cloudstack-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "ASF GitHub Bot (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (CLOUDSTACK-10310) KVM hosts reboot if there is a short transient storage error
Date Mon, 25 Jun 2018 15:15:05 GMT

    [ https://issues.apache.org/jira/browse/CLOUDSTACK-10310?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16522418#comment-16522418 ] 

ASF GitHub Bot commented on CLOUDSTACK-10310:
---------------------------------------------

Slair1 closed pull request #2472: CLOUDSTACK-10310 Fix KVM reboot on storage issue
URL: https://github.com/apache/cloudstack/pull/2472
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/.gitignore b/.gitignore
index 48aa29b69e3..1a73724c117 100644
--- a/.gitignore
+++ b/.gitignore
@@ -51,7 +51,6 @@ tools/cli/build/
 *.jar
 *.war
 *.mar
-*.zip
 *.iso
 *.tar.gz
 *.tgz
@@ -98,3 +97,5 @@ systemvm/.pydevproject
 test/.pydevprojec
 plugins/hypervisors/kvm/.pydevproject
 scripts/.pydevproject
+*.qcow2
+*.raw
diff --git a/.java-version b/.java-version
index d3bdbdf1fda..6259340971b 100644
--- a/.java-version
+++ b/.java-version
@@ -1 +1 @@
-1.7
+1.8
diff --git a/.travis.yml b/.travis.yml
index 359d6666788..d5fd173d71e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -19,7 +19,7 @@ dist: trusty
 group: edge
 language: java
 jdk:
-- openjdk7
+- oraclejdk8
 python:
   - "2.7"
 cache:
@@ -32,8 +32,11 @@ env:
   global:
      - PATH=$HOME/.local/bin:$PATH
   matrix:
-    - TESTS="smoke/test_affinity_groups
+    # Keep the TESTS sorted by name and grouped by type
+    - TESTS="smoke/test_accounts
+             smoke/test_affinity_groups
              smoke/test_affinity_groups_projects
+             smoke/test_certauthority_root
              smoke/test_deploy_vgpu_enabled_vm
              smoke/test_deploy_vm_iso
              smoke/test_deploy_vm_root_resize
@@ -42,8 +45,12 @@ env:
              smoke/test_disk_offerings
              smoke/test_dynamicroles
              smoke/test_global_settings
-             smoke/test_guest_vlan_range
-             smoke/test_hosts
+             smoke/test_guest_vlan_range"
+
+    - TESTS="smoke/test_hostha_kvm
+             smoke/test_hostha_simulator
+             smoke/test_host_annotations
+             smoke/test_host_maintenance
              smoke/test_internal_lb
              smoke/test_iso
              smoke/test_list_ids_parameter
@@ -51,18 +58,22 @@ env:
              smoke/test_login
              smoke/test_metrics_api
              smoke/test_multipleips_per_nic
+             smoke/test_nested_virtualization
              smoke/test_network
              smoke/test_network_acl
              smoke/test_nic
              smoke/test_nic_adapter_type
-             smoke/test_non_contigiousvlan"
-
-    - TESTS="smoke/test_outofbandmanagement
+             smoke/test_non_contigiousvlan
+             smoke/test_outofbandmanagement
+             smoke/test_outofbandmanagement_nestedplugin
              smoke/test_over_provisioning
              smoke/test_password_server
              smoke/test_portable_publicip
-             smoke/test_primary_storage
+             smoke/test_portforwardingrules"
+
+    - TESTS="smoke/test_primary_storage
              smoke/test_privategw_acl
+             smoke/test_projects
              smoke/test_public_ip_range
              smoke/test_pvlan
              smoke/test_regions
@@ -80,6 +91,7 @@ env:
              smoke/test_ssvm
              smoke/test_staticroles
              smoke/test_templates
+             smoke/test_usage
              smoke/test_usage_events
              smoke/test_vm_life_cycle
              smoke/test_vm_snapshots
@@ -97,8 +109,12 @@ env:
              component/test_acl_listsnapshot
              component/test_acl_listvm
              component/test_acl_listvolume
-             component/test_acl_sharednetwork
-             component/test_acl_sharednetwork_deployVM-impersonation"
+             component/test_acl_sharednetwork"
+
+    - TESTS="component/test_allocation_states
+             component/test_acl_sharednetwork_deployVM-impersonation
+             component/test_affinity_groups_projects
+             component/test_cpu_domain_limits
              component/test_cpu_limits"
 
     - TESTS="component/test_cpu_max_limits
@@ -117,41 +133,37 @@ env:
              component/test_non_contiguous_vlan
              component/test_persistent_networks"
 
-    - TESTS="component/test_projects
+    - TESTS="component/test_project_limits
              component/test_project_configs
-             component/test_project_limits
              component/test_project_usage
-             component/test_regions
+             component/test_project_resources
              component/test_regions_accounts
              component/test_routers
-             component/test_snapshots"
+             component/test_snapshots
+             component/test_stopped_vm"
+
+    - TESTS="component/test_project_resources"
 
-    - TESTS="component/test_resource_limits"
+    - TESTS="component/test_project_limits
+             component/test_resource_limits"
 
-    - TESTS="component/test_stopped_vm
-             component/test_tags
+    - TESTS="component/test_tags
              component/test_templates
              component/test_update_vm
-             component/test_usage"
+             component/test_volumes"
 
-    - TESTS="component/test_volumes
+    - TESTS="component/test_vpc
              component/test_vpc_network
              component/test_vpc_offerings
              component/test_vpn_users"
 
 # FIXME: fix following tests and include them in Travis
-#    - TESTS="component/test_affinity_groups_projects"
-#    - TESTS="component/test_allocation_states"
-#    - TESTS="component/test_vpc"
-#    - TESTS="component/test_project_resources"
-#    - TESTS="component/test_cpu_domain_limits"
-#    - TESTS="component/test_acl_isolatednetwork"
-#    - TESTS="component/test_accounts"
-#    - TESTS="component/test_organization_states"
+#    - TESTS="component/test_vpc" Please add when PR: https://github.com/apache/cloudstack/pull/955 CLOUDSTACK-8969 is fixed
+#    - TESTS="component/test_organization_states" Please add when CLOUDSTACK-7735 is fixed
 
-before_install: travis_wait 60 ./tools/travis/before_install.sh
+before_install: travis_wait 30 ./tools/travis/before_install.sh
 install: ./tools/travis/install.sh
-before_script: travis_wait 60 ./tools/travis/before_script.sh
+before_script: travis_wait 30 ./tools/travis/before_script.sh
 script:
   - travis_wait 40 ./tools/travis/script.sh ${TESTS}
 after_success: ./tools/travis/after_success.sh
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index c4ad1974eb6..6ac3ad56dd4 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -3,10 +3,26 @@ Contributing to Apache CloudStack (ACS)
 
 Summary
 -------
-This document covers how to contribute to the ACS project. 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 ACS project and you will submit a Pull Request for your changes to be added.
+This document covers how to contribute to the ACS project. ACS 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 ACS project and you will submit a Pull Request for your changes to be added.
 
 _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)
+
+Developing new features
+-----------------------
+
+Development should be done in a feature branch, branched off of master. 
+Send a PR(steps below) to get it into master (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!
 
 Fork the code 
 -------------
@@ -30,6 +46,7 @@ $ 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 ACS 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.
@@ -72,6 +89,8 @@ Make a GitHub Pull Request to contribute your changes
 
 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 JIRA id, detailed information about the bug/feature, what all tests are executed, how the reviewer can test this feature etc. Incase of UI PRs, 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
@@ -105,3 +124,7 @@ $ git checkout master
 $ git branch -D feature_x
 $ git push origin :feature_x
 ```
+
+Release Principles
+------------------
+Detailed information about ACS release principles is available at https://cwiki.apache.org/confluence/display/CLOUDSTACK/Release+principles+for+Apache+CloudStack+4.6+and+up 
diff --git a/INSTALL.md b/INSTALL.md
index 8a83fb0f720..626df91dc56 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -15,7 +15,7 @@ was tested against a CentOS 6.5 x86_64 setup.
 Install tools and dependencies used for development:
 
     $ yum install git ant ant-devel java-1.6.0-openjdk java-1.6.0-openjdk-devel
-    mysql mysql-server tomcat6 mkisofs gcc python MySQL-python openssh-clients wget
+    mysql mysql-server mkisofs gcc python MySQL-python openssh-clients wget
 
     # yum -y update
     # yum -y install java-1.7.0-openjdk
@@ -124,7 +124,6 @@ To create debs install the following extra packages:
 
     # apt-get -y install python-mysqldb
     # apt-get -y install debhelper
-    # apt-get -y install tomcat6
 
 Then:
 
@@ -138,7 +137,6 @@ All the deb packages will be located one level down.
 To create rpms, install the following extra packages:
 
     # yum -y install rpm-build
-    # yum -y install tomcat6
     # yum -y install ws-commons-util
     # yum -y instal gcc
     # yum -y install glibc-devel
@@ -154,7 +152,7 @@ All the rpm packages will be created in `dist/rpmbuild/RPMS/x86_64` directory.
 
 ## Notes
 
-If you will be using Xen as your hypervisor, please download [vhd-util](http://download.cloud.com.s3.amazonaws.com/tools/vhd-util)
+If you will be using Xen as your hypervisor, please download [vhd-util](http://download.cloudstack.org/tools/vhd-util)
 
 If management server is installed on RHEL/CentOS, then copy vhd-util into:
 
diff --git a/LICENSE b/LICENSE
index 982b15844f4..0dcb45c6189 100644
--- a/LICENSE
+++ b/LICENSE
@@ -208,7 +208,7 @@ Within the console-proxy/js directory
             jquery.js 
 
 
-Within the patches/systemvm/debian/config/etc directory
+Within the systemvm/debian/etc directory
     placed in the public domain
         by Adiscon GmbH  http://www.adiscon.com/ 
             rsyslog.conf 
@@ -216,14 +216,14 @@ Within the patches/systemvm/debian/config/etc directory
             dnsmasq.conf 
             vpcdnsmasq.conf 
 
-Within the patches/systemvm/debian/config/etc/apache2 directory
+Within the systemvm/debian/etc/apache2 directory
     licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt  (as above)
     Copyright (c) 2012 The Apache Software Foundation
         from The Apache Software Foundation  http://www.apache.org/ 
             httpd.conf 
             vhost.template
 
-Within the patches/systemvm/debian/config/etc/ssh/ directory
+Within the systemvm/debian/etc/ssh/ directory
     licensed under the BSD (2-clause) http://www.opensource.org/licenses/BSD-2-Clause  (as follows)
  
             
@@ -254,7 +254,7 @@ Within the patches/systemvm/debian/config/etc/ssh/ directory
         from OpenSSH Project  http://www.openssh.org/ 
             sshd_config 
 
-Within the patches/systemvm/debian/config/root/redundant_router directory
+Within the systemvm/debian/root/redundant_router directory
     placed in the public domain
         by The netfilter.org project  http://www.netfilter.org/ 
             conntrackd.conf.templ 
@@ -271,65 +271,6 @@ Within the scripts/vm/hypervisor/xenserver directory
         from OpenStack, LLC  http://www.openstack.org 
             swift 
 
-Within the tools/appliance/definitions/{devcloud,systemvmtemplate,systemvmtemplate64} directory
-    licensed under the MIT License http://www.opensource.org/licenses/mit-license.php  (as follows)
-
-            Copyright (c) 2010-2012 Patrick Debois 
-            
-            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.
-                        
-        from Patrick Debois  http://www.jedi.be/blog/ 
-            base.sh  from https://github.com/jedi4ever/veewee
-            cleanup.sh  from https://github.com/jedi4ever/veewee
-            definition.rb  from https://github.com/jedi4ever/veewee
-            preseed.cfg  from https://github.com/jedi4ever/veewee
-            zerodisk.sh  from https://github.com/jedi4ever/veewee
-
-Within the tools/devcloud/src/deps/boxes/basebox-build directory
-    licensed under the MIT License http://www.opensource.org/licenses/mit-license.php  (as follows)
-
-            Copyright (c) 2010-2012 Patrick Debois 
-            
-            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.
-                        
-        from Patrick Debois  http://www.jedi.be/blog/ 
-            definition.rb  from https://github.com/jedi4ever/veewee
-            preseed.cfg  from https://github.com/jedi4ever/veewee
-
 Within the ui/lib directory
     placed in the public domain
         by Eric Meyer  http://meyerweb.com/eric/ 
diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 00000000000..17adfe69a31
--- /dev/null
+++ b/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,39 @@
+## Description
+<!--- Describe your changes in detail -->
+
+<!-- For new features, provide link to FS, dev ML discussion etc. -->
+<!-- In case of bug fix, the expected and actual behaviours, steps to reproduce. -->
+
+## Types of changes
+<!--- What types of changes does your code introduce? Put an `x` in all the boxes that apply: -->
+- [ ] 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)
+
+## GitHub Issue/PRs
+<!-- If this PR is to fix an issue or another PR on GH, uncomment the section and provide the id of issue/PR -->
+<!-- When "Fixes: #<id>" is specified, the issue/PR will automatically be closed when this PR gets merged -->
+<!-- For addressing multiple issues/PRs, use multiple "Fixes: #<id>" -->
+
+<!-- Fixes: # -->
+
+## 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. -->
+
+## Checklist:
+<!--- Go over all the following points, and put an `x` in all the boxes that apply. -->
+<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
+- [ ] I have read the [CONTRIBUTING](https://github.com/apache/cloudstack/blob/master/CONTRIBUTING.md) document.
+- [ ] My code follows the code style of this project.
+- [ ] My change requires a change to the documentation.
+- [ ] I have updated the documentation accordingly.
+- [ ] I have added tests to cover my changes.
+- [ ] All new and existing tests passed.
+
diff --git a/README.md b/README.md
index 287f8f2bf68..17a7a8f7bd9 100644
--- a/README.md
+++ b/README.md
@@ -42,7 +42,7 @@ For more information on Apache CloudStack, please visit the [website](http://clo
 
 Apache CloudStack project uses Git. The official Git repository is at:
 
-    https://git-wip-us.apache.org/repos/asf/cloudstack.git
+    https://gitbox.apache.org/repos/asf/cloudstack.git
 
 And a mirror is hosted on Github:
 
@@ -92,8 +92,7 @@ developer [page](http://cloudstack.apache.org/developers.html) for contributing
 
 * [Blog](https://blogs.apache.org/cloudstack)
 * [Twitter](https://twitter.com/cloudstack)
-* [Planet CloudStack](http://planet.apache.org/cloudstack)
-* [Events and meetup](http://lanyrd.com/topics/apache-cloudstack)
+* [Events and meetup](http://cloudstackcollab.org/)
 
 ## Reporting Security Vulnerabilities
 
diff --git a/agent-simulator/tomcatconf/commands-simulator.properties.in b/agent-simulator/tomcatconf/commands-simulator.properties.in
deleted file mode 100644
index 4350bb788b4..00000000000
--- a/agent-simulator/tomcatconf/commands-simulator.properties.in
+++ /dev/null
@@ -1,21 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-# 
-#   http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-
-configureSimulator=com.cloud.api.commands.ConfigureSimulatorCmd;1
-querySimulatorMock=com.cloud.api.commands.QuerySimulatorMockCmd;1
-cleanupSimulatorMock=com.cloud.api.commands.CleanupSimulatorMockCmd;1
diff --git a/agent/bindir/cloud-setup-agent.in b/agent/bindir/cloud-setup-agent.in
index 8d2b91961ae..3c6203c2d34 100755
--- a/agent/bindir/cloud-setup-agent.in
+++ b/agent/bindir/cloud-setup-agent.in
@@ -26,6 +26,7 @@ from cloudutils.configFileOps import  configFileOps
 from cloudutils.globalEnv import globalEnv
 from cloudutils.networkConfig import networkConfig
 from cloudutils.syscfg import sysConfigFactory
+from cloudutils.serviceConfig import configureLibvirtConfig
 
 from optparse import OptionParser
 
@@ -100,6 +101,7 @@ if __name__ == '__main__':
     parser.add_option("-c", "--cluster", dest="cluster", help="cluster id")
     parser.add_option("-t", "--hypervisor", default="kvm", dest="hypervisor", help="hypervisor type")
     parser.add_option("-g", "--guid", dest="guid", help="guid")
+    parser.add_option("-s", action="store_true", default=False, dest="secure", help="Secure and enable TLS for libvirtd")
     parser.add_option("--pubNic", dest="pubNic", help="Public traffic interface")
     parser.add_option("--prvNic", dest="prvNic", help="Private traffic interface")
     parser.add_option("--guestNic", dest="guestNic", help="Guest traffic interface")
@@ -110,6 +112,12 @@ if __name__ == '__main__':
         glbEnv.bridgeType = bridgeType
 
     (options, args) = parser.parse_args()
+
+    if not options.auto and options.secure:
+        configureLibvirtConfig(True)
+        print "Libvirtd with TLS configured"
+        sys.exit(0)
+
     if options.auto is None:
         userInputs = getUserInputs()
         glbEnv.mgtSvr = userInputs[0]
@@ -138,7 +146,9 @@ if __name__ == '__main__':
         glbEnv.nics.append(options.prvNic)
         glbEnv.nics.append(options.pubNic)
         glbEnv.nics.append(options.guestNic)
-        
+
+    glbEnv.secure = options.secure
+
     print "Starting to configure your system:"
     syscfg = sysConfigFactory.getSysConfigFactory(glbEnv)
     try:
diff --git a/agent/bindir/libvirtqemuhook.in b/agent/bindir/libvirtqemuhook.in
index 9fbe037d1c1..55ab3e67309 100755
--- a/agent/bindir/libvirtqemuhook.in
+++ b/agent/bindir/libvirtqemuhook.in
@@ -6,25 +6,36 @@
 # to you under the Apache License, Version 2.0 (the
 # "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
-# 
+#
 #   http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
 # "AS IS" BASIS, WITHOUT 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 sys
+
+import logging
 import re
+import sys
 from xml.dom.minidom import parse
 from cloudutils.configFileOps import configFileOps
 from cloudutils.networkConfig import networkConfig
+
+logging.basicConfig(filename='/var/log/libvirt/qemu-hook.log',
+                    filemode='a',
+                    format='%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s',
+                    datefmt='%H:%M:%S',
+                    level=logging.INFO)
+logger = logging.getLogger('qemu-hook')
+
 def isOldStyleBridge(brName):
     if brName.find("cloudVirBr") == 0:
        return True
     else:
        return False
+
 def isNewStyleBridge(brName):
     if brName.startswith('brvx-'):
         return False
@@ -32,12 +43,14 @@ def isNewStyleBridge(brName):
        return False
     else:
        return True
+
 def getGuestNetworkDevice():
-    netlib = networkConfig() 
+    netlib = networkConfig()
     cfo = configFileOps("/etc/cloudstack/agent/agent.properties")
     guestDev = cfo.getEntry("guest.network.device")
     enslavedDev = netlib.getEnslavedDev(guestDev, 1)
     return enslavedDev.split(".")[0]
+
 def handleMigrateBegin():
     try:
         domain = parse(sys.stdin)
@@ -45,20 +58,26 @@ def handleMigrateBegin():
             source = interface.getElementsByTagName("source")[0]
             bridge = source.getAttribute("bridge")
             if isOldStyleBridge(bridge):
-                vlanId = bridge.replace("cloudVirBr","")
+                vlanId = bridge.replace("cloudVirBr", "")
             elif isNewStyleBridge(bridge):
-                vlanId = re.sub(r"br(\w+)-","",bridge)
+                vlanId = re.sub(r"br(\w+)-", "", bridge)
             else:
                 continue
             phyDev = getGuestNetworkDevice()
-            newBrName="br" + phyDev + "-" + vlanId
+            newBrName = "br" + phyDev + "-" + vlanId
             source.setAttribute("bridge", newBrName)
         print(domain.toxml())
     except:
         pass
+
+
 if __name__ == '__main__':
     if len(sys.argv) != 5:
         sys.exit(0)
 
-    if sys.argv[2] == "migrate" and sys.argv[3] == "begin":
-        handleMigrateBegin() 
+    # For docs refer https://libvirt.org/hooks.html#qemu
+    logger.debug("Executing qemu hook with args: %s" % sys.argv)
+    action, status = sys.argv[2:4]
+
+    if action == "migrate" and status == "begin":
+        handleMigrateBegin()
diff --git a/agent/conf/agent.properties b/agent/conf/agent.properties
index 8b99ee36466..ad35b96bab6 100644
--- a/agent/conf/agent.properties
+++ b/agent/conf/agent.properties
@@ -30,6 +30,17 @@ workers=5
 #host= The IP address of management server
 host=localhost
 
+# The time interval in seconds after which agent will check if connected host
+# is the preferred host (the first host in the comma-separated list is preferred
+# one) and will attempt to reconnect to the preferred host when it's connected
+# to one of the secondary/backup hosts. The timer task is scheduled after agent
+# connects to a management server. On connection, it receives admin configured
+# cluster-level 'indirect.agent.lb.check.interval' setting that will be used by
+# the agent as the preferred host check interval however the following setting
+# if defined overrides the received value. The value 0 and lb algorithm 'shuffle'
+# disables this background task.
+#host.lb.check.interval=0
+
 #port = The port management server listening on, default is 8250
 port=8250
 
@@ -56,6 +67,11 @@ zone=default
 # local storage path, by default, it's /var/lib/libvirt/images/
 #local.storage.path=/var/lib/libvirt/images/
 
+# Qemu socket path, directory where Qemu sockets are placed.
+# These sockets are for the Qemu Guest Agent and SSVM privisioning
+# Make sure that AppArmor or SELinux allow libvirt to write there
+#qemu.sockets.path=/var/lib/libvirt/qemu
+
 # The UUID for the local storage pool, this is mandatory!
 # Generate with "uuidgen"
 local.storage.uuid=
@@ -153,6 +169,41 @@ hypervisor.type=kvm
 # Some newer linux kernels are incapable of reliably migrating vms with kvmclock
 # This is a workaround for the bug, admin can set this to true per-host
 #
-#router.aggregation.command.each.timeout=600
-#timeout value for aggregation commands send to virtual router
+# vm.rng.enable=false
+# This enabled the VirtIO Random Number Generator device for guests.
+#
+# vm.rng.model=random
+# The model of VirtIO Random Number Generator (RNG) to present to the Guest.
+# Currently only 'random' is supported.
+#
+# vm.rng.path=/dev/random
+# Local Random Number Device Generator to use for VirtIO RNG for Guests.
+# This is usually /dev/random, but per platform this might be different
+#
+# vm.rng.rate.bytes=2048
+# The amount of bytes the Guest may request/obtain from the RNG in the period
+# specified below.
+#
+# vm.rng.rate.period=1000
+# The number of milliseconds in which the guest is allowed to obtain the bytes
+# specified above.
+#
+# router.aggregation.command.each.timeout=600
+# timeout value for aggregation commands send to virtual router
+#
+# host.overcommit.mem.mb = 0
+# allows to increase amount of ram available on host virtually to utilize Zswap, KSM features
+# and modern fast SSD/3D XPoint devices. Specified amount of MBs is added to the memory agent 
+# reports to the Management Server
+# Default: 0
+#
+# vm.watchdog.model=i6300esb
+# The model of Watchdog timer to present to the Guest
+# For all models refer to the libvirt documentation.
+# Recommend value is: i6300esb
 #
+# vm.watchdog.action=none
+# Action to take when the Guest/Instance is no longer notifiying the Watchdog
+# timer.
+# For all actions refer to the libvirt documentation.
+# Recommended values are: none, reset and poweroff.
diff --git a/agent/pom.xml b/agent/pom.xml
index 02eb9d8b1dc..50b10c17827 100644
--- a/agent/pom.xml
+++ b/agent/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.cloudstack</groupId>
     <artifactId>cloudstack</artifactId>
-    <version>4.9.4.0-SNAPSHOT</version>
+    <version>4.11.1.0-SNAPSHOT</version>
   </parent>
   <dependencies>
     <dependency>
diff --git a/agent/src/com/cloud/agent/Agent.java b/agent/src/com/cloud/agent/Agent.java
index 7fab5f4d301..67115e649a1 100644
--- a/agent/src/com/cloud/agent/Agent.java
+++ b/agent/src/com/cloud/agent/Agent.java
@@ -16,12 +16,16 @@
 // under the License.
 package com.cloud.agent;
 
+import java.io.File;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.Socket;
 import java.net.UnknownHostException;
 import java.nio.channels.ClosedChannelException;
+import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -35,7 +39,18 @@
 
 import javax.naming.ConfigurationException;
 
+import org.apache.cloudstack.agent.directdownload.SetupDirectDownloadCertificate;
+import org.apache.cloudstack.agent.lb.SetupMSListAnswer;
+import org.apache.cloudstack.agent.lb.SetupMSListCommand;
+import org.apache.cloudstack.ca.PostCertificateRenewalCommand;
+import org.apache.cloudstack.ca.SetupCertificateAnswer;
+import org.apache.cloudstack.ca.SetupCertificateCommand;
+import org.apache.cloudstack.ca.SetupKeyStoreCommand;
+import org.apache.cloudstack.ca.SetupKeystoreAnswer;
 import org.apache.cloudstack.managed.context.ManagedContextTimerTask;
+import org.apache.cloudstack.utils.security.KeyStoreUtils;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.io.FileUtils;
 import org.apache.log4j.Logger;
 import org.slf4j.MDC;
 
@@ -54,8 +69,10 @@
 import com.cloud.agent.transport.Request;
 import com.cloud.agent.transport.Response;
 import com.cloud.exception.AgentControlChannelException;
+import com.cloud.host.Host;
 import com.cloud.resource.ServerResource;
 import com.cloud.utils.PropertiesUtil;
+import com.cloud.utils.StringUtils;
 import com.cloud.utils.backoff.BackoffAlgorithm;
 import com.cloud.utils.concurrency.NamedThreadFactory;
 import com.cloud.utils.exception.CloudRuntimeException;
@@ -68,6 +85,7 @@
 import com.cloud.utils.nio.Task;
 import com.cloud.utils.script.OutputInterpreter;
 import com.cloud.utils.script.Script;
+import com.google.common.base.Strings;
 
 /**
  * @config
@@ -111,6 +129,8 @@ public int value() {
     Long _id;
 
     Timer _timer = new Timer("Agent Timer");
+    Timer certTimer;
+    Timer hostLBTimer;
 
     List<WatchTask> _watchList = new ArrayList<WatchTask>();
     long _sequence = 0;
@@ -123,17 +143,22 @@ public int value() {
     long _startupWait = _startupWaitDefault;
     boolean _reconnectAllowed = true;
     //For time sentitive task, e.g. PingTask
-    private final ThreadPoolExecutor _ugentTaskPool;
+    ThreadPoolExecutor _ugentTaskPool;
     ExecutorService _executor;
 
+    Thread _shutdownThread = new ShutdownThread(this);
+
+    private String _keystoreSetupPath;
+    private String _keystoreCertImportPath;
+
     // for simulator use only
     public Agent(final IAgentShell shell) {
         _shell = shell;
         _link = null;
 
-        _connection = new NioClient("Agent", _shell.getHost(), _shell.getPort(), _shell.getWorkers(), this);
+        _connection = new NioClient("Agent", _shell.getNextHost(), _shell.getPort(), _shell.getWorkers(), this);
 
-        Runtime.getRuntime().addShutdownHook(new ShutdownThread(this));
+        Runtime.getRuntime().addShutdownHook(_shutdownThread);
 
         _ugentTaskPool =
                 new ThreadPoolExecutor(shell.getPingRetries(), 2 * shell.getPingRetries(), 10, TimeUnit.MINUTES, new SynchronousQueue<Runnable>(), new NamedThreadFactory(
@@ -166,12 +191,13 @@ public Agent(final IAgentShell shell, final int localAgentId, final ServerResour
             throw new ConfigurationException("Unable to configure " + _resource.getName());
         }
 
-        _connection = new NioClient("Agent", _shell.getHost(), _shell.getPort(), _shell.getWorkers(), this);
+        final String host = _shell.getNextHost();
+        _connection = new NioClient("Agent", host, _shell.getPort(), _shell.getWorkers(), this);
 
         // ((NioClient)_connection).setBindAddress(_shell.getPrivateIp());
 
         s_logger.debug("Adding shutdown hook");
-        Runtime.getRuntime().addShutdownHook(new ShutdownThread(this));
+        Runtime.getRuntime().addShutdownHook(_shutdownThread);
 
         _ugentTaskPool =
                 new ThreadPoolExecutor(shell.getPingRetries(), 2 * shell.getPingRetries(), 10, TimeUnit.MINUTES, new SynchronousQueue<Runnable>(), new NamedThreadFactory(
@@ -182,7 +208,7 @@ public Agent(final IAgentShell shell, final int localAgentId, final ServerResour
                         "agentRequest-Handler"));
 
         s_logger.info("Agent [id = " + (_id != null ? _id : "new") + " : type = " + getResourceName() + " : zone = " + _shell.getZone() + " : pod = " + _shell.getPod() +
-                " : workers = " + _shell.getWorkers() + " : host = " + _shell.getHost() + " : port = " + _shell.getPort());
+                " : workers = " + _shell.getWorkers() + " : host = " + host + " : port = " + _shell.getPort());
     }
 
     public String getVersion() {
@@ -218,12 +244,41 @@ public String getResourceName() {
         return _resource.getClass().getSimpleName();
     }
 
+    /**
+     * In case of a software based agent restart, this method
+     * can help to perform explicit garbage collection of any old
+     * agent instances and its inner objects.
+     */
+    private void scavengeOldAgentObjects() {
+        _executor.submit(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    Thread.sleep(2000L);
+                } catch (final InterruptedException ignored) {
+                } finally {
+                    System.gc();
+                }
+            }
+        });
+    }
+
     public void start() {
         if (!_resource.start()) {
             s_logger.error("Unable to start the resource: " + _resource.getName());
             throw new CloudRuntimeException("Unable to start the resource: " + _resource.getName());
         }
 
+        _keystoreSetupPath = Script.findScript("scripts/util/", KeyStoreUtils.KS_SETUP_SCRIPT);
+        if (_keystoreSetupPath == null) {
+            throw new CloudRuntimeException(String.format("Unable to find the '%s' script", KeyStoreUtils.KS_SETUP_SCRIPT));
+        }
+
+        _keystoreCertImportPath = Script.findScript("scripts/util/", KeyStoreUtils.KS_IMPORT_SCRIPT);
+        if (_keystoreCertImportPath == null) {
+            throw new CloudRuntimeException(String.format("Unable to find the '%s' script", KeyStoreUtils.KS_IMPORT_SCRIPT));
+        }
+
         try {
             _connection.start();
         } catch (final NioConnectionException e) {
@@ -231,8 +286,10 @@ public void start() {
             s_logger.info("Attempted to connect to the server, but received an unexpected exception, trying again...");
         }
         while (!_connection.isStartup()) {
+            final String host = _shell.getNextHost();
             _shell.getBackoffAlgorithm().waitBeforeRetry();
-            _connection = new NioClient("Agent", _shell.getHost(), _shell.getPort(), _shell.getWorkers(), this);
+            _connection = new NioClient("Agent", host, _shell.getPort(), _shell.getWorkers(), this);
+            s_logger.info("Connecting to host:" + host);
             try {
                 _connection.start();
             } catch (final NioConnectionException e) {
@@ -240,6 +297,8 @@ public void start() {
                 s_logger.info("Attempted to connect to the server, but received an unexpected exception, trying again...");
             }
         }
+        _shell.updateConnectedHost();
+        scavengeOldAgentObjects();
     }
 
     public void stop(final String reason, final String detail) {
@@ -264,6 +323,7 @@ public void stop(final String reason, final String detail) {
             }
             _connection.stop();
             _connection = null;
+            _link = null;
         }
 
         if (_resource != null) {
@@ -271,7 +331,34 @@ public void stop(final String reason, final String detail) {
             _resource = null;
         }
 
-        _ugentTaskPool.shutdownNow();
+        if (_startup != null) {
+            _startup = null;
+        }
+
+        if (_ugentTaskPool != null) {
+            _ugentTaskPool.shutdownNow();
+            _ugentTaskPool = null;
+        }
+
+        if (_executor != null) {
+            _executor.shutdown();
+            _executor = null;
+        }
+
+        if (_timer != null) {
+            _timer.cancel();
+            _timer = null;
+        }
+
+        if (hostLBTimer != null) {
+            hostLBTimer.cancel();
+            hostLBTimer = null;
+        }
+
+        if (certTimer != null) {
+            certTimer.cancel();
+            certTimer = null;
+        }
     }
 
     public Long getId() {
@@ -284,6 +371,26 @@ public void setId(final Long id) {
         _shell.setPersistentProperty(getResourceName(), "id", Long.toString(id));
     }
 
+    private synchronized void scheduleServicesRestartTask() {
+        if (certTimer != null) {
+            certTimer.cancel();
+            certTimer.purge();
+        }
+        certTimer = new Timer("Certificate Renewal Timer");
+        certTimer.schedule(new PostCertificateRenewalTask(this), 5000L);
+    }
+
+    private synchronized void scheduleHostLBCheckerTask(final long checkInterval) {
+        if (hostLBTimer != null) {
+            hostLBTimer.cancel();
+        }
+        if (checkInterval > 0L) {
+            s_logger.info("Scheduling preferred host timer task with host.lb.interval=" + checkInterval + "ms");
+            hostLBTimer = new Timer("Host LB Timer");
+            hostLBTimer.scheduleAtFixedRate(new PreferredHostCheckerTask(), checkInterval, checkInterval);
+        }
+    }
+
     public void scheduleWatch(final Link link, final Request request, final long delay, final long period) {
         synchronized (_watchList) {
             if (s_logger.isDebugEnabled()) {
@@ -306,8 +413,8 @@ protected void cancelTasks() {
             _watchList.clear();
         }
     }
-    public synchronized void lockStartupTask(final Link link)
-    {
+
+    public synchronized void lockStartupTask(final Link link) {
         _startup = new StartupTask(link);
         _timer.schedule(_startup, _startupWait);
     }
@@ -315,9 +422,11 @@ public synchronized void lockStartupTask(final Link link)
     public void sendStartup(final Link link) {
         final StartupCommand[] startup = _resource.initialize();
         if (startup != null) {
+            final String msHostList = _shell.getPersistentProperty(null, "host");
             final Command[] commands = new Command[startup.length];
             for (int i = 0; i < startup.length; i++) {
                 setupStartupCommand(startup[i]);
+                startup[i].setMSHostList(msHostList);
                 commands[i] = startup[i];
             }
             final Request request = new Request(_id != null ? _id : -1, -1, commands, false, false);
@@ -376,25 +485,17 @@ protected void reconnect(final Link link) {
             }
         }
 
-        link.close();
-        link.terminated();
+        if (link != null) {
+            link.close();
+            link.terminated();
+        }
 
         setLink(null);
         cancelTasks();
 
         _resource.disconnected();
 
-        int inProgress = 0;
-        do {
-            _shell.getBackoffAlgorithm().waitBeforeRetry();
-
-            s_logger.info("Lost connection to the server. Dealing with the remaining commands...");
-
-            inProgress = _inProgress.get();
-            if (inProgress > 0) {
-                s_logger.info("Cannot connect because we still have " + inProgress + " commands in progress.");
-            }
-        } while (inProgress > 0);
+        s_logger.info("Lost connection to host: " + _shell.getConnectedHost() + ". Attempting reconnection while we still have " + _inProgress.get() + " commands in progress.");
 
         _connection.stop();
 
@@ -408,18 +509,26 @@ protected void reconnect(final Link link) {
             _shell.getBackoffAlgorithm().waitBeforeRetry();
         }
 
-        _connection = new NioClient("Agent", _shell.getHost(), _shell.getPort(), _shell.getWorkers(), this);
+        final String host = _shell.getNextHost();
         do {
-            s_logger.info("Reconnecting...");
+            _connection = new NioClient("Agent", host, _shell.getPort(), _shell.getWorkers(), this);
+            s_logger.info("Reconnecting to host:" + host);
             try {
                 _connection.start();
             } catch (final NioConnectionException e) {
                 s_logger.warn("NIO Connection Exception  " + e);
                 s_logger.info("Attempted to connect to the server, but received an unexpected exception, trying again...");
+                _connection.stop();
+                try {
+                    _connection.cleanUp();
+                } catch (final IOException ex) {
+                    s_logger.warn("Fail to clean up old connection. " + ex);
+                }
             }
             _shell.getBackoffAlgorithm().waitBeforeRetry();
         } while (!_connection.isStartup());
-        s_logger.info("Connected to the server");
+        _shell.updateConnectedHost();
+        s_logger.info("Connected to the host: " + _shell.getConnectedHost());
     }
 
     public void processStartupAnswer(final Answer answer, final Response response, final Link link) {
@@ -515,7 +624,17 @@ protected void processRequest(final Request request, final Link link) {
                             s_logger.warn("No handler found to process cmd: " + cmd.toString());
                             answer = new AgentControlAnswer(cmd);
                         }
-
+                    } else if (cmd instanceof SetupKeyStoreCommand && ((SetupKeyStoreCommand) cmd).isHandleByAgent()) {
+                        answer = setupAgentKeystore((SetupKeyStoreCommand) cmd);
+                    } else if (cmd instanceof SetupCertificateCommand && ((SetupCertificateCommand) cmd).isHandleByAgent()) {
+                        answer = setupAgentCertificate((SetupCertificateCommand) cmd);
+                        if (Host.Type.Routing.equals(_resource.getType())) {
+                            scheduleServicesRestartTask();
+                        }
+                    } else if (cmd instanceof SetupDirectDownloadCertificate) {
+                        answer = setupDirectDownloadCertificate((SetupDirectDownloadCertificate) cmd);
+                    } else if (cmd instanceof SetupMSListCommand) {
+                        answer = setupManagementServerList((SetupMSListCommand) cmd);
                     } else {
                         if (cmd instanceof ReadyCommand) {
                             processReadyCommand(cmd);
@@ -565,6 +684,135 @@ protected void processRequest(final Request request, final Link link) {
         }
     }
 
+    private Answer setupDirectDownloadCertificate(SetupDirectDownloadCertificate cmd) {
+        String certificate = cmd.getCertificate();
+        String certificateName = cmd.getCertificateName();
+        s_logger.info("Importing certificate " + certificateName + " into keystore");
+
+        final File agentFile = PropertiesUtil.findConfigFile("agent.properties");
+        if (agentFile == null) {
+            return new Answer(cmd, false, "Failed to find agent.properties file");
+        }
+
+        final String keyStoreFile = agentFile.getParent() + "/" + KeyStoreUtils.KS_FILENAME;
+
+        String cerFile = agentFile.getParent() + "/" + certificateName + ".cer";
+        Script.runSimpleBashScript(String.format("echo '%s' > %s", certificate, cerFile));
+
+        String privatePasswordFormat = "sed -n '/keystore.passphrase/p' '%s' 2>/dev/null  | sed 's/keystore.passphrase=//g' 2>/dev/null";
+        String privatePasswordCmd = String.format(privatePasswordFormat, agentFile.getAbsolutePath());
+        String privatePassword = Script.runSimpleBashScript(privatePasswordCmd);
+
+        String importCommandFormat = "keytool -importcert -file %s -keystore %s -alias '%s' -storepass '%s' -noprompt";
+        String importCmd = String.format(importCommandFormat, cerFile, keyStoreFile, certificateName, privatePassword);
+        Script.runSimpleBashScript(importCmd);
+        return new Answer(cmd, true, "Certificate " + certificateName + " imported");
+    }
+
+    public Answer setupAgentKeystore(final SetupKeyStoreCommand cmd) {
+        final String keyStorePassword = cmd.getKeystorePassword();
+        final long validityDays = cmd.getValidityDays();
+
+        s_logger.debug("Setting up agent keystore file and generating CSR");
+
+        final File agentFile = PropertiesUtil.findConfigFile("agent.properties");
+        if (agentFile == null) {
+            return new Answer(cmd, false, "Failed to find agent.properties file");
+        }
+        final String keyStoreFile = agentFile.getParent() + "/" + KeyStoreUtils.KS_FILENAME;
+        final String csrFile = agentFile.getParent() + "/" + KeyStoreUtils.CSR_FILENAME;
+
+        String storedPassword = _shell.getPersistentProperty(null, KeyStoreUtils.KS_PASSPHRASE_PROPERTY);
+        if (Strings.isNullOrEmpty(storedPassword)) {
+            storedPassword = keyStorePassword;
+            _shell.setPersistentProperty(null, KeyStoreUtils.KS_PASSPHRASE_PROPERTY, storedPassword);
+        }
+
+        Script script = new Script(_keystoreSetupPath, 60000, s_logger);
+        script.add(agentFile.getAbsolutePath());
+        script.add(keyStoreFile);
+        script.add(storedPassword);
+        script.add(String.valueOf(validityDays));
+        script.add(csrFile);
+        String result = script.execute();
+        if (result != null) {
+            throw new CloudRuntimeException("Unable to setup keystore file");
+        }
+
+        final String csrString;
+        try {
+            csrString = FileUtils.readFileToString(new File(csrFile), Charset.defaultCharset());
+        } catch (IOException e) {
+            throw new CloudRuntimeException("Unable to read generated CSR file", e);
+        }
+        return new SetupKeystoreAnswer(csrString);
+    }
+
+    private Answer setupAgentCertificate(final SetupCertificateCommand cmd) {
+        final String certificate = cmd.getCertificate();
+        final String privateKey = cmd.getPrivateKey();
+        final String caCertificates = cmd.getCaCertificates();
+
+        s_logger.debug("Importing received certificate to agent's keystore");
+
+        final File agentFile = PropertiesUtil.findConfigFile("agent.properties");
+        if (agentFile == null) {
+            return new Answer(cmd, false, "Failed to find agent.properties file");
+        }
+        final String keyStoreFile = agentFile.getParent() + "/" + KeyStoreUtils.KS_FILENAME;
+        final String certFile = agentFile.getParent() + "/" + KeyStoreUtils.CERT_FILENAME;
+        final String privateKeyFile = agentFile.getParent() + "/" + KeyStoreUtils.PKEY_FILENAME;
+        final String caCertFile = agentFile.getParent() + "/" + KeyStoreUtils.CACERT_FILENAME;
+
+        try {
+            FileUtils.writeStringToFile(new File(certFile), certificate, Charset.defaultCharset());
+            FileUtils.writeStringToFile(new File(caCertFile), caCertificates, Charset.defaultCharset());
+            s_logger.debug("Saved received client certificate to: " + certFile);
+        } catch (IOException e) {
+            throw new CloudRuntimeException("Unable to save received agent client and ca certificates", e);
+        }
+
+        Script script = new Script(_keystoreCertImportPath, 60000, s_logger);
+        script.add(agentFile.getAbsolutePath());
+        script.add(keyStoreFile);
+        script.add(KeyStoreUtils.AGENT_MODE);
+        script.add(certFile);
+        script.add("");
+        script.add(caCertFile);
+        script.add("");
+        script.add(privateKeyFile);
+        script.add(privateKey);
+        String result = script.execute();
+        if (result != null) {
+            throw new CloudRuntimeException("Unable to import certificate into keystore file");
+        }
+        return new SetupCertificateAnswer(true);
+    }
+
+    private void processManagementServerList(final List<String> msList, final String lbAlgorithm, final Long lbCheckInterval) {
+        if (CollectionUtils.isNotEmpty(msList) && !Strings.isNullOrEmpty(lbAlgorithm)) {
+            try {
+                final String newMSHosts = String.format("%s%s%s", StringUtils.toCSVList(msList), IAgentShell.hostLbAlgorithmSeparator, lbAlgorithm);
+                _shell.setPersistentProperty(null, "host", newMSHosts);
+                _shell.setHosts(newMSHosts);
+                _shell.resetHostCounter();
+                s_logger.info("Processed new management server list: " + newMSHosts);
+            } catch (final Exception e) {
+                throw new CloudRuntimeException("Could not persist received management servers list", e);
+            }
+        }
+        if ("shuffle".equals(lbAlgorithm)) {
+            scheduleHostLBCheckerTask(0);
+        } else {
+            scheduleHostLBCheckerTask(_shell.getLbCheckerInterval(lbCheckInterval));
+        }
+    }
+
+    private Answer setupManagementServerList(final SetupMSListCommand cmd) {
+        processManagementServerList(cmd.getMsList(), cmd.getLbAlgorithm(), cmd.getLbCheckInterval());
+        return new SetupMSListAnswer(true);
+    }
+
     public void processResponse(final Response response, final Link link) {
         final Answer answer = response.getAnswer();
         if (s_logger.isDebugEnabled()) {
@@ -585,15 +833,16 @@ public void processResponse(final Response response, final Link link) {
     }
 
     public void processReadyCommand(final Command cmd) {
-
         final ReadyCommand ready = (ReadyCommand)cmd;
 
-        s_logger.info("Proccess agent ready command, agent id = " + ready.getHostId());
+        s_logger.info("Processing agent ready command, agent id = " + ready.getHostId());
         if (ready.getHostId() != null) {
             setId(ready.getHostId());
         }
-        s_logger.info("Ready command is processed: agent id = " + getId());
 
+        processManagementServerList(ready.getMsHostList(), ready.getLbAlgorithm(), ready.getLbCheckInterval());
+
+        s_logger.info("Ready command is processed for agent id = " + getId());
     }
 
     public void processOtherTask(final Task task) {
@@ -875,4 +1124,98 @@ public void doTask(final Task task) throws TaskExecutionException {
             }
         }
     }
+
+    /**
+     * Task stops the current agent and launches a new agent
+     * when there are no outstanding jobs in the agent's task queue
+     */
+    public class PostCertificateRenewalTask extends ManagedContextTimerTask {
+
+        private Agent agent;
+
+        public PostCertificateRenewalTask(final Agent agent) {
+            this.agent = agent;
+        }
+
+        @Override
+        protected void runInContext() {
+            while (true) {
+                try {
+                    if (_inProgress.get() == 0) {
+                        s_logger.debug("Running post certificate renewal task to restart services.");
+
+                        // Let the resource perform any post certificate renewal cleanups
+                        _resource.executeRequest(new PostCertificateRenewalCommand());
+
+                        IAgentShell shell = agent._shell;
+                        ServerResource resource = agent._resource.getClass().newInstance();
+
+                        // Stop current agent
+                        agent.cancelTasks();
+                        agent._reconnectAllowed = false;
+                        Runtime.getRuntime().removeShutdownHook(agent._shutdownThread);
+                        agent.stop(ShutdownCommand.Requested, "Restarting due to new X509 certificates");
+
+                        // Nullify references for GC
+                        agent._shell = null;
+                        agent._watchList = null;
+                        agent._shutdownThread = null;
+                        agent._controlListeners = null;
+                        agent = null;
+
+                        // Start a new agent instance
+                        shell.launchNewAgent(resource);
+                        return;
+                    }
+                    if (s_logger.isTraceEnabled()) {
+                        s_logger.debug("Other tasks are in progress, will retry post certificate renewal command after few seconds");
+                    }
+                    Thread.sleep(5000);
+                } catch (final Exception e) {
+                    s_logger.warn("Failed to execute post certificate renewal command:", e);
+                    break;
+                }
+            }
+        }
+    }
+
+    public class PreferredHostCheckerTask extends ManagedContextTimerTask {
+
+        @Override
+        protected void runInContext() {
+            try {
+                final String[] msList = _shell.getHosts();
+                if (msList == null || msList.length < 1) {
+                    return;
+                }
+                final String preferredHost  = msList[0];
+                final String connectedHost = _shell.getConnectedHost();
+                if (s_logger.isTraceEnabled()) {
+                    s_logger.trace("Running preferred host checker task, connected host=" + connectedHost + ", preferred host=" + preferredHost);
+                }
+                if (preferredHost != null && !preferredHost.equals(connectedHost) && _link != null) {
+                    boolean isHostUp = true;
+                    try (final Socket socket = new Socket()) {
+                        socket.connect(new InetSocketAddress(preferredHost, _shell.getPort()), 5000);
+                    } catch (final IOException e) {
+                        isHostUp = false;
+                        if (s_logger.isTraceEnabled()) {
+                            s_logger.trace("Host: " + preferredHost + " is not reachable");
+                        }
+                    }
+                    if (isHostUp && _link != null && _inProgress.get() == 0) {
+                        if (s_logger.isDebugEnabled()) {
+                            s_logger.debug("Preferred host " + preferredHost + " is found to be reachable, trying to reconnect");
+                        }
+                        _shell.resetHostCounter();
+                        reconnect(_link);
+                    }
+                }
+            } catch (Throwable t) {
+                s_logger.error("Error caught while attempting to connect to preferred host", t);
+            }
+        }
+
+    }
+
 }
diff --git a/agent/src/com/cloud/agent/AgentShell.java b/agent/src/com/cloud/agent/AgentShell.java
index 5e0da68c6d6..01654ac9caa 100644
--- a/agent/src/com/cloud/agent/AgentShell.java
+++ b/agent/src/com/cloud/agent/AgentShell.java
@@ -50,6 +50,7 @@
 import com.cloud.utils.backoff.BackoffAlgorithm;
 import com.cloud.utils.backoff.impl.ConstantTimeBackoff;
 import com.cloud.utils.exception.CloudRuntimeException;
+import com.google.common.base.Strings;
 
 public class AgentShell implements IAgentShell, Daemon {
     private static final Logger s_logger = Logger.getLogger(AgentShell.class.getName());
@@ -67,10 +68,14 @@
     private int _proxyPort;
     private int _workers;
     private String _guid;
+    private int _hostCounter = 0;
     private int _nextAgentId = 1;
     private volatile boolean _exit = false;
     private int _pingRetries;
     private final List<Agent> _agents = new ArrayList<Agent>();
+    private String hostToConnect;
+    private String connectedHost;
+    private Long preferredHostCheckInterval;
 
     public AgentShell() {
     }
@@ -106,8 +111,54 @@ public String getPod() {
     }
 
     @Override
-    public String getHost() {
-        return _host;
+    public String getNextHost() {
+        final String[] hosts = getHosts();
+        if (_hostCounter >= hosts.length) {
+            _hostCounter = 0;
+        }
+        hostToConnect = hosts[_hostCounter % hosts.length];
+        _hostCounter++;
+        return hostToConnect;
+    }
+
+    @Override
+    public String getConnectedHost() {
+        return connectedHost;
+    }
+
+    @Override
+    public long getLbCheckerInterval(final Long receivedLbInterval) {
+        if (preferredHostCheckInterval != null) {
+            return preferredHostCheckInterval * 1000L;
+        }
+        if (receivedLbInterval != null) {
+            return receivedLbInterval * 1000L;
+        }
+        return 0L;
+    }
+
+    @Override
+    public void updateConnectedHost() {
+        connectedHost = hostToConnect;
+    }
+
+
+    @Override
+    public void resetHostCounter() {
+        _hostCounter = 0;
+    }
+
+    @Override
+    public String[] getHosts() {
+        return _host.split(",");
+    }
+
+    @Override
+    public void setHosts(final String host) {
+        if (!Strings.isNullOrEmpty(host)) {
+            _host = host.split(hostLbAlgorithmSeparator)[0];
+            resetHostCounter();
+        }
     }
 
     @Override
@@ -240,7 +291,8 @@ protected boolean parseCommand(final String[] args) throws ConfigurationExceptio
         if (host == null) {
             host = "localhost";
         }
-        _host = host;
+
+        setHosts(host);
 
         if (zone != null)
             _zone = zone;
@@ -280,6 +332,9 @@ protected boolean parseCommand(final String[] args) throws ConfigurationExceptio
             _properties.setProperty("guid", _guid);
         }
 
+        String val = getProperty(null, preferredHostIntervalKey);
+        preferredHostCheckInterval = (Strings.isNullOrEmpty(val) ? null : Long.valueOf(val));
+
         return true;
     }
 
@@ -364,7 +419,7 @@ private void launchAgentFromClassInfo(String resourceClassNames) throws Configur
                 final Constructor<?> constructor = impl.getDeclaredConstructor();
                 constructor.setAccessible(true);
                 ServerResource resource = (ServerResource)constructor.newInstance();
-                launchAgent(getNextAgentId(), resource);
+                launchNewAgent(resource);
             } catch (final ClassNotFoundException e) {
                 throw new ConfigurationException("Resource class not found: " + name + " due to: " + e.toString());
             } catch (final SecurityException e) {
@@ -392,9 +447,10 @@ private void launchAgentFromTypeInfo() throws ConfigurationException {
         s_logger.trace("Launching agent based on type=" + typeInfo);
     }
 
-    private void launchAgent(int localAgentId, ServerResource resource) throws ConfigurationException {
+    public void launchNewAgent(ServerResource resource) throws ConfigurationException {
         // we don't track agent after it is launched for now
-        Agent agent = new Agent(this, localAgentId, resource);
+        _agents.clear();
+        Agent agent = new Agent(this, getNextAgentId(), resource);
         _agents.add(agent);
         agent.start();
     }
diff --git a/agent/src/com/cloud/agent/IAgentShell.java b/agent/src/com/cloud/agent/IAgentShell.java
index dde67381a4a..5d389a07041 100644
--- a/agent/src/com/cloud/agent/IAgentShell.java
+++ b/agent/src/com/cloud/agent/IAgentShell.java
@@ -19,36 +19,56 @@
 import java.util.Map;
 import java.util.Properties;
 
+import javax.naming.ConfigurationException;
+
+import com.cloud.resource.ServerResource;
 import com.cloud.utils.backoff.BackoffAlgorithm;
 
 public interface IAgentShell {
-    public Map<String, Object> getCmdLineProperties();
+    String hostLbAlgorithmSeparator = "@";
+    String preferredHostIntervalKey = "host.lb.check.interval";
+
+    Map<String, Object> getCmdLineProperties();
+
+    Properties getProperties();
+
+    String getPersistentProperty(String prefix, String name);
+
+    void setPersistentProperty(String prefix, String name, String value);
+
+    String getNextHost();
+
+    String getPrivateIp();
+
+    int getPort();
+
+    int getWorkers();
 
-    public Properties getProperties();
+    int getProxyPort();
 
-    public String getPersistentProperty(String prefix, String name);
+    String getGuid();
 
-    public void setPersistentProperty(String prefix, String name, String value);
+    String getZone();
 
-    public String getHost();
+    String getPod();
 
-    public String getPrivateIp();
+    BackoffAlgorithm getBackoffAlgorithm();
 
-    public int getPort();
+    int getPingRetries();
 
-    public int getWorkers();
+    String getVersion();
 
-    public int getProxyPort();
+    void setHosts(String hosts);
 
-    public String getGuid();
+    void resetHostCounter();
 
-    public String getZone();
+    String[] getHosts();
 
-    public String getPod();
+    long getLbCheckerInterval(Long receivedLbInterval);
 
-    public BackoffAlgorithm getBackoffAlgorithm();
+    void updateConnectedHost();
 
-    public int getPingRetries();
+    String getConnectedHost();
 
-    public String getVersion();
+    void launchNewAgent(ServerResource resource) throws ConfigurationException;
 }
diff --git a/agent/src/com/cloud/agent/dao/impl/PropertiesStorage.java b/agent/src/com/cloud/agent/dao/impl/PropertiesStorage.java
index df1b1ea7b27..a1db88c86c4 100644
--- a/agent/src/com/cloud/agent/dao/impl/PropertiesStorage.java
+++ b/agent/src/com/cloud/agent/dao/impl/PropertiesStorage.java
@@ -23,8 +23,6 @@
 import java.util.Map;
 import java.util.Properties;
 
-import javax.ejb.Local;
-
 import org.apache.commons.io.IOUtils;
 import org.apache.log4j.Logger;
 
@@ -37,7 +35,6 @@
  * @config {@table || Param Name | Description | Values | Default || || path |
  *         path to the properties _file | String | db/db.properties || * }
  **/
-@Local(value = {StorageComponent.class})
 public class PropertiesStorage implements StorageComponent {
     private static final Logger s_logger = Logger.getLogger(PropertiesStorage.class);
     Properties _properties = new Properties();
@@ -51,6 +48,9 @@ public synchronized String get(String key) {
 
     @Override
     public synchronized void persist(String key, String value) {
+        if (!loadFromFile(_file)) {
+            s_logger.error("Failed to load changes and then write to them");
+        }
         _properties.setProperty(key, value);
         FileOutputStream output = null;
         try {
@@ -65,6 +65,20 @@ public synchronized void persist(String key, String value) {
         }
     }
 
+    private synchronized boolean loadFromFile(final File file) {
+        try {
+            PropertiesUtil.loadFromFile(_properties, file);
+            _file = file;
+        } catch (FileNotFoundException e) {
+            s_logger.error("How did we get here? ", e);
+            return false;
+        } catch (IOException e) {
+            s_logger.error("IOException: ", e);
+            return false;
+        }
+        return true;
+    }
+
     @Override
     public synchronized boolean configure(String name, Map<String, Object> params) {
         _name = name;
@@ -86,17 +100,7 @@ public synchronized boolean configure(String name, Map<String, Object> params) {
                 return false;
             }
         }
-        try {
-            PropertiesUtil.loadFromFile(_properties, file);
-            _file = file;
-        } catch (FileNotFoundException e) {
-            s_logger.error("How did we get here? ", e);
-            return false;
-        } catch (IOException e) {
-            s_logger.error("IOException: ", e);
-            return false;
-        }
-        return true;
+        return loadFromFile(file);
     }
 
     @Override
diff --git a/agent/src/com/cloud/agent/dhcp/FakeDhcpSnooper.java b/agent/src/com/cloud/agent/dhcp/FakeDhcpSnooper.java
index 8509b438f5b..c42a5af814d 100644
--- a/agent/src/com/cloud/agent/dhcp/FakeDhcpSnooper.java
+++ b/agent/src/com/cloud/agent/dhcp/FakeDhcpSnooper.java
@@ -24,7 +24,6 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentLinkedQueue;
 
-import javax.ejb.Local;
 import javax.naming.ConfigurationException;
 
 import org.apache.log4j.Logger;
@@ -32,7 +31,6 @@
 import com.cloud.utils.Pair;
 import com.cloud.utils.net.NetUtils;
 
-@Local(value = {DhcpSnooper.class})
 public class FakeDhcpSnooper implements DhcpSnooper {
     private static final Logger s_logger = Logger.getLogger(FakeDhcpSnooper.class);
     private Queue<String> _ipAddresses = new ConcurrentLinkedQueue<String>();
diff --git a/agent/src/com/cloud/agent/direct/download/DirectTemplateDownloader.java b/agent/src/com/cloud/agent/direct/download/DirectTemplateDownloader.java
new file mode 100644
index 00000000000..a88b4526e9d
--- /dev/null
+++ b/agent/src/com/cloud/agent/direct/download/DirectTemplateDownloader.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.agent.direct.download;
+
+public interface DirectTemplateDownloader {
+
+    class DirectTemplateInformation {
+        private String installPath;
+        private Long size;
+        private String checksum;
+
+        public DirectTemplateInformation(String installPath, Long size, String checksum) {
+            this.installPath = installPath;
+            this.size = size;
+            this.checksum = checksum;
+        }
+
+        public String getInstallPath() {
+            return installPath;
+        }
+
+        public Long getSize() {
+            return size;
+        }
+
+        public String getChecksum() {
+            return checksum;
+        }
+    }
+
+    /**
+     * Perform template download to pool specified on downloader creation
+     * @return true if successful, false if not
+     */
+    boolean downloadTemplate();
+
+    /**
+     * Perform extraction (if necessary) and installation of previously downloaded template
+     * @return true if successful, false if not
+     */
+    boolean extractAndInstallDownloadedTemplate();
+
+    /**
+     * Get template information after it is properly installed on pool
+     * @return template information
+     */
+    DirectTemplateInformation getTemplateInformation();
+
+    /**
+     * Perform checksum validation of previously downloadeed template
+     * @return true if successful, false if not
+     */
+    boolean validateChecksum();
+}
diff --git a/agent/src/com/cloud/agent/direct/download/DirectTemplateDownloaderImpl.java b/agent/src/com/cloud/agent/direct/download/DirectTemplateDownloaderImpl.java
new file mode 100644
index 00000000000..419ab7d1bbd
--- /dev/null
+++ b/agent/src/com/cloud/agent/direct/download/DirectTemplateDownloaderImpl.java
@@ -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.
+//
+package com.cloud.agent.direct.download;
+
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.script.Script;
+import org.apache.cloudstack.utils.security.DigestHelper;
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
+import java.util.UUID;
+
+public abstract class DirectTemplateDownloaderImpl implements DirectTemplateDownloader {
+
+    private String url;
+    private String destPoolPath;
+    private Long templateId;
+    private String downloadedFilePath;
+    private String installPath;
+    private String checksum;
+    private boolean redownload = false;
+    public static final Logger s_logger = Logger.getLogger(DirectTemplateDownloaderImpl.class.getName());
+
+    protected DirectTemplateDownloaderImpl(final String url, final String destPoolPath, final Long templateId, final String checksum) {
+        this.url = url;
+        this.destPoolPath = destPoolPath;
+        this.templateId = templateId;
+        this.checksum = checksum;
+    }
+
+    private static String directDownloadDir = "template";
+
+    /**
+     * Return direct download temporary path to download template
+     */
+    protected static String getDirectDownloadTempPath(Long templateId) {
+        String templateIdAsString = String.valueOf(templateId);
+        return directDownloadDir + File.separator + templateIdAsString.substring(0,1) +
+                File.separator + templateIdAsString;
+    }
+
+    /**
+     * Create folder on path if it does not exist
+     */
+    protected void createFolder(String path) {
+        File dir = new File(path);
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getDestPoolPath() {
+        return destPoolPath;
+    }
+
+    public Long getTemplateId() {
+        return templateId;
+    }
+
+    public String getDownloadedFilePath() {
+        return downloadedFilePath;
+    }
+
+    public void setDownloadedFilePath(String filePath) {
+        this.downloadedFilePath = filePath;
+    }
+
+    public String getChecksum() {
+        return checksum;
+    }
+
+    public void setChecksum(String checksum) {
+        this.checksum = checksum;
+    }
+
+    public boolean isRedownload() {
+        return redownload;
+    }
+
+    /**
+     * Return filename from url
+     */
+    public String getFileNameFromUrl() {
+        String[] urlParts = url.split("/");
+        return urlParts[urlParts.length - 1];
+    }
+
+    /**
+     * Checks if downloaded template is extractable
+     * @return true if it should be extracted, false if not
+     */
+    private boolean isTemplateExtractable() {
+        String type = Script.runSimpleBashScript("file " + downloadedFilePath + " | awk -F' ' '{print $2}'");
+        return type.equalsIgnoreCase("bzip2") || type.equalsIgnoreCase("gzip") || type.equalsIgnoreCase("zip");
+    }
+
+    @Override
+    public boolean extractAndInstallDownloadedTemplate() {
+        installPath = UUID.randomUUID().toString();
+        if (isTemplateExtractable()) {
+            extractDownloadedTemplate();
+        } else {
+            Script.runSimpleBashScript("mv " + downloadedFilePath + " " + getInstallFullPath());
+        }
+        return true;
+    }
+
+    /**
+     * Return install full path
+     */
+    private String getInstallFullPath() {
+        return destPoolPath + File.separator + installPath;
+    }
+
+    /**
+     * Return extract command to execute given downloaded file
+     */
+    private String getExtractCommandForDownloadedFile() {
+        if (downloadedFilePath.endsWith(".zip")) {
+            return "unzip -p " + downloadedFilePath + " | cat > " + getInstallFullPath();
+        } else if (downloadedFilePath.endsWith(".bz2")) {
+            return "bunzip2 -c " + downloadedFilePath + " > " + getInstallFullPath();
+        } else if (downloadedFilePath.endsWith(".gz")) {
+            return "gunzip -c " + downloadedFilePath + " > " + getInstallFullPath();
+        } else {
+            throw new CloudRuntimeException("Unable to extract template " + templateId + " on " + downloadedFilePath);
+        }
+    }
+
+    /**
+     * Extract downloaded template into installPath, remove compressed file
+     */
+    private void extractDownloadedTemplate() {
+        String extractCommand = getExtractCommandForDownloadedFile();
+        Script.runSimpleBashScript(extractCommand);
+        Script.runSimpleBashScript("rm -f " + downloadedFilePath);
+    }
+
+    @Override
+    public DirectTemplateInformation getTemplateInformation() {
+        String sizeResult = Script.runSimpleBashScript("ls -als " + getInstallFullPath() + " | awk '{print $1}'");
+        long size = Long.parseLong(sizeResult);
+        return new DirectTemplateInformation(installPath, size, checksum);
+    }
+
+    @Override
+    public boolean validateChecksum() {
+        if (StringUtils.isNotBlank(checksum)) {
+            int retry = 3;
+            boolean valid = false;
+            try {
+                while (!valid && retry > 0) {
+                    retry--;
+                    s_logger.info("Performing checksum validation for downloaded template " + templateId + " using " + checksum + ", retries left: " + retry);
+                    valid = DigestHelper.check(checksum, new FileInputStream(downloadedFilePath));
+                    if (!valid && retry > 0) {
+                        s_logger.info("Checksum validation failded, re-downloading template");
+                        redownload = true;
+                        resetDownloadFile();
+                        downloadTemplate();
+                    }
+                }
+                s_logger.info("Checksum validation for template " + templateId + ": " + (valid ? "succeeded" : "failed"));
+                return valid;
+            } catch (IOException e) {
+                throw new CloudRuntimeException("could not check sum for file: " + downloadedFilePath, e);
+            } catch (NoSuchAlgorithmException e) {
+                throw new CloudRuntimeException("Unknown checksum algorithm: " + checksum, e);
+            }
+        }
+        s_logger.info("No checksum provided, skipping checksum validation");
+        return true;
+    }
+
+    /**
+     * Delete and create download file
+     */
+    private void resetDownloadFile() {
+        File f = new File(getDownloadedFilePath());
+        s_logger.info("Resetting download file: " + getDownloadedFilePath() + ", in order to re-download and persist template " + templateId + " on it");
+        try {
+            if (f.exists()) {
+                f.delete();
+            }
+            f.createNewFile();
+        } catch (IOException e) {
+            s_logger.error("Error creating file to download on: " + getDownloadedFilePath() + " due to: " + e.getMessage());
+            throw new CloudRuntimeException("Failed to create download file for direct download");
+        }
+    }
+
+}
diff --git a/agent/src/com/cloud/agent/direct/download/HttpDirectTemplateDownloader.java b/agent/src/com/cloud/agent/direct/download/HttpDirectTemplateDownloader.java
new file mode 100644
index 00000000000..147ccabf8fc
--- /dev/null
+++ b/agent/src/com/cloud/agent/direct/download/HttpDirectTemplateDownloader.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.agent.direct.download;
+
+import com.cloud.utils.exception.CloudRuntimeException;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.io.IOUtils;
+import org.apache.log4j.Logger;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class HttpDirectTemplateDownloader extends DirectTemplateDownloaderImpl {
+
+    protected HttpClient client;
+    private static final MultiThreadedHttpConnectionManager s_httpClientManager = new MultiThreadedHttpConnectionManager();
+    public static final Logger s_logger = Logger.getLogger(HttpDirectTemplateDownloader.class.getName());
+    protected GetMethod request;
+    protected Map<String, String> reqHeaders = new HashMap<>();
+
+    public HttpDirectTemplateDownloader(String url, Long templateId, String destPoolPath, String checksum, Map<String, String> headers) {
+        super(url, destPoolPath, templateId, checksum);
+        s_httpClientManager.getParams().setConnectionTimeout(5000);
+        s_httpClientManager.getParams().setSoTimeout(5000);
+        client = new HttpClient(s_httpClientManager);
+        request = createRequest(url, headers);
+        String downloadDir = getDirectDownloadTempPath(templateId);
+        createTemporaryDirectoryAndFile(downloadDir);
+    }
+
+    protected void createTemporaryDirectoryAndFile(String downloadDir) {
+        createFolder(getDestPoolPath() + File.separator + downloadDir);
+        File f = new File(getDestPoolPath() + File.separator + downloadDir + File.separator + getFileNameFromUrl());
+        setDownloadedFilePath(f.getAbsolutePath());
+    }
+
+    protected GetMethod createRequest(String downloadUrl, Map<String, String> headers) {
+        GetMethod request = new GetMethod(downloadUrl);
+        request.setFollowRedirects(true);
+        if (MapUtils.isNotEmpty(headers)) {
+            for (String key : headers.keySet()) {
+                request.setRequestHeader(key, headers.get(key));
+                reqHeaders.put(key, headers.get(key));
+            }
+        }
+        return request;
+    }
+
+    @Override
+    public boolean downloadTemplate() {
+        try {
+            int status = client.executeMethod(request);
+            if (status != HttpStatus.SC_OK) {
+                s_logger.warn("Not able to download template, status code: " + status);
+                return false;
+            }
+            return performDownload();
+        } catch (IOException e) {
+            throw new CloudRuntimeException("Error on HTTP request: " + e.getMessage());
+        } finally {
+            request.releaseConnection();
+        }
+    }
+
+    protected boolean performDownload() {
+        s_logger.info("Downloading template " + getTemplateId() + " from " + getUrl() + " to: " + getDownloadedFilePath());
+        try (
+                InputStream in = request.getResponseBodyAsStream();
+                OutputStream out = new FileOutputStream(getDownloadedFilePath());
+        ) {
+            IOUtils.copy(in, out);
+        } catch (IOException e) {
+            s_logger.error("Error downloading template " + getTemplateId() + " due to: " + e.getMessage());
+            return false;
+        }
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/agent/src/com/cloud/agent/direct/download/HttpsDirectTemplateDownloader.java b/agent/src/com/cloud/agent/direct/download/HttpsDirectTemplateDownloader.java
new file mode 100644
index 00000000000..38f59837cd8
--- /dev/null
+++ b/agent/src/com/cloud/agent/direct/download/HttpsDirectTemplateDownloader.java
@@ -0,0 +1,129 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT 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.direct.download;
+
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.script.Script;
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.commons.collections.MapUtils;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpUriRequest;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.ssl.SSLContexts;
+
+import javax.net.ssl.SSLContext;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.FileOutputStream;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.util.Map;
+
+public class HttpsDirectTemplateDownloader extends HttpDirectTemplateDownloader {
+
+    private CloseableHttpClient httpsClient;
+    private HttpUriRequest req;
+
+    public HttpsDirectTemplateDownloader(String url, Long templateId, String destPoolPath, String checksum, Map<String, String> headers) {
+        super(url, templateId, destPoolPath, checksum, headers);
+        SSLContext sslcontext = null;
+        try {
+            sslcontext = getSSLContext();
+        } catch (KeyStoreException | NoSuchAlgorithmException | CertificateException | IOException | KeyManagementException e) {
+            throw new CloudRuntimeException("Failure getting SSL context for HTTPS downloader: " + e.getMessage());
+        }
+        SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(sslcontext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+        RequestConfig config = RequestConfig.custom()
+                .setConnectTimeout(5000)
+                .setConnectionRequestTimeout(5000)
+                .setSocketTimeout(5000).build();
+        httpsClient = HttpClients.custom().setSSLSocketFactory(factory).setDefaultRequestConfig(config).build();
+        createUriRequest(url, headers);
+    }
+
+    protected void createUriRequest(String downloadUrl, Map<String, String> headers) {
+        req = new HttpGet(downloadUrl);
+        if (MapUtils.isNotEmpty(headers)) {
+            for (String headerKey: headers.keySet()) {
+                req.setHeader(headerKey, headers.get(headerKey));
+            }
+        }
+    }
+
+    private SSLContext getSSLContext() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, KeyManagementException {
+        KeyStore trustStore  = KeyStore.getInstance("jks");
+        FileInputStream instream = new FileInputStream(new File("/etc/cloudstack/agent/cloud.jks"));
+        try {
+            String privatePasswordFormat = "sed -n '/keystore.passphrase/p' '%s' 2>/dev/null  | sed 's/keystore.passphrase=//g' 2>/dev/null";
+            String privatePasswordCmd = String.format(privatePasswordFormat, "/etc/cloudstack/agent/agent.properties");
+            String privatePassword = Script.runSimpleBashScript(privatePasswordCmd);
+            trustStore.load(instream, privatePassword.toCharArray());
+        } finally {
+            instream.close();
+        }
+        return SSLContexts.custom()
+                .loadTrustMaterial(trustStore, new TrustSelfSignedStrategy())
+                .build();
+    }
+
+    @Override
+    public boolean downloadTemplate() {
+        CloseableHttpResponse response;
+        try {
+            response = httpsClient.execute(req);
+        } catch (IOException e) {
+            throw new CloudRuntimeException("Error on HTTPS request: " + e.getMessage());
+        }
+        return consumeResponse(response);
+    }
+
+    /**
+     * Consume response and persist it on getDownloadedFilePath() file
+     */
+    protected boolean consumeResponse(CloseableHttpResponse response) {
+        s_logger.info("Downloading template " + getTemplateId() + " from " + getUrl() + " to: " + getDownloadedFilePath());
+        if (response.getStatusLine().getStatusCode() != 200) {
+            throw new CloudRuntimeException("Error on HTTPS response");
+        }
+        try {
+            HttpEntity entity = response.getEntity();
+            InputStream in = entity.getContent();
+            OutputStream out = new FileOutputStream(getDownloadedFilePath());
+            IOUtils.copy(in, out);
+        } catch (Exception e) {
+            s_logger.error("Error parsing response for template " + getTemplateId() + " due to: " + e.getMessage());
+            return false;
+        }
+        return true;
+    }
+
+}
diff --git a/agent/src/com/cloud/agent/direct/download/MetalinkDirectTemplateDownloader.java b/agent/src/com/cloud/agent/direct/download/MetalinkDirectTemplateDownloader.java
new file mode 100644
index 00000000000..2fd8ba03611
--- /dev/null
+++ b/agent/src/com/cloud/agent/direct/download/MetalinkDirectTemplateDownloader.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.direct.download;
+
+import com.cloud.utils.UriUtils;
+import com.cloud.utils.exception.CloudRuntimeException;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+public class MetalinkDirectTemplateDownloader extends HttpDirectTemplateDownloader {
+
+    private String metalinkUrl;
+    private List<String> metalinkUrls;
+    private List<String> metalinkChecksums;
+    private Random random = new Random();
+    private static final Logger s_logger = Logger.getLogger(MetalinkDirectTemplateDownloader.class.getName());
+
+    public MetalinkDirectTemplateDownloader(String url, String destPoolPath, Long templateId, String checksum, Map<String, String> headers) {
+        super(url, templateId, destPoolPath, checksum, headers);
+        metalinkUrl = url;
+        metalinkUrls = UriUtils.getMetalinkUrls(metalinkUrl);
+        metalinkChecksums = UriUtils.getMetalinkChecksums(metalinkUrl);
+        if (CollectionUtils.isEmpty(metalinkUrls)) {
+            throw new CloudRuntimeException("No urls found on metalink file: " + metalinkUrl + ". Not possible to download template " + templateId);
+        }
+        setUrl(metalinkUrls.get(0));
+        s_logger.info("Metalink downloader created, metalink url: " + metalinkUrl + " parsed - " +
+                metalinkUrls.size() + " urls and " +
+                (CollectionUtils.isNotEmpty(metalinkChecksums) ? metalinkChecksums.size() : "0") + " checksums found");
+    }
+
+    @Override
+    public boolean downloadTemplate() {
+        if (StringUtils.isBlank(getUrl())) {
+            throw new CloudRuntimeException("Download url has not been set, aborting");
+        }
+        String downloadDir = getDirectDownloadTempPath(getTemplateId());
+        boolean downloaded = false;
+        int i = 0;
+        do {
+            if (!isRedownload()) {
+                setUrl(metalinkUrls.get(i));
+            }
+            s_logger.info("Trying to download template from url: " + getUrl());
+            try {
+                File f = new File(getDestPoolPath() + File.separator + downloadDir + File.separator + getFileNameFromUrl());
+                if (f.exists()) {
+                    f.delete();
+                    f.createNewFile();
+                }
+                setDownloadedFilePath(f.getAbsolutePath());
+                request = createRequest(getUrl(), reqHeaders);
+                downloaded = super.downloadTemplate();
+                if (downloaded) {
+                    s_logger.info("Successfully downloaded template from url: " + getUrl());
+                }
+
+            } catch (Exception e) {
+                s_logger.error("Error downloading template: " + getTemplateId() + " from " + getUrl() + ": " + e.getMessage());
+            }
+            i++;
+        }
+        while (!downloaded && !isRedownload() && i < metalinkUrls.size());
+        return downloaded;
+    }
+
+    @Override
+    public boolean validateChecksum() {
+        if (StringUtils.isBlank(getChecksum()) && CollectionUtils.isNotEmpty(metalinkChecksums)) {
+            String chk = metalinkChecksums.get(random.nextInt(metalinkChecksums.size()));
+            setChecksum(chk);
+            s_logger.info("Checksum not provided but " + metalinkChecksums.size() + " found on metalink file, performing checksum using one of them: " + chk);
+        }
+        return super.validateChecksum();
+    }
+}
diff --git a/agent/src/com/cloud/agent/direct/download/NfsDirectTemplateDownloader.java b/agent/src/com/cloud/agent/direct/download/NfsDirectTemplateDownloader.java
new file mode 100644
index 00000000000..16901afedf1
--- /dev/null
+++ b/agent/src/com/cloud/agent/direct/download/NfsDirectTemplateDownloader.java
@@ -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.
+//
+package com.cloud.agent.direct.download;
+
+import com.cloud.utils.UriUtils;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.script.Script;
+
+import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.UUID;
+
+public class NfsDirectTemplateDownloader extends DirectTemplateDownloaderImpl {
+
+    private String srcHost;
+    private String srcPath;
+
+    private static final String mountCommand = "mount -t nfs %s %s";
+
+    /**
+     * Parse url and set srcHost and srcPath
+     */
+    private void parseUrl() {
+        URI uri = null;
+        String url = getUrl();
+        try {
+            uri = new URI(UriUtils.encodeURIComponent(url));
+            if (uri.getScheme() != null && uri.getScheme().equalsIgnoreCase("nfs")) {
+                srcHost = uri.getHost();
+                srcPath = uri.getPath();
+            }
+        } catch (URISyntaxException e) {
+            throw new CloudRuntimeException("Invalid NFS url " + url + " caused error: " + e.getMessage());
+        }
+    }
+
+    public NfsDirectTemplateDownloader(String url, String destPool, Long templateId, String checksum) {
+        super(url, destPool, templateId, checksum);
+        parseUrl();
+    }
+
+    @Override
+    public boolean downloadTemplate() {
+        String mountSrcUuid = UUID.randomUUID().toString();
+        String mount = String.format(mountCommand, srcHost + ":" + srcPath, "/mnt/" + mountSrcUuid);
+        Script.runSimpleBashScript(mount);
+        String downloadDir = getDestPoolPath() + File.separator + getDirectDownloadTempPath(getTemplateId());
+        setDownloadedFilePath(downloadDir + File.separator + getFileNameFromUrl());
+        Script.runSimpleBashScript("cp /mnt/" + mountSrcUuid + srcPath + " " + getDownloadedFilePath());
+        Script.runSimpleBashScript("umount /mnt/" + mountSrcUuid);
+        return true;
+    }
+}
diff --git a/agent/src/com/cloud/agent/resource/DummyResource.java b/agent/src/com/cloud/agent/resource/DummyResource.java
index c0167f63598..fe519ca9497 100644
--- a/agent/src/com/cloud/agent/resource/DummyResource.java
+++ b/agent/src/com/cloud/agent/resource/DummyResource.java
@@ -22,8 +22,6 @@
 import java.util.Map;
 import java.util.UUID;
 
-import javax.ejb.Local;
-
 import com.cloud.agent.IAgentControl;
 import com.cloud.agent.api.Answer;
 import com.cloud.agent.api.CheckNetworkAnswer;
@@ -43,7 +41,6 @@
 import com.cloud.storage.Storage.StoragePoolType;
 import com.cloud.utils.StringUtils;
 
-@Local(value = {ServerResource.class})
 public class DummyResource implements ServerResource {
     String _name;
     Host.Type _type;
diff --git a/agent/src/com/cloud/agent/resource/consoleproxy/ConsoleProxyResource.java b/agent/src/com/cloud/agent/resource/consoleproxy/ConsoleProxyResource.java
index 08f09823986..b3b17e7d970 100644
--- a/agent/src/com/cloud/agent/resource/consoleproxy/ConsoleProxyResource.java
+++ b/agent/src/com/cloud/agent/resource/consoleproxy/ConsoleProxyResource.java
@@ -32,11 +32,8 @@
 
 import javax.naming.ConfigurationException;
 
-import org.apache.log4j.Logger;
-
-import com.google.gson.Gson;
-
 import org.apache.cloudstack.managed.context.ManagedContextRunnable;
+import org.apache.log4j.Logger;
 
 import com.cloud.agent.Agent.ExitStatus;
 import com.cloud.agent.api.AgentControlAnswer;
@@ -62,8 +59,10 @@
 import com.cloud.resource.ServerResource;
 import com.cloud.resource.ServerResourceBase;
 import com.cloud.utils.NumbersUtil;
+import com.cloud.utils.ReflectUtil;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.utils.script.Script;
+import com.google.gson.Gson;
 
 /**
  *
@@ -240,9 +239,11 @@ public boolean configure(String name, Map<String, Object> params) throws Configu
         _proxyVmId = NumbersUtil.parseLong(value, 0);
 
         if (_localgw != null) {
-            String mgmtHost = (String)params.get("host");
+            String mgmtHosts = (String)params.get("host");
             if (_eth1ip != null) {
-                addRouteToInternalIpOrCidr(_localgw, _eth1ip, _eth1mask, mgmtHost);
+                for (final String mgmtHost : mgmtHosts.split(",")) {
+                    addRouteToInternalIpOrCidr(_localgw, _eth1ip, _eth1mask, mgmtHost);
+                }
                 String internalDns1 = (String) params.get("internaldns1");
                 if (internalDns1 == null) {
                     s_logger.warn("No DNS entry found during configuration of NfsSecondaryStorage");
@@ -275,12 +276,12 @@ private void addRouteToInternalIpOrCidr(String localgw, String eth1ip, String et
             s_logger.debug("addRouteToInternalIp: destIp is null");
             return;
         }
-        if (!NetUtils.isValidIp(destIpOrCidr) && !NetUtils.isValidCIDR(destIpOrCidr)) {
+        if (!NetUtils.isValidIp4(destIpOrCidr) && !NetUtils.isValidIp4Cidr(destIpOrCidr)) {
             s_logger.warn(" destIp is not a valid ip address or cidr destIp=" + destIpOrCidr);
             return;
         }
         boolean inSameSubnet = false;
-        if (NetUtils.isValidIp(destIpOrCidr)) {
+        if (NetUtils.isValidIp4(destIpOrCidr)) {
             if (eth1ip != null && eth1mask != null) {
                 inSameSubnet = NetUtils.sameSubnet(eth1ip, destIpOrCidr, eth1mask);
             } else {
@@ -315,20 +316,19 @@ public String getName() {
 
     private void launchConsoleProxy(final byte[] ksBits, final String ksPassword, final String encryptorPassword) {
         final Object resource = this;
+        s_logger.info("Building class loader for com.cloud.consoleproxy.ConsoleProxy");
+        final ClassLoader loader = ReflectUtil.getClassLoaderForName("console-proxy");
         if (_consoleProxyMain == null) {
+            s_logger.info("Running com.cloud.consoleproxy.ConsoleProxy with encryptor password=" + encryptorPassword);
             _consoleProxyMain = new Thread(new ManagedContextRunnable() {
                 @Override
                 protected void runInContext() {
                     try {
-                        Class<?> consoleProxyClazz = Class.forName("com.cloud.consoleproxy.ConsoleProxy");
+                        Class<?> consoleProxyClazz = loader.loadClass("com.cloud.consoleproxy.ConsoleProxy");
                         try {
-                            s_logger.info("Invoke setEncryptorPassword(), ecnryptorPassword: " + encryptorPassword);
-                            Method methodSetup = consoleProxyClazz.getMethod("setEncryptorPassword", String.class);
-                            methodSetup.invoke(null, encryptorPassword);
-
                             s_logger.info("Invoke startWithContext()");
-                            Method method = consoleProxyClazz.getMethod("startWithContext", Properties.class, Object.class, byte[].class, String.class);
-                            method.invoke(null, _properties, resource, ksBits, ksPassword);
+                            Method method = consoleProxyClazz.getMethod("startWithContext", Properties.class, Object.class, byte[].class, String.class, String.class);
+                            method.invoke(null, _properties, resource, ksBits, ksPassword, encryptorPassword);
                         } catch (SecurityException e) {
                             s_logger.error("Unable to launch console proxy due to SecurityException", e);
                             System.exit(ExitStatus.Error.value());
@@ -357,7 +357,7 @@ protected void runInContext() {
             s_logger.info("com.cloud.consoleproxy.ConsoleProxy is already running");
 
             try {
-                Class<?> consoleProxyClazz = Class.forName("com.cloud.consoleproxy.ConsoleProxy");
+                Class<?> consoleProxyClazz = loader.loadClass("com.cloud.consoleproxy.ConsoleProxy");
                 Method methodSetup = consoleProxyClazz.getMethod("setEncryptorPassword", String.class);
                 methodSetup.invoke(null, encryptorPassword);
             } catch (SecurityException e) {
diff --git a/agent/test/com/cloud/agent/AgentShellTest.java b/agent/test/com/cloud/agent/AgentShellTest.java
index 5baa7bf800e..868293c8977 100644
--- a/agent/test/com/cloud/agent/AgentShellTest.java
+++ b/agent/test/com/cloud/agent/AgentShellTest.java
@@ -16,6 +16,8 @@
 // under the License.
 package com.cloud.agent;
 
+import java.util.Arrays;
+import java.util.List;
 import java.util.UUID;
 
 import javax.naming.ConfigurationException;
@@ -23,6 +25,8 @@
 import org.junit.Assert;
 import org.junit.Test;
 
+import com.cloud.utils.StringUtils;
+
 public class AgentShellTest {
     @Test
     public void parseCommand() throws ConfigurationException {
@@ -31,7 +35,7 @@ public void parseCommand() throws ConfigurationException {
         shell.parseCommand(new String[] {"port=55555", "threads=4", "host=localhost", "pod=pod1", "guid=" + anyUuid, "zone=zone1"});
         Assert.assertEquals(55555, shell.getPort());
         Assert.assertEquals(4, shell.getWorkers());
-        Assert.assertEquals("localhost", shell.getHost());
+        Assert.assertEquals("localhost", shell.getNextHost());
         Assert.assertEquals(anyUuid.toString(), shell.getGuid());
         Assert.assertEquals("pod1", shell.getPod());
         Assert.assertEquals("zone1", shell.getZone());
@@ -44,4 +48,15 @@ public void loadProperties() throws ConfigurationException {
         Assert.assertNotNull(shell.getProperties());
         Assert.assertFalse(shell.getProperties().entrySet().isEmpty());
     }
+
+    @Test
+    public void testGetHost() {
+        AgentShell shell = new AgentShell();
+        List<String> hosts = Arrays.asList("10.1.1.1", "20.2.2.2", "30.3.3.3", "2001:db8::1");
+        shell.setHosts(StringUtils.listToCsvTags(hosts));
+        for (String host : hosts) {
+            Assert.assertEquals(host, shell.getNextHost());
+        }
+        Assert.assertEquals(shell.getNextHost(), hosts.get(0));
+    }
 }
diff --git a/agent/test/com/cloud/agent/direct/download/DirectTemplateDownloaderImplTest.java b/agent/test/com/cloud/agent/direct/download/DirectTemplateDownloaderImplTest.java
new file mode 100644
index 00000000000..b244d02f499
--- /dev/null
+++ b/agent/test/com/cloud/agent/direct/download/DirectTemplateDownloaderImplTest.java
@@ -0,0 +1,36 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT 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.direct.download;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.runners.MockitoJUnitRunner;
+
+@RunWith(MockitoJUnitRunner.class)
+public class DirectTemplateDownloaderImplTest {
+
+    private static final Long templateId = 202l;
+
+    @Test
+    public void testGetDirectDownloadTempPath() {
+        String path = DirectTemplateDownloaderImpl.getDirectDownloadTempPath(templateId);
+        Assert.assertEquals("template/2/202", path);
+    }
+}
diff --git a/api/pom.xml b/api/pom.xml
index d9be0a1877e..b0a8c160f50 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -23,7 +23,7 @@
   <parent>
     <groupId>org.apache.cloudstack</groupId>
     <artifactId>cloudstack</artifactId>
-    <version>4.9.4.0-SNAPSHOT</version>
+    <version>4.11.1.0-SNAPSHOT</version>
   </parent>
   <dependencies>
     <dependency>
@@ -51,6 +51,21 @@
       <artifactId>cloud-framework-config</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.cloudstack</groupId>
+      <artifactId>cloud-framework-ca</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+      <version>${cs.commons-lang3.version}</version>
+    </dependency>
+    <dependency>
+        <groupId>org.apache.cloudstack</groupId>
+        <artifactId>cloud-framework-direct-download</artifactId>
+        <version>${project.version}</version>
+    </dependency>
   </dependencies>
   <build>
     <plugins>
diff --git a/api/resources/META-INF/cloudstack/api-config/spring-api-config-context.xml b/api/resources/META-INF/cloudstack/api-config/spring-api-config-context.xml
index 2cd12663072..5ea32464ee9 100644
--- a/api/resources/META-INF/cloudstack/api-config/spring-api-config-context.xml
+++ b/api/resources/META-INF/cloudstack/api-config/spring-api-config-context.xml
@@ -21,10 +21,10 @@
        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-3.0.xsd
-                      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
+                      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-3.0.xsd"
+                      http://www.springframework.org/schema/context/spring-context.xsd"
                       >
 
     <bean id="apiServiceConfiguration" class="org.apache.cloudstack.config.ApiServiceConfiguration" />
diff --git a/api/resources/META-INF/cloudstack/api-planner/spring-api-planner-context.xml b/api/resources/META-INF/cloudstack/api-planner/spring-api-planner-context.xml
index 2fd34a8ee0a..8523daf1d21 100644
--- a/api/resources/META-INF/cloudstack/api-planner/spring-api-planner-context.xml
+++ b/api/resources/META-INF/cloudstack/api-planner/spring-api-planner-context.xml
@@ -21,10 +21,10 @@
        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-3.0.xsd
-                      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
+                      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-3.0.xsd"
+                      http://www.springframework.org/schema/context/spring-context.xsd"
                       >
 
     <bean id="UserDispersingPlanner" class="com.cloud.deploy.UserDispersingPlanner">
diff --git a/api/src/com/cloud/agent/api/BadCommand.java b/api/src/com/cloud/agent/api/BadCommand.java
new file mode 100644
index 00000000000..55976f64185
--- /dev/null
+++ b/api/src/com/cloud/agent/api/BadCommand.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.agent.api;
+
+public class BadCommand extends Command {
+
+    @Override
+    public boolean executeInSequence() {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public BadCommand(){
+        super();
+    }
+}
diff --git a/api/src/com/cloud/agent/api/storage/OVFHelper.java b/api/src/com/cloud/agent/api/storage/OVFHelper.java
new file mode 100644
index 00000000000..85d4030b215
--- /dev/null
+++ b/api/src/com/cloud/agent/api/storage/OVFHelper.java
@@ -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.
+package com.cloud.agent.api.storage;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Transformer;
+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.configuration.Resource.ResourceType;
+import com.cloud.exception.InternalErrorException;
+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.NodeList;
+import org.xml.sax.SAXException;
+
+import com.cloud.agent.api.to.DatadiskTO;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public class OVFHelper {
+    private static final Logger s_logger = Logger.getLogger(OVFHelper.class);
+
+    /**
+     * Get disk virtual size given its values on fields: 'ovf:capacity' and 'ovf:capacityAllocationUnits'
+     * @param capacity capacity
+     * @param allocationUnits capacity allocation units
+     * @return disk virtual size
+     */
+    public static Long getDiskVirtualSize(Long capacity, String allocationUnits, String ovfFilePath) throws InternalErrorException {
+        if ((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;
+            }
+            return capacity * units;
+        } else {
+            throw new InternalErrorException("Failed to read capacity and capacityAllocationUnits from the OVF file: " + ovfFilePath);
+        }
+    }
+
+    public List<DatadiskTO> getOVFVolumeInfo(final String ovfFilePath) {
+        if (StringUtils.isBlank(ovfFilePath)) {
+            return new ArrayList<DatadiskTO>();
+        }
+        ArrayList<OVFFile> vf = new ArrayList<OVFFile>();
+        ArrayList<OVFDisk> vd = new ArrayList<OVFDisk>();
+
+        File ovfFile = new File(ovfFilePath);
+        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);
+            }
+
+        } 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 = cdisk == null ? "" : cdisk._controller._name;
+            String controllerSubType = cdisk == 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) {
+        for (int k = 0; k < itemList.getLength(); k++) {
+            Element item = (Element)itemList.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/" + diskId) || el.getTextContent().contains("ovf:/disk/" + diskId))) {
+                        Element oe = getParentNode(itemList, item);
+                        Element voe = oe;
+                        while (oe != null) {
+                            voe = oe;
+                            oe = getParentNode(itemList, voe);
+                        }
+                        return getController(voe);
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    private Element getParentNode(final NodeList itemList, final Element childItem) {
+        NodeList cn = childItem.getChildNodes();
+        String parent_id = null;
+        for (int l = 0; l < cn.getLength(); l++) {
+            if (cn.item(l) instanceof Element) {
+                Element el = (Element)cn.item(l);
+                if ("rasd:Parent".equals(el.getNodeName())) {
+                    parent_id = el.getTextContent();
+                }
+            }
+        }
+        if (parent_id != null) {
+            for (int k = 0; k < itemList.getLength(); k++) {
+                Element item = (Element)itemList.item(k);
+                NodeList child = item.getChildNodes();
+                for (int l = 0; l < child.getLength(); l++) {
+                    if (child.item(l) instanceof Element) {
+                        Element el = (Element)child.item(l);
+                        if ("rasd:InstanceID".equals(el.getNodeName()) && el.getTextContent().trim().equals(parent_id)) {
+                            return item;
+                        }
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    private OVFDiskController getController(Element controllerItem) {
+        OVFDiskController dc = new OVFDiskController();
+        NodeList child = controllerItem.getChildNodes();
+        for (int l = 0; l < child.getLength(); l++) {
+            if (child.item(l) instanceof Element) {
+                Element el = (Element)child.item(l);
+                if ("rasd:ElementName".equals(el.getNodeName())) {
+                    dc._name = el.getTextContent();
+                }
+                if ("rasd:ResourceSubType".equals(el.getNodeName())) {
+                    dc._subType = el.getTextContent();
+                }
+            }
+        }
+        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);
+                }
+            }
+            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);
+                }
+            }
+            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);
+                }
+            }
+
+            final StringWriter writer = new StringWriter();
+            final StreamResult result = new StreamResult(writer);
+            final TransformerFactory tf = TransformerFactory.newInstance();
+            final Transformer transformer = tf.newTransformer();
+            final DOMSource domSource = new DOMSource(doc);
+            transformer.transform(domSource, result);
+            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);
+            throw new CloudRuntimeException(e);
+        }
+    }
+
+    OVFDisk getDisk(String fileRef, List<OVFDisk> disks) {
+        for (OVFDisk disk : disks) {
+            if (disk._fileRef.equals(fileRef)) {
+                return disk;
+            }
+        }
+        return null;
+    }
+
+    class OVFFile {
+        // <File ovf:href="i-2-8-VM-disk2.vmdk" ovf:id="file1" ovf:size="69120" />
+        public String _href;
+        public String _id;
+        public Long _size;
+        public boolean _bootable;
+        public boolean isIso;
+    }
+
+    class OVFDisk {
+        //<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;
+        public OVFDiskController _controller;
+    }
+
+    class OVFDiskController {
+        public String _name;
+        public String _subType;
+    }
+}
diff --git a/api/src/com/cloud/agent/api/to/DatadiskTO.java b/api/src/com/cloud/agent/api/to/DatadiskTO.java
new file mode 100644
index 00000000000..1d3f91e25db
--- /dev/null
+++ b/api/src/com/cloud/agent/api/to/DatadiskTO.java
@@ -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.
+ */
+package com.cloud.agent.api.to;
+
+public class DatadiskTO {
+    private String path;
+    private long virtualSize;
+    private long fileSize;
+    boolean bootable;
+    private String diskId;
+    private boolean isIso;
+    private String diskController;
+    private String diskControllerSubType;
+
+    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) {
+        this.path = path;
+        this.virtualSize = virtualSize;
+        this.fileSize = fileSize;
+        this.bootable = bootable;
+        this.diskId = diskId;
+        this.isIso = isIso;
+        this.diskController = controller;
+        this.diskControllerSubType = controllerSubType;
+    }
+
+    public String getPath() {
+        return path;
+    }
+
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    public Long getVirtualSize() {
+        return virtualSize;
+    }
+
+    public void setVirtualSize(Long virtualSize) {
+        this.virtualSize = virtualSize;
+    }
+
+    public Long getFileSize() {
+        return fileSize;
+    }
+
+    public boolean isBootable() {
+        return bootable;
+    }
+
+    public String getDiskId() {
+        return diskId;
+    }
+
+    public void setDiskId(String diskId) {
+        this.diskId = diskId;
+    }
+
+    public boolean isIso() {
+        return isIso;
+    }
+
+    public void setIso(boolean isIso) {
+        this.isIso = isIso;
+    }
+
+    public String getDiskController() {
+        return diskController;
+    }
+
+    public void setDiskController(String diskController) {
+        this.diskController = diskController;
+    }
+
+    public String getDiskControllerSubType() {
+        return diskControllerSubType;
+    }
+
+    public void setDiskControllerSubType(String diskControllerSubType) {
+        this.diskControllerSubType = diskControllerSubType;
+    }
+
+}
\ No newline at end of file
diff --git a/api/src/com/cloud/agent/api/to/DiskTO.java b/api/src/com/cloud/agent/api/to/DiskTO.java
index f982844486a..7b3d10bc4db 100644
--- a/api/src/com/cloud/agent/api/to/DiskTO.java
+++ b/api/src/com/cloud/agent/api/to/DiskTO.java
@@ -27,6 +27,7 @@
     public static final String CHAP_INITIATOR_SECRET = "chapInitiatorSecret";
     public static final String CHAP_TARGET_USERNAME = "chapTargetUsername";
     public static final String CHAP_TARGET_SECRET = "chapTargetSecret";
+    public static final String SCSI_NAA_DEVICE_ID = "scsiNaaDeviceId";
     public static final String MANAGED = "managed";
     public static final String IQN = "iqn";
     public static final String STORAGE_HOST = "storageHost";
@@ -36,6 +37,9 @@
     public static final String PROTOCOL_TYPE = "protocoltype";
     public static final String PATH = "path";
     public static final String UUID = "uuid";
+    public static final String VMDK = "vmdk";
+    public static final String EXPAND_DATASTORE = "expandDatastore";
+    public static final String TEMPLATE_RESIGN = "templateResign";
 
     private DataTO data;
     private Long diskSeq;
diff --git a/api/src/com/cloud/agent/api/to/FirewallRuleTO.java b/api/src/com/cloud/agent/api/to/FirewallRuleTO.java
index edfb0aa7c17..25e7b5f60b3 100644
--- a/api/src/com/cloud/agent/api/to/FirewallRuleTO.java
+++ b/api/src/com/cloud/agent/api/to/FirewallRuleTO.java
@@ -48,6 +48,7 @@
     boolean revoked;
     boolean alreadyAdded;
     private List<String> sourceCidrList;
+    private List<String> destCidrList;
     FirewallRule.Purpose purpose;
     private Integer icmpType;
     private Integer icmpCode;
@@ -170,6 +171,7 @@ public FirewallRuleTO(FirewallRule rule, String srcVlanTag, String srcIp, Firewa
             rule.getSourceCidrList(),
             rule.getIcmpType(),
             rule.getIcmpCode());
+        this.destCidrList = rule.getDestinationCidrList();
         this.trafficType = trafficType;
         this.defaultEgressPolicy = defaultEgressPolicy;
     }
@@ -257,6 +259,10 @@ public boolean revoked() {
         return sourceCidrList;
     }
 
+    public List<String> getDestCidrList(){
+        return destCidrList;
+    }
+
     public boolean isAlreadyAdded() {
         return alreadyAdded;
     }
diff --git a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java
index 4d5a2c05db0..3a3dfa47502 100644
--- a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java
+++ b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java
@@ -45,6 +45,10 @@
     boolean revoked;
     boolean alreadyAdded;
     boolean inline;
+    String srcIpVlan;
+    String srcIpGateway;
+    String srcIpNetmask;
+    Long networkId;
     DestinationTO[] destinations;
     private StickinessPolicyTO[] stickinessPolicies;
     private HealthCheckPolicyTO[] healthCheckPolicies;
@@ -82,6 +86,15 @@ public LoadBalancerTO(String id, String srcIp, int srcPort, String protocol, Str
         this(id, srcIp, srcPort, protocol, algorithm, revoked, alreadyAdded, inline, argDestinations, stickinessPolicies, null, null, null);
     }
 
+    public LoadBalancerTO(String id, List<DestinationTO> destinations) {
+        this.uuid = id;
+        int i = 0;
+        this.destinations = new DestinationTO[destinations.size()];
+        for (DestinationTO destination : destinations) {
+            this.destinations[i++] = new DestinationTO(destination.getDestIp(), destination.getDestPort(), destination.getMonitorState());
+        }
+    }
+
     public LoadBalancerTO(String id, String srcIp, int srcPort, String protocol, String algorithm, boolean revoked, boolean alreadyAdded, boolean inline,
             List<LbDestination> argDestinations, List<LbStickinessPolicy> stickinessPolicies, List<LbHealthCheckPolicy> healthCheckPolicies, LbSslCert sslCert,
             String lbProtocol) {
@@ -194,21 +207,53 @@ public LbSslCert getSslCert() {
         return this.sslCert;
     }
 
+    public String getSrcIpVlan() {
+        return srcIpVlan;
+    }
+
+    public void setSrcIpVlan(String srcIpVlan) {
+        this.srcIpVlan = srcIpVlan;
+    }
+
+    public Long getNetworkId() {
+        return networkId;
+    }
+
+    public void setNetworkId(long id) {
+        this.networkId = id;
+    }
+
+    public String getSrcIpGateway() {
+        return srcIpGateway;
+    }
+
+    public void setSrcIpGateway(String srcIpGateway) {
+        this.srcIpGateway = srcIpGateway;
+    }
+
+    public String getSrcIpNetmask() {
+        return srcIpNetmask;
+    }
+
+    public void setSrcIpNetmask(String srcIpNetmask) {
+        this.srcIpNetmask = srcIpNetmask;
+    }
+
     public static class StickinessPolicyTO {
-        private String _methodName;
-        private List<Pair<String, String>> _paramsList;
+        private String methodName;
+        private List<Pair<String, String>> params;
 
         public String getMethodName() {
-            return _methodName;
+            return methodName;
         }
 
         public List<Pair<String, String>> getParams() {
-            return _paramsList;
+            return params;
         }
 
         public StickinessPolicyTO(String methodName, List<Pair<String, String>> paramsList) {
-            this._methodName = methodName;
-            this._paramsList = paramsList;
+            this.methodName = methodName;
+            this.params = paramsList;
         }
     }
 
@@ -219,7 +264,7 @@ public StickinessPolicyTO(String methodName, List<Pair<String, String>> paramsLi
         private int healthcheckInterval;
         private int healthcheckThresshold;
         private int unhealthThresshold;
-        private boolean revoke = false;
+        private boolean revoked = false;
 
         public HealthCheckPolicyTO(String pingPath, String description, int responseTime, int healthcheckInterval, int healthcheckThresshold, int unhealthThresshold,
                 boolean revoke) {
@@ -230,7 +275,7 @@ public HealthCheckPolicyTO(String pingPath, String description, int responseTime
             this.healthcheckInterval = healthcheckInterval;
             this.healthcheckThresshold = healthcheckThresshold;
             this.unhealthThresshold = unhealthThresshold;
-            this.revoke = revoke;
+            this.revoked = revoke;
         }
 
         public HealthCheckPolicyTO() {
@@ -262,11 +307,11 @@ public int getUnhealthThresshold() {
         }
 
         public void setRevoke(boolean revoke) {
-            this.revoke = revoke;
+            this.revoked = revoke;
         }
 
         public boolean isRevoked() {
-            return revoke;
+            return revoked;
         }
 
     }
@@ -285,6 +330,12 @@ public DestinationTO(String destIp, int destPort, boolean revoked, boolean alrea
             this.alreadyAdded = alreadyAdded;
         }
 
+        public DestinationTO(String destIp, int destPort, String monitorState) {
+            this.destIp = destIp;
+            this.destPort = destPort;
+            this.monitorState = monitorState;
+        }
+
         protected DestinationTO() {
         }
 
diff --git a/api/src/com/cloud/agent/api/to/NetworkTO.java b/api/src/com/cloud/agent/api/to/NetworkTO.java
index be11deaa1ec..9c888059d93 100644
--- a/api/src/com/cloud/agent/api/to/NetworkTO.java
+++ b/api/src/com/cloud/agent/api/to/NetworkTO.java
@@ -38,6 +38,8 @@
     protected URI isolationUri;
     protected boolean isSecurityGroupEnabled;
     protected String name;
+    protected String ip6address;
+    protected String ip6cidr;
 
     public NetworkTO() {
     }
@@ -62,6 +64,14 @@ public void setIp(String ip) {
         this.ip = ip;
     }
 
+    public void setIp6Address(String addr) {
+        this.ip6address = addr;
+    }
+
+    public void setIp6Cidr(String cidr) {
+        this.ip6cidr = cidr;
+    }
+
     public void setNetmask(String netmask) {
         this.netmask = netmask;
     }
@@ -114,6 +124,7 @@ public NetworkTO(String ip, String netmask, String mac) {
      * the full information about what is needed.
      *
      * @param ip
+     * @param ip6address
      * @param vlan
      * @param netmask
      * @param mac
@@ -130,10 +141,30 @@ public NetworkTO(String ip, String netmask, String mac, String gateway, String d
         this.dns2 = dns2;
     }
 
+    public NetworkTO(String ip, String netmask, String mac, String gateway, String dns1, String dns2, String ip6address,
+                     String ip6cidr) {
+        this.ip = ip;
+        this.netmask = netmask;
+        this.mac = mac;
+        this.gateway = gateway;
+        this.dns1 = dns1;
+        this.dns2 = dns2;
+        this.ip6address = ip6address;
+        this.ip6cidr = ip6cidr;
+    }
+
     public String getIp() {
         return ip;
     }
 
+    public String getIp6Address() {
+        return ip6address;
+    }
+
+    public String getIp6Cidr() {
+        return ip6cidr;
+    }
+
     public String getNetmask() {
         return netmask;
     }
diff --git a/api/src/com/cloud/agent/api/to/NicTO.java b/api/src/com/cloud/agent/api/to/NicTO.java
index bd681f282cd..3863e1bafe7 100644
--- a/api/src/com/cloud/agent/api/to/NicTO.java
+++ b/api/src/com/cloud/agent/api/to/NicTO.java
@@ -16,7 +16,10 @@
 // under the License.
 package com.cloud.agent.api.to;
 
+import com.cloud.offering.NetworkOffering;
+
 import java.util.List;
+import java.util.Map;
 
 public class NicTO extends NetworkTO {
     int deviceId;
@@ -26,6 +29,7 @@
     boolean pxeDisable;
     String nicUuid;
     List<String> nicSecIps;
+    Map<NetworkOffering.Detail, String> details;
 
     public NicTO() {
         super();
@@ -97,4 +101,12 @@ public String getNetworkUuid() {
     public void setNetworkUuid(String uuid) {
         super.setUuid(uuid);
     }
+
+    public Map<NetworkOffering.Detail, String> getDetails() {
+        return details;
+    }
+
+    public void setDetails(final Map<NetworkOffering.Detail, String> details) {
+        this.details = details;
+    }
 }
diff --git a/api/src/com/cloud/agent/api/to/SwiftTO.java b/api/src/com/cloud/agent/api/to/SwiftTO.java
index c7a98660302..b89dfea40e0 100644
--- a/api/src/com/cloud/agent/api/to/SwiftTO.java
+++ b/api/src/com/cloud/agent/api/to/SwiftTO.java
@@ -26,17 +26,19 @@
 
     String userName;
     String key;
+    String storagePolicy;
     private static final String pathSeparator = "/";
 
     public SwiftTO() {
     }
 
-    public SwiftTO(Long id, String url, String account, String userName, String key) {
+    public SwiftTO(Long id, String url, String account, String userName, String key, String storagePolicy) {
         this.id = id;
         this.url = url;
         this.account = account;
         this.userName = userName;
         this.key = key;
+        this.storagePolicy = storagePolicy;
     }
 
     public Long getId() {
@@ -63,6 +65,11 @@ public String getKey() {
         return key;
     }
 
+    @Override
+    public String getStoragePolicy() {
+        return this.storagePolicy;
+    }
+
     @Override
     public DataStoreRole getRole() {
         return DataStoreRole.Image;
diff --git a/api/src/com/cloud/agent/api/to/VirtualMachineTO.java b/api/src/com/cloud/agent/api/to/VirtualMachineTO.java
index c367ec9e07d..84a6bf5fc16 100644
--- a/api/src/com/cloud/agent/api/to/VirtualMachineTO.java
+++ b/api/src/com/cloud/agent/api/to/VirtualMachineTO.java
@@ -18,6 +18,7 @@
 
 import java.util.List;
 import java.util.Map;
+import java.util.HashMap;
 
 import com.cloud.template.VirtualMachineTemplate.BootloaderType;
 import com.cloud.vm.VirtualMachine;
@@ -69,6 +70,9 @@
     String configDriveIsoRootFolder = null;
     String configDriveIsoFile = null;
 
+    Double cpuQuotaPercentage = null;
+
+    Map<String, String> guestOsDetails = new HashMap<String, String>();
 
     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) {
@@ -331,4 +335,19 @@ public void setConfigDriveIsoFile(String configDriveIsoFile) {
         this.configDriveIsoFile = configDriveIsoFile;
     }
 
+    public Map<String, String> getGuestOsDetails() {
+        return guestOsDetails;
+    }
+
+    public void setGuestOsDetails(Map<String, String> guestOsDetails) {
+        this.guestOsDetails = guestOsDetails;
+    }
+
+    public Double getCpuQuotaPercentage() {
+        return cpuQuotaPercentage;
+    }
+
+    public void setCpuQuotaPercentage(Double cpuQuotaPercentage) {
+        this.cpuQuotaPercentage = cpuQuotaPercentage;
+    }
 }
diff --git a/api/src/com/cloud/capacity/Capacity.java b/api/src/com/cloud/capacity/Capacity.java
index 2fbc1d6eef1..ba04a82a5de 100644
--- a/api/src/com/cloud/capacity/Capacity.java
+++ b/api/src/com/cloud/capacity/Capacity.java
@@ -32,6 +32,8 @@
     public static final short CAPACITY_TYPE_LOCAL_STORAGE = 9;
     public static final short CAPACITY_TYPE_GPU = 19;
 
+    public static final short CAPACITY_TYPE_CPU_CORE = 90;
+
     public Long getHostOrPoolId();
 
     public Long getDataCenterId();
@@ -49,4 +51,6 @@
     public long getReservedCapacity();
 
     public Float getUsedPercentage();
+
+    public Long getAllocatedCapacity();
 }
diff --git a/api/src/com/cloud/configuration/ConfigurationService.java b/api/src/com/cloud/configuration/ConfigurationService.java
index b13122208ee..5af44ed18f4 100644
--- a/api/src/com/cloud/configuration/ConfigurationService.java
+++ b/api/src/com/cloud/configuration/ConfigurationService.java
@@ -19,7 +19,9 @@
 import java.util.List;
 
 import org.apache.cloudstack.api.command.admin.config.UpdateCfgCmd;
+import org.apache.cloudstack.api.command.admin.network.CreateManagementNetworkIpRangeCmd;
 import org.apache.cloudstack.api.command.admin.network.CreateNetworkOfferingCmd;
+import org.apache.cloudstack.api.command.admin.network.DeleteManagementNetworkIpRangeCmd;
 import org.apache.cloudstack.api.command.admin.network.DeleteNetworkOfferingCmd;
 import org.apache.cloudstack.api.command.admin.network.UpdateNetworkOfferingCmd;
 import org.apache.cloudstack.api.command.admin.offering.CreateDiskOfferingCmd;
@@ -160,6 +162,19 @@
      */
     Pod createPod(long zoneId, String name, String startIp, String endIp, String gateway, String netmask, String allocationState);
 
+    /**
+     * Creates a mutual exclusive IP range in the pod with same gateway, netmask.
+     * @param cmd - The command specifying pod ID, start IP, end IP, gateway, netmask.
+     * @return The new range if successful, null otherwise.
+     */
+    Pod createPodIpRange(CreateManagementNetworkIpRangeCmd cmd);
+
+    /**
+     * Deletes a mutually exclusive IP range in the pod.
+     * @param cmd - The command specifying pod ID, start IP, end IP.
+     */
+    void deletePodIpRange(DeleteManagementNetworkIpRangeCmd cmd) throws ResourceUnavailableException, ConcurrentOperationException;
+
     /**
      * Edits a pod in the database. Will not allow you to edit pods that are being used anywhere in the system.
      *
diff --git a/api/src/com/cloud/configuration/Resource.java b/api/src/com/cloud/configuration/Resource.java
index 5550e29eca4..76f2930e615 100644
--- a/api/src/com/cloud/configuration/Resource.java
+++ b/api/src/com/cloud/configuration/Resource.java
@@ -37,7 +37,9 @@
         private String name;
         private ResourceOwnerType[] supportedOwners;
         private int ordinal;
-        public static final long bytesToGiB = 1024 * 1024 * 1024;
+        public static final long bytesToKiB = 1024;
+        public static final long bytesToMiB = bytesToKiB * 1024;
+        public static final long bytesToGiB = bytesToMiB * 1024;
 
         ResourceType(String name, int ordinal, ResourceOwnerType... supportedOwners) {
             this.name = name;
@@ -71,6 +73,15 @@ public boolean supportsOwner(ResourceOwnerType ownerType) {
         public int getOrdinal() {
             return ordinal;
         }
+
+        public static ResourceType fromOrdinal(int ordinal) {
+            for (ResourceType r : ResourceType.values()) {
+                if (r.ordinal == ordinal) {
+                    return r;
+                }
+            }
+            return null;
+        }
     }
 
     public static class ResourceOwnerType {
diff --git a/api/src/com/cloud/dc/DataCenter.java b/api/src/com/cloud/dc/DataCenter.java
index 5b3d3c01f30..7d434c5f231 100644
--- a/api/src/com/cloud/dc/DataCenter.java
+++ b/api/src/com/cloud/dc/DataCenter.java
@@ -18,15 +18,14 @@
 
 import com.cloud.org.Grouping;
 import org.apache.cloudstack.acl.InfrastructureEntity;
-import org.apache.cloudstack.api.Identity;
-import org.apache.cloudstack.api.InternalIdentity;
+import org.apache.cloudstack.kernel.Partition;
 
 import java.util.Map;
 
 /**
  *
  */
-public interface DataCenter extends InfrastructureEntity, Grouping, Identity, InternalIdentity {
+public interface DataCenter extends InfrastructureEntity, Grouping, Partition {
 
     public enum NetworkType {
         Basic, Advanced,
diff --git a/api/src/com/cloud/dc/StorageNetworkIpRange.java b/api/src/com/cloud/dc/StorageNetworkIpRange.java
index 2b50ca1594e..03d4f44de48 100644
--- a/api/src/com/cloud/dc/StorageNetworkIpRange.java
+++ b/api/src/com/cloud/dc/StorageNetworkIpRange.java
@@ -21,20 +21,19 @@
 import org.apache.cloudstack.api.InternalIdentity;
 
 public interface StorageNetworkIpRange extends InfrastructureEntity, InternalIdentity, Identity {
-
     Integer getVlan();
 
-    String getPodUuid();
+    String getGateway();
+
+    String getNetmask();
 
     String getStartIp();
 
     String getEndIp();
 
-    String getNetworkUuid();
-
     String getZoneUuid();
 
-    String getNetmask();
+    String getPodUuid();
 
-    String getGateway();
+    String getNetworkUuid();
 }
diff --git a/api/src/com/cloud/deploy/DataCenterDeployment.java b/api/src/com/cloud/deploy/DataCenterDeployment.java
index f046b66ef06..76faf25f726 100644
--- a/api/src/com/cloud/deploy/DataCenterDeployment.java
+++ b/api/src/com/cloud/deploy/DataCenterDeployment.java
@@ -19,6 +19,9 @@
 import com.cloud.deploy.DeploymentPlanner.ExcludeList;
 import com.cloud.vm.ReservationContext;
 
+import java.util.ArrayList;
+import java.util.List;
+
 public class DataCenterDeployment implements DeploymentPlan {
     long _dcId;
     Long _podId;
@@ -29,6 +32,7 @@
     ExcludeList _avoids = null;
     boolean _recreateDisks;
     ReservationContext _context;
+    List<Long> preferredHostIds = new ArrayList<>();
 
     public DataCenterDeployment(long dataCenterId) {
         this(dataCenterId, null, null, null, null, null);
@@ -93,4 +97,14 @@ public ReservationContext getReservationContext() {
         return _context;
     }
 
+    @Override
+    public void setPreferredHosts(List<Long> hostIds) {
+        this.preferredHostIds = new ArrayList<>(hostIds);
+    }
+
+    @Override
+    public List<Long> getPreferredHosts() {
+        return this.preferredHostIds;
+    }
+
 }
diff --git a/api/src/com/cloud/deploy/DeploymentClusterPlanner.java b/api/src/com/cloud/deploy/DeploymentClusterPlanner.java
index 6c09a6d5106..a668b79187d 100644
--- a/api/src/com/cloud/deploy/DeploymentClusterPlanner.java
+++ b/api/src/com/cloud/deploy/DeploymentClusterPlanner.java
@@ -29,6 +29,7 @@
 
     static final String ClusterCPUCapacityDisableThresholdCK = "cluster.cpu.allocated.capacity.disablethreshold";
     static final String ClusterMemoryCapacityDisableThresholdCK = "cluster.memory.allocated.capacity.disablethreshold";
+    static final String ClusterThresholdEnabledCK = "cluster.threshold.enabled";
 
     static final ConfigKey<Float> ClusterCPUCapacityDisableThreshold =
         new ConfigKey<Float>(
@@ -46,6 +47,15 @@
             "0.85",
             "Percentage (as a value between 0 and 1) of memory utilization above which allocators will disable using the cluster for low memory available. Keep the corresponding notification threshold lower than this to be notified beforehand.",
             true, ConfigKey.Scope.Cluster, null);
+    static final ConfigKey<Boolean> ClusterThresholdEnabled =
+        new ConfigKey<Boolean>(
+            "Advanced",
+            Boolean.class,
+            ClusterThresholdEnabledCK,
+            "true",
+            "Enable/Disable cluster thresholds. If disabled, an instance can start in a cluster even though the threshold may be crossed.",
+            false,
+            ConfigKey.Scope.Global);
 
     /**
      * This is called to determine list of possible clusters where a virtual
diff --git a/api/src/com/cloud/deploy/DeploymentPlan.java b/api/src/com/cloud/deploy/DeploymentPlan.java
index 456d5b85899..b57fec0cf41 100644
--- a/api/src/com/cloud/deploy/DeploymentPlan.java
+++ b/api/src/com/cloud/deploy/DeploymentPlan.java
@@ -19,6 +19,8 @@
 import com.cloud.deploy.DeploymentPlanner.ExcludeList;
 import com.cloud.vm.ReservationContext;
 
+import java.util.List;
+
 /**
  */
 public interface DeploymentPlan {
@@ -65,4 +67,8 @@
     Long getPhysicalNetworkId();
 
     ReservationContext getReservationContext();
+
+    void setPreferredHosts(List<Long> hostIds);
+
+    List<Long> getPreferredHosts();
 }
diff --git a/api/src/com/cloud/event/EventTypes.java b/api/src/com/cloud/event/EventTypes.java
index 3cc4eac81f1..907b93eca10 100644
--- a/api/src/com/cloud/event/EventTypes.java
+++ b/api/src/com/cloud/event/EventTypes.java
@@ -16,6 +16,9 @@
 // under the License.
 package com.cloud.event;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import com.cloud.dc.DataCenter;
 import com.cloud.dc.Pod;
 import com.cloud.dc.StorageNetworkIpRange;
@@ -54,10 +57,10 @@
 import com.cloud.offering.ServiceOffering;
 import com.cloud.projects.Project;
 import com.cloud.server.ResourceTag;
-import com.cloud.storage.StoragePool;
 import com.cloud.storage.GuestOS;
 import com.cloud.storage.GuestOSHypervisor;
 import com.cloud.storage.Snapshot;
+import com.cloud.storage.StoragePool;
 import com.cloud.storage.Volume;
 import com.cloud.storage.snapshot.SnapshotPolicy;
 import com.cloud.template.VirtualMachineTemplate;
@@ -68,12 +71,11 @@
 import com.cloud.vm.VirtualMachine;
 import org.apache.cloudstack.acl.Role;
 import org.apache.cloudstack.acl.RolePermission;
+import org.apache.cloudstack.annotation.Annotation;
 import org.apache.cloudstack.config.Configuration;
+import org.apache.cloudstack.ha.HAConfig;
 import org.apache.cloudstack.usage.Usage;
 
-import java.util.HashMap;
-import java.util.Map;
-
 public class EventTypes {
 
     //map of Event and corresponding entity for which Event is applicable
@@ -128,6 +130,7 @@
     public static final String EVENT_NETWORK_CREATE = "NETWORK.CREATE";
     public static final String EVENT_NETWORK_DELETE = "NETWORK.DELETE";
     public static final String EVENT_NETWORK_UPDATE = "NETWORK.UPDATE";
+    public static final String EVENT_NETWORK_MIGRATE = "NETWORK.MIGRATE";
     public static final String EVENT_FIREWALL_OPEN = "FIREWALL.OPEN";
     public static final String EVENT_FIREWALL_CLOSE = "FIREWALL.CLOSE";
     public static final String EVENT_FIREWALL_UPDATE = "FIREWALL.UPDATE";
@@ -176,6 +179,11 @@
     public static final String EVENT_ROLE_PERMISSION_UPDATE = "ROLE.PERMISSION.UPDATE";
     public static final String EVENT_ROLE_PERMISSION_DELETE = "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";
+    public static final String EVENT_CA_CERTIFICATE_PROVISION = "CA.CERTIFICATE.PROVISION";
+
     // Account events
     public static final String EVENT_ACCOUNT_ENABLE = "ACCOUNT.ENABLE";
     public static final String EVENT_ACCOUNT_DISABLE = "ACCOUNT.DISABLE";
@@ -190,6 +198,7 @@
     public static final String EVENT_USER_CREATE = "USER.CREATE";
     public static final String EVENT_USER_DELETE = "USER.DELETE";
     public static final String EVENT_USER_DISABLE = "USER.DISABLE";
+    public static final String EVENT_USER_MOVE = "USER.MOVE";
     public static final String EVENT_USER_UPDATE = "USER.UPDATE";
     public static final String EVENT_USER_ENABLE = "USER.ENABLE";
     public static final String EVENT_USER_LOCK = "USER.LOCK";
@@ -233,6 +242,8 @@
 
     // Snapshots
     public static final String EVENT_SNAPSHOT_CREATE = "SNAPSHOT.CREATE";
+    public static final String EVENT_SNAPSHOT_ON_PRIMARY = "SNAPSHOT.ON_PRIMARY";
+    public static final String EVENT_SNAPSHOT_OFF_PRIMARY = "SNAPSHOT.OFF_PRIMARY";
     public static final String EVENT_SNAPSHOT_DELETE = "SNAPSHOT.DELETE";
     public static final String EVENT_SNAPSHOT_REVERT = "SNAPSHOT.REVERT";
     public static final String EVENT_SNAPSHOT_POLICY_CREATE = "SNAPSHOTPOLICY.CREATE";
@@ -289,6 +300,9 @@
     public static final String EVENT_VLAN_IP_RANGE_DEDICATE = "VLAN.IP.RANGE.DEDICATE";
     public static final String EVENT_VLAN_IP_RANGE_RELEASE = "VLAN.IP.RANGE.RELEASE";
 
+    public static final String EVENT_MANAGEMENT_IP_RANGE_CREATE = "MANAGEMENT.IP.RANGE.CREATE";
+    public static final String EVENT_MANAGEMENT_IP_RANGE_DELETE = "MANAGEMENT.IP.RANGE.DELETE";
+
     public static final String EVENT_STORAGE_IP_RANGE_CREATE = "STORAGE.IP.RANGE.CREATE";
     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";
@@ -317,6 +331,12 @@
     public static final String EVENT_HOST_OUTOFBAND_MANAGEMENT_CHANGE_PASSWORD = "HOST.OOBM.CHANGEPASSWORD";
     public static final String EVENT_HOST_OUTOFBAND_MANAGEMENT_POWERSTATE_TRANSITION = "HOST.OOBM.POWERSTATE.TRANSITION";
 
+    // HA
+    public static final String EVENT_HA_RESOURCE_ENABLE = "HA.RESOURCE.ENABLE";
+    public static final String EVENT_HA_RESOURCE_DISABLE = "HA.RESOURCE.DISABLE";
+    public static final String EVENT_HA_RESOURCE_CONFIGURE = "HA.RESOURCE.CONFIGURE";
+    public static final String EVENT_HA_STATE_TRANSITION = "HA.STATE.TRANSITION";
+
     // Maintenance
     public static final String EVENT_MAINTENANCE_CANCEL = "MAINT.CANCEL";
     public static final String EVENT_MAINTENANCE_CANCEL_PRIMARY_STORAGE = "MAINT.CANCEL.PS";
@@ -391,6 +411,10 @@
     public static final String EVENT_EXTERNAL_LB_DEVICE_DELETE = "PHYSICAL.LOADBALANCER.DELETE";
     public static final String EVENT_EXTERNAL_LB_DEVICE_CONFIGURE = "PHYSICAL.LOADBALANCER.CONFIGURE";
 
+    // external NCC device events
+    public static final String EVENT_EXTERNAL_NCC_DEVICE_ADD = "PHYSICAL.NCC.ADD";
+    public static final String EVENT_EXTERNAL_NCC_DEVICE_DELETE = "PHYSICAL.NCC.DELETE";
+
     // external switch management device events (E.g.: Cisco Nexus 1000v Virtual Supervisor Module.
     public static final String EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_ADD = "SWITCH.MGMT.ADD";
     public static final String EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_DELETE = "SWITCH.MGMT.DELETE";
@@ -441,6 +465,8 @@
     // vm snapshot events
     public static final String EVENT_VM_SNAPSHOT_CREATE = "VMSNAPSHOT.CREATE";
     public static final String EVENT_VM_SNAPSHOT_DELETE = "VMSNAPSHOT.DELETE";
+    public static final String EVENT_VM_SNAPSHOT_ON_PRIMARY = "VMSNAPSHOT.ON_PRIMARY";
+    public static final String EVENT_VM_SNAPSHOT_OFF_PRIMARY = "VMSNAPSHOT.OFF_PRIMARY";
     public static final String EVENT_VM_SNAPSHOT_REVERT = "VMSNAPSHOT.REVERTTO";
 
     // external network device events
@@ -545,6 +571,19 @@
     //Usage related events
     public static final String EVENT_USAGE_REMOVE_USAGE_RECORDS = "USAGE.REMOVE.USAGE.RECORDS";
 
+    // Netscaler Service Package events
+    public static final String EVENT_NETSCALER_SERVICEPACKAGE_ADD = "NETSCALER.SERVICEPACKAGE.ADD";
+    public static final String EVENT_NETSCALER_SERVICEPACKAGE_DELETE = "NETSCALER.SERVICEPACKAGE.DELETE";
+
+    public static final String EVENT_NETSCALER_VM_START = "NETSCALERVM.START";
+    public static final String EVENT_NETSCALER_VM_STOP = "NETSCALERVM.STOP";
+
+    public static final String EVENT_ANNOTATION_CREATE = "ANNOTATION.CREATE";
+    public static final String EVENT_ANNOTATION_REMOVE = "ANNOTATION.REMOVE";
+
+    public static final String EVENT_TEMPLATE_DIRECT_DOWNLOAD_FAILURE = "TEMPLATE.DIRECT.DOWNLOAD.FAILURE";
+    public static final String EVENT_ISO_DIRECT_DOWNLOAD_FAILURE = "ISO.DIRECT.DOWNLOAD.FAILURE";
+
     static {
 
         // TODO: need a way to force author adding event types to declare the entity details as well, with out braking
@@ -679,6 +718,8 @@
         // Snapshots
         entityEventDetails.put(EVENT_SNAPSHOT_CREATE, Snapshot.class);
         entityEventDetails.put(EVENT_SNAPSHOT_DELETE, Snapshot.class);
+        entityEventDetails.put(EVENT_SNAPSHOT_ON_PRIMARY, Snapshot.class);
+        entityEventDetails.put(EVENT_SNAPSHOT_OFF_PRIMARY, Snapshot.class);
         entityEventDetails.put(EVENT_SNAPSHOT_POLICY_CREATE, SnapshotPolicy.class);
         entityEventDetails.put(EVENT_SNAPSHOT_POLICY_UPDATE, SnapshotPolicy.class);
         entityEventDetails.put(EVENT_SNAPSHOT_POLICY_DELETE, SnapshotPolicy.class);
@@ -733,6 +774,9 @@
         entityEventDetails.put(EVENT_VLAN_IP_RANGE_DEDICATE, Vlan.class);
         entityEventDetails.put(EVENT_VLAN_IP_RANGE_RELEASE, Vlan.class);
 
+        entityEventDetails.put(EVENT_MANAGEMENT_IP_RANGE_CREATE, Pod.class);
+        entityEventDetails.put(EVENT_MANAGEMENT_IP_RANGE_DELETE, Pod.class);
+
         entityEventDetails.put(EVENT_STORAGE_IP_RANGE_CREATE, StorageNetworkIpRange.class);
         entityEventDetails.put(EVENT_STORAGE_IP_RANGE_DELETE, StorageNetworkIpRange.class);
         entityEventDetails.put(EVENT_STORAGE_IP_RANGE_UPDATE, StorageNetworkIpRange.class);
@@ -761,6 +805,12 @@
         entityEventDetails.put(EVENT_HOST_OUTOFBAND_MANAGEMENT_CHANGE_PASSWORD, Host.class);
         entityEventDetails.put(EVENT_HOST_OUTOFBAND_MANAGEMENT_POWERSTATE_TRANSITION, Host.class);
 
+        // HA
+        entityEventDetails.put(EVENT_HA_RESOURCE_ENABLE, HAConfig.class);
+        entityEventDetails.put(EVENT_HA_RESOURCE_DISABLE, HAConfig.class);
+        entityEventDetails.put(EVENT_HA_RESOURCE_CONFIGURE, HAConfig.class);
+        entityEventDetails.put(EVENT_HA_STATE_TRANSITION, HAConfig.class);
+
         // Maintenance
         entityEventDetails.put(EVENT_MAINTENANCE_CANCEL, Host.class);
         entityEventDetails.put(EVENT_MAINTENANCE_CANCEL_PRIMARY_STORAGE, Host.class);
@@ -918,6 +968,15 @@
 
         //Usage
         entityEventDetails.put(EVENT_USAGE_REMOVE_USAGE_RECORDS, Usage.class);
+        // Netscaler Service Packages
+        entityEventDetails.put(EVENT_NETSCALER_SERVICEPACKAGE_ADD, "NETSCALER.SERVICEPACKAGE.CREATE");
+        entityEventDetails.put(EVENT_NETSCALER_SERVICEPACKAGE_DELETE, "NETSCALER.SERVICEPACKAGE.DELETE");
+
+        entityEventDetails.put(EVENT_ANNOTATION_CREATE, Annotation.class);
+        entityEventDetails.put(EVENT_ANNOTATION_REMOVE, Annotation.class);
+
+        entityEventDetails.put(EVENT_TEMPLATE_DIRECT_DOWNLOAD_FAILURE, VirtualMachineTemplate.class);
+        entityEventDetails.put(EVENT_ISO_DIRECT_DOWNLOAD_FAILURE, "Iso");
     }
 
     public static String getEntityForEvent(String eventName) {
diff --git a/api/src/com/cloud/exception/UnavailableCommandException.java b/api/src/com/cloud/exception/UnavailableCommandException.java
new file mode 100644
index 00000000000..d5b7faa8f36
--- /dev/null
+++ b/api/src/com/cloud/exception/UnavailableCommandException.java
@@ -0,0 +1,36 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT 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.exception;
+
+import com.cloud.utils.SerialVersionUID;
+
+public class UnavailableCommandException extends PermissionDeniedException {
+
+    private static final long serialVersionUID = SerialVersionUID.UnavailableCommandException;
+
+    protected UnavailableCommandException() {
+        super();
+    }
+
+    public UnavailableCommandException(String msg) {
+        super(msg);
+    }
+
+    public UnavailableCommandException(String msg, Throwable cause) {
+        super(msg, cause);
+    }
+}
diff --git a/api/src/com/cloud/host/Host.java b/api/src/com/cloud/host/Host.java
index 689ed12b64e..1ecd48d74ce 100644
--- a/api/src/com/cloud/host/Host.java
+++ b/api/src/com/cloud/host/Host.java
@@ -16,22 +16,22 @@
 // under the License.
 package com.cloud.host;
 
-import java.util.Date;
-
-import org.apache.cloudstack.api.Identity;
-import org.apache.cloudstack.api.InternalIdentity;
-
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.resource.ResourceState;
 import com.cloud.utils.fsm.StateObject;
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.ha.HAResource;
+import org.apache.cloudstack.kernel.Partition;
+
+import java.util.Date;
 
 /**
  *  Host represents one particular host server.
  */
-public interface Host extends StateObject<Status>, Identity, InternalIdentity {
+public interface Host extends StateObject<Status>, Identity, Partition, HAResource {
     public enum Type {
         Storage(false), Routing(false), SecondaryStorage(false), SecondaryStorageCmdExecutor(false), ConsoleProxy(true), ExternalFirewall(false), ExternalLoadBalancer(
-                false), ExternalVirtualSwitchSupervisor(false), PxeServer(false), BaremetalPxe(false), BaremetalDhcp(false), TrafficMonitor(false),
+                false), ExternalVirtualSwitchSupervisor(false), PxeServer(false), BaremetalPxe(false), BaremetalDhcp(false), TrafficMonitor(false), NetScalerControlCenter(false),
 
         ExternalDhcp(false), SecondaryStorageVM(true), LocalSecondaryStorage(false), L2Networking(false);
         boolean _virtual;
@@ -202,5 +202,7 @@ public boolean isVirtual() {
 
     boolean isInMaintenanceStates();
 
+    boolean isDisabled();
+
     ResourceState getResourceState();
 }
diff --git a/api/src/com/cloud/host/Status.java b/api/src/com/cloud/host/Status.java
index 73e6cc9185a..e381115db41 100644
--- a/api/src/com/cloud/host/Status.java
+++ b/api/src/com/cloud/host/Status.java
@@ -150,12 +150,14 @@ public Status getNextStatus(Event e) throws NoTransitionException {
         s_fsm.addTransition(Status.Down, Event.ManagementServerDown, Status.Down);
         s_fsm.addTransition(Status.Down, Event.AgentDisconnected, Status.Down);
         s_fsm.addTransition(Status.Down, Event.PingTimeout, Status.Down);
+        s_fsm.addTransition(Status.Down, Event.HostDown, Status.Down);
         s_fsm.addTransition(Status.Alert, Event.AgentConnected, Status.Connecting);
         s_fsm.addTransition(Status.Alert, Event.Ping, Status.Up);
         s_fsm.addTransition(Status.Alert, Event.Remove, Status.Removed);
         s_fsm.addTransition(Status.Alert, Event.ManagementServerDown, Status.Alert);
         s_fsm.addTransition(Status.Alert, Event.AgentDisconnected, Status.Alert);
         s_fsm.addTransition(Status.Alert, Event.ShutdownRequested, Status.Disconnected);
+        s_fsm.addTransition(Status.Alert, Event.HostDown, Status.Down);
         s_fsm.addTransition(Status.Rebalancing, Event.RebalanceFailed, Status.Disconnected);
         s_fsm.addTransition(Status.Rebalancing, Event.RebalanceCompleted, Status.Connecting);
         s_fsm.addTransition(Status.Rebalancing, Event.ManagementServerDown, Status.Disconnected);
diff --git a/api/src/com/cloud/hypervisor/HypervisorGuru.java b/api/src/com/cloud/hypervisor/HypervisorGuru.java
index 6a09dd257af..45e19ee2674 100644
--- a/api/src/com/cloud/hypervisor/HypervisorGuru.java
+++ b/api/src/com/cloud/hypervisor/HypervisorGuru.java
@@ -33,7 +33,7 @@
 
 public interface HypervisorGuru extends Adapter {
     static final ConfigKey<Boolean> VmwareFullClone = new ConfigKey<Boolean>("Advanced", Boolean.class, "vmware.create.full.clone", "true",
-                        "If set to true, creates guest VMs as full clones on ESX", false);
+            "If set to true, creates guest VMs as full clones on ESX", false);
     HypervisorType getHypervisorType();
 
     /**
@@ -45,7 +45,7 @@
     VirtualMachineTO implement(VirtualMachineProfile vm);
 
     /**
-     * Give hypervisor guru opportunity to decide if certain command needs to be delegated to other host, mainly to secondary storage VM host
+     * Gives hypervisor guru opportunity to decide if certain commands need to be delegated to another host, for instance, we may have the opportunity to change from a system VM (is considered a host) to a real host to execute commands.
      *
      * @param hostId original hypervisor host
      * @param cmd command that is going to be sent, hypervisor guru usually needs to register various context objects into the command object
diff --git a/api/src/com/cloud/network/IpAddress.java b/api/src/com/cloud/network/IpAddress.java
index 2061771ed37..2447809d66f 100644
--- a/api/src/com/cloud/network/IpAddress.java
+++ b/api/src/com/cloud/network/IpAddress.java
@@ -92,4 +92,8 @@
 
     public Date getCreated();
 
+    State getRuleState();
+
+    void setRuleState(State ruleState);
+
 }
diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java
index 7cc5441603a..75196a469d3 100644
--- a/api/src/com/cloud/network/Network.java
+++ b/api/src/com/cloud/network/Network.java
@@ -38,14 +38,16 @@
 public interface Network extends ControlledEntity, StateObject<Network.State>, InternalIdentity, Identity, Serializable, Displayable {
 
     public enum GuestType {
-        Shared, Isolated
+        Shared, Isolated, L2
     }
 
+    public String updatingInSequence ="updatingInSequence";
+
     public static class Service {
         private static List<Service> supportedServices = new ArrayList<Service>();
 
         public static final Service Vpn = new Service("Vpn", Capability.SupportedVpnProtocols, Capability.VpnTypes);
-        public static final Service Dhcp = new Service("Dhcp");
+        public static final Service Dhcp = new Service("Dhcp", Capability.ExtraDhcpOptions);
         public static final Service Dns = new Service("Dns", Capability.AllowDnsSuffixModification);
         public static final Service Gateway = new Service("Gateway");
         public static final Service Firewall = new Service("Firewall", Capability.SupportedProtocols, Capability.MultipleIps, Capability.TrafficStatistics,
@@ -58,7 +60,8 @@
         public static final Service PortForwarding = new Service("PortForwarding");
         public static final Service SecurityGroup = new Service("SecurityGroup");
         public static final Service NetworkACL = new Service("NetworkACL", Capability.SupportedProtocols);
-        public static final Service Connectivity = new Service("Connectivity", Capability.DistributedRouter, Capability.RegionLevelVpc, Capability.StretchedL2Subnet);
+        public static final Service Connectivity = new Service("Connectivity", Capability.DistributedRouter, Capability.RegionLevelVpc, Capability.StretchedL2Subnet,
+                Capability.NoVlan, Capability.PublicAccess);
 
         private final String name;
         private final Capability[] caps;
@@ -139,6 +142,8 @@ public static Service getService(String serviceName) {
         public static final Provider GloboDns = new Provider("GloboDns", true);
         // add Big Switch Bcf Provider
         public static final Provider BigSwitchBcf = new Provider("BigSwitchBcf", false);
+        //Add ConfigDrive provider
+        public static final Provider ConfigDrive = new Provider("ConfigDrive", false);
 
         private final String name;
         private final boolean isExternal;
@@ -213,6 +218,9 @@ public static Provider getProvider(String providerName) {
         public static final Capability DistributedRouter = new Capability("DistributedRouter");
         public static final Capability StretchedL2Subnet = new Capability("StretchedL2Subnet");
         public static final Capability RegionLevelVpc = new Capability("RegionLevelVpc");
+        public static final Capability NoVlan = new Capability("NoVlan");
+        public static final Capability PublicAccess = new Capability("PublicAccess");
+        public static final Capability ExtraDhcpOptions = new Capability("ExtraDhcpOptions");
 
         private final String name;
 
@@ -272,12 +280,26 @@ private State(String description) {
     public class IpAddresses {
         private String ip4Address;
         private String ip6Address;
+        private String macAddress;
+
+        public String getMacAddress() {
+            return macAddress;
+        }
+
+        public void setMacAddress(String macAddress) {
+            this.macAddress = macAddress;
+        }
 
         public IpAddresses(String ip4Address, String ip6Address) {
             setIp4Address(ip4Address);
             setIp6Address(ip6Address);
         }
 
+        public IpAddresses(String ipAddress, String ip6Address, String macAddress) {
+            this(ipAddress, ip6Address);
+            setMacAddress(macAddress);
+        }
+
         public String getIp4Address() {
             return ip4Address;
         }
@@ -329,6 +351,8 @@ public void setIp6Address(String ip6Address) {
 
     boolean isRedundant();
 
+    boolean isRollingRestart();
+
     long getRelated();
 
     URI getBroadcastUri();
@@ -370,4 +394,6 @@ public void setIp6Address(String ip6Address) {
     void setNetworkACLId(Long networkACLId);
 
     boolean isStrechedL2Network();
+
+    String getExternalId();
 }
diff --git a/api/src/com/cloud/network/NetworkModel.java b/api/src/com/cloud/network/NetworkModel.java
index 780f97d22f4..a5bf5e44610 100644
--- a/api/src/com/cloud/network/NetworkModel.java
+++ b/api/src/com/cloud/network/NetworkModel.java
@@ -17,6 +17,8 @@
 
 package com.cloud.network;
 
+import com.google.common.collect.ImmutableMap;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -27,6 +29,7 @@
 import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.network.Network.Capability;
+import com.cloud.network.Network.IpAddresses;
 import com.cloud.network.Network.Provider;
 import com.cloud.network.Network.Service;
 import com.cloud.network.Networks.TrafficType;
@@ -38,6 +41,7 @@
 import com.cloud.vm.Nic;
 import com.cloud.vm.NicProfile;
 import com.cloud.vm.VirtualMachine;
+import org.apache.cloudstack.framework.config.ConfigKey;
 
 /**
  * The NetworkModel presents a read-only view into the Network data such as L2 networks,
@@ -46,6 +50,34 @@
  * participants in the orchestration can use this interface to query the data.
  */
 public interface NetworkModel {
+    String METATDATA_DIR = "metadata";
+    String USERDATA_DIR = "userdata";
+    String USERDATA_FILE = "user_data";
+    String PASSWORD_DIR = "password";
+    String PASSWORD_FILE = "vm_password";
+    String PASSWORD_CHECKSUM_FILE = "vm-password-md5checksum";
+    String SERVICE_OFFERING_FILE = "service-offering";
+    String AVAILABILITY_ZONE_FILE = "availability-zone";
+    String LOCAL_HOSTNAME_FILE = "local-hostname";
+    String LOCAL_IPV4_FILE = "local-ipv4";
+    String PUBLIC_HOSTNAME_FILE = "public-hostname";
+    String PUBLIC_IPV4_FILE = "public-ipv4";
+    String INSTANCE_ID_FILE = "instance-id";
+    String VM_ID_FILE = "vm-id";
+    String PUBLIC_KEYS_FILE = "public-keys";
+    String CLOUD_IDENTIFIER_FILE = "cloud-identifier";
+    int CONFIGDATA_DIR = 0;
+    int CONFIGDATA_FILE = 1;
+    int CONFIGDATA_CONTENT = 2;
+    ImmutableMap<String, String> openStackFileMapping = ImmutableMap.of(
+            AVAILABILITY_ZONE_FILE, "availability_zone",
+            LOCAL_HOSTNAME_FILE, "hostname",
+            VM_ID_FILE, "uuid",
+            PUBLIC_HOSTNAME_FILE, "name"
+    );
+
+    static final ConfigKey<Integer> MACIdentifier = new ConfigKey<Integer>("Advanced",Integer.class, "mac.identifier", "0",
+            "This value will be used while generating the mac addresses for isolated and shared networks. The hexadecimal equivalent value will be present at the 2nd octet of the mac address. Default value is null which means this feature is disabled.Its scope is global.", true, ConfigKey.Scope.Global);
 
     /**
      * Lists IP addresses that belong to VirtualNetwork VLANs
@@ -154,6 +186,8 @@
 
     boolean checkIpForService(IpAddress ip, Service service, Long networkId);
 
+    boolean providerSupportsCapability(Set<Provider> providers, Service service, Capability cap);
+
     void checkCapabilityForProvider(Set<Provider> providers, Service service, Capability cap, String capValue);
 
     Provider getDefaultUniqueProviderForService(String serviceName);
@@ -254,7 +288,7 @@
 
     void checkIp6Parameters(String startIPv6, String endIPv6, String ip6Gateway, String ip6Cidr) throws InvalidParameterValueException;
 
-    void checkRequestedIpAddresses(long networkId, String ip4, String ip6) throws InvalidParameterValueException;
+    void checkRequestedIpAddresses(long networkId, IpAddresses ips) throws InvalidParameterValueException;
 
     String getStartIpv6Address(long id);
 
@@ -278,7 +312,9 @@
 
     boolean getNetworkEgressDefaultPolicy(Long networkId);
 
-    List<String[]> generateVmData(String userData, String serviceOffering, String zoneName,
-                                  String vmName, long vmId, String publicKey, String password, Boolean isWindows);
+    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 getValidNetworkCidr(Network guestNetwork);
 
 }
diff --git a/api/src/com/cloud/network/NetworkProfile.java b/api/src/com/cloud/network/NetworkProfile.java
index ab033edaa53..d8733ca6c50 100644
--- a/api/src/com/cloud/network/NetworkProfile.java
+++ b/api/src/com/cloud/network/NetworkProfile.java
@@ -57,6 +57,7 @@
     private Long networkAclId;
     private final String guruName;
     private boolean strechedL2Subnet;
+    private String externalId;
 
     public NetworkProfile(Network network) {
         id = network.getId();
@@ -91,6 +92,7 @@ public NetworkProfile(Network network) {
         guruName = network.getGuruName();
         strechedL2Subnet = network.isStrechedL2Network();
         isRedundant = network.isRedundant();
+        externalId = network.getExternalId();
     }
 
     public String getDns1() {
@@ -153,6 +155,11 @@ public boolean isRedundant() {
         return this.isRedundant;
     }
 
+    @Override
+    public boolean isRollingRestart() {
+        return false;
+    }
+
     @Override
     public String getName() {
         return name;
@@ -300,4 +307,9 @@ public boolean isStrechedL2Network() {
         return false;
     }
 
+    @Override
+    public String getExternalId() {
+        return externalId;
+    }
+
 }
diff --git a/api/src/com/cloud/network/NetworkService.java b/api/src/com/cloud/network/NetworkService.java
index c1b68eb3a46..d76d6597202 100644
--- a/api/src/com/cloud/network/NetworkService.java
+++ b/api/src/com/cloud/network/NetworkService.java
@@ -19,6 +19,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.cloudstack.api.command.admin.address.ReleasePodIpCmdByAdmin;
 import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd;
 import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd;
 import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementorsCmd;
@@ -26,6 +27,7 @@
 import org.apache.cloudstack.api.command.user.network.ListNetworksCmd;
 import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd;
 import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
+import org.apache.cloudstack.api.response.AcquirePodIpCmdResponse;
 
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientAddressCapacityException;
@@ -34,10 +36,12 @@
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.network.Network.Service;
 import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.vpc.Vpc;
 import com.cloud.offering.NetworkOffering;
 import com.cloud.user.Account;
 import com.cloud.user.User;
 import com.cloud.utils.Pair;
+import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.Nic;
 import com.cloud.vm.NicSecondaryIp;
 
@@ -66,7 +70,7 @@ IpAddress allocatePortableIP(Account ipOwner, int regionId, Long zoneId, Long ne
 
     boolean deleteNetwork(long networkId, boolean forced);
 
-    boolean restartNetwork(RestartNetworkCmd cmd, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException;
+    boolean restartNetwork(RestartNetworkCmd cmd, boolean cleanup, boolean makeRedundant) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException;
 
     int getActiveNicsInNetwork(long networkId);
 
@@ -77,7 +81,25 @@ IpAddress allocatePortableIP(Account ipOwner, int regionId, Long zoneId, Long ne
     IpAddress getIp(long id);
 
     Network updateGuestNetwork(long networkId, String name, String displayText, Account callerAccount, User callerUser, String domainSuffix, Long networkOfferingId,
-        Boolean changeCidr, String guestVmCidr, Boolean displayNetwork, String newUUID);
+        Boolean changeCidr, String guestVmCidr, Boolean displayNetwork, String newUUID, boolean updateInSequence, boolean forced);
+
+    /**
+     * Migrate a network from one physical network to another physical network
+     * @param networkId of the network that needs to be migrated
+     * @param networkOfferingId new network offering id for the network
+     * @param resume if previous migration failed try to resume of just fail directly because anomaly is detected
+     * @return the migrated network
+     */
+    Network migrateGuestNetwork(long networkId, long networkOfferingId, Account callerAccount, User callerUser, boolean resume);
+
+    /**
+     * Migrate a vpc from on physical network to another physical network
+     * @param vpcId the id of the vpc that needs to be migrated
+     * @param vpcNetworkofferingId the new vpc offering id
+     * @param resume if previous migration failed try to resume of just fail directly because anomaly is detected
+     * @return the migrated vpc
+     */
+    Vpc migrateVpcNetwork(long vpcId, long vpcNetworkofferingId, Map<String, String> networkToOffering, Account account, User callerUser, boolean resume);
 
     PhysicalNetwork createPhysicalNetwork(Long zoneId, String vnetRange, String networkSpeed, List<String> isolationMethods, String broadcastDomainRange, Long domainId,
         List<String> tags, String name);
@@ -180,4 +202,10 @@ Network createPrivateNetwork(String networkName, String displayText, long physic
     IpAddress updateIP(Long id, String customId, Boolean displayIp);
 
     boolean configureNicSecondaryIp(NicSecondaryIp secIp, boolean isZoneSgEnabled);
+
+    List<? extends NicSecondaryIp> listVmNicSecondaryIps(ListNicsCmd listNicsCmd);
+
+    AcquirePodIpCmdResponse allocatePodIp(Account account, String zoneId, String podId) throws ResourceAllocationException, ConcurrentOperationException;
+
+    boolean releasePodIp(ReleasePodIpCmdByAdmin ip) throws CloudRuntimeException;
 }
diff --git a/api/src/com/cloud/network/Networks.java b/api/src/com/cloud/network/Networks.java
index f027cf9fe99..06f4236eb7a 100644
--- a/api/src/com/cloud/network/Networks.java
+++ b/api/src/com/cloud/network/Networks.java
@@ -75,6 +75,10 @@
                     throw new CloudRuntimeException("Unable to convert to broadcast URI: " + value);
                 }
             }
+            @Override
+            public String getValueFrom(URI uri) {
+                return uri.getAuthority();
+            }
         },
         Vswitch("vs", String.class), LinkLocal(null, null), Vnet("vnet", Long.class), Storage("storage", Integer.class), Lswitch("lswitch", String.class) {
             @Override
@@ -242,6 +246,7 @@ public static String getValue(String uriString) throws URISyntaxException {
          * encode a string into a BroadcastUri
          * @param candidate the input string
          * @return an URI containing an appropriate (possibly given) scheme and the value
+         *
          */
         public static URI fromString(String candidate) {
             try {
diff --git a/api/src/com/cloud/network/PhysicalNetwork.java b/api/src/com/cloud/network/PhysicalNetwork.java
index bdf098f3abb..48e416c4b46 100644
--- a/api/src/com/cloud/network/PhysicalNetwork.java
+++ b/api/src/com/cloud/network/PhysicalNetwork.java
@@ -16,12 +16,16 @@
 // under the License.
 package com.cloud.network;
 
-import java.util.List;
-
+import com.cloud.exception.CloudException;
+import com.cloud.utils.Pair;
+import com.cloud.utils.StringUtils;
 import org.apache.cloudstack.api.Identity;
 import org.apache.cloudstack.api.InternalIdentity;
 
-import com.cloud.utils.Pair;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
 
 /**
  *
@@ -32,8 +36,101 @@
         Disabled, Enabled;
     }
 
-    public enum IsolationMethod {
-        VLAN, L3, GRE, STT, BCF_SEGMENT, MIDO, SSP, VXLAN, ODL, L3VPN, VSP, VCS;
+    public class IsolationMethod {
+        protected static final String UNKNOWN_PROVIDER = "Unknown";
+        static Set<IsolationMethod> registeredIsolationMethods = new HashSet<>();
+
+        String methodPrefix;
+        String provider;
+
+        public IsolationMethod(String prfx) {
+            this(prfx, UNKNOWN_PROVIDER);
+        }
+
+        public IsolationMethod(String prfx, String prvdr) {
+            methodPrefix = prfx;
+            provider = StringUtils.isNotBlank(prvdr)? prvdr : UNKNOWN_PROVIDER;
+            registeredIsolationMethods.add(this);
+        }
+
+        /**
+         * gets a IsolationMethod object that defines this prefix and if any it returns the first one found that has a known provider. If none has a known provider
+         * it will return the one with the unknown provider. if none is found it return null.
+         *
+         * @param prfx
+         * @return
+         */
+        public static IsolationMethod getIsolationMethod(String prfx) throws IsolationMethodNotRegistered {
+            IsolationMethod rc = null;
+            for (IsolationMethod method: registeredIsolationMethods) {
+                if (method.methodPrefix.equals(prfx)) {
+                    rc = method;
+                    if(! rc.getProvider().equals(UNKNOWN_PROVIDER)) {
+                        break;
+                    }
+                }
+            }
+            if (rc == null) {
+                throw new IsolationMethodNotRegistered("No registration of prefix '" + prfx + "' found.");
+            }
+            return rc;
+        }
+
+        public static IsolationMethod getIsolationMethod(String prfx, String provider) throws IsolationMethodNotRegistered {
+            for (IsolationMethod method: registeredIsolationMethods) {
+                if (method.methodPrefix.equals(prfx) && method.provider.equals(provider)) {
+                    return method;
+                }
+            }
+            throw new IsolationMethodNotRegistered("No registration of prefix '" + prfx + "' for provider '" + provider + "' found.");
+        }
+
+        static class IsolationMethodNotRegistered extends CloudException {
+            IsolationMethodNotRegistered (String message) {
+                super(message);
+            }
+        }
+
+        public String getMethodPrefix() {
+            return methodPrefix;
+        }
+
+        public String getProvider() {
+            return provider;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o)
+                return true;
+            if (o == null || getClass() != o.getClass())
+                return false;
+            IsolationMethod that = (IsolationMethod)o;
+            return Objects.equals(methodPrefix, that.methodPrefix) && Objects.equals(provider, that.provider);
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(methodPrefix, provider);
+        }
+
+        @Override
+        public String toString() {
+            return methodPrefix;
+        }
+
+        public static boolean remove(String prfx, String prvdr) {
+            prvdr = StringUtils.isNotBlank(prvdr)? prvdr : UNKNOWN_PROVIDER;
+
+            try {
+                return remove(getIsolationMethod(prfx, prvdr));
+            } catch (IsolationMethodNotRegistered isolationMethodNotRegistered) {
+                return false;
+            }
+        }
+        public static boolean remove(IsolationMethod method) {
+            return registeredIsolationMethods.remove(method);
+        }
     }
 
     public enum BroadcastDomainRange {
diff --git a/api/src/com/cloud/network/VirtualRouterProvider.java b/api/src/com/cloud/network/VirtualRouterProvider.java
index 8e2fa70d891..aca526b1832 100644
--- a/api/src/com/cloud/network/VirtualRouterProvider.java
+++ b/api/src/com/cloud/network/VirtualRouterProvider.java
@@ -21,7 +21,7 @@
 
 public interface VirtualRouterProvider extends InternalIdentity, Identity {
     public enum Type {
-        VirtualRouter, ElasticLoadBalancerVm, VPCVirtualRouter, InternalLbVm
+        VirtualRouter, ElasticLoadBalancerVm, VPCVirtualRouter, InternalLbVm, NetScalerVm
     }
 
     public Type getType();
diff --git a/api/src/com/cloud/network/element/DhcpServiceProvider.java b/api/src/com/cloud/network/element/DhcpServiceProvider.java
index 2bd6ebcba35..12830f8cec0 100644
--- a/api/src/com/cloud/network/element/DhcpServiceProvider.java
+++ b/api/src/com/cloud/network/element/DhcpServiceProvider.java
@@ -16,6 +16,8 @@
 // under the License.
 package com.cloud.network.element;
 
+import java.util.Map;
+
 import com.cloud.deploy.DeployDestination;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientCapacityException;
@@ -33,4 +35,6 @@ boolean configDhcpSupportForSubnet(Network network, NicProfile nic, VirtualMachi
         throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException;
 
     boolean removeDhcpSupportForSubnet(Network network) throws ResourceUnavailableException;
+
+    boolean setExtraDhcpOptions(Network network, long nicId, Map<Integer, String> dhcpOptions);
 }
diff --git a/api/src/com/cloud/network/element/DnsServiceProvider.java b/api/src/com/cloud/network/element/DnsServiceProvider.java
new file mode 100644
index 00000000000..7abce537221
--- /dev/null
+++ b/api/src/com/cloud/network/element/DnsServiceProvider.java
@@ -0,0 +1,36 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT 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.network.element;
+
+import com.cloud.deploy.DeployDestination;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.network.Network;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.ReservationContext;
+import com.cloud.vm.VirtualMachineProfile;
+
+public interface DnsServiceProvider extends NetworkElement {
+    boolean addDnsEntry(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context)
+        throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException;
+
+    boolean configDnsSupportForSubnet(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context)
+        throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException;
+
+    boolean removeDnsSupportForSubnet(Network network) throws ResourceUnavailableException;
+}
diff --git a/api/src/com/cloud/network/element/RedundantResource.java b/api/src/com/cloud/network/element/RedundantResource.java
new file mode 100644
index 00000000000..6ed2d67e7c9
--- /dev/null
+++ b/api/src/com/cloud/network/element/RedundantResource.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.network.element;
+
+import com.cloud.network.Network;
+
+/**
+ * Created by bharat on 11/08/15.
+ */
+public interface RedundantResource {
+     public void configureResource(Network network);
+     public int getResourceCount(Network network);
+     public void finalize(Network network, boolean success);
+}
diff --git a/api/src/com/cloud/network/element/UserDataServiceProvider.java b/api/src/com/cloud/network/element/UserDataServiceProvider.java
index 45ab0d877a3..bf6d7e819e9 100644
--- a/api/src/com/cloud/network/element/UserDataServiceProvider.java
+++ b/api/src/com/cloud/network/element/UserDataServiceProvider.java
@@ -26,7 +26,7 @@
 import com.cloud.vm.VirtualMachineProfile;
 
 public interface UserDataServiceProvider extends NetworkElement {
-    public boolean addPasswordAndUserdata(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context)
+    boolean addPasswordAndUserdata(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context)
         throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException;
 
     boolean savePassword(Network network, NicProfile nic, VirtualMachineProfile vm) throws ResourceUnavailableException;
diff --git a/api/src/com/cloud/network/lb/CertService.java b/api/src/com/cloud/network/lb/CertService.java
deleted file mode 100644
index e9219e07878..00000000000
--- a/api/src/com/cloud/network/lb/CertService.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.network.lb;
-
-import java.util.List;
-
-import org.apache.cloudstack.api.command.user.loadbalancer.DeleteSslCertCmd;
-import org.apache.cloudstack.api.command.user.loadbalancer.ListSslCertsCmd;
-import org.apache.cloudstack.api.command.user.loadbalancer.UploadSslCertCmd;
-import org.apache.cloudstack.api.response.SslCertResponse;
-
-public interface CertService {
-
-    public SslCertResponse uploadSslCert(UploadSslCertCmd certCmd);
-
-    public void deleteSslCert(DeleteSslCertCmd deleteSslCertCmd);
-
-    public List<SslCertResponse> listSslCerts(ListSslCertsCmd listSslCertCmd);
-}
\ No newline at end of file
diff --git a/api/src/com/cloud/network/lb/SslCert.java b/api/src/com/cloud/network/lb/SslCert.java
deleted file mode 100644
index 98f96ce4020..00000000000
--- a/api/src/com/cloud/network/lb/SslCert.java
+++ /dev/null
@@ -1,35 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-package com.cloud.network.lb;
-
-import org.apache.cloudstack.acl.ControlledEntity;
-import org.apache.cloudstack.api.Identity;
-import org.apache.cloudstack.api.InternalIdentity;
-
-public interface SslCert extends InternalIdentity, Identity, ControlledEntity {
-
-    public String getCertificate();
-
-    public String getKey();
-
-    public String getChain();
-
-    public String getPassword();
-
-    public String getFingerPrint();
-
-}
diff --git a/api/src/com/cloud/network/router/VirtualRouter.java b/api/src/com/cloud/network/router/VirtualRouter.java
index 0114a962146..84c85ce6675 100644
--- a/api/src/com/cloud/network/router/VirtualRouter.java
+++ b/api/src/com/cloud/network/router/VirtualRouter.java
@@ -23,7 +23,11 @@
  */
 public interface VirtualRouter extends VirtualMachine {
     public enum Role {
-        VIRTUAL_ROUTER, LB, INTERNAL_LB_VM
+        VIRTUAL_ROUTER, LB, INTERNAL_LB_VM, NETSCALER_VM
+    }
+
+    public enum UpdateState {
+        UPDATE_NEEDED, UPDATE_IN_PROGRESS, UPDATE_COMPLETE, UPDATE_FAILED
     }
 
     Role getRole();
diff --git a/api/src/com/cloud/network/rules/FirewallRule.java b/api/src/com/cloud/network/rules/FirewallRule.java
index 4346e2f665d..6a46c7da03d 100644
--- a/api/src/com/cloud/network/rules/FirewallRule.java
+++ b/api/src/com/cloud/network/rules/FirewallRule.java
@@ -79,6 +79,8 @@
 
     List<String> getSourceCidrList();
 
+    List<String> getDestinationCidrList();
+
     Long getRelated();
 
     FirewallRuleType getType();
diff --git a/api/src/com/cloud/network/rules/RulesService.java b/api/src/com/cloud/network/rules/RulesService.java
index 3eca14d6543..0b4afeef945 100644
--- a/api/src/com/cloud/network/rules/RulesService.java
+++ b/api/src/com/cloud/network/rules/RulesService.java
@@ -81,6 +81,6 @@
 
     boolean disableStaticNat(long ipId) throws ResourceUnavailableException, NetworkRuleConflictException, InsufficientAddressCapacityException;
 
-    PortForwardingRule updatePortForwardingRule(long id, Integer privatePort, Long virtualMachineId, Ip vmGuestIp, String customId, Boolean forDisplay);
+    PortForwardingRule updatePortForwardingRule(long id, Integer privatePort, Integer privateEndPort, Long virtualMachineId, Ip vmGuestIp, String customId, Boolean forDisplay);
 
 }
diff --git a/api/src/com/cloud/network/vpc/Vpc.java b/api/src/com/cloud/network/vpc/Vpc.java
index dd607fe6caa..9f40562423d 100644
--- a/api/src/com/cloud/network/vpc/Vpc.java
+++ b/api/src/com/cloud/network/vpc/Vpc.java
@@ -87,4 +87,8 @@
      * @return true if VPC spans multiple zones in the region
      */
     boolean isRegionLevelVpc();
+
+    boolean isRollingRestart();
+
+    void setRollingRestart(boolean rollingRestart);
 }
diff --git a/api/src/com/cloud/network/vpc/VpcOffering.java b/api/src/com/cloud/network/vpc/VpcOffering.java
index fb4b151fb4c..c0da6bf967a 100644
--- a/api/src/com/cloud/network/vpc/VpcOffering.java
+++ b/api/src/com/cloud/network/vpc/VpcOffering.java
@@ -52,7 +52,7 @@
     boolean isDefault();
 
     /**
-     * @return service offering id used by VPC virutal router
+     * @return service offering id used by VPC virtual router
      */
     Long getServiceOfferingId();
 
diff --git a/api/src/com/cloud/network/vpn/RemoteAccessVpnService.java b/api/src/com/cloud/network/vpn/RemoteAccessVpnService.java
index decf8c43733..5426d181e70 100644
--- a/api/src/com/cloud/network/vpn/RemoteAccessVpnService.java
+++ b/api/src/com/cloud/network/vpn/RemoteAccessVpnService.java
@@ -33,7 +33,7 @@
 
     RemoteAccessVpn createRemoteAccessVpn(long vpnServerAddressId, String ipRange, boolean openFirewall, Boolean forDisplay) throws NetworkRuleConflictException;
 
-    boolean destroyRemoteAccessVpnForIp(long ipId, Account caller) throws ResourceUnavailableException;
+    boolean destroyRemoteAccessVpnForIp(long ipId, Account caller, boolean forceCleanup) throws ResourceUnavailableException;
 
     RemoteAccessVpn startRemoteAccessVpn(long vpnServerAddressId, boolean openFirewall) throws ResourceUnavailableException;
 
@@ -43,7 +43,7 @@
 
     List<? extends VpnUser> listVpnUsers(long vpnOwnerId, String userName);
 
-    boolean applyVpnUsers(long vpnOwnerId, String userName);
+    boolean applyVpnUsers(long vpnOwnerId, String userName) throws ResourceUnavailableException;
 
     Pair<List<? extends RemoteAccessVpn>, Integer> searchForRemoteAccessVpns(ListRemoteAccessVpnsCmd cmd);
 
diff --git a/api/src/com/cloud/offering/NetworkOffering.java b/api/src/com/cloud/offering/NetworkOffering.java
index f1ef69c2f68..33b165bfa29 100644
--- a/api/src/com/cloud/offering/NetworkOffering.java
+++ b/api/src/com/cloud/offering/NetworkOffering.java
@@ -38,7 +38,7 @@
     }
 
     public enum Detail {
-        InternalLbProvider, PublicLbProvider
+        InternalLbProvider, PublicLbProvider, servicepackageuuid, servicepackagedescription, PromiscuousMode, MacAddressChanges, ForgedTransmits, RelatedNetworkOffering
     }
 
     public final static String SystemPublicNetwork = "System-Public-Network";
@@ -57,6 +57,10 @@
     public final static String DefaultIsolatedNetworkOfferingForVpcNetworks = "DefaultIsolatedNetworkOfferingForVpcNetworks";
     public final static String DefaultIsolatedNetworkOfferingForVpcNetworksNoLB = "DefaultIsolatedNetworkOfferingForVpcNetworksNoLB";
     public final static String DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB = "DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB";
+    public final static String DefaultL2NetworkOffering = "DefaultL2NetworkOffering";
+    public final static String DefaultL2NetworkOfferingVlan = "DefaultL2NetworkOfferingVlan";
+    public final static String DefaultL2NetworkOfferingConfigDrive = "DefaultL2NetworkOfferingConfigDrive";
+    public final static String DefaultL2NetworkOfferingConfigDriveVlan = "DefaultL2NetworkOfferingConfigDriveVlan";
 
     /**
      * @return name for the network offering.
@@ -78,6 +82,8 @@
      */
     Integer getMulticastRateMbps();
 
+    boolean getForVpc();
+
     TrafficType getTrafficType();
 
     boolean getSpecifyVlan();
@@ -131,4 +137,8 @@
     boolean isKeepAliveEnabled();
 
     boolean getSupportsStrechedL2();
+
+    boolean getSupportsPublicAccess();
+
+    String getServicePackage();
 }
diff --git a/api/src/com/cloud/offering/ServiceOffering.java b/api/src/com/cloud/offering/ServiceOffering.java
index 05ae2375c17..196d2b4eb47 100644
--- a/api/src/com/cloud/offering/ServiceOffering.java
+++ b/api/src/com/cloud/offering/ServiceOffering.java
@@ -31,6 +31,7 @@
     public static final String routerDefaultOffUniqueName = "Cloud.Com-SoftwareRouter";
     public static final String elbVmDefaultOffUniqueName = "Cloud.Com-ElasticLBVm";
     public static final String internalLbVmDefaultOffUniqueName = "Cloud.Com-InternalLBVm";
+    // leaving cloud.com references as these are identifyers and no real world addresses (check against DB)
 
     public enum StorageType {
         local, shared
diff --git a/api/src/com/cloud/org/Cluster.java b/api/src/com/cloud/org/Cluster.java
index 90fcb5729e4..4079c88dfde 100644
--- a/api/src/com/cloud/org/Cluster.java
+++ b/api/src/com/cloud/org/Cluster.java
@@ -16,13 +16,11 @@
 // under the License.
 package com.cloud.org;
 
-import org.apache.cloudstack.api.Identity;
-import org.apache.cloudstack.api.InternalIdentity;
-
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.org.Managed.ManagedState;
+import org.apache.cloudstack.kernel.Partition;
 
-public interface Cluster extends Grouping, InternalIdentity, Identity {
+public interface Cluster extends Grouping, Partition {
     public static enum ClusterType {
         CloudManaged, ExternalManaged;
     };
diff --git a/api/src/com/cloud/resource/ResourceService.java b/api/src/com/cloud/resource/ResourceService.java
index 7050b97e0fe..854b53591d6 100644
--- a/api/src/com/cloud/resource/ResourceService.java
+++ b/api/src/com/cloud/resource/ResourceService.java
@@ -53,7 +53,7 @@
     Host reconnectHost(ReconnectHostCmd cmd);
 
     /**
-     * We will automatically create a cloud.com cluster to attach to the external cluster and return a hyper host to perform
+     * We will automatically create an Apache CloudStack cluster to attach to the external cluster and return a hyper host to perform
      * host related operation within the cluster
      *
      * @param cmd
diff --git a/api/src/com/cloud/resource/ResourceState.java b/api/src/com/cloud/resource/ResourceState.java
index 5d2c962f989..d952afa0b7d 100644
--- a/api/src/com/cloud/resource/ResourceState.java
+++ b/api/src/com/cloud/resource/ResourceState.java
@@ -93,6 +93,7 @@ public ResourceState getNextState(Event a) {
         s_fsm.addTransition(ResourceState.Enabled, Event.InternalCreated, ResourceState.Enabled);
         s_fsm.addTransition(ResourceState.Enabled, Event.Disable, ResourceState.Disabled);
         s_fsm.addTransition(ResourceState.Enabled, Event.AdminAskMaintenace, ResourceState.PrepareForMaintenance);
+        s_fsm.addTransition(ResourceState.Enabled, Event.InternalEnterMaintenance, ResourceState.Maintenance);
         s_fsm.addTransition(ResourceState.Disabled, Event.Enable, ResourceState.Enabled);
         s_fsm.addTransition(ResourceState.Disabled, Event.Disable, ResourceState.Disabled);
         s_fsm.addTransition(ResourceState.Disabled, Event.InternalCreated, ResourceState.Disabled);
@@ -109,5 +110,7 @@ public ResourceState getNextState(Event a) {
         s_fsm.addTransition(ResourceState.ErrorInMaintenance, Event.InternalEnterMaintenance, ResourceState.Maintenance);
         s_fsm.addTransition(ResourceState.ErrorInMaintenance, Event.AdminCancelMaintenance, ResourceState.Enabled);
         s_fsm.addTransition(ResourceState.Error, Event.InternalCreated, ResourceState.Error);
+        s_fsm.addTransition(ResourceState.Disabled, Event.DeleteHost, ResourceState.Disabled);
+
     }
 }
diff --git a/api/src/com/cloud/server/ManagementService.java b/api/src/com/cloud/server/ManagementService.java
index 449e1085239..56f36a8d90c 100644
--- a/api/src/com/cloud/server/ManagementService.java
+++ b/api/src/com/cloud/server/ManagementService.java
@@ -390,7 +390,7 @@
      * @return Ternary<List<? extends Host>, List<? extends Host>, Map<Host, Boolean>> List of all Hosts to which a VM
      *         can be migrated, list of Hosts with enough capacity and hosts requiring storage motion for migration.
      */
-    Ternary<Pair<List<? extends Host>, Integer>, List<? extends Host>, Map<Host, Boolean>> listHostsForMigrationOfVM(Long vmId, Long startIndex, Long pageSize);
+    Ternary<Pair<List<? extends Host>, Integer>, List<? extends Host>, Map<Host, Boolean>> listHostsForMigrationOfVM(Long vmId, Long startIndex, Long pageSize, String keyword);
 
     /**
      * List storage pools for live migrating of a volume. The API returns list of all pools in the cluster to which the
diff --git a/api/src/com/cloud/server/ResourceTag.java b/api/src/com/cloud/server/ResourceTag.java
index ce09fdf955b..0bd5d734e30 100644
--- a/api/src/com/cloud/server/ResourceTag.java
+++ b/api/src/com/cloud/server/ResourceTag.java
@@ -38,6 +38,7 @@
         SecurityGroupRule(true, false),
         PublicIpAddress(true, true),
         Project(true, false),
+        Account(true, false),
         Vpc(true, true),
         NetworkACL(true, true),
         StaticRoute(true, false),
@@ -57,7 +58,10 @@
         AutoScaleVmGroup(false, true),
         LBStickinessPolicy(false, true),
         LBHealthCheckPolicy(false, true),
-        SnapshotPolicy(false, true);
+        SnapshotPolicy(false, true),
+        GuestOs(false, true),
+        NetworkOffering(false, true),
+        VpcOffering(true, false);
 
 
         ResourceObjectType(boolean resourceTagsSupport, boolean resourceMetadataSupport) {
diff --git a/api/src/com/cloud/storage/ImageStore.java b/api/src/com/cloud/storage/ImageStore.java
index ec693c4e493..c019b17421d 100644
--- a/api/src/com/cloud/storage/ImageStore.java
+++ b/api/src/com/cloud/storage/ImageStore.java
@@ -41,4 +41,11 @@
      * @return data store protocol
      */
     String getProtocol();
+
+    /**
+     *
+     * @return uri
+     */
+    String getUrl();
+
 }
diff --git a/api/src/com/cloud/storage/Snapshot.java b/api/src/com/cloud/storage/Snapshot.java
index 7f0168efd8e..2f3a59541d9 100644
--- a/api/src/com/cloud/storage/Snapshot.java
+++ b/api/src/com/cloud/storage/Snapshot.java
@@ -16,14 +16,13 @@
 // under the License.
 package com.cloud.storage;
 
-import java.util.Date;
-
+import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.utils.fsm.StateObject;
 import org.apache.cloudstack.acl.ControlledEntity;
 import org.apache.cloudstack.api.Identity;
 import org.apache.cloudstack.api.InternalIdentity;
 
-import com.cloud.hypervisor.Hypervisor.HypervisorType;
-import com.cloud.utils.fsm.StateObject;
+import java.util.Date;
 
 public interface Snapshot extends ControlledEntity, Identity, InternalIdentity, StateObject<Snapshot.State> {
     public enum Type {
@@ -67,6 +66,10 @@ public boolean equals(String status) {
         CreateRequested, OperationNotPerformed, BackupToSecondary, BackedupToSecondary, DestroyRequested, CopyingRequested, OperationSucceeded, OperationFailed
     }
 
+    enum LocationType {
+        PRIMARY, SECONDARY
+    }
+
     public static final long MANUAL_POLICY_ID = 0L;
 
     @Override
@@ -76,6 +79,8 @@ public boolean equals(String status) {
 
     String getName();
 
+    long getSnapshotId();
+
     Date getCreated();
 
     Type getRecurringType();
@@ -89,4 +94,5 @@ public boolean equals(String status) {
 
     short getsnapshotType();
 
+    LocationType getLocationType(); // This type is in reference to the location where the snapshot resides (ex. primary storage, archive on secondary storage, etc.)
 }
diff --git a/api/src/com/cloud/storage/Storage.java b/api/src/com/cloud/storage/Storage.java
index 25ae5ca4dc9..9093dc34f14 100644
--- a/api/src/com/cloud/storage/Storage.java
+++ b/api/src/com/cloud/storage/Storage.java
@@ -113,36 +113,44 @@ public static ProvisioningType getProvisioningType(String provisioningType){
         SYSTEM, /* routing, system vm template */
         BUILTIN, /* buildin template */
         PERHOST, /* every host has this template, don't need to install it in secondary storage */
-        USER /* User supplied template/iso */
+        USER, /* User supplied template/iso */
+        DATADISK, /* Template corresponding to a datadisk(non root disk) present in an OVA */
+        ISODISK /* Template corresponding to a iso (non root disk) present in an OVA */
     }
 
     public static enum StoragePoolType {
-        Filesystem(false), // local directory
-        NetworkFilesystem(true), // NFS
-        IscsiLUN(true), // shared LUN, with a clusterfs overlay
-        Iscsi(true), // for e.g., ZFS Comstar
-        ISO(false), // for iso image
-        LVM(false), // XenServer local LVM SR
-        CLVM(true),
-        RBD(true), // http://libvirt.org/storage.html#StorageBackendRBD
-        SharedMountPoint(true),
-        VMFS(true), // VMware VMFS storage
-        PreSetup(true), // for XenServer, Storage Pool is set up by customers.
-        EXT(false), // XenServer local EXT SR
-        OCFS2(true),
-        SMB(true),
-        Gluster(true),
-        ManagedNFS(true);
-
-        boolean shared;
-
-        StoragePoolType(boolean shared) {
+        Filesystem(false, true), // local directory
+        NetworkFilesystem(true, true), // NFS
+        IscsiLUN(true, false), // shared LUN, with a clusterfs overlay
+        Iscsi(true, false), // for e.g., ZFS Comstar
+        ISO(false, false), // for iso image
+        LVM(false, false), // XenServer local LVM SR
+        CLVM(true, false),
+        RBD(true, true), // http://libvirt.org/storage.html#StorageBackendRBD
+        SharedMountPoint(true, false),
+        VMFS(true, true), // VMware VMFS storage
+        PreSetup(true, true), // for XenServer, Storage Pool is set up by customers.
+        EXT(false, true), // XenServer local EXT SR
+        OCFS2(true, false),
+        SMB(true, false),
+        Gluster(true, false),
+        ManagedNFS(true, false);
+
+        private final boolean shared;
+        private final boolean overprovisioning;
+
+        StoragePoolType(boolean shared, boolean overprovisioning) {
             this.shared = shared;
+            this.overprovisioning = overprovisioning;
         }
 
         public boolean isShared() {
             return shared;
         }
+
+        public boolean supportsOverProvisioning() {
+            return overprovisioning;
+        }
     }
 
     public static List<StoragePoolType> getNonSharedStoragePoolTypes() {
diff --git a/api/src/com/cloud/storage/StoragePool.java b/api/src/com/cloud/storage/StoragePool.java
index 8e03c3348f3..3a2d3bd8fee 100644
--- a/api/src/com/cloud/storage/StoragePool.java
+++ b/api/src/com/cloud/storage/StoragePool.java
@@ -104,4 +104,6 @@
     boolean isInMaintenance();
 
     Hypervisor.HypervisorType getHypervisor();
+
+    boolean isManaged();
 }
diff --git a/api/src/com/cloud/storage/VMTemplateStorageResourceAssoc.java b/api/src/com/cloud/storage/VMTemplateStorageResourceAssoc.java
index d40eafe7a15..f43d5331222 100644
--- a/api/src/com/cloud/storage/VMTemplateStorageResourceAssoc.java
+++ b/api/src/com/cloud/storage/VMTemplateStorageResourceAssoc.java
@@ -22,7 +22,7 @@
 
 public interface VMTemplateStorageResourceAssoc extends InternalIdentity {
     public static enum Status {
-        UNKNOWN, DOWNLOAD_ERROR, NOT_DOWNLOADED, DOWNLOAD_IN_PROGRESS, DOWNLOADED, ABANDONED, UPLOADED, NOT_UPLOADED, UPLOAD_ERROR, UPLOAD_IN_PROGRESS, CREATING, CREATED
+        UNKNOWN, DOWNLOAD_ERROR, NOT_DOWNLOADED, DOWNLOAD_IN_PROGRESS, DOWNLOADED, ABANDONED, UPLOADED, NOT_UPLOADED, UPLOAD_ERROR, UPLOAD_IN_PROGRESS, CREATING, CREATED, BYPASSED
     }
 
     String getInstallPath();
diff --git a/api/src/com/cloud/storage/Volume.java b/api/src/com/cloud/storage/Volume.java
index f70ead93718..133a59df8a6 100644
--- a/api/src/com/cloud/storage/Volume.java
+++ b/api/src/com/cloud/storage/Volume.java
@@ -51,7 +51,8 @@
         NotUploaded("The volume entry is just created in DB, not yet uploaded"),
         UploadInProgress("Volume upload is in progress"),
         UploadError("Volume upload encountered some error"),
-        UploadAbandoned("Volume upload is abandoned since the upload was never initiated within a specificed time");
+        UploadAbandoned("Volume upload is abandoned since the upload was never initiated within a specificed time"),
+        Attaching("The volume is attaching to a VM");
 
         String _description;
 
@@ -118,6 +119,9 @@ public String getDescription() {
             s_fsm.addTransition(new StateMachine2.Transition<State, Event>(UploadInProgress, Event.OperationTimeout, UploadError, null));
             s_fsm.addTransition(new StateMachine2.Transition<State, Event>(UploadError, Event.DestroyRequested, Destroy, null));
             s_fsm.addTransition(new StateMachine2.Transition<State, Event>(UploadAbandoned, Event.DestroyRequested, Destroy, null));
+            s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Ready, Event.AttachRequested, Attaching, null));
+            s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Attaching, Event.OperationSucceeded, Ready, null));
+            s_fsm.addTransition(new StateMachine2.Transition<State, Event>(Attaching, Event.OperationFailed, Ready, null));
         }
     }
 
@@ -139,6 +143,7 @@ public String getDescription() {
         DestroyRequested,
         ExpungingRequested,
         ResizeRequested,
+        AttachRequested,
         OperationTimeout;
     }
 
diff --git a/api/src/com/cloud/storage/VolumeApiService.java b/api/src/com/cloud/storage/VolumeApiService.java
index 7832b892072..cf13cd671a9 100644
--- a/api/src/com/cloud/storage/VolumeApiService.java
+++ b/api/src/com/cloud/storage/VolumeApiService.java
@@ -18,6 +18,8 @@
  */
 package com.cloud.storage;
 
+import java.net.MalformedURLException;
+
 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;
@@ -26,13 +28,10 @@
 import org.apache.cloudstack.api.command.user.volume.MigrateVolumeCmd;
 import org.apache.cloudstack.api.command.user.volume.ResizeVolumeCmd;
 import org.apache.cloudstack.api.command.user.volume.UploadVolumeCmd;
+import org.apache.cloudstack.api.response.GetUploadParamsResponse;
 
-import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.user.Account;
-import org.apache.cloudstack.api.response.GetUploadParamsResponse;
-
-import java.net.MalformedURLException;
 
 public interface VolumeApiService {
     /**
@@ -70,23 +69,22 @@
     /**
      * Uploads the volume to secondary storage
      *
-     * @param UploadVolumeCmdByAdmin cmd
-     *
      * @return Volume object
      */
-    Volume uploadVolume(UploadVolumeCmd cmd)    throws ResourceAllocationException;
+    Volume uploadVolume(UploadVolumeCmd cmd) throws ResourceAllocationException;
 
     GetUploadParamsResponse uploadVolume(GetUploadParamsForVolumeCmd cmd) throws ResourceAllocationException, MalformedURLException;
 
-    boolean deleteVolume(long volumeId, Account caller) throws ConcurrentOperationException;
+    boolean deleteVolume(long volumeId, Account caller);
 
     Volume attachVolumeToVM(AttachVolumeCmd command);
 
-    Volume detachVolumeFromVM(DetachVolumeCmd cmmd);
+    Volume detachVolumeFromVM(DetachVolumeCmd cmd);
 
-    Snapshot takeSnapshot(Long volumeId, Long policyId, Long snapshotId, Account account, boolean quiescevm) throws ResourceAllocationException;
+    Snapshot takeSnapshot(Long volumeId, Long policyId, Long snapshotId, Account account, boolean quiescevm, Snapshot.LocationType locationType, boolean asyncBackup)
+            throws ResourceAllocationException;
 
-    Snapshot allocSnapshot(Long volumeId, Long policyId, String snapshotName) throws ResourceAllocationException;
+    Snapshot allocSnapshot(Long volumeId, Long policyId, String snapshotName, Snapshot.LocationType locationType) throws ResourceAllocationException;
 
     Volume updateVolume(long volumeId, String path, String state, Long storageId, Boolean displayVolume, String customId, long owner, String chainInfo);
 
@@ -94,14 +92,14 @@
      * Extracts the volume to a particular location.
      *
      * @param cmd
-     *            the command specifying url (where the volume needs to be extracted to), zoneId (zone where the volume
-     *            exists),
+     *            the command specifying url (where the volume needs to be extracted to), zoneId (zone where the volume exists),
      *            id (the id of the volume)
-     *
      */
     String extractVolume(ExtractVolumeCmd cmd);
 
     boolean isDisplayResourceEnabled(Long id);
 
     void updateDisplay(Volume volume, Boolean displayVolume);
+
+    Snapshot allocSnapshotForVm(Long vmId, Long volumeId, String snapshotName) throws ResourceAllocationException;
 }
diff --git a/api/src/com/cloud/storage/VolumeStats.java b/api/src/com/cloud/storage/VolumeStats.java
index 70c0b17f84a..81fa7eabdd7 100644
--- a/api/src/com/cloud/storage/VolumeStats.java
+++ b/api/src/com/cloud/storage/VolumeStats.java
@@ -20,5 +20,10 @@
     /**
      * @return bytes used by the volume
      */
-    public long getBytesUsed();
+    long getVirtualSize();
+
+    /**
+     * @return bytes allocated
+     */
+    long getPhysicalSize();
 }
diff --git a/api/src/com/cloud/storage/snapshot/SnapshotApiService.java b/api/src/com/cloud/storage/snapshot/SnapshotApiService.java
index fb48f477454..eb1393543c0 100644
--- a/api/src/com/cloud/storage/snapshot/SnapshotApiService.java
+++ b/api/src/com/cloud/storage/snapshot/SnapshotApiService.java
@@ -86,7 +86,7 @@
 
     boolean deleteSnapshotPolicies(DeleteSnapshotPoliciesCmd cmd);
 
-    Snapshot allocSnapshot(Long volumeId, Long policyId, String snapshotName) throws ResourceAllocationException;
+    Snapshot allocSnapshot(Long volumeId, Long policyId, String snapshotName, Snapshot.LocationType locationType) throws ResourceAllocationException;
 
     /**
      * Create a snapshot of a volume
@@ -108,5 +108,7 @@
 
     Snapshot revertSnapshot(Long snapshotId);
 
+    Snapshot backupSnapshotFromVmSnapshot(Long snapshotId, Long vmId, Long volumeId, Long vmSnapshotId);
+
     SnapshotPolicy updateSnapshotPolicy(UpdateSnapshotPolicyCmd updateSnapshotPolicyCmd);
 }
diff --git a/api/src/com/cloud/template/VirtualMachineTemplate.java b/api/src/com/cloud/template/VirtualMachineTemplate.java
index 54d61a4597b..564f3b987be 100644
--- a/api/src/com/cloud/template/VirtualMachineTemplate.java
+++ b/api/src/com/cloud/template/VirtualMachineTemplate.java
@@ -133,6 +133,8 @@
 
     boolean isDynamicallyScalable();
 
+    Long getParentTemplateId();
+
     long getUpdatedCount();
 
     void incrUpdatedCount();
diff --git a/api/src/com/cloud/user/AccountService.java b/api/src/com/cloud/user/AccountService.java
index 959a710d6d9..9683d9fa330 100644
--- a/api/src/com/cloud/user/AccountService.java
+++ b/api/src/com/cloud/user/AccountService.java
@@ -21,6 +21,7 @@
 import org.apache.cloudstack.acl.ControlledEntity;
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
+import org.apache.cloudstack.api.command.admin.user.GetUserKeysCmd;
 import org.apache.cloudstack.api.command.admin.user.RegisterCmd;
 
 import com.cloud.domain.Domain;
@@ -28,6 +29,7 @@
 import com.cloud.offering.DiskOffering;
 import com.cloud.offering.ServiceOffering;
 
+
 public interface AccountService {
 
     /**
@@ -124,6 +126,8 @@ User createUser(String userName, String password, String firstName, String lastN
 
     void checkAccess(Account account, DiskOffering dof) throws PermissionDeniedException;
 
+    void checkAccess(User user, ControlledEntity entity);
+
     void checkAccess(Account account, AccessType accessType, boolean sameOwner, String apiName,
             ControlledEntity... entities) throws PermissionDeniedException;
 
@@ -136,4 +140,5 @@ void checkAccess(Account account, AccessType accessType, boolean sameOwner, Stri
      */
     UserAccount getUserAccountById(Long userId);
 
+    public Map<String, String> getKeys(GetUserKeysCmd cmd);
 }
diff --git a/api/src/com/cloud/user/ResourceLimitService.java b/api/src/com/cloud/user/ResourceLimitService.java
index fef16da942f..2df9b037e3d 100644
--- a/api/src/com/cloud/user/ResourceLimitService.java
+++ b/api/src/com/cloud/user/ResourceLimitService.java
@@ -23,9 +23,13 @@
 import com.cloud.configuration.ResourceLimit;
 import com.cloud.domain.Domain;
 import com.cloud.exception.ResourceAllocationException;
+import org.apache.cloudstack.framework.config.ConfigKey;
 
 public interface ResourceLimitService {
 
+    static final ConfigKey<Long> ResourceCountCheckInterval = new ConfigKey<Long>("Advanced", Long.class, "resourcecount.check.interval", "300",
+            "Time (in seconds) to wait before running resource recalculation and fixing task. Default is 300 seconds, Setting this to 0 disables execution of the task", false);
+
     /**
      * Updates an existing resource limit with the specified details. If a limit doesn't exist, will create one.
      *
@@ -64,11 +68,11 @@
      *            TODO
      * @param domainId
      *            TODO
-     * @param type
+     * @param resourceType
      *            TODO
      * @return a list of limits that match the criteria
      */
-    public List<? extends ResourceLimit> searchForLimits(Long id, Long accountId, Long domainId, Integer type, Long startIndex, Long pageSizeVal);
+    public List<? extends ResourceLimit> searchForLimits(Long id, Long accountId, Long domainId, ResourceType resourceType, Long startIndex, Long pageSizeVal);
 
     /**
      * Finds the resource limit for a specified account and type. If the account has an infinite limit, will check
@@ -100,6 +104,14 @@
      */
     public long findCorrectResourceLimitForDomain(Domain domain, ResourceType type);
 
+    /**
+     * Finds the default resource limit for a specified type.
+     *
+     * @param resourceType
+     * @return resource limit
+     */
+    public long findDefaultResourceLimitForDomain(ResourceType resourceType);
+
     /**
      * Increments the resource count
      *
diff --git a/api/src/com/cloud/user/User.java b/api/src/com/cloud/user/User.java
index 0ecdcfa58d4..c3ac66c6979 100644
--- a/api/src/com/cloud/user/User.java
+++ b/api/src/com/cloud/user/User.java
@@ -22,8 +22,9 @@
 
 public interface User extends OwnedBy, InternalIdentity {
 
+    // UNKNOWN and NATIVE can be used interchangeably
     public enum Source {
-        LDAP, SAML2, SAML2DISABLED, UNKNOWN
+        LDAP, SAML2, SAML2DISABLED, UNKNOWN, NATIVE
     }
 
     public static final long UID_SYSTEM = 1;
diff --git a/api/src/com/cloud/vm/DiskProfile.java b/api/src/com/cloud/vm/DiskProfile.java
index a37f7aaf57b..d9097748363 100644
--- a/api/src/com/cloud/vm/DiskProfile.java
+++ b/api/src/com/cloud/vm/DiskProfile.java
@@ -139,6 +139,10 @@ public Long getTemplateId() {
         return templateId;
     }
 
+    public void setTemplateId(Long templateId) {
+        this.templateId = templateId;
+    }
+
     /**
      * @return disk offering id that the disk is based on.
      */
diff --git a/api/src/com/cloud/vm/NicExtraDhcpOption.java b/api/src/com/cloud/vm/NicExtraDhcpOption.java
new file mode 100644
index 00000000000..f5d9fa0c6b4
--- /dev/null
+++ b/api/src/com/cloud/vm/NicExtraDhcpOption.java
@@ -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.
+package com.cloud.vm;
+
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
+public interface NicExtraDhcpOption extends InternalIdentity, Identity {
+
+    /**
+     * Returns the nic id for which the DHCP option applies
+     * @return nic id
+     */
+    long getNicId();
+
+    /**
+     * Returns the DHCP option code
+     * @return
+     */
+    int getCode();
+
+    /**
+     * Returns the Dhcp value
+     * @return
+     */
+    String getValue();
+}
diff --git a/api/src/com/cloud/vm/NicProfile.java b/api/src/com/cloud/vm/NicProfile.java
index 58e05124c89..6ef9cfe5db1 100644
--- a/api/src/com/cloud/vm/NicProfile.java
+++ b/api/src/com/cloud/vm/NicProfile.java
@@ -114,6 +114,11 @@ public NicProfile(String requestedIPv4, String requestedIPv6) {
         this.requestedIPv6 = requestedIPv6;
     }
 
+    public NicProfile(String requestedIPv4, String requestedIPv6, String requestedMacAddress) {
+        this(requestedIPv4, requestedIPv6);
+        this.macAddress = requestedMacAddress;
+    }
+
     public NicProfile(ReservationStrategy strategy, String iPv4Address, String macAddress, String iPv4gateway, String iPv4netmask) {
         format = AddressFormat.Ip4;
         this.iPv4Address = iPv4Address;
diff --git a/api/src/com/cloud/vm/NicSecondaryIp.java b/api/src/com/cloud/vm/NicSecondaryIp.java
index fb90dd351f6..2856e0aea75 100644
--- a/api/src/com/cloud/vm/NicSecondaryIp.java
+++ b/api/src/com/cloud/vm/NicSecondaryIp.java
@@ -32,8 +32,12 @@
 
     long getNicId();
 
+    void setNicId(long nicId);
+
     String getIp4Address();
 
+    String getIp6Address();
+
     long getNetworkId();
 
     long getVmId();
diff --git a/api/src/com/cloud/vm/UserVmService.java b/api/src/com/cloud/vm/UserVmService.java
index 54206ed2395..74090ec40e6 100644
--- a/api/src/com/cloud/vm/UserVmService.java
+++ b/api/src/com/cloud/vm/UserVmService.java
@@ -50,6 +50,7 @@
 import com.cloud.host.Host;
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.network.Network.IpAddresses;
+import com.cloud.offering.DiskOffering;
 import com.cloud.offering.ServiceOffering;
 import com.cloud.storage.StoragePool;
 import com.cloud.template.VirtualMachineTemplate;
@@ -75,14 +76,14 @@
     /**
      * Destroys one virtual machine
      *
-     * @param userId
-     *            the id of the user performing the action
      * @param vmId
      *            the id of the virtual machine.
+     * @param expunge
+     *            indicates if vm should be expunged
      * @throws ConcurrentOperationException
      * @throws ResourceUnavailableException
      */
-    UserVm destroyVm(long vmId) throws ResourceUnavailableException, ConcurrentOperationException;
+    UserVm destroyVm(long vmId, boolean expunge) throws ResourceUnavailableException, ConcurrentOperationException;
 
     /**
      * Resets the password of a virtual machine.
@@ -194,7 +195,14 @@ UserVm startVirtualMachine(StartVMCmd cmd) throws StorageUnavailableException, E
      * @param memory
      * @param cpuNumber
      * @param customId
+     * @param dhcpOptionMap
+     *           - Maps the dhcp option code and the dhcp value to the network uuid
      * @return UserVm object if successful.
+     * @param dataDiskTemplateToDiskOfferingMap
+     *            - Datadisk template to Disk offering Map
+     *             an optional parameter that creates additional data disks for the virtual machine
+     *             For each of the templates in the map, a data disk will be created from the corresponding
+     *             disk offering obtained from the map
      *
      * @throws InsufficientCapacityException
      *             if there is insufficient capacity to deploy the VM.
@@ -208,7 +216,8 @@ UserVm startVirtualMachine(StartVMCmd cmd) throws StorageUnavailableException, E
     UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List<Long> securityGroupIdList,
         Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, HTTPMethod httpmethod,
         String userData, String sshKeyPair, Map<Long, IpAddresses> requestedIps, IpAddresses defaultIp, Boolean displayVm, String keyboard,
-        List<Long> affinityGroupIdList, Map<String, String> customParameter, String customId) throws InsufficientCapacityException,
+        List<Long> affinityGroupIdList, Map<String, String> customParameter, String customId, Map<String, Map<Integer, String>> dhcpOptionMap,
+        Map<Long, DiskOffering> dataDiskTemplateToDiskOfferingMap) throws InsufficientCapacityException,
         ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException;
 
     /**
@@ -267,6 +276,13 @@ UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering s
      * @param memory
      * @param cpuNumber
      * @param customId
+     * @param dhcpOptionMap
+     *             - Maps the dhcp option code and the dhcp value to the network uuid
+     * @param dataDiskTemplateToDiskOfferingMap
+     *            - Datadisk template to Disk offering Map
+     *             an optional parameter that creates additional data disks for the virtual machine
+     *             For each of the templates in the map, a data disk will be created from the corresponding
+     *             disk offering obtained from the map
      * @return UserVm object if successful.
      *
      * @throws InsufficientCapacityException
@@ -281,7 +297,8 @@ UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering s
     UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List<Long> networkIdList,
         List<Long> securityGroupIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor,
         HTTPMethod httpmethod, String userData, String sshKeyPair, Map<Long, IpAddresses> requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard,
-        List<Long> affinityGroupIdList, Map<String, String> customParameters, String customId) throws InsufficientCapacityException,
+        List<Long> affinityGroupIdList, Map<String, String> customParameters, String customId, Map<String, Map<Integer, String>> dhcpOptionMap,
+        Map<Long, DiskOffering> dataDiskTemplateToDiskOfferingMap) throws InsufficientCapacityException,
         ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException;
 
     /**
@@ -338,6 +355,13 @@ UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, ServiceOfferin
      * @param memory
      * @param cpuNumber
      * @param customId
+     * @param dhcpOptionMap
+     *             - Map that maps the DhcpOption code and their value on the Network uuid
+     * @param dataDiskTemplateToDiskOfferingMap
+     *            - Datadisk template to Disk offering Map
+     *             an optional parameter that creates additional data disks for the virtual machine
+     *             For each of the templates in the map, a data disk will be created from the corresponding
+     *             disk offering obtained from the map
      * @return UserVm object if successful.
      *
      * @throws InsufficientCapacityException
@@ -352,7 +376,7 @@ UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, ServiceOfferin
     UserVm createAdvancedVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List<Long> networkIdList, Account owner,
         String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, HTTPMethod httpmethod, String userData,
         String sshKeyPair, Map<Long, IpAddresses> requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, List<Long> affinityGroupIdList,
-        Map<String, String> customParameters, String customId)
+        Map<String, String> customParameters, String customId, Map<String, Map<Integer, String>> dhcpOptionMap, Map<Long, DiskOffering> dataDiskTemplateToDiskOfferingMap)
 
         throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException;
 
@@ -482,4 +506,8 @@ UserVm upgradeVirtualMachine(ScaleVMCmd cmd) throws ResourceUnavailableException
      */
     public boolean isDisplayResourceEnabled(Long vmId);
 
+    void collectVmDiskStatistics(UserVm userVm);
+
+    void collectVmNetworkStatistics (UserVm userVm);
+
 }
diff --git a/api/src/com/cloud/vm/VirtualMachine.java b/api/src/com/cloud/vm/VirtualMachine.java
index b45ac7c9be9..a46edd78f44 100644
--- a/api/src/com/cloud/vm/VirtualMachine.java
+++ b/api/src/com/cloud/vm/VirtualMachine.java
@@ -16,26 +16,24 @@
 // under the License.
 package com.cloud.vm;
 
-import java.util.Arrays;
-import java.util.Date;
-import java.util.Map;
-
-import org.apache.cloudstack.acl.ControlledEntity;
-import org.apache.cloudstack.api.Displayable;
-import org.apache.cloudstack.api.Identity;
-import org.apache.cloudstack.api.InternalIdentity;
-
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.utils.fsm.StateMachine2;
 import com.cloud.utils.fsm.StateMachine2.Transition;
 import com.cloud.utils.fsm.StateMachine2.Transition.Impact;
 import com.cloud.utils.fsm.StateObject;
+import org.apache.cloudstack.acl.ControlledEntity;
+import org.apache.cloudstack.api.Displayable;
+import org.apache.cloudstack.kernel.Partition;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Map;
 
 /**
  * VirtualMachine describes the properties held by a virtual machine
  *
  */
-public interface VirtualMachine extends RunningOn, ControlledEntity, Identity, InternalIdentity, Displayable, StateObject<VirtualMachine.State> {
+public interface VirtualMachine extends RunningOn, ControlledEntity, Partition, Displayable, StateObject<VirtualMachine.State> {
 
     public enum PowerState {
         PowerUnknown,
@@ -214,6 +212,7 @@ public static boolean isVmDestroyed(State oldState, Event e, State newState) {
 
     public enum Type {
         User(false), DomainRouter(true), ConsoleProxy(true), SecondaryStorageVm(true), ElasticIpVm(true), ElasticLoadBalancerVm(true), InternalLoadBalancerVm(true),
+        NetScalerVm(true),
 
         /*
          * UserBareMetal is only used for selecting VirtualMachineGuru, there is no
diff --git a/api/src/com/cloud/vm/VirtualMachineProfile.java b/api/src/com/cloud/vm/VirtualMachineProfile.java
index ed02dcb9c67..977e27eb14f 100644
--- a/api/src/com/cloud/vm/VirtualMachineProfile.java
+++ b/api/src/com/cloud/vm/VirtualMachineProfile.java
@@ -56,6 +56,7 @@
         public static final Param VmSshPubKey = new Param("VmSshPubKey");
         public static final Param ControlNic = new Param("ControlNic");
         public static final Param ReProgramGuestNetworks = new Param("RestartNetwork");
+        public static final Param RollingRestart = new Param("RollingRestart");
         public static final Param PxeSeverType = new Param("PxeSeverType");
         public static final Param HaTag = new Param("HaTag");
         public static final Param HaOperation = new Param("HaOperation");
@@ -173,4 +174,6 @@ public boolean equals(Object obj) {
 
     Float getMemoryOvercommitRatio();
 
+    boolean isRollingRestart();
+
 }
diff --git a/api/src/com/cloud/vm/VmDetailConstants.java b/api/src/com/cloud/vm/VmDetailConstants.java
index d34afc13a16..f24c4f587c4 100644
--- a/api/src/com/cloud/vm/VmDetailConstants.java
+++ b/api/src/com/cloud/vm/VmDetailConstants.java
@@ -23,4 +23,8 @@
     public static final String NESTED_VIRTUALIZATION_FLAG = "nestedVirtualizationFlag";
     public static final String HYPERVISOR_TOOLS_VERSION = "hypervisortoolsversion";
     public static final String DATA_DISK_CONTROLLER = "dataDiskController";
+    public static final String SVGA_VRAM_SIZE = "svga.vramSize";
+    public static final String CPU_NUMBER = "cpuNumber";
+    public static final String CPU_SPEED = "cpuSpeed";
+    public static final String MEMORY = "memory";
 }
diff --git a/api/src/com/cloud/vm/VmNetworkStats.java b/api/src/com/cloud/vm/VmNetworkStats.java
new file mode 100644
index 00000000000..7f96fdfdfac
--- /dev/null
+++ b/api/src/com/cloud/vm/VmNetworkStats.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 com.cloud.vm;
+
+public interface VmNetworkStats {
+    // vm related network stats
+
+    public long getBytesSent();
+
+    public long getBytesReceived();
+
+}
diff --git a/api/src/com/cloud/vm/snapshot/VMSnapshot.java b/api/src/com/cloud/vm/snapshot/VMSnapshot.java
index 7713b2052ac..c398e583fae 100644
--- a/api/src/com/cloud/vm/snapshot/VMSnapshot.java
+++ b/api/src/com/cloud/vm/snapshot/VMSnapshot.java
@@ -102,4 +102,6 @@ public String getDescription() {
 
     @Override
     public long getAccountId();
+
+    public long getServiceOfferingId();
 }
diff --git a/api/src/com/cloud/vm/snapshot/VMSnapshotService.java b/api/src/com/cloud/vm/snapshot/VMSnapshotService.java
index 12767b3db15..e376265acfa 100644
--- a/api/src/com/cloud/vm/snapshot/VMSnapshotService.java
+++ b/api/src/com/cloud/vm/snapshot/VMSnapshotService.java
@@ -36,7 +36,7 @@
 
     VMSnapshot getVMSnapshotById(Long id);
 
-    VMSnapshot creatVMSnapshot(Long vmId, Long vmSnapshotId, Boolean quiescevm);
+    VMSnapshot createVMSnapshot(Long vmId, Long vmSnapshotId, Boolean quiescevm);
 
     VMSnapshot allocVMSnapshot(Long vmId, String vsDisplayName, String vsDescription, Boolean snapshotMemory) throws ResourceAllocationException;
 
@@ -46,4 +46,11 @@ UserVm revertToSnapshot(Long vmSnapshotId) throws InsufficientServerCapacityExce
         ConcurrentOperationException;
 
     VirtualMachine getVMBySnapshotId(Long id);
+
+    /**
+     * Delete vm snapshots only from database. Introduced as a Vmware optimization in which vm snapshots are deleted when
+     * 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);
 }
diff --git a/api/src/org/apache/cloudstack/acl/RoleService.java b/api/src/org/apache/cloudstack/acl/RoleService.java
index 59eef51e782..6130c62a7d4 100644
--- a/api/src/org/apache/cloudstack/acl/RoleService.java
+++ b/api/src/org/apache/cloudstack/acl/RoleService.java
@@ -17,36 +17,64 @@
 
 package org.apache.cloudstack.acl;
 
-import org.apache.cloudstack.framework.config.ConfigKey;
-
 import java.util.List;
 
+import org.apache.cloudstack.acl.RolePermission.Permission;
+import org.apache.cloudstack.framework.config.ConfigKey;
+
 public interface RoleService {
 
     ConfigKey<Boolean> EnableDynamicApiChecker = new ConfigKey<>("Advanced", Boolean.class, "dynamic.apichecker.enabled", "false",
-            "If set to true, this enables the dynamic role-based api access checker and disables the default static role-based api access checker.",
-            true);
+            "If set to true, this enables the dynamic role-based api access checker and disables the default static role-based api access checker.", true);
 
     boolean isEnabled();
-    Role findRole(final Long id);
-    Role createRole(final String name, final RoleType roleType, final String description);
-    boolean updateRole(final Role role, final String name, final RoleType roleType, final String description);
-    boolean deleteRole(final Role role);
 
-    RolePermission findRolePermission(final Long id);
-    RolePermission findRolePermissionByUuid(final String uuid);
+    /**
+     *  Searches for a role with the given ID. If the ID is null or less than zero, this method will return null.
+     *  This method will also return null if no role is found with the provided ID.
+     *  Moreover, we will check if the requested role is of 'Admin' type; roles with 'Admin' type should only be visible to 'root admins'.
+     *  Therefore, if a non-'root admin' user tries to search for an 'Admin' role, this method will return null.
+     */
+    Role findRole(Long id);
+
+    Role createRole(String name, RoleType roleType, String description);
+
+    Role updateRole(Role role, String name, RoleType roleType, String description);
+
+    boolean deleteRole(Role role);
+
+    RolePermission findRolePermission(Long id);
+
+    RolePermission findRolePermissionByUuid(String uuid);
+
+    RolePermission createRolePermission(Role role, Rule rule, Permission permission, String description);
 
-    RolePermission createRolePermission(final Role role, final Rule rule, final RolePermission.Permission permission, final String description);
     /**
      * updateRolePermission updates the order/position of an role permission
      * @param role The role whose permissions needs to be re-ordered
      * @param newOrder The new list of ordered role permissions
      */
-    boolean updateRolePermission(final Role role, final List<RolePermission> newOrder);
-    boolean deleteRolePermission(final RolePermission rolePermission);
+    boolean updateRolePermission(Role role, List<RolePermission> newOrder);
 
+    boolean updateRolePermission(Role role, RolePermission rolePermission, Permission permission);
+
+    boolean deleteRolePermission(RolePermission rolePermission);
+
+    /**
+     *  List all roles configured in the database. Roles that have the type {@link RoleType#Admin} will not be shown for users that are not 'root admin'.
+     */
     List<Role> listRoles();
-    List<Role> findRolesByName(final String name);
-    List<Role> findRolesByType(final RoleType roleType);
-    List<RolePermission> findAllPermissionsBy(final Long roleId);
+
+    /**
+     *  Find all roles that have the giving {@link String} as part of their name.
+     *  If the user calling the method is not a 'root admin', roles of type {@link RoleType#Admin} wil lbe removed of the returned list.
+     */
+    List<Role> findRolesByName(String name);
+
+    /**
+     *  Find all roles by {@link RoleType}. If the role type is {@link RoleType#Admin}, the calling account must be a root admin, otherwise we return an empty list.
+     */
+    List<Role> findRolesByType(RoleType roleType);
+
+    List<RolePermission> findAllPermissionsBy(Long roleId);
 }
diff --git a/api/src/org/apache/cloudstack/alert/AlertService.java b/api/src/org/apache/cloudstack/alert/AlertService.java
index ad711ecea4e..26c3f3cf3ab 100644
--- a/api/src/org/apache/cloudstack/alert/AlertService.java
+++ b/api/src/org/apache/cloudstack/alert/AlertService.java
@@ -16,12 +16,12 @@
 // under the License.
 package org.apache.cloudstack.alert;
 
-import java.util.HashSet;
-import java.util.Set;
-
 import com.cloud.capacity.Capacity;
 import com.cloud.exception.InvalidParameterValueException;
 
+import java.util.HashSet;
+import java.util.Set;
+
 public interface AlertService {
     public static class AlertType {
         private static Set<AlertType> defaultAlertTypes = new HashSet<AlertType>();
@@ -67,6 +67,8 @@ private AlertType(short type, String name, boolean isDefault) {
         public static final AlertType ALERT_TYPE_SYNC = new AlertType((short)27, "ALERT.TYPE.SYNC", true);
         public static final AlertType ALERT_TYPE_UPLOAD_FAILED = new AlertType((short)28, "ALERT.UPLOAD.FAILED", true);
         public static final AlertType ALERT_TYPE_OOBM_AUTH_ERROR = new AlertType((short)29, "ALERT.OOBM.AUTHERROR", true);
+        public static final AlertType ALERT_TYPE_HA_ACTION = new AlertType((short)30, "ALERT.HA.ACTION", true);
+        public static final AlertType ALERT_TYPE_CA_CERT = new AlertType((short)31, "ALERT.CA.CERT", true);
 
         public short getType() {
             return type;
diff --git a/api/src/org/apache/cloudstack/annotation/Annotation.java b/api/src/org/apache/cloudstack/annotation/Annotation.java
new file mode 100644
index 00000000000..90e371e5071
--- /dev/null
+++ b/api/src/org/apache/cloudstack/annotation/Annotation.java
@@ -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.
+package org.apache.cloudstack.annotation;
+
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
+import java.util.Date;
+
+public interface Annotation extends InternalIdentity, Identity {
+
+    String getAnnotation();
+
+    String getEntityUuid();
+
+    AnnotationService.EntityType getEntityType();
+
+    String getUserUuid();
+
+    Date getCreated();
+
+    Date getRemoved();
+}
diff --git a/api/src/org/apache/cloudstack/annotation/AnnotationService.java b/api/src/org/apache/cloudstack/annotation/AnnotationService.java
new file mode 100644
index 00000000000..769a753b587
--- /dev/null
+++ b/api/src/org/apache/cloudstack/annotation/AnnotationService.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 org.apache.cloudstack.annotation;
+
+import org.apache.cloudstack.api.command.admin.annotation.AddAnnotationCmd;
+import org.apache.cloudstack.api.command.admin.annotation.ListAnnotationsCmd;
+import org.apache.cloudstack.api.command.admin.annotation.RemoveAnnotationCmd;
+import org.apache.cloudstack.api.response.AnnotationResponse;
+import org.apache.cloudstack.api.response.ListResponse;
+
+public interface AnnotationService {
+    ListResponse<AnnotationResponse> searchForAnnotations(ListAnnotationsCmd cmd);
+
+    AnnotationResponse addAnnotation(AddAnnotationCmd addAnnotationCmd);
+    AnnotationResponse addAnnotation(String text, EntityType type, String uuid);
+
+    AnnotationResponse removeAnnotation(RemoveAnnotationCmd removeAnnotationCmd);
+
+    enum EntityType {
+        HOST("host"), DOMAIN("domain"), VM("vm_instance");
+        private String tableName;
+
+        EntityType(String tableName) {
+            this.tableName = tableName;
+        }
+        static public boolean contains(String representation) {
+            try {
+                /* EntityType tiep = */ valueOf(representation);
+                return true;
+            } catch (IllegalArgumentException iae) {
+                return false;
+            }
+        }
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/APICommand.java b/api/src/org/apache/cloudstack/api/APICommand.java
index d451e4b10a3..c559be08116 100644
--- a/api/src/org/apache/cloudstack/api/APICommand.java
+++ b/api/src/org/apache/cloudstack/api/APICommand.java
@@ -16,8 +16,6 @@
 // under the License.
 package org.apache.cloudstack.api;
 
-import static java.lang.annotation.ElementType.TYPE;
-
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
@@ -25,9 +23,12 @@
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.ResponseObject.ResponseView;
 
+import static java.lang.annotation.ElementType.TYPE;
+
 @Retention(RetentionPolicy.RUNTIME)
 @Target({TYPE})
 public @interface APICommand {
+
     Class<? extends BaseResponse> responseObject();
 
     String name() default "";
diff --git a/api/src/org/apache/cloudstack/api/AbstractGetUploadParamsCmd.java b/api/src/org/apache/cloudstack/api/AbstractGetUploadParamsCmd.java
index df63d747158..c82f4789367 100644
--- a/api/src/org/apache/cloudstack/api/AbstractGetUploadParamsCmd.java
+++ b/api/src/org/apache/cloudstack/api/AbstractGetUploadParamsCmd.java
@@ -18,15 +18,15 @@
  */
 package org.apache.cloudstack.api;
 
+import java.net.URL;
+import java.util.UUID;
+
 import org.apache.cloudstack.api.response.DomainResponse;
 import org.apache.cloudstack.api.response.GetUploadParamsResponse;
 import org.apache.cloudstack.api.response.ProjectResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
 import org.apache.log4j.Logger;
 
-import java.net.URL;
-import java.util.UUID;
-
 public abstract class AbstractGetUploadParamsCmd extends BaseCmd {
 
     public static final Logger s_logger = Logger.getLogger(AbstractGetUploadParamsCmd.class.getName());
@@ -42,7 +42,7 @@
             + "to be hosted on")
     private Long zoneId;
 
-    @Parameter(name = ApiConstants.CHECKSUM, type = CommandType.STRING, description = "the MD5 checksum value of this volume/template")
+    @Parameter(name = ApiConstants.CHECKSUM, type = CommandType.STRING, description = "the checksum value of this volume/template " + ApiConstants.CHECKSUM_PARAMETER_PREFIX_DESCRIPTION)
     private String checksum;
 
     @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "an optional accountName. Must be used with domainId.")
diff --git a/api/src/org/apache/cloudstack/api/ApiConstants.java b/api/src/org/apache/cloudstack/api/ApiConstants.java
index 1d0b4a3756a..03ee7fc1b20 100644
--- a/api/src/org/apache/cloudstack/api/ApiConstants.java
+++ b/api/src/org/apache/cloudstack/api/ApiConstants.java
@@ -21,10 +21,13 @@
     public static final String ACCOUNTS = "accounts";
     public static final String ACCOUNT_TYPE = "accounttype";
     public static final String ACCOUNT_ID = "accountid";
+    public static final String ACTIVITY = "activity";
     public static final String ADDRESS = "address";
     public static final String ALGORITHM = "algorithm";
     public static final String ALLOCATED_ONLY = "allocatedonly";
+    public static final String ANNOTATION = "annotation";
     public static final String API_KEY = "apikey";
+    public static final String ASYNC_BACKUP = "asyncbackup";
     public static final String USER_API_KEY = "userapikey";
     public static final String APPLIED = "applied";
     public static final String LIST_LB_VMIPS = "lbvmips";
@@ -35,12 +38,15 @@
     public static final String BIND_PASSWORD = "bindpass";
     public static final String BYTES_READ_RATE = "bytesreadrate";
     public static final String BYTES_WRITE_RATE = "byteswriterate";
+    public static final String BYPASS_VLAN_OVERLAP_CHECK = "bypassvlanoverlapcheck";
     public static final String CATEGORY = "category";
     public static final String CAN_REVERT = "canrevert";
+    public static final String CA_CERTIFICATES = "cacertificates";
     public static final String CERTIFICATE = "certificate";
     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 CSR = "csr";
     public static final String PRIVATE_KEY = "privatekey";
     public static final String DOMAIN_SUFFIX = "domainsuffix";
     public static final String DNS_SEARCH_ORDER = "dnssearchorder";
@@ -48,11 +54,13 @@
     public static final String CIDR = "cidr";
     public static final String IP6_CIDR = "ip6cidr";
     public static final String CIDR_LIST = "cidrlist";
+    public static final String DEST_CIDR_LIST = "destcidrlist";
     public static final String CLEANUP = "cleanup";
-    public static final String MAKEREDUNDANTE = "makeredundant";
+    public static final String MAKEREDUNDANT = "makeredundant";
     public static final String CLUSTER_ID = "clusterid";
     public static final String CLUSTER_NAME = "clustername";
     public static final String CLUSTER_TYPE = "clustertype";
+    public static final String CN = "cn";
     public static final String COMMAND = "command";
     public static final String CMD_EVENT_TYPE = "cmdeventtype";
     public static final String COMPONENT = "component";
@@ -71,14 +79,20 @@
     public static final String MIN_IOPS = "miniops";
     public static final String MAX_IOPS = "maxiops";
     public static final String HYPERVISOR_SNAPSHOT_RESERVE = "hypervisorsnapshotreserve";
+    public static final String DATADISK_OFFERING_LIST = "datadiskofferinglist";
     public static final String DESCRIPTION = "description";
     public static final String DESTINATION_ZONE_ID = "destzoneid";
     public static final String DETAILS = "details";
     public static final String DEVICE_ID = "deviceid";
+    public static final String DIRECT_DOWNLOAD = "directdownload";
     public static final String DISK_OFFERING_ID = "diskofferingid";
     public static final String DISK_SIZE = "disksize";
+    public static final String UTILIZATION = "utilization";
     public static final String DRIVER = "driver";
     public static final String ROOT_DISK_SIZE = "rootdisksize";
+    public static final String DHCP_OPTIONS_NETWORK_LIST = "dhcpoptionsnetworklist";
+    public static final String DHCP_OPTIONS = "dhcpoptions";
+    public static final String DHCP_PREFIX = "dhcp:";
     public static final String DISPLAY_NAME = "displayname";
     public static final String DISPLAY_NETWORK = "displaynetwork";
     public static final String DISPLAY_NIC = "displaynic";
@@ -94,6 +108,7 @@
     public static final String DOMAIN_ID = "domainid";
     public static final String DOMAIN__ID = "domainId";
     public static final String DURATION = "duration";
+    public static final String ELIGIBLE = "eligible";
     public static final String EMAIL = "email";
     public static final String END_DATE = "enddate";
     public static final String END_IP = "endip";
@@ -101,12 +116,18 @@
     public static final String END_PORT = "endport";
     public static final String ENTRY_TIME = "entrytime";
     public static final String EXPIRES = "expires";
+    public static final String EXTRA_DHCP_OPTION = "extradhcpoption";
+    public static final String EXTRA_DHCP_OPTION_NAME = "extradhcpoptionname";
+    public static final String EXTRA_DHCP_OPTION_CODE = "extradhcpoptioncode";
+    public static final String EXTRA_DHCP_OPTION_VALUE = "extradhcpvalue";
+    public static final String FENCE = "fence";
     public static final String FETCH_LATEST = "fetchlatest";
     public static final String FIRSTNAME = "firstname";
     public static final String FORCED = "forced";
     public static final String FORCED_DESTROY_LOCAL_STORAGE = "forcedestroylocalstorage";
     public static final String FORMAT = "format";
     public static final String FOR_VIRTUAL_NETWORK = "forvirtualnetwork";
+    public static final String FOR_SYSTEM_VMS = "forsystemvms";
     public static final String GATEWAY = "gateway";
     public static final String IP6_GATEWAY = "ip6gateway";
     public static final String GROUP = "group";
@@ -119,6 +140,9 @@
     public static final String GUEST_CIDR_ADDRESS = "guestcidraddress";
     public static final String GUEST_VLAN_RANGE = "guestvlanrange";
     public static final String HA_ENABLE = "haenable";
+    public static final String HA_PROVIDER = "haprovider";
+    public static final String HA_STATE = "hastate";
+    public static final String HEALTH = "health";
     public static final String HOST_ID = "hostid";
     public static final String HOST_NAME = "hostname";
     public static final String HYPERVISOR = "hypervisor";
@@ -131,6 +155,7 @@
     public static final String INTERNAL_DNS1 = "internaldns1";
     public static final String INTERNAL_DNS2 = "internaldns2";
     public static final String INTERVAL_TYPE = "intervaltype";
+    public static final String LOCATION_TYPE = "locationtype";
     public static final String IOPS_READ_RATE = "iopsreadrate";
     public static final String IOPS_WRITE_RATE = "iopswriterate";
     public static final String IP_ADDRESS = "ipaddress";
@@ -161,6 +186,7 @@
     public static final String LUN = "lun";
     public static final String LBID = "lbruleid";
     public static final String MAX = "max";
+    public static final String MAC_ADDRESS = "macaddress";
     public static final String MAX_SNAPS = "maxsnaps";
     public static final String MEMORY = "memory";
     public static final String MODE = "mode";
@@ -182,7 +208,9 @@
     public static final String OUTOFBANDMANAGEMENT_POWERSTATE = "outofbandmanagementpowerstate";
     public static final String OUTOFBANDMANAGEMENT_ENABLED = "outofbandmanagementenabled";
     public static final String PARAMS = "params";
+    public static final String PARENT_ID = "parentid";
     public static final String PARENT_DOMAIN_ID = "parentdomainid";
+    public static final String PARENT_TEMPLATE_ID = "parenttemplateid";
     public static final String PASSWORD = "password";
     public static final String SHOULD_UPDATE_PASSWORD = "update_passwd_on_host";
     public static final String NEW_PASSWORD = "new_password";
@@ -190,6 +218,7 @@
     public static final String SSHKEY_ENABLED = "sshkeyenabled";
     public static final String PATH = "path";
     public static final String POD_ID = "podid";
+    public static final String POD_NAME = "podname";
     public static final String POD_IDS = "podids";
     public static final String POLICY_ID = "policyid";
     public static final String PORT = "port";
@@ -214,8 +243,11 @@
     public static final String PUBLIC_END_PORT = "publicendport";
     public static final String PUBLIC_ZONE = "publiczone";
     public static final String RECEIVED_BYTES = "receivedbytes";
+    public static final String RECONNECT = "reconnect";
+    public static final String RECOVER = "recover";
     public static final String REQUIRES_HVM = "requireshvm";
     public static final String RESOURCE_TYPE = "resourcetype";
+    public static final String RESOURCE_TYPE_NAME = "resourcetypename";
     public static final String RESPONSE = "response";
     public static final String REVERTABLE = "revertable";
     public static final String REGISTERED = "registered";
@@ -223,6 +255,7 @@
     public static final String SCHEDULE = "schedule";
     public static final String SCOPE = "scope";
     public static final String SECRET_KEY = "usersecretkey";
+    public static final String SECONDARY_IP = "secondaryip";
     public static final String SINCE = "since";
     public static final String KEY = "key";
     public static final String SEARCH_BASE = "searchbase";
@@ -232,6 +265,7 @@
     public static final String SECURITY_GROUP_ID = "securitygroupid";
     public static final String SENT = "sent";
     public static final String SENT_BYTES = "sentbytes";
+    public static final String SERIAL = "serial";
     public static final String SERVICE_OFFERING_ID = "serviceofferingid";
     public static final String SESSIONKEY = "sessionkey";
     public static final String SHOW_CAPACITIES = "showcapacities";
@@ -239,18 +273,21 @@
     public static final String SIGNATURE = "signature";
     public static final String SIGNATURE_VERSION = "signatureversion";
     public static final String SIZE = "size";
+    public static final String SNAPSHOT = "snapshot";
     public static final String SNAPSHOT_ID = "snapshotid";
     public static final String SNAPSHOT_POLICY_ID = "snapshotpolicyid";
     public static final String SNAPSHOT_TYPE = "snapshottype";
     public static final String SNAPSHOT_QUIESCEVM = "quiescevm";
     public static final String SOURCE_ZONE_ID = "sourcezoneid";
     public static final String START_DATE = "startdate";
+    public static final String START_ID = "startid";
     public static final String START_IP = "startip";
     public static final String START_IPV6 = "startipv6";
     public static final String START_PORT = "startport";
     public static final String STATE = "state";
     public static final String STATUS = "status";
     public static final String STORAGE_TYPE = "storagetype";
+    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 SYSTEM_VM_TYPE = "systemvmtype";
@@ -261,6 +298,7 @@
     public static final String ISO_ID = "isoid";
     public static final String TIMEOUT = "timeout";
     public static final String TIMEZONE = "timezone";
+    public static final String TIMEZONEOFFSET = "timezoneoffset";
     public static final String TYPE = "type";
     public static final String TRUST_STORE = "truststore";
     public static final String TRUST_STORE_PASSWORD = "truststorepass";
@@ -272,6 +310,7 @@
     public static final String USERNAME = "username";
     public static final String USER_SECURITY_GROUP_LIST = "usersecuritygrouplist";
     public static final String USE_VIRTUAL_NETWORK = "usevirtualnetwork";
+    public static final String Update_IN_SEQUENCE ="updateinsequence";
     public static final String VALUE = "value";
     public static final String VIRTUAL_MACHINE_ID = "virtualmachineid";
     public static final String VIRTUAL_MACHINE_IDS = "virtualmachineids";
@@ -279,12 +318,14 @@
     public static final String VIRTUAL_MACHINE_COUNT = "virtualmachinecount";
     public static final String USAGE_ID = "usageid";
     public static final String USAGE_TYPE = "usagetype";
+    public static final String INCLUDE_TAGS = "includetags";
 
     public static final String VLAN = "vlan";
     public static final String VLAN_RANGE = "vlanrange";
     public static final String REMOVE_VLAN = "removevlan";
     public static final String VLAN_ID = "vlanid";
     public static final String ISOLATED_PVLAN = "isolatedpvlan";
+    public static final String ISOLATION_URI = "isolationuri";
     public static final String VM_AVAILABLE = "vmavailable";
     public static final String VM_LIMIT = "vmlimit";
     public static final String VM_TOTAL = "vmtotal";
@@ -299,6 +340,7 @@
     public static final String COUNT = "count";
     public static final String TRAFFIC_TYPE = "traffictype";
     public static final String NETWORK_OFFERING_ID = "networkofferingid";
+    public static final String TIER_NETWORK_OFFERINGS = "tiernetworkofferings";
     public static final String NETWORK_IDS = "networkids";
     public static final String NETWORK_ID = "networkid";
     public static final String NIC_ID = "nicid";
@@ -342,6 +384,7 @@
     public static final String ZONE_TOKEN = "zonetoken";
     public static final String DHCP_PROVIDER = "dhcpprovider";
     public static final String RESULT = "success";
+    public static final String RESUME = "resume";
     public static final String LUN_ID = "lunId";
     public static final String IQN = "iqn";
     public static final String AGGREGATE_NAME = "aggregatename";
@@ -368,6 +411,7 @@
     public static final String ROLE_NAME = "rolename";
     public static final String PERMISSION = "permission";
     public static final String RULE = "rule";
+    public static final String RULE_ID = "ruleid";
     public static final String RULE_ORDER = "ruleorder";
     public static final String USER = "user";
     public static final String ACTIVE_ONLY = "activeonly";
@@ -385,6 +429,7 @@
     public static final String CAPACITY_IOPS = "capacityiops";
     public static final String NETWORK_SPEED = "networkspeed";
     public static final String BROADCAST_DOMAIN_RANGE = "broadcastdomainrange";
+    public static final String BROADCAST_URI = "broadcasturi";
     public static final String ISOLATION_METHOD = "isolationmethod";
     public static final String ISOLATION_METHODS = "isolationmethods";
     public static final String PHYSICAL_NETWORK_ID = "physicalnetworkid";
@@ -511,6 +556,8 @@
     public static final String NICIRA_NVP_DEVICE_NAME = "niciradevicename";
     public static final String NICIRA_NVP_GATEWAYSERVICE_UUID = "l3gatewayserviceuuid";
     public static final String NICIRA_NVP_L2_GATEWAYSERVICE_UUID = "l2gatewayserviceuuid";
+    public static final String NSX_LOGICAL_SWITCH = "nsxlogicalswitch";
+    public static final String NSX_LOGICAL_SWITCH_PORT = "nsxlogicalswitchport";
     public static final String S3_ACCESS_KEY = "accesskey";
     public static final String S3_SECRET_KEY = "secretkey";
     public static final String S3_END_POINT = "endpoint";
@@ -613,6 +660,7 @@
     public static final String IAM_ALLOW_DENY = "permission";
     public static final String ENTITY_TYPE = "entitytype";
     public static final String ENTITY_ID = "entityid";
+    public static final String EXTERNAL_ID = "externalid";
     public static final String ACCESS_TYPE = "accesstype";
 
     public static final String RESOURCE_DETAILS = "resourcedetails";
@@ -633,20 +681,40 @@
     public static final String REMAININGCAPACITY = "remainingcapacity";
     public static final String MAXCAPACITY = "maxcapacity";
     public static final String DISTRIBUTED_VPC_ROUTER = "distributedvpcrouter";
+    public static final String REDUNDANT_ROUTER = "redundantrouter";
     public static final String REDUNDANT_VPC_ROUTER = "redundantvpcrouter";
     public static final String READ_ONLY = "readonly";
     public static final String SUPPORTS_REGION_LEVEL_VPC = "supportsregionLevelvpc";
     public static final String SUPPORTS_STRECHED_L2_SUBNET = "supportsstrechedl2subnet";
+    public static final String SUPPORTS_PUBLIC_ACCESS = "supportspublicaccess";
     public static final String REGION_LEVEL_VPC = "regionlevelvpc";
     public static final String STRECHED_L2_SUBNET = "strechedl2subnet";
+    public static final String NETWORK_NAME = "networkname";
     public static final String NETWORK_SPANNED_ZONES = "zonesnetworkspans";
     public static final String METADATA = "metadata";
     public static final String PHYSICAL_SIZE = "physicalsize";
     public static final String OVM3_POOL = "ovm3pool";
     public static final String OVM3_CLUSTER = "ovm3cluster";
     public static final String OVM3_VIP = "ovm3vip";
+    public static final String CLEAN_UP_DETAILS = "cleanupdetails";
+    public static final String VIRTUAL_SIZE = "virtualsize";
+    public static final String NETSCALER_CONTROLCENTER_ID = "netscalercontrolcenterid";
+    public static final String NETSCALER_SERVICEPACKAGE_ID = "netscalerservicepackageid";
 
+    public static final String ZONE_ID_LIST = "zoneids";
+    public static final String DESTINATION_ZONE_ID_LIST = "destzoneids";
     public static final String ADMIN = "admin";
+    public static final String CHECKSUM_PARAMETER_PREFIX_DESCRIPTION = "The parameter containing the checksum will be considered a MD5sum if it is not prefixed\n"
+            + " and just a plain ascii/utf8 representation of a hexadecimal string. If it is required to\n"
+            + " use another algorithm the hexadecimal string is to be prefixed with a string of the form,\n"
+            + " \"{<algorithm>}\", not including the double quotes. In this <algorithm> is the exact string\n"
+            + " representing the java supported algorithm, i.e. MD5 or SHA-256. Note that java does not\n"
+            + " contain an algorithm called SHA256 or one called sha-256, only SHA-256.";
+
+    public static final String HAS_ANNOTATION = "hasannotation";
+    public static final String LAST_ANNOTATED = "lastannotated";
+    public static final String LDAP_DOMAIN = "ldapdomain";
+
 
     public enum HostDetails {
         all, capacity, events, stats, min;
@@ -655,4 +723,8 @@
     public enum VMDetails {
         all, group, nics, stats, secgrp, tmpl, servoff, diskoff, iso, volume, min, affgrp;
     }
+
+    public enum DomainDetails {
+        all, resource, min;
+    }
 }
diff --git a/api/src/org/apache/cloudstack/api/ApiServerService.java b/api/src/org/apache/cloudstack/api/ApiServerService.java
index aeeb7b613ca..382b48a5e02 100644
--- a/api/src/org/apache/cloudstack/api/ApiServerService.java
+++ b/api/src/org/apache/cloudstack/api/ApiServerService.java
@@ -24,7 +24,7 @@
 import com.cloud.exception.CloudAuthenticationException;
 
 public interface ApiServerService {
-    public boolean verifyRequest(Map<String, Object[]> requestParameters, Long userId) throws ServerApiException;
+    public boolean verifyRequest(Map<String, Object[]> requestParameters, Long userId, InetAddress remoteAddress) throws ServerApiException;
 
     public Long fetchDomainId(String domainUUID);
 
@@ -43,7 +43,4 @@ public ResponseObject loginUser(HttpSession session, String username, String pas
 
     public Class<?> getCmdClass(String cmdName);
 
-    public String getJSONContentType();
-
-    public boolean isSecureSessionCookieEnabled();
 }
diff --git a/api/src/org/apache/cloudstack/api/BaseCmd.java b/api/src/org/apache/cloudstack/api/BaseCmd.java
index 5be75196d39..37dbeaab841 100644
--- a/api/src/org/apache/cloudstack/api/BaseCmd.java
+++ b/api/src/org/apache/cloudstack/api/BaseCmd.java
@@ -17,32 +17,6 @@
 
 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 com.cloud.utils.HttpUtils;
-import org.apache.cloudstack.acl.RoleService;
-import org.apache.log4j.Logger;
-
-import org.apache.cloudstack.acl.RoleType;
-import org.apache.cloudstack.affinity.AffinityGroupService;
-import org.apache.cloudstack.alert.AlertService;
-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 com.cloud.configuration.ConfigurationService;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientCapacityException;
@@ -78,11 +52,35 @@
 import com.cloud.user.AccountService;
 import com.cloud.user.DomainService;
 import com.cloud.user.ResourceLimitService;
+import com.cloud.utils.HttpUtils;
 import com.cloud.utils.ReflectUtil;
 import com.cloud.utils.db.EntityManager;
 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());
@@ -93,6 +91,7 @@
     public static Pattern newInputDateFormat = Pattern.compile("[\\d]+-[\\d]+-[\\d]+ [\\d]+:[\\d]+:[\\d]+");
     private static final DateFormat s_outputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
     protected static final Map<Class<?>, List<Field>> fieldsForCmdClass = new HashMap<Class<?>, List<Field>>();
+
     public static enum HTTPMethod {
         GET, POST, PUT, DELETE
     }
@@ -192,6 +191,8 @@
     public AlertService _alertSvc;
     @Inject
     public UUIDManager _uuidMgr;
+    @Inject
+    public AnnotationService annotationService;
 
     public abstract void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException,
         ResourceAllocationException, NetworkRuleConflictException;
diff --git a/api/src/org/apache/cloudstack/api/BaseUpdateTemplateOrIsoCmd.java b/api/src/org/apache/cloudstack/api/BaseUpdateTemplateOrIsoCmd.java
index 5dc2b06f4c7..36767345a4b 100644
--- a/api/src/org/apache/cloudstack/api/BaseUpdateTemplateOrIsoCmd.java
+++ b/api/src/org/apache/cloudstack/api/BaseUpdateTemplateOrIsoCmd.java
@@ -17,7 +17,6 @@
 package org.apache.cloudstack.api;
 
 import org.apache.log4j.Logger;
-
 import org.apache.cloudstack.api.command.user.iso.UpdateIsoCmd;
 import org.apache.cloudstack.api.response.GuestOSResponse;
 import org.apache.cloudstack.api.response.TemplateResponse;
@@ -73,6 +72,11 @@
     @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, description = "Details in key/value pairs using format details[i].keyname=keyvalue. Example: details[0].hypervisortoolsversion=xenserver61")
     protected Map details;
 
+    @Parameter(name = ApiConstants.CLEAN_UP_DETAILS,
+            type = CommandType.BOOLEAN,
+            description = "optional boolean field, which indicates if details should be cleaned up or not (if set to true, details removed for this resource, details field ignored; if false or not set, no action)")
+    private Boolean cleanupDetails;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -129,4 +133,8 @@ public Map getDetails() {
         Collection paramsCollection = this.details.values();
         return (Map) (paramsCollection.toArray())[0];
     }
-}
\ No newline at end of file
+
+    public boolean isCleanupDetails(){
+        return cleanupDetails == null ? false : cleanupDetails.booleanValue();
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/ResponseGenerator.java b/api/src/org/apache/cloudstack/api/ResponseGenerator.java
index 1cc5bc8ae01..4fb248cd105 100644
--- a/api/src/org/apache/cloudstack/api/ResponseGenerator.java
+++ b/api/src/org/apache/cloudstack/api/ResponseGenerator.java
@@ -20,6 +20,7 @@
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.cloudstack.affinity.AffinityGroup;
 import org.apache.cloudstack.affinity.AffinityGroupResponse;
@@ -237,6 +238,8 @@
 
     VlanIpRangeResponse createVlanIpRangeResponse(Vlan vlan);
 
+    VlanIpRangeResponse createVlanIpRangeResponse(Class<? extends VlanIpRangeResponse> subClass, Vlan vlan);
+
     IPAddressResponse createIPAddressResponse(ResponseView view, IpAddress ipAddress);
 
     GuestVlanRangeResponse createDedicatedGuestVlanRangeResponse(GuestVlan result);
@@ -283,6 +286,8 @@
 
     Host findHostById(Long hostId);
 
+    DiskOffering findDiskOfferingById(Long diskOfferingId);
+
     VpnUsersResponse createVpnUserResponse(VpnUser user);
 
     RemoteAccessVpnResponse createRemoteAccessVpnResponse(RemoteAccessVpn vpn);
@@ -305,7 +310,11 @@
 
     TemplateResponse createTemplateUpdateResponse(ResponseView view, VirtualMachineTemplate result);
 
-    List<TemplateResponse> createTemplateResponses(ResponseView view, VirtualMachineTemplate result, Long zoneId, boolean readyOnly);
+    List<TemplateResponse> createTemplateResponses(ResponseView view, VirtualMachineTemplate result,
+                                                   Long zoneId, boolean readyOnly);
+
+    List<TemplateResponse> createTemplateResponses(ResponseView view, VirtualMachineTemplate result,
+                                                   List<Long> zoneIds, boolean readyOnly);
 
     List<CapacityResponse> createCapacityResponse(List<? extends Capacity> result, DecimalFormat format);
 
@@ -424,6 +433,10 @@
 
     UsageRecordResponse createUsageResponse(Usage usageRecord);
 
+    UsageRecordResponse createUsageResponse(Usage usageRecord, Map<String, Set<ResourceTagResponse>> resourceTagResponseMap);
+
+    public Map<String, Set<ResourceTagResponse>> getUsageResourceTags();
+
     TrafficMonitorResponse createTrafficMonitorResponse(Host trafficMonitor);
 
     VMSnapshotResponse createVMSnapshotResponse(VMSnapshot vmSnapshot);
diff --git a/api/src/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java b/api/src/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java
index 2e1fbd6f861..074df8d5fc2 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java
@@ -184,7 +184,7 @@ public long getEntityOwnerId() {
     @Override
     public void execute() {
         validateParams();
-        CallContext.current().setEventDetails("Account Name: " + getAccountName() + ", Domain Id:" + getDomainId());
+        CallContext.current().setEventDetails("Account Name: " + getUsername() + ", Domain Id:" + getDomainId());
         UserAccount userAccount =
             _accountService.createUserAccount(getUsername(), getPassword(), getFirstName(), getLastName(), getEmail(), getTimeZone(), getAccountName(), getAccountType(), getRoleId(),
                 getDomainId(), getNetworkDomain(), getDetails(), getAccountUUID(), getUserUUID());
diff --git a/api/src/org/apache/cloudstack/api/command/admin/acl/CreateRoleCmd.java b/api/src/org/apache/cloudstack/api/command/admin/acl/CreateRoleCmd.java
index 994573d1796..87f0288dd01 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/acl/CreateRoleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/acl/CreateRoleCmd.java
@@ -34,7 +34,7 @@
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
         since = "4.9.0",
         authorized = {RoleType.Admin})
-public class CreateRoleCmd extends BaseCmd {
+public class CreateRoleCmd extends RoleCmd {
     public static final String APINAME = "createRole";
 
     /////////////////////////////////////////////////////
@@ -83,16 +83,6 @@ public long getEntityOwnerId() {
         return Account.ACCOUNT_ID_SYSTEM;
     }
 
-    private void setupResponse(final Role role) {
-        final RoleResponse response = new RoleResponse();
-        response.setId(role.getUuid());
-        response.setRoleName(role.getName());
-        response.setRoleType(role.getRoleType());
-        response.setResponseName(getCommandName());
-        response.setObjectName("role");
-        setResponseObject(response);
-    }
-
     @Override
     public void execute() {
         CallContext.current().setEventDetails("Role: " + getRoleName() + ", type:" + getRoleType() + ", description: " + getRoleDescription());
diff --git a/api/src/org/apache/cloudstack/api/command/admin/acl/ListRolesCmd.java b/api/src/org/apache/cloudstack/api/command/admin/acl/ListRolesCmd.java
index 5cf870bfc06..9025e89a93c 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/acl/ListRolesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/acl/ListRolesCmd.java
@@ -17,31 +17,25 @@
 
 package org.apache.cloudstack.api.command.admin.acl;
 
-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.google.common.base.Strings;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 import org.apache.cloudstack.acl.Role;
 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.ServerApiException;
 import org.apache.cloudstack.api.response.ListResponse;
 import org.apache.cloudstack.api.response.RoleResponse;
+import org.apache.commons.lang3.StringUtils;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
+import com.cloud.user.Account;
+import com.google.common.base.Strings;
 
-@APICommand(name = ListRolesCmd.APINAME, description = "Lists dynamic roles in CloudStack", responseObject = RoleResponse.class,
-        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
-        since = "4.9.0",
-        authorized = {RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin})
+@APICommand(name = ListRolesCmd.APINAME, description = "Lists dynamic roles in CloudStack", responseObject = RoleResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.9.0", authorized = {
+        RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin})
 public class ListRolesCmd extends BaseCmd {
     public static final String APINAME = "listRoles";
 
@@ -112,13 +106,13 @@ private void setupResponse(final List<Role> roles) {
     }
 
     @Override
-    public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException {
-        final List<Role> roles;
+    public void execute() {
+        List<Role> roles;
         if (getId() != null && getId() > 0L) {
             roles = Collections.singletonList(roleService.findRole(getId()));
-        } else if (!Strings.isNullOrEmpty(getName())) {
+        } else if (StringUtils.isNotBlank(getName())) {
             roles = roleService.findRolesByName(getName());
-        } else if (getRoleType() != null){
+        } else if (getRoleType() != null) {
             roles = roleService.findRolesByType(getRoleType());
         } else {
             roles = roleService.listRoles();
diff --git a/api/src/org/apache/cloudstack/api/command/admin/acl/RoleCmd.java b/api/src/org/apache/cloudstack/api/command/admin/acl/RoleCmd.java
new file mode 100644
index 00000000000..9054ff5fada
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/acl/RoleCmd.java
@@ -0,0 +1,36 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT 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.Role;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.response.RoleResponse;
+
+public abstract class RoleCmd extends BaseCmd {
+
+    protected void setupResponse(final Role role) {
+        final RoleResponse response = new RoleResponse();
+        response.setId(role.getUuid());
+        response.setRoleName(role.getName());
+        response.setRoleType(role.getRoleType());
+        response.setDescription(role.getDescription());
+        response.setResponseName(getCommandName());
+        response.setObjectName("role");
+        setResponseObject(response);
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/acl/UpdateRoleCmd.java b/api/src/org/apache/cloudstack/api/command/admin/acl/UpdateRoleCmd.java
index e17fc6f5714..f9519aeec5a 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/acl/UpdateRoleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/acl/UpdateRoleCmd.java
@@ -22,21 +22,20 @@
 import org.apache.cloudstack.acl.Role;
 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.ApiArgValidator;
 import org.apache.cloudstack.api.response.RoleResponse;
-import org.apache.cloudstack.api.response.SuccessResponse;
 import org.apache.cloudstack.context.CallContext;
 
-@APICommand(name = UpdateRoleCmd.APINAME, description = "Updates a role", responseObject = SuccessResponse.class,
+@APICommand(name = UpdateRoleCmd.APINAME, description = "Updates a role", responseObject = RoleResponse.class,
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
         since = "4.9.0",
         authorized = {RoleType.Admin})
-public class UpdateRoleCmd extends BaseCmd {
+public class UpdateRoleCmd extends RoleCmd {
     public static final String APINAME = "updateRole";
 
     /////////////////////////////////////////////////////
@@ -100,9 +99,7 @@ public void execute() {
             throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid role id provided");
         }
         CallContext.current().setEventDetails("Role: " + getRoleName() + ", type:" + getRoleType() + ", description: " + getRoleDescription());
-        boolean result = roleService.updateRole(role, getRoleName(), getRoleType(), getRoleDescription());
-        SuccessResponse response = new SuccessResponse(getCommandName());
-        response.setSuccess(result);
-        setResponseObject(response);
+        role = roleService.updateRole(role, getRoleName(), getRoleType(), getRoleDescription());
+        setupResponse(role);
     }
 }
diff --git a/api/src/org/apache/cloudstack/api/command/admin/acl/UpdateRolePermissionCmd.java b/api/src/org/apache/cloudstack/api/command/admin/acl/UpdateRolePermissionCmd.java
index 055265c5ccc..045464eab79 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/acl/UpdateRolePermissionCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/acl/UpdateRolePermissionCmd.java
@@ -20,6 +20,7 @@
 import com.cloud.user.Account;
 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;
@@ -51,10 +52,18 @@
             description = "ID of the role", validations = {ApiArgValidator.PositiveNumber})
     private Long roleId;
 
-    @Parameter(name = ApiConstants.RULE_ORDER, type = CommandType.LIST, collectionType = CommandType.UUID, required = true, entityType = RolePermissionResponse.class,
+    @Parameter(name = ApiConstants.RULE_ORDER, type = CommandType.LIST, collectionType = CommandType.UUID, entityType = RolePermissionResponse.class,
             description = "The parent role permission uuid, use 0 to move this rule at the top of the list")
     private List<Long> rulePermissionOrder;
 
+    @Parameter(name = ApiConstants.RULE_ID, type = CommandType.UUID, entityType = RolePermissionResponse.class,
+            description = "Role permission rule id", since="4.11")
+    private Long ruleId;
+
+    @Parameter(name = ApiConstants.PERMISSION, type = CommandType.STRING,
+            description = "Rule permission, can be: allow or deny", since="4.11")
+    private String rulePermission;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -67,6 +76,21 @@ public Long getRoleId() {
         return rulePermissionOrder;
     }
 
+    public Long getRuleId() {
+        return ruleId;
+    }
+
+    public Permission getRulePermission() {
+        if (this.rulePermission == null) {
+            return null;
+        }
+        if (!this.rulePermission.equalsIgnoreCase(Permission.ALLOW.toString()) &&
+                !this.rulePermission.equalsIgnoreCase(Permission.DENY.toString())) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Values for permission parameter should be: allow or deny");
+        }
+        return rulePermission.equalsIgnoreCase(Permission.ALLOW.toString()) ? Permission.ALLOW : Permission.DENY;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
@@ -84,19 +108,35 @@ public long getEntityOwnerId() {
     @Override
     public void execute() {
         final Role role = roleService.findRole(getRoleId());
+        boolean result = false;
         if (role == null) {
             throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid role id provided");
         }
-        CallContext.current().setEventDetails("Reordering permissions for role id: " + role.getId());
-        final List<RolePermission> rolePermissionsOrder = new ArrayList<>();
-        for (Long rolePermissionId : getRulePermissionOrder()) {
-            final RolePermission rolePermission = roleService.findRolePermission(rolePermissionId);
+        if (getRulePermissionOrder() != null) {
+            if (getRuleId() != null || getRulePermission() != 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: " + role.getId());
+            final List<RolePermission> rolePermissionsOrder = new ArrayList<>();
+            for (Long rolePermissionId : getRulePermissionOrder()) {
+                final RolePermission rolePermission = roleService.findRolePermission(rolePermissionId);
+                if (rolePermission == null) {
+                    throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Provided role permission(s) do not exist");
+                }
+                rolePermissionsOrder.add(rolePermission);
+            }
+            result = roleService.updateRolePermission(role, rolePermissionsOrder);
+        } else if (getRuleId() != null && getRulePermission() != null) {
+            if (getRulePermissionOrder() != null) {
+                throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Parameters permission and ruleid must be mutually exclusive with ruleorder");
+            }
+            RolePermission rolePermission = roleService.findRolePermission(getRuleId());
             if (rolePermission == null) {
-                throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Provided role permission(s) do not exist");
+                throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid rule id provided");
             }
-            rolePermissionsOrder.add(rolePermission);
+            CallContext.current().setEventDetails("Updating permission for rule id: " + getRuleId() + " to: " + getRulePermission().toString());
+            result = roleService.updateRolePermission(role, rolePermission, getRulePermission());
         }
-        boolean result = roleService.updateRolePermission(role, rolePermissionsOrder);
         SuccessResponse response = new SuccessResponse(getCommandName());
         response.setSuccess(result);
         setResponseObject(response);
diff --git a/api/src/org/apache/cloudstack/api/command/admin/address/AcquirePodIpCmdByAdmin.java b/api/src/org/apache/cloudstack/api/command/admin/address/AcquirePodIpCmdByAdmin.java
new file mode 100644
index 00000000000..fea0ca64d9c
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/address/AcquirePodIpCmdByAdmin.java
@@ -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.
+package org.apache.cloudstack.api.command.admin.address;
+
+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.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.AcquirePodIpCmdResponse;
+import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.cloudstack.context.CallContext;
+
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+
+@APICommand(name = "acquirePodIpAddress", description = "Allocates IP addresses in respective Pod of a Zone", responseObject = AcquirePodIpCmdResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+public class AcquirePodIpCmdByAdmin extends BaseCmd {
+
+    public static final Logger s_logger = Logger.getLogger(AcquirePodIpCmdByAdmin.class.getName());
+    private static final String s_name = "acquirepodipaddress";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.STRING, entityType = ZoneResponse.class, required = true, description = "the ID of the zone")
+    private String zoneId;
+
+    @Parameter(name = ApiConstants.POD_ID, type = CommandType.STRING, entityType = ZoneResponse.class, required = false, description = "Pod ID")
+    private String podId;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    private String getZoneId() {
+        return zoneId;
+    }
+
+    public String getPodId() {
+        return podId;
+    }
+
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public void execute() throws ResourceUnavailableException, ResourceAllocationException, ConcurrentOperationException {
+        AcquirePodIpCmdResponse podIp = null;
+        podIp = _networkService.allocatePodIp(_accountService.getAccount(getEntityOwnerId()), getZoneId(), getPodId());
+        if (podIp != null) {
+            podIp.setResponseName(getCommandName());
+            podIp.setObjectName(getCommandName());
+            setResponseObject(podIp);
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to assign IP address");
+        }
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccount().getAccountId();
+    }
+
+}
\ No newline at end of file
diff --git a/api/src/org/apache/cloudstack/api/command/admin/address/ReleasePodIpCmdByAdmin.java b/api/src/org/apache/cloudstack/api/command/admin/address/ReleasePodIpCmdByAdmin.java
new file mode 100644
index 00000000000..750a85d57f2
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/address/ReleasePodIpCmdByAdmin.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 org.apache.cloudstack.api.command.admin.address;
+
+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.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.command.admin.vlan.ReleasePublicIpRangeCmd;
+import org.apache.cloudstack.api.response.AcquireIPAddressResponse;
+import org.apache.cloudstack.api.response.SuccessResponse;
+
+import com.cloud.user.Account;
+
+@APICommand(name = "releasePodIpAddress", description = "Releases a Pod IP back to the Pod", responseObject = SuccessResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+public class ReleasePodIpCmdByAdmin extends BaseCmd {
+    public static final Logger s_logger = Logger.getLogger(ReleasePublicIpRangeCmd.class.getName());
+
+    private static final String s_name = "releasepodipresponse";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.ID, type = CommandType.LONG, entityType = AcquireIPAddressResponse.class, required = true, description = "UUID of the Pod IP")
+    private Long id;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public long getId() {
+        return id;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return Account.ACCOUNT_ID_SYSTEM;
+    }
+
+    @Override
+    public void execute() {
+        boolean result = _networkService.releasePodIp(this);
+        if (result) {
+            SuccessResponse response = new SuccessResponse(getCommandName());
+            response.setDisplayText("IP is released sucessfully");
+            setResponseObject(response);
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to release  Pod ip ");
+        }
+    }
+}
\ No newline at end of file
diff --git a/api/src/org/apache/cloudstack/api/command/admin/annotation/AddAnnotationCmd.java b/api/src/org/apache/cloudstack/api/command/admin/annotation/AddAnnotationCmd.java
new file mode 100644
index 00000000000..07a73ce095f
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/annotation/AddAnnotationCmd.java
@@ -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.
+package org.apache.cloudstack.api.command.admin.annotation;
+
+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.google.common.base.Preconditions;
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.annotation.AnnotationService;
+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.ServerApiException;
+import org.apache.cloudstack.api.response.AnnotationResponse;
+import org.apache.cloudstack.context.CallContext;
+
+@APICommand(name = AddAnnotationCmd.APINAME, description = "add an annotation.", responseObject = AnnotationResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.11", authorized = {RoleType.Admin})
+public class AddAnnotationCmd extends BaseCmd {
+
+    public static final String APINAME = "addAnnotation";
+
+    @Parameter(name = ApiConstants.ANNOTATION, type = CommandType.STRING, description = "the annotation text")
+    private String annotation;
+    @Parameter(name = ApiConstants.ENTITY_TYPE, type = CommandType.STRING, description = "the entity type (only HOST is allowed atm)")
+    private String entityType;
+    @Parameter(name = ApiConstants.ENTITY_ID, type = CommandType.STRING, description = "the id of the entity to annotate")
+    private String entityUuid;
+
+    public String getAnnotation() {
+        return annotation;
+    }
+
+    protected void setEntityType(String newType) {
+        entityType = newType;
+    }
+    public AnnotationService.EntityType getEntityType() {
+        return AnnotationService.EntityType.valueOf(entityType);
+    }
+
+    protected void setEntityUuid(String newUuid) {
+        entityUuid = newUuid;
+    }
+    public String getEntityUuid() {
+        return entityUuid;
+    }
+
+    @Override
+    public void execute()
+            throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException,
+            NetworkRuleConflictException {
+        Preconditions.checkNotNull(getEntityUuid(),"I have to have an entity to set an annotation on!");
+        Preconditions.checkState(AnnotationService.EntityType.contains(entityType),(java.lang.String)"'%s' is ot a valid EntityType to put annotations on", entityType);
+        AnnotationResponse annotationResponse = annotationService.addAnnotation(this);
+        annotationResponse.setResponseName(getCommandName());
+        this.setResponseObject(annotationResponse);
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccount().getAccountId();
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/annotation/ListAnnotationsCmd.java b/api/src/org/apache/cloudstack/api/command/admin/annotation/ListAnnotationsCmd.java
new file mode 100644
index 00000000000..4657eb9e16a
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/annotation/ListAnnotationsCmd.java
@@ -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.
+package org.apache.cloudstack.api.command.admin.annotation;
+
+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.utils.StringUtils;
+import com.google.common.base.Preconditions;
+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.AnnotationResponse;
+import org.apache.cloudstack.api.response.ListResponse;
+
+@APICommand(name = ListAnnotationsCmd.APINAME, description = "Lists annotations.", responseObject = AnnotationResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.11", authorized = {RoleType.Admin})
+public class ListAnnotationsCmd extends BaseListCmd {
+
+    public static final String APINAME = "listAnnotations";
+
+    @Parameter(name = ApiConstants.ID, type = CommandType.STRING, description = "the id of the annotation")
+    private String uuid;
+    @Parameter(name = ApiConstants.ENTITY_TYPE, type = CommandType.STRING, description = "the entity type")
+    private String entityType;
+    @Parameter(name = ApiConstants.ENTITY_ID, type = CommandType.STRING, description = "the id of the entity for which to show annotations")
+    private String entityUuid;
+
+    public String getUuid() {
+        return uuid;
+    }
+
+    public String getEntityType() {
+        return entityType;
+    }
+
+    public String getEntityUuid() {
+        return entityUuid;
+    }
+
+    @Override public void execute()
+            throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException,
+            NetworkRuleConflictException {
+        // preconditions to check:
+        // if entity type is null entity uuid can not have a value
+        Preconditions.checkArgument(StringUtils.isNotBlank(entityType) ? ! StringUtils.isNotBlank(uuid) : true,
+                "I can search for an anotation on an entity or for a specific annotation, not both");
+        // if uuid has a value entity type and entity uuid can not have a value
+        Preconditions.checkArgument(StringUtils.isNotBlank(uuid) ? entityType == null && entityUuid == null : true,
+                "I will either search for a specific annotation or for annotations on an entity, not both");
+
+        ListResponse<AnnotationResponse> response = annotationService.searchForAnnotations(this);
+        response.setResponseName(getCommandName());
+        this.setResponseObject(response);
+        response.setObjectName("annotations");
+    }
+
+    @Override public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/annotation/RemoveAnnotationCmd.java b/api/src/org/apache/cloudstack/api/command/admin/annotation/RemoveAnnotationCmd.java
new file mode 100644
index 00000000000..581ce45f252
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/annotation/RemoveAnnotationCmd.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.command.admin.annotation;
+
+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.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.AnnotationResponse;
+import org.apache.cloudstack.context.CallContext;
+
+@APICommand(name = RemoveAnnotationCmd.APINAME, description = "remove an annotation.", responseObject = AnnotationResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.11", authorized = {RoleType.Admin})
+public class RemoveAnnotationCmd extends BaseCmd {
+
+    public static final String APINAME = "removeAnnotation";
+
+    @Parameter(name = ApiConstants.ID, type = CommandType.STRING, required = true, description = "the id of the annotation")
+    private String uuid;
+
+    public String getUuid() {
+        return uuid;
+    }
+
+    @Override
+    public void execute()
+            throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException,
+            NetworkRuleConflictException {
+        AnnotationResponse annotationResponse = annotationService.removeAnnotation(this);
+        annotationResponse.setResponseName(getCommandName());
+        this.setResponseObject(annotationResponse);
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccount().getAccountId();
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/ca/IssueCertificateCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ca/IssueCertificateCmd.java
new file mode 100644
index 00000000000..8926829205f
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/ca/IssueCertificateCmd.java
@@ -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.
+
+package org.apache.cloudstack.api.command.admin.ca;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+
+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.response.CertificateResponse;
+import org.apache.cloudstack.ca.CAManager;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.framework.ca.Certificate;
+import org.apache.cloudstack.utils.security.CertUtils;
+import org.apache.log4j.Logger;
+
+import com.cloud.event.EventTypes;
+import com.google.common.base.Strings;
+
+@APICommand(name = IssueCertificateCmd.APINAME,
+        description = "Issues a client certificate using configured or provided CA plugin",
+        responseObject = CertificateResponse.class,
+        requestHasSensitiveInfo = true,
+        responseHasSensitiveInfo = true,
+        since = "4.11.0",
+        authorized = {RoleType.Admin})
+public class IssueCertificateCmd extends BaseAsyncCmd {
+    private static final Logger LOG = Logger.getLogger(IssueCertificateCmd.class);
+
+    public static final String APINAME = "issueCertificate";
+
+    @Inject
+    private CAManager caManager;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.CSR, type = BaseCmd.CommandType.STRING, description = "The certificate signing request (in pem format), if CSR is not provided then configured/provided options are considered", length = 65535)
+    private String csr;
+
+    @Parameter(name = ApiConstants.DOMAIN, type = BaseCmd.CommandType.STRING, description = "Comma separated list of domains, the certificate should be issued for. When csr is not provided, the first domain is used as a subject/CN")
+    private String domains;
+
+    @Parameter(name = ApiConstants.IP_ADDRESS, type = BaseCmd.CommandType.STRING, description = "Comma separated list of IP addresses, the certificate should be issued for")
+    private String addresses;
+
+    @Parameter(name = ApiConstants.DURATION, type = CommandType.INTEGER, description = "Certificate validity duration in number of days, when not provided the default configured value will be used")
+    private Integer validityDuration;
+
+    @Parameter(name = ApiConstants.PROVIDER, type = BaseCmd.CommandType.STRING, description = "Name of the CA service provider, otherwise the default configured provider plugin will be used")
+    private String provider;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public String getCsr() {
+        return csr;
+    }
+
+    private List<String> processList(final String string) {
+        final List<String> list = new ArrayList<>();
+        if (!Strings.isNullOrEmpty(string)) {
+            for (final String address: string.split(",")) {
+                list.add(address.trim());
+            }
+        }
+        return list;
+    }
+
+    public List<String> getAddresses() {
+        return processList(addresses);
+    }
+
+    public List<String> getDomains() {
+        return processList(domains);
+    }
+
+    public Integer getValidityDuration() {
+        return validityDuration;
+    }
+
+    public String getProvider() {
+        return provider;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public void execute() {
+        if (Strings.isNullOrEmpty(getCsr()) && getDomains().isEmpty()) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Please provide the domains or the CSR, none of them are provided");
+        }
+        final Certificate certificate = caManager.issueCertificate(getCsr(), getDomains(), getAddresses(), getValidityDuration(), getProvider());
+        if (certificate == null) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to issue client certificate with given provider");
+        }
+
+        final CertificateResponse certificateResponse = new CertificateResponse();
+        try {
+            certificateResponse.setCertificate(CertUtils.x509CertificateToPem(certificate.getClientCertificate()));
+            if (certificate.getPrivateKey() != null) {
+                certificateResponse.setPrivateKey(CertUtils.privateKeyToPem(certificate.getPrivateKey()));
+            }
+            if (certificate.getCaCertificates() != null) {
+                certificateResponse.setCaCertificate(CertUtils.x509CertificatesToPem(certificate.getCaCertificates()));
+            }
+        } catch (final IOException e) {
+            LOG.error("Failed to generate and convert client certificate(s) to PEM due to error: ", e);
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to process and return client certificate");
+        }
+        certificateResponse.setResponseName(getCommandName());
+        setResponseObject(certificateResponse);
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccount().getId();
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_CA_CERTIFICATE_ISSUE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "issuing certificate for domain(s)=" + domains + ", ip(s)=" + addresses;
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/ca/ListCAProvidersCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ca/ListCAProvidersCmd.java
new file mode 100644
index 00000000000..e1e8e375163
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/ca/ListCAProvidersCmd.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.admin.ca;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+
+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.CAProviderResponse;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.ca.CAManager;
+import org.apache.cloudstack.framework.ca.CAProvider;
+
+import com.cloud.user.Account;
+
+@APICommand(name = ListCAProvidersCmd.APINAME,
+        description = "Lists available certificate authority providers in CloudStack",
+        responseObject = CAProviderResponse.class,
+        requestHasSensitiveInfo = false,
+        responseHasSensitiveInfo = false,
+        since = "4.11.0",
+        authorized = {RoleType.Admin})
+public class ListCAProvidersCmd extends BaseCmd {
+    public static final String APINAME = "listCAProviders";
+
+    @Inject
+    private CAManager caManager;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "List CA service provider by name")
+    private String name;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public String getName() {
+        return name;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return Account.ACCOUNT_ID_SYSTEM;
+    }
+
+    private void setupResponse(final List<CAProvider> providers) {
+        final ListResponse<CAProviderResponse> response = new ListResponse<>();
+        final List<CAProviderResponse> responses = new ArrayList<>();
+        for (final CAProvider provider : providers) {
+            if (provider == null || (getName() != null && !provider.getProviderName().equals(getName()))) {
+                continue;
+            }
+            final CAProviderResponse caProviderResponse = new CAProviderResponse();
+            caProviderResponse.setName(provider.getProviderName());
+            caProviderResponse.setDescription(provider.getDescription());
+            caProviderResponse.setObjectName("caprovider");
+            responses.add(caProviderResponse);
+        }
+        response.setResponses(responses);
+        response.setResponseName(getCommandName());
+        setResponseObject(response);
+    }
+
+    @Override
+    public void execute() {
+        final List<CAProvider> caProviders = caManager.getCaProviders();
+        setupResponse(caProviders);
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/ca/ListCaCertificateCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ca/ListCaCertificateCmd.java
new file mode 100644
index 00000000000..1baa84179f0
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/ca/ListCaCertificateCmd.java
@@ -0,0 +1,90 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.api.command.admin.ca;
+
+import java.io.IOException;
+
+import javax.inject.Inject;
+
+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.CertificateResponse;
+import org.apache.cloudstack.ca.CAManager;
+
+import com.cloud.user.Account;
+import com.cloud.utils.exception.CloudRuntimeException;
+
+@APICommand(name = ListCaCertificateCmd.APINAME,
+        description = "Lists the CA public certificate(s) as support by the configured/provided CA plugin",
+        responseObject = CertificateResponse.class,
+        requestHasSensitiveInfo = false,
+        responseHasSensitiveInfo = false,
+        since = "4.11.0",
+        authorized = {RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin, RoleType.User})
+public class ListCaCertificateCmd extends BaseCmd {
+    public static final String APINAME = "listCaCertificate";
+
+    @Inject
+    private CAManager caManager;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.PROVIDER, type = CommandType.STRING, description = "Name of the CA service provider, otherwise the default configured provider plugin will be used")
+    private String provider;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public String getProvider() {
+        return provider;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public void execute() {
+        final String caCertificates;
+        try {
+            caCertificates = caManager.getCaCertificate(getProvider());
+        } catch (final IOException e) {
+            throw new CloudRuntimeException("Failed to get CA certificates for given CA provider");
+        }
+        final CertificateResponse certificateResponse = new CertificateResponse("cacertificates");
+        certificateResponse.setCertificate(caCertificates);
+        certificateResponse.setResponseName(getCommandName());
+        setResponseObject(certificateResponse);
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return Account.ACCOUNT_TYPE_NORMAL;
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/ca/ProvisionCertificateCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ca/ProvisionCertificateCmd.java
new file mode 100644
index 00000000000..2745f071dd0
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/ca/ProvisionCertificateCmd.java
@@ -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.
+
+package org.apache.cloudstack.api.command.admin.ca;
+
+import javax.inject.Inject;
+
+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.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.HostResponse;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.cloudstack.ca.CAManager;
+import org.apache.cloudstack.context.CallContext;
+
+import com.cloud.event.EventTypes;
+import com.cloud.host.Host;
+
+@APICommand(name = ProvisionCertificateCmd.APINAME,
+        description = "Issues and propagates client certificate on a connected host/agent using configured CA plugin",
+        responseObject = SuccessResponse.class,
+        requestHasSensitiveInfo = false,
+        responseHasSensitiveInfo = false,
+        since = "4.11.0",
+        authorized = {RoleType.Admin})
+public class ProvisionCertificateCmd extends BaseAsyncCmd {
+    public static final String APINAME = "provisionCertificate";
+
+    @Inject
+    private CAManager caManager;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.HOST_ID, type = CommandType.UUID, required = true, entityType = HostResponse.class,
+            description = "The host/agent uuid to which the certificate has to be provisioned (issued and propagated)")
+    private Long hostId;
+
+    @Parameter(name = ApiConstants.RECONNECT, type = CommandType.BOOLEAN,
+            description = "Whether to attempt reconnection with host/agent after successful deployment of certificate. When option is not provided, configured global setting is used")
+    private Boolean reconnect;
+
+    @Parameter(name = ApiConstants.PROVIDER, type = CommandType.STRING,
+            description = "Name of the CA service provider, otherwise the default configured provider plugin will be used")
+    private String provider;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getHostId() {
+        return hostId;
+    }
+
+    public Boolean getReconnect() {
+        return reconnect;
+    }
+
+    public String getProvider() {
+        return provider;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public void execute() {
+        final Host host = _resourceService.getHost(getHostId());
+        if (host == null) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find host by ID: " + getHostId());
+        }
+
+        boolean result = caManager.provisionCertificate(host, getReconnect(), getProvider());
+        SuccessResponse response = new SuccessResponse(getCommandName());
+        response.setSuccess(result);
+        setResponseObject(response);
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccount().getId();
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_CA_CERTIFICATE_PROVISION;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "provisioning certificate for host id=" + hostId + " using provider=" + provider;
+    }
+
+    @Override
+    public ApiCommandJobType getInstanceType() {
+        return ApiCommandJobType.Host;
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/ca/RevokeCertificateCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ca/RevokeCertificateCmd.java
new file mode 100644
index 00000000000..0f154f045df
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/ca/RevokeCertificateCmd.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.ca;
+
+import java.math.BigInteger;
+
+import javax.inject.Inject;
+
+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.response.SuccessResponse;
+import org.apache.cloudstack.ca.CAManager;
+import org.apache.cloudstack.context.CallContext;
+
+import com.cloud.event.EventTypes;
+import com.google.common.base.Strings;
+
+@APICommand(name = RevokeCertificateCmd.APINAME,
+        description = "Revokes certificate using configured CA plugin",
+        responseObject = SuccessResponse.class,
+        requestHasSensitiveInfo = true,
+        responseHasSensitiveInfo = false,
+        since = "4.11.0",
+        authorized = {RoleType.Admin})
+public class RevokeCertificateCmd extends BaseAsyncCmd {
+
+    public static final String APINAME = "revokeCertificate";
+
+    @Inject
+    private CAManager caManager;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.SERIAL, type = BaseCmd.CommandType.STRING, required = true, description = "The certificate serial number, as a hex value")
+    private String serial;
+
+    @Parameter(name = ApiConstants.CN, type = BaseCmd.CommandType.STRING, description = "The certificate CN")
+    private String cn;
+
+    @Parameter(name = ApiConstants.PROVIDER, type = BaseCmd.CommandType.STRING, description = "Name of the CA service provider, otherwise the default configured provider plugin will be used")
+    private String provider;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public BigInteger getSerialBigInteger() {
+        if (Strings.isNullOrEmpty(serial)) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Certificate serial cannot be empty");
+        }
+        return new BigInteger(serial, 16);
+    }
+
+    public String getCn() {
+        return cn;
+    }
+
+    public String getProvider() {
+        return provider;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public void execute() {
+        boolean result = caManager.revokeCertificate(getSerialBigInteger(), getCn(), getProvider());
+        SuccessResponse response = new SuccessResponse(getCommandName());
+        response.setSuccess(result);
+        setResponseObject(response);
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccount().getId();
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_CA_CERTIFICATE_REVOKE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "revoking certificate with serial id=" + serial + ", cn=" + cn;
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/config/ListCfgsByCmd.java b/api/src/org/apache/cloudstack/api/command/admin/config/ListCfgsByCmd.java
index a34bc3eb622..80ebaf43f64 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/config/ListCfgsByCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/config/ListCfgsByCmd.java
@@ -19,6 +19,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.cloudstack.api.response.DomainResponse;
 import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.api.APICommand;
@@ -28,6 +29,7 @@
 import org.apache.cloudstack.api.response.AccountResponse;
 import org.apache.cloudstack.api.response.ClusterResponse;
 import org.apache.cloudstack.api.response.ConfigurationResponse;
+import org.apache.cloudstack.api.response.ImageStoreResponse;
 import org.apache.cloudstack.api.response.ListResponse;
 import org.apache.cloudstack.api.response.StoragePoolResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
@@ -76,6 +78,18 @@
                description = "the ID of the Account to update the parameter value for corresponding account")
     private Long accountId;
 
+    @Parameter(name = ApiConstants.DOMAIN_ID,
+               type = CommandType.UUID,
+               entityType = DomainResponse.class,
+               description = "the ID of the Domain to update the parameter value for corresponding domain")
+    private Long domainId;
+
+    @Parameter(name = ApiConstants.IMAGE_STORE_UUID,
+            type = CommandType.UUID,
+            entityType = ImageStoreResponse.class,
+            description = "the ID of the Image Store to update the parameter value for corresponding image store")
+    private Long imageStoreId;
+
     // ///////////////////////////////////////////////////
     // ///////////////// Accessors ///////////////////////
     // ///////////////////////////////////////////////////
@@ -104,6 +118,14 @@ public Long getAccountId() {
         return accountId;
     }
 
+    public Long getDomainId() {
+        return domainId;
+    }
+
+    public Long getImageStoreId() {
+        return imageStoreId;
+    }
+
     @Override
     public Long getPageSizeVal() {
         Long defaultPageSize = 500L;
@@ -147,6 +169,12 @@ public void execute() {
             if (getAccountId() != null) {
                 cfgResponse.setScope("account");
             }
+            if (getDomainId() != null) {
+                cfgResponse.setScope("domain");
+            }
+            if (getImageStoreId() != null){
+                cfgResponse.setScope("imagestore");
+            }
             configResponses.add(cfgResponse);
         }
 
diff --git a/api/src/org/apache/cloudstack/api/command/admin/config/UpdateCfgCmd.java b/api/src/org/apache/cloudstack/api/command/admin/config/UpdateCfgCmd.java
index 45f790fb70b..936f0cd69f1 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/config/UpdateCfgCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/config/UpdateCfgCmd.java
@@ -18,9 +18,10 @@
 
 import com.google.common.base.Strings;
 import org.apache.cloudstack.acl.RoleService;
+import org.apache.cloudstack.api.response.DomainResponse;
 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.BaseCmd;
@@ -29,6 +30,7 @@
 import org.apache.cloudstack.api.response.AccountResponse;
 import org.apache.cloudstack.api.response.ClusterResponse;
 import org.apache.cloudstack.api.response.ConfigurationResponse;
+import org.apache.cloudstack.api.response.ImageStoreResponse;
 import org.apache.cloudstack.api.response.StoragePoolResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
 import org.apache.cloudstack.config.Configuration;
@@ -75,6 +77,19 @@
                description = "the ID of the Account to update the parameter value for corresponding account")
     private Long accountId;
 
+    @Parameter(name = ApiConstants.DOMAIN_ID,
+               type = CommandType.UUID,
+               entityType = DomainResponse.class,
+               description = "the ID of the Domain to update the parameter value for corresponding domain")
+    private Long domainId;
+
+    @Parameter(name = ApiConstants.IMAGE_STORE_UUID,
+            type = CommandType.UUID,
+            entityType = ImageStoreResponse.class,
+            description = "the ID of the Image Store to update the parameter value for corresponding image store",
+            validations = ApiArgValidator.PositiveNumber)
+    private Long imageStoreId;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -107,6 +122,14 @@ public Long getAccountId() {
         return accountId;
     }
 
+    public Long getDomainId() {
+        return domainId;
+    }
+
+    public Long getImageStoreId() {
+        return imageStoreId;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
@@ -145,6 +168,9 @@ public void execute() {
             if (getAccountId() != null) {
                 response.setScope("account");
             }
+            if (getDomainId() != null) {
+                response.setScope("domain");
+            }
             response.setValue(value);
             this.setResponseObject(response);
         } else {
diff --git a/api/src/org/apache/cloudstack/api/command/admin/direct/download/UploadTemplateDirectDownloadCertificate.java b/api/src/org/apache/cloudstack/api/command/admin/direct/download/UploadTemplateDirectDownloadCertificate.java
new file mode 100755
index 00000000000..89c0c25c9ca
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/direct/download/UploadTemplateDirectDownloadCertificate.java
@@ -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.
+package org.apache.cloudstack.api.command.admin.direct.download;
+
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.exception.NetworkRuleConflictException;
+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.ServerApiException;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.direct.download.DirectDownloadManager;
+import org.apache.log4j.Logger;
+
+import javax.inject.Inject;
+
+@APICommand(name = UploadTemplateDirectDownloadCertificate.APINAME,
+        description = "Upload a certificate for HTTPS direct template download on KVM hosts",
+        responseObject = SuccessResponse.class,
+        requestHasSensitiveInfo = true,
+        responseHasSensitiveInfo = true,
+        since = "4.11.0",
+        authorized = {RoleType.Admin})
+public class UploadTemplateDirectDownloadCertificate extends BaseCmd {
+
+    @Inject
+    DirectDownloadManager directDownloadManager;
+
+    private static final Logger LOG = Logger.getLogger(UploadTemplateDirectDownloadCertificate.class);
+    public static final String APINAME = "uploadTemplateDirectDownloadCertificate";
+
+    @Parameter(name = ApiConstants.CERTIFICATE, type = BaseCmd.CommandType.STRING, required = true, length = 65535,
+            description = "SSL certificate")
+    private String certificate;
+
+    @Parameter(name = ApiConstants.NAME , type = BaseCmd.CommandType.STRING, required = true,
+            description = "Name for the uploaded certificate")
+    private String name;
+
+    @Parameter(name = ApiConstants.HYPERVISOR, type = BaseCmd.CommandType.STRING, required = true, description = "Hypervisor type")
+    private String hypervisor;
+
+    @Override
+    public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException {
+        if (!hypervisor.equalsIgnoreCase("kvm")) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Currently supporting KVM hosts only");
+        }
+
+        SuccessResponse response = new SuccessResponse(getCommandName());
+        try {
+            LOG.debug("Uploading certificate " + name + " to agents for Direct Download");
+            boolean result = directDownloadManager.uploadCertificateToHosts(certificate, name, hypervisor);
+            response.setSuccess(result);
+            setResponseObject(response);
+        } catch (Exception e) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage());
+        }
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccount().getId();
+    }
+}
+
+
diff --git a/api/src/org/apache/cloudstack/api/command/admin/domain/CreateDomainCmd.java b/api/src/org/apache/cloudstack/api/command/admin/domain/CreateDomainCmd.java
index 312c9ee4b09..fe1c20206b6 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/domain/CreateDomainCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/domain/CreateDomainCmd.java
@@ -17,7 +17,7 @@
 package org.apache.cloudstack.api.command.admin.domain;
 
 import org.apache.log4j.Logger;
-
+import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.ApiErrorCode;
@@ -31,7 +31,8 @@
 import com.cloud.user.Account;
 
 @APICommand(name = "createDomain", description = "Creates a domain", responseObject = DomainResponse.class,
-        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+ requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, authorized = {
+        RoleType.Admin, RoleType.DomainAdmin })
 public class CreateDomainCmd extends BaseCmd {
     public static final Logger s_logger = Logger.getLogger(CreateDomainCmd.class.getName());
 
@@ -45,9 +46,9 @@
     private String domainName;
 
     @Parameter(name = ApiConstants.PARENT_DOMAIN_ID,
-               type = CommandType.UUID,
-               entityType = DomainResponse.class,
-               description = "assigns new domain a parent domain by domain ID of the parent.  If no parent domain is specied, the ROOT domain is assumed.")
+            type = CommandType.UUID,
+            entityType = DomainResponse.class,
+            description = "assigns new domain a parent domain by domain ID of the parent.  If no parent domain is specied, the ROOT domain is assumed.")
     private Long parentDomainId;
 
     @Parameter(name = ApiConstants.NETWORK_DOMAIN, type = CommandType.STRING, description = "Network domain for networks in the domain")
diff --git a/api/src/org/apache/cloudstack/api/command/admin/domain/DeleteDomainCmd.java b/api/src/org/apache/cloudstack/api/command/admin/domain/DeleteDomainCmd.java
index a6d2b0b10c1..037cf3d9ab4 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/domain/DeleteDomainCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/domain/DeleteDomainCmd.java
@@ -18,8 +18,7 @@
 
 import javax.inject.Inject;
 
-import org.apache.log4j.Logger;
-
+import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.ApiErrorCode;
@@ -30,13 +29,15 @@
 import org.apache.cloudstack.api.response.SuccessResponse;
 import org.apache.cloudstack.context.CallContext;
 import org.apache.cloudstack.region.RegionService;
+import org.apache.log4j.Logger;
 
 import com.cloud.domain.Domain;
 import com.cloud.event.EventTypes;
 import com.cloud.user.Account;
 
 @APICommand(name = "deleteDomain", description = "Deletes a specified domain", responseObject = SuccessResponse.class,
-        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, authorized = {
+        RoleType.Admin, RoleType.DomainAdmin })
 public class DeleteDomainCmd extends BaseAsyncCmd {
     public static final Logger s_logger = Logger.getLogger(DeleteDomainCmd.class.getName());
     private static final String s_name = "deletedomainresponse";
@@ -49,8 +50,8 @@
     private Long id;
 
     @Parameter(name = ApiConstants.CLEANUP,
-               type = CommandType.BOOLEAN,
-               description = "true if all domain resources (child domains, accounts) have to be cleaned up, false otherwise")
+            type = CommandType.BOOLEAN,
+            description = "true if all domain resources (child domains, accounts) have to be cleaned up, false otherwise")
     private Boolean cleanup;
 
     @Inject
diff --git a/api/src/org/apache/cloudstack/api/command/admin/domain/ListDomainsCmd.java b/api/src/org/apache/cloudstack/api/command/admin/domain/ListDomainsCmd.java
index e382ed9b41c..9c1ae221328 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/domain/ListDomainsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/domain/ListDomainsCmd.java
@@ -16,10 +16,15 @@
 // under the License.
 package org.apache.cloudstack.api.command.admin.domain;
 
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+
 import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiConstants.DomainDetails;
 import org.apache.cloudstack.api.BaseListCmd;
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ResponseObject.ResponseView;
@@ -27,6 +32,7 @@
 import org.apache.cloudstack.api.response.ListResponse;
 
 import com.cloud.domain.Domain;
+import com.cloud.exception.InvalidParameterValueException;
 
 @APICommand(name = "listDomains", description = "Lists domains and provides detailed information for listed domains", responseObject = DomainResponse.class, responseView = ResponseView.Restricted, entityType = {Domain.class},
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
@@ -53,6 +59,12 @@
                description = "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false")
     private Boolean listAll;
 
+    @Parameter(name = ApiConstants.DETAILS,
+               type = CommandType.LIST,
+               collectionType = CommandType.STRING,
+               description = "comma separated list of domain details requested, value can be a list of [ all, resource, min]")
+    private List<String> viewDetails;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -73,6 +85,25 @@ public boolean listAll() {
         return listAll == null ? false : listAll;
     }
 
+    public EnumSet<DomainDetails> getDetails() throws InvalidParameterValueException {
+        EnumSet<DomainDetails> dv;
+        if (viewDetails == null || viewDetails.size() <= 0) {
+            dv = EnumSet.of(DomainDetails.all);
+        } else {
+            try {
+                ArrayList<DomainDetails> dc = new ArrayList<DomainDetails>();
+                for (String detail : viewDetails) {
+                    dc.add(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(DomainDetails.class));
+            }
+        }
+        return dv;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/org/apache/cloudstack/api/command/admin/guest/AddGuestOsCmd.java b/api/src/org/apache/cloudstack/api/command/admin/guest/AddGuestOsCmd.java
index 3ba9669b305..717bcfe8155 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/guest/AddGuestOsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/guest/AddGuestOsCmd.java
@@ -33,6 +33,11 @@
 import com.cloud.storage.GuestOS;
 import com.cloud.user.Account;
 
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
 @APICommand(name = "addGuestOs", description = "Add a new guest OS type", responseObject = GuestOSResponse.class,
         since = "4.4.0", requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
 public class AddGuestOsCmd extends BaseAsyncCreateCmd {
@@ -53,8 +58,11 @@
     @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = false, description = "Optional name for Guest OS")
     private String osName;
 
+    @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, required = true, description = "Map of (key/value pairs)")
+    private Map details;
+
 
-/////////////////////////////////////////////////////
+    /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
 
@@ -70,6 +78,22 @@ public String getOsName() {
         return osName;
     }
 
+    public Map getDetails() {
+        Map<String, String> detailsMap = new HashMap<String, String>();
+        if (!details.isEmpty()) {
+            Collection<?> servicesCollection = details.values();
+            Iterator<?> iter = servicesCollection.iterator();
+            while (iter.hasNext()) {
+                HashMap<String, String> services = (HashMap<String, String>)iter.next();
+                String key = services.get("key");
+                String value = services.get("value");
+                detailsMap.put(key, value);
+            }
+        }
+        return detailsMap;
+    }
+
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/org/apache/cloudstack/api/command/admin/guest/UpdateGuestOsCmd.java b/api/src/org/apache/cloudstack/api/command/admin/guest/UpdateGuestOsCmd.java
index e4b1ecd5719..ff3b49d79be 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/guest/UpdateGuestOsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/guest/UpdateGuestOsCmd.java
@@ -31,6 +31,11 @@
 import com.cloud.storage.GuestOS;
 import com.cloud.user.Account;
 
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
 @APICommand(name = "updateGuestOs", description = "Updates the information about Guest OS", responseObject = GuestOSResponse.class,
         since = "4.4.0", requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
 public class UpdateGuestOsCmd extends BaseAsyncCmd {
@@ -49,6 +54,10 @@
     @Parameter(name = ApiConstants.OS_DISPLAY_NAME, type = CommandType.STRING, required = true, description = "Unique display name for Guest OS")
     private String osDisplayName;
 
+    @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, required = true, description = "Map of (key/value pairs)")
+    private Map details;
+
+
 /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -61,6 +70,21 @@ public String getOsDisplayName() {
         return osDisplayName;
     }
 
+    public Map getDetails() {
+        Map<String, String> detailsMap = new HashMap<String, String>();;
+        if (!details.isEmpty()) {
+            Collection<?> servicesCollection = details.values();
+            Iterator<?> iter = servicesCollection.iterator();
+            while (iter.hasNext()) {
+                HashMap<String, String> services = (HashMap<String, String>)iter.next();
+                String key = services.get("key");
+                String value = services.get("value");
+                detailsMap.put(key, value);
+            }
+        }
+        return detailsMap;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/org/apache/cloudstack/api/command/admin/ha/ConfigureHAForHostCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ha/ConfigureHAForHostCmd.java
new file mode 100644
index 00000000000..f85dbb23504
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/ha/ConfigureHAForHostCmd.java
@@ -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.
+
+package org.apache.cloudstack.api.command.admin.ha;
+
+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.host.Host;
+import com.cloud.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.HostHAResponse;
+import org.apache.cloudstack.api.response.HostResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.ha.HAConfigManager;
+import org.apache.cloudstack.ha.HAResource;
+
+import javax.inject.Inject;
+
+@APICommand(name = ConfigureHAForHostCmd.APINAME, description = "Configures HA for a host",
+        responseObject = HostHAResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
+        since = "4.11", authorized = {RoleType.Admin})
+public final class ConfigureHAForHostCmd extends BaseAsyncCmd {
+    public static final String APINAME = "configureHAForHost";
+
+    @Inject
+    private HAConfigManager haConfigManager;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.HOST_ID, type = CommandType.UUID, entityType = HostResponse.class,
+            description = "ID of the host", required = true, validations = {ApiArgValidator.PositiveNumber})
+    private Long hostId;
+
+    @Parameter(name = ApiConstants.PROVIDER, type = CommandType.STRING,
+            description = "HA provider", required = true, validations = {ApiArgValidator.NotNullOrEmpty})
+    private String haProvider;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getHostId() {
+        return hostId;
+    }
+
+    public String getHaProvider() {
+        return haProvider;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return Account.ACCOUNT_ID_SYSTEM;
+    }
+
+    private void setupResponse(final boolean result, final String resourceUuid) {
+        final HostHAResponse response = new HostHAResponse();
+        response.setId(resourceUuid);
+        response.setProvider(getHaProvider().toLowerCase());
+        response.setResponseName(getCommandName());
+        setResponseObject(response);
+    }
+
+    @Override
+    public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException {
+        final Host host = _resourceService.getHost(getHostId());
+        if (host == null) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find host by ID: " + getHostId());
+        }
+
+        final boolean result = haConfigManager.configureHA(host.getId(), HAResource.ResourceType.Host, getHaProvider());
+        if (!result) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to configure HA provider for the host");
+        }
+        CallContext.current().setEventDetails("Host Id:" + host.getId() + " HA configured with provider: " + getHaProvider());
+        CallContext.current().putContextParameter(Host.class, host.getUuid());
+
+        setupResponse(result, host.getUuid());
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_HA_RESOURCE_DISABLE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "configure HA for host: " + getHostId();
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/ha/DisableHAForClusterCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ha/DisableHAForClusterCmd.java
new file mode 100644
index 00000000000..053c978b831
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/ha/DisableHAForClusterCmd.java
@@ -0,0 +1,114 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT 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.ha;
+
+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.org.Cluster;
+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.ClusterResponse;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.ha.HAConfigManager;
+
+import javax.inject.Inject;
+
+@APICommand(name = DisableHAForClusterCmd.APINAME, description = "Disables HA cluster-wide",
+        responseObject = SuccessResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
+        since = "4.11", authorized = {RoleType.Admin})
+public final class DisableHAForClusterCmd extends BaseAsyncCmd {
+    public static final String APINAME = "disableHAForCluster";
+
+    @Inject
+    private HAConfigManager haConfigManager;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.CLUSTER_ID, type = BaseCmd.CommandType.UUID, entityType = ClusterResponse.class,
+            description = "ID of the cluster", required = true, validations = {ApiArgValidator.PositiveNumber})
+    private Long clusterId;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getClusterId() {
+        return clusterId;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccountId();
+    }
+
+    private void setupResponse(final boolean result) {
+        final SuccessResponse response = new SuccessResponse();
+        response.setSuccess(result);
+        response.setResponseName(getCommandName());
+        response.setObjectName("ha");
+        setResponseObject(response);
+    }
+
+    @Override
+    public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException {
+        final Cluster cluster = _resourceService.getCluster(getClusterId());
+        if (cluster == null) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find cluster by ID: " + getClusterId());
+        }
+        final boolean result = haConfigManager.disableHA(cluster);
+        CallContext.current().setEventDetails("Cluster Id:" + cluster.getId() + " HA enabled: false");
+        CallContext.current().putContextParameter(Cluster.class, cluster.getUuid());
+
+        setupResponse(result);
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_HA_RESOURCE_DISABLE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "disable HA for cluster: " + getClusterId();
+    }
+
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/ha/DisableHAForHostCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ha/DisableHAForHostCmd.java
new file mode 100644
index 00000000000..87ebe878ceb
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/ha/DisableHAForHostCmd.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.ha;
+
+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.host.Host;
+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.HostHAResponse;
+import org.apache.cloudstack.api.response.HostResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.ha.HAConfigManager;
+import org.apache.cloudstack.ha.HAResource;
+
+import javax.inject.Inject;
+
+@APICommand(name = DisableHAForHostCmd.APINAME, description = "Disables HA for a host",
+        responseObject = HostHAResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
+        since = "4.11", authorized = {RoleType.Admin})
+public final class DisableHAForHostCmd extends BaseAsyncCmd {
+    public static final String APINAME = "disableHAForHost";
+
+    @Inject
+    private HAConfigManager haConfigManager;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.HOST_ID, type = CommandType.UUID, entityType = HostResponse.class,
+            description = "ID of the host", required = true, validations = {ApiArgValidator.PositiveNumber})
+    private Long hostId;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getHostId() {
+        return hostId;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccountId();
+    }
+
+    private void setupResponse(final boolean result, final String resourceUuid) {
+        final HostHAResponse response = new HostHAResponse();
+        response.setId(resourceUuid);
+        response.setEnabled(false);
+        response.setStatus(result);
+        response.setResponseName(getCommandName());
+        setResponseObject(response);
+    }
+
+    @Override
+    public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException {
+        final Host host = _resourceService.getHost(getHostId());
+        if (host == null) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find host by ID: " + getHostId());
+        }
+
+        final boolean result = haConfigManager.disableHA(host.getId(), HAResource.ResourceType.Host);
+        CallContext.current().setEventDetails("Host Id:" + host.getId() + " HA enabled: false");
+        CallContext.current().putContextParameter(Host.class, host.getUuid());
+
+        setupResponse(result, host.getUuid());
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_HA_RESOURCE_DISABLE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "disable HA for host: " + getHostId();
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/ha/DisableHAForZoneCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ha/DisableHAForZoneCmd.java
new file mode 100644
index 00000000000..845c4a663b5
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/ha/DisableHAForZoneCmd.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.ha;
+
+import com.cloud.dc.DataCenter;
+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 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.SuccessResponse;
+import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.ha.HAConfigManager;
+
+import javax.inject.Inject;
+
+@APICommand(name = DisableHAForZoneCmd.APINAME, description = "Disables HA for a zone",
+        responseObject = SuccessResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
+        since = "4.11", authorized = {RoleType.Admin})
+public final class DisableHAForZoneCmd extends BaseAsyncCmd {
+    public static final String APINAME = "disableHAForZone";
+
+    @Inject
+    private HAConfigManager haConfigManager;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.ZONE_ID, type = BaseCmd.CommandType.UUID, entityType = ZoneResponse.class,
+            description = "ID of the zone", required = true, validations = {ApiArgValidator.PositiveNumber})
+    private Long zoneId;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getZoneId() {
+        return zoneId;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccountId();
+    }
+
+    private void setupResponse(final boolean result) {
+        final SuccessResponse response = new SuccessResponse();
+        response.setSuccess(result);
+        response.setResponseName(getCommandName());
+        response.setObjectName("ha");
+        setResponseObject(response);
+    }
+
+    @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());
+        }
+
+        final boolean result = haConfigManager.disableHA(dataCenter);
+        CallContext.current().setEventDetails("Zone Id:" + dataCenter.getId() + " HA enabled: false");
+        CallContext.current().putContextParameter(DataCenter.class, dataCenter.getUuid());
+
+        setupResponse(result);
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_HA_RESOURCE_DISABLE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "disable HA for zone: " + getZoneId();
+    }
+
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/ha/EnableHAForClusterCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ha/EnableHAForClusterCmd.java
new file mode 100644
index 00000000000..e06d0d2c1b0
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/ha/EnableHAForClusterCmd.java
@@ -0,0 +1,114 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT 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.ha;
+
+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.org.Cluster;
+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.ClusterResponse;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.ha.HAConfigManager;
+
+import javax.inject.Inject;
+
+@APICommand(name = EnableHAForClusterCmd.APINAME, description = "Enables HA cluster-wide",
+        responseObject = SuccessResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
+        since = "4.11", authorized = {RoleType.Admin})
+public final class EnableHAForClusterCmd extends BaseAsyncCmd {
+    public static final String APINAME = "enableHAForCluster";
+
+    @Inject
+    private HAConfigManager haConfigManager;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.CLUSTER_ID, type = BaseCmd.CommandType.UUID, entityType = ClusterResponse.class,
+            description = "ID of the cluster", required = true, validations = {ApiArgValidator.PositiveNumber})
+    private Long clusterId;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getClusterId() {
+        return clusterId;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccountId();
+    }
+
+    private void setupResponse(final boolean result) {
+        final SuccessResponse response = new SuccessResponse();
+        response.setSuccess(result);
+        response.setResponseName(getCommandName());
+        response.setObjectName("ha");
+        setResponseObject(response);
+    }
+
+    @Override
+    public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException {
+        final Cluster cluster = _resourceService.getCluster(getClusterId());
+        if (cluster == null) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find cluster by ID: " + getClusterId());
+        }
+
+        final boolean result = haConfigManager.enableHA(cluster);
+        CallContext.current().setEventDetails("Cluster Id:" + cluster.getId() + " HA enabled: true");
+        CallContext.current().putContextParameter(Cluster.class, cluster.getUuid());
+
+        setupResponse(result);
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_HA_RESOURCE_ENABLE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "enable HA for cluster: " + getClusterId();
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/ha/EnableHAForHostCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ha/EnableHAForHostCmd.java
new file mode 100644
index 00000000000..b23841ad56f
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/ha/EnableHAForHostCmd.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.ha;
+
+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.host.Host;
+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.HostHAResponse;
+import org.apache.cloudstack.api.response.HostResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.ha.HAConfigManager;
+import org.apache.cloudstack.ha.HAResource;
+
+import javax.inject.Inject;
+
+@APICommand(name = EnableHAForHostCmd.APINAME, description = "Enables HA for a host",
+        responseObject = HostHAResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
+        since = "4.11", authorized = {RoleType.Admin})
+public final class EnableHAForHostCmd extends BaseAsyncCmd {
+    public static final String APINAME = "enableHAForHost";
+
+    @Inject
+    private HAConfigManager haConfigManager;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.HOST_ID, type = CommandType.UUID, entityType = HostResponse.class,
+            description = "ID of the host", required = true, validations = {ApiArgValidator.PositiveNumber})
+    private Long hostId;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getHostId() {
+        return hostId;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccountId();
+    }
+
+    private void setupResponse(final boolean result, final String resourceUuid) {
+        final HostHAResponse response = new HostHAResponse();
+        response.setId(resourceUuid);
+        response.setEnabled(true);
+        response.setStatus(result);
+        response.setResponseName(getCommandName());
+        setResponseObject(response);
+    }
+
+    @Override
+    public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException {
+        final Host host = _resourceService.getHost(getHostId());
+        if (host == null) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find host by ID: " + getHostId());
+        }
+        final boolean result = haConfigManager.enableHA(host.getId(), HAResource.ResourceType.Host);
+
+        CallContext.current().setEventDetails("Host Id:" + host.getId() + " HA enabled: true");
+        CallContext.current().putContextParameter(Host.class, host.getUuid());
+
+        setupResponse(result, host.getUuid());
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_HA_RESOURCE_ENABLE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "enable HA for host: " + getHostId();
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/ha/EnableHAForZoneCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ha/EnableHAForZoneCmd.java
new file mode 100644
index 00000000000..443d303c296
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/ha/EnableHAForZoneCmd.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.ha;
+
+import com.cloud.dc.DataCenter;
+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 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.SuccessResponse;
+import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.ha.HAConfigManager;
+
+import javax.inject.Inject;
+
+@APICommand(name = EnableHAForZoneCmd.APINAME, description = "Enables HA for a zone",
+        responseObject = SuccessResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
+        since = "4.11", authorized = {RoleType.Admin})
+public final class EnableHAForZoneCmd extends BaseAsyncCmd {
+    public static final String APINAME = "enableHAForZone";
+
+    @Inject
+    private HAConfigManager haConfigManager;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.ZONE_ID, type = BaseCmd.CommandType.UUID, entityType = ZoneResponse.class,
+            description = "ID of the zone", required = true, validations = {ApiArgValidator.PositiveNumber})
+    private Long zoneId;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getZoneId() {
+        return zoneId;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccountId();
+    }
+
+    private void setupResponse(final boolean result) {
+        final SuccessResponse response = new SuccessResponse();
+        response.setSuccess(result);
+        response.setResponseName(getCommandName());
+        response.setObjectName("ha");
+        setResponseObject(response);
+    }
+
+    @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());
+        }
+
+        final boolean result = haConfigManager.enableHA(dataCenter);
+        CallContext.current().setEventDetails("Zone Id:" + dataCenter.getId() + " HA enabled: true");
+        CallContext.current().putContextParameter(DataCenter.class, dataCenter.getUuid());
+
+        setupResponse(result);
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_HA_RESOURCE_ENABLE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "enable HA for zone: " + getZoneId();
+    }
+
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/ha/ListHostHAProvidersCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ha/ListHostHAProvidersCmd.java
new file mode 100644
index 00000000000..64b9a6a8e5c
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/ha/ListHostHAProvidersCmd.java
@@ -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.
+
+package org.apache.cloudstack.api.command.admin.ha;
+
+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.google.common.base.Enums;
+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.HAProviderResponse;
+import org.apache.cloudstack.api.response.HostHAResponse;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.ha.HAConfigManager;
+import org.apache.cloudstack.ha.HAResource;
+
+import javax.inject.Inject;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@APICommand(name = ListHostHAProvidersCmd.APINAME, description = "Lists HA providers", responseObject = HostHAResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
+        since = "4.11", authorized = {RoleType.Admin})
+public final class ListHostHAProvidersCmd extends BaseCmd {
+    public static final String APINAME = "listHostHAProviders";
+
+    @Inject
+    private HAConfigManager haConfigManager;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.HYPERVISOR, type = CommandType.STRING, required = true,
+            description = "Hypervisor type of the resource", validations = {ApiArgValidator.NotNullOrEmpty})
+    private String hypervisorType;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public HAResource.ResourceSubType getHypervisorType() {
+        return HAResource.ResourceSubType.valueOf(hypervisorType);
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return Account.ACCOUNT_ID_SYSTEM;
+    }
+
+    private void setupResponse(final List<String> hostHAProviderList) {
+        final ListResponse<HAProviderResponse> response = new ListResponse<>();
+        final List<HAProviderResponse> hostHAResponses = new ArrayList<>();
+        for (final String provider : hostHAProviderList) {
+            final HAProviderResponse haProviderResponse = new HAProviderResponse();
+            haProviderResponse.setProvider(provider);
+            hostHAResponses.add(haProviderResponse);
+        }
+        response.setResponses(hostHAResponses);
+        response.setResponseName(getCommandName());
+        setResponseObject(response);
+    }
+
+    @Override
+    public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException {
+        if (!Enums.getIfPresent(HAResource.ResourceSubType.class, hypervisorType).isPresent()) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid or unsupported host hypervisor type provided. Supported types are: " + Arrays.toString(HAResource.ResourceSubType.values()));
+        }
+        final List<String> hostHAProviders = haConfigManager.listHAProviders(HAResource.ResourceType.Host, getHypervisorType());
+        setupResponse(hostHAProviders);
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/ha/ListHostHAResourcesCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ha/ListHostHAResourcesCmd.java
new file mode 100644
index 00000000000..75a900c2198
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/ha/ListHostHAResourcesCmd.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.ha;
+
+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.host.Host;
+import com.cloud.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.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.HostHAResponse;
+import org.apache.cloudstack.api.response.HostResponse;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.ha.HAConfig;
+import org.apache.cloudstack.ha.HAConfigManager;
+import org.apache.cloudstack.ha.HAResource;
+
+import javax.inject.Inject;
+import java.util.ArrayList;
+import java.util.List;
+
+@APICommand(name = ListHostHAResourcesCmd.APINAME, description = "Lists host HA resources", responseObject = HostHAResponse.class,
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
+        since = "4.11", authorized = {RoleType.Admin})
+public final class ListHostHAResourcesCmd extends BaseCmd {
+    public static final String APINAME = "listHostHAResources";
+
+    @Inject
+    private HAConfigManager haConfigManager;
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.HOST_ID, type = CommandType.UUID, entityType = HostResponse.class,
+            description = "List by host ID", validations = {ApiArgValidator.PositiveNumber})
+    private Long hostId;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getHostId() {
+        return hostId;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return Account.ACCOUNT_ID_SYSTEM;
+    }
+
+    private void setupResponse(final List<HAConfig> hostHAConfigList) {
+        final ListResponse<HostHAResponse> response = new ListResponse<>();
+        final List<HostHAResponse> hostHAResponses = new ArrayList<>();
+        for (final HAConfig config : hostHAConfigList) {
+            final Host host = _resourceService.getHost(config.getResourceId());
+            if (host == null) {
+                continue;
+            }
+            final HostHAResponse hostHAResponse = new HostHAResponse();
+            hostHAResponse.setId(host.getUuid());
+            hostHAResponse.setEnabled(config.isEnabled());
+            hostHAResponse.setHaState(config.getState());
+            hostHAResponse.setProvider(config.getHaProvider());
+            hostHAResponses.add(hostHAResponse);
+        }
+        response.setResponses(hostHAResponses);
+        response.setResponseName(getCommandName());
+        setResponseObject(response);
+    }
+
+    @Override
+    public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException {
+        final List<HAConfig> hostHAConfig = haConfigManager.listHAResources(getHostId(), HAResource.ResourceType.Host);
+        setupResponse(hostHAConfig);
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/host/FindHostsForMigrationCmd.java b/api/src/org/apache/cloudstack/api/command/admin/host/FindHostsForMigrationCmd.java
index dbb94384523..ad9b6af3436 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/host/FindHostsForMigrationCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/host/FindHostsForMigrationCmd.java
@@ -76,7 +76,7 @@ public void execute() {
         Map<Host, Boolean> hostsRequiringStorageMotion;
 
         Ternary<Pair<List<? extends Host>, Integer>, List<? extends Host>, Map<Host, Boolean>> hostsForMigration =
-            _mgr.listHostsForMigrationOfVM(getVirtualMachineId(), this.getStartIndex(), this.getPageSizeVal());
+            _mgr.listHostsForMigrationOfVM(getVirtualMachineId(), this.getStartIndex(), this.getPageSizeVal(), this.getKeyword());
         result = hostsForMigration.first();
         List<? extends Host> hostsWithCapacity = hostsForMigration.second();
         hostsRequiringStorageMotion = hostsForMigration.third();
diff --git a/api/src/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java b/api/src/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java
index 3391fdca1e3..9a5d3115b59 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java
@@ -209,7 +209,7 @@ public ApiCommandJobType getInstanceType() {
         } else {
             Pair<List<? extends Host>, Integer> result;
             Ternary<Pair<List<? extends Host>, Integer>, List<? extends Host>, Map<Host, Boolean>> hostsForMigration =
-                    _mgr.listHostsForMigrationOfVM(getVirtualMachineId(), this.getStartIndex(), this.getPageSizeVal());
+                _mgr.listHostsForMigrationOfVM(getVirtualMachineId(), this.getStartIndex(), this.getPageSizeVal(), null);
             result = hostsForMigration.first();
             List<? extends Host> hostsWithCapacity = hostsForMigration.second();
             List<HostResponse> hostResponses = new ArrayList<HostResponse>();
diff --git a/api/src/org/apache/cloudstack/api/command/admin/host/UpdateHostCmd.java b/api/src/org/apache/cloudstack/api/command/admin/host/UpdateHostCmd.java
index c6f6530dc50..aa0a690e2a9 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/host/UpdateHostCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/host/UpdateHostCmd.java
@@ -16,10 +16,10 @@
 // under the License.
 package org.apache.cloudstack.api.command.admin.host;
 
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
+import com.cloud.host.Host;
+import com.cloud.user.Account;
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.annotation.AnnotationService;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.ApiErrorCode;
@@ -28,9 +28,9 @@
 import org.apache.cloudstack.api.ServerApiException;
 import org.apache.cloudstack.api.response.GuestOSCategoryResponse;
 import org.apache.cloudstack.api.response.HostResponse;
+import org.apache.log4j.Logger;
 
-import com.cloud.host.Host;
-import com.cloud.user.Account;
+import java.util.List;
 
 @APICommand(name = "updateHost", description = "Updates a host.", responseObject = HostResponse.class,
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
@@ -62,6 +62,9 @@
     @Parameter(name = ApiConstants.URL, type = CommandType.STRING, description = "the new uri for the secondary storage: nfs://host/path")
     private String url;
 
+    @Parameter(name = ApiConstants.ANNOTATION, type = CommandType.STRING, description = "Add an annotation to this host", since = "4.11", authorized = {RoleType.Admin})
+    private String annotation;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -86,6 +89,10 @@ public String getUrl() {
         return url;
     }
 
+    public String getAnnotation() {
+        return annotation;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
@@ -109,6 +116,9 @@ public void execute() {
         Host result;
         try {
             result = _resourceService.updateHost(this);
+            if(getAnnotation() != null) {
+                annotationService.addAnnotation(getAnnotation(), AnnotationService.EntityType.HOST, result.getUuid());
+            }
             HostResponse hostResponse = _responseGenerator.createHostResponse(result);
             hostResponse.setResponseName(getCommandName());
             this.setResponseObject(hostResponse);
diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/CreateManagementNetworkIpRangeCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/CreateManagementNetworkIpRangeCmd.java
new file mode 100644
index 00000000000..f7957469cd1
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/network/CreateManagementNetworkIpRangeCmd.java
@@ -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.
+package org.apache.cloudstack.api.command.admin.network;
+
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.ApiArgValidator;
+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.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.PodResponse;
+
+import com.cloud.dc.Pod;
+import com.cloud.event.EventTypes;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.user.Account;
+
+@APICommand(name = CreateManagementNetworkIpRangeCmd.APINAME,
+        description = "Creates a Management network IP range.",
+        responseObject = PodResponse.class,
+        since = "4.11.0.0",
+        requestHasSensitiveInfo = false,
+        responseHasSensitiveInfo = false,
+        authorized = {RoleType.Admin})
+public class CreateManagementNetworkIpRangeCmd extends BaseAsyncCmd {
+    public static final Logger s_logger = Logger.getLogger(CreateManagementNetworkIpRangeCmd.class);
+
+    public static final String APINAME = "createManagementNetworkIpRange";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+    @Parameter(name = ApiConstants.POD_ID,
+            type = CommandType.UUID,
+            entityType = PodResponse.class,
+            required = true,
+            description = "UUID of POD, where the IP range belongs to.",
+            validations = {ApiArgValidator.PositiveNumber})
+    private Long podId;
+
+    @Parameter(name = ApiConstants.GATEWAY,
+            type = CommandType.STRING,
+            required = true,
+            description = "The gateway for the management network.",
+            validations = {ApiArgValidator.NotNullOrEmpty})
+    private String gateway;
+
+    @Parameter(name = ApiConstants.NETMASK,
+            type = CommandType.STRING,
+            required = true,
+            description = "The netmask for the management network.",
+            validations = {ApiArgValidator.NotNullOrEmpty})
+    private String netmask;
+
+    @Parameter(name = ApiConstants.START_IP,
+            type = CommandType.STRING,
+            required = true,
+            description = "The starting IP address.",
+            validations = {ApiArgValidator.NotNullOrEmpty})
+    private String startIp;
+
+    @Parameter(name = ApiConstants.END_IP,
+            type = CommandType.STRING,
+            description = "The ending IP address.")
+    private String endIp;
+
+    @Parameter(name = ApiConstants.FOR_SYSTEM_VMS,
+            type = CommandType.BOOLEAN,
+            description = "Specify if range is dedicated for CPVM and SSVM.")
+    private Boolean forSystemVms;
+
+    @Parameter(name = ApiConstants.VLAN,
+            type = CommandType.STRING,
+            description = "Optional. The vlan id the ip range sits on, default to Null when it is not specificed which means you network is not on any Vlan")
+    private String vlan;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getPodId() {
+        return podId;
+    }
+
+    public String getGateWay() {
+        return gateway;
+    }
+
+    public String getNetmask() {
+        return netmask;
+    }
+
+    public String getStartIp() {
+        return startIp;
+    }
+
+    public String getEndIp() {
+        return endIp;
+    }
+
+    public Boolean isForSystemVms() {
+        return forSystemVms == null ? Boolean.FALSE : forSystemVms;
+    }
+
+    public String getVlan() {
+        if (vlan == null || vlan.isEmpty()) {
+            vlan = "untagged";
+        }
+        return vlan;
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_MANAGEMENT_IP_RANGE_CREATE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "Creating management ip range from " + getStartIp() + " to " + getEndIp() + " and gateway=" + getGateWay() + ", netmask=" + getNetmask() + " of pod=" + getPodId();
+    }
+
+    @Override
+    public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException,
+            ResourceAllocationException {
+        Pod result = _configService.createPodIpRange(this);
+        if (result != null) {
+            PodResponse response = _responseGenerator.createPodResponse(result, false);
+            response.setResponseName(getCommandName());
+            this.setResponseObject(response);
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create Pod IP Range.");
+        }
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseAsyncCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return Account.ACCOUNT_ID_SYSTEM;
+    }
+
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkCmdByAdmin.java b/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkCmdByAdmin.java
index 6cf9e2308dc..6d346e9a4db 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkCmdByAdmin.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkCmdByAdmin.java
@@ -40,6 +40,9 @@
     @Parameter(name=ApiConstants.VLAN, type=CommandType.STRING, description="the ID or VID of the network")
     private String vlan;
 
+    @Parameter(name=ApiConstants.BYPASS_VLAN_OVERLAP_CHECK, type=CommandType.BOOLEAN, description="when true bypasses VLAN id/range overlap check during network creation for shared networks")
+    private Boolean bypassVlanOverlapCheck;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -48,6 +51,13 @@ public String getVlan() {
         return vlan;
     }
 
+    public Boolean getBypassVlanOverlapCheck() {
+        if (bypassVlanOverlapCheck != null) {
+            return bypassVlanOverlapCheck;
+        }
+        return false;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java
index a09c9797b68..7c8c46a9c9e 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java
@@ -112,8 +112,14 @@
                description = "true if network offering supports persistent networks; defaulted to false if not specified")
     private Boolean isPersistent;
 
+    @Parameter(name = ApiConstants.FOR_VPC,
+            type = CommandType.BOOLEAN,
+            description = "true if network offering is meant to be used for VPC, false otherwise.")
+    private Boolean forVpc;
+
     @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, since = "4.2.0", description = "Network offering details in key/value pairs."
-        + " Supported keys are internallbprovider/publiclbprovider with service provider as a value")
+        + " Supported keys are internallbprovider/publiclbprovider with service provider as a value, and"
+        + " promiscuousmode/macaddresschanges/forgedtransmits with true/false as value to accept/reject the security settings if available for a nic/portgroup")
     protected Map details;
 
     @Parameter(name = ApiConstants.EGRESS_DEFAULT_POLICY,
@@ -195,6 +201,10 @@ public Boolean getIsPersistent() {
         return isPersistent == null ? false : isPersistent;
     }
 
+    public Boolean getForVpc() {
+        return forVpc;
+    }
+
     public Boolean getEgressDefaultPolicy() {
         if (egressDefaultPolicy == null) {
             return true;
@@ -273,10 +283,23 @@ public Integer getMaxconnections() {
         }
 
         Collection paramsCollection = details.values();
-        Map<String, String> params = (Map<String, String>)(paramsCollection.toArray())[0];
+        Object objlist[]= paramsCollection.toArray();
+        Map<String, String> params = (Map<String, String>)(objlist[0]);
+        for(int i=1; i< objlist.length; i++)
+        {
+            params.putAll((Map<String, String>)(objlist[i]));
+        }
+
         return params;
     }
 
+    public String getServicePackageId() {
+        Map<String, String> data = getDetails();
+        if (data == null)
+            return null;
+        return data.get(NetworkOffering.Detail.servicepackageuuid+ "");
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/DeleteManagementNetworkIpRangeCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/DeleteManagementNetworkIpRangeCmd.java
new file mode 100644
index 00000000000..d6481846f43
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/network/DeleteManagementNetworkIpRangeCmd.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 org.apache.cloudstack.api.command.admin.network;
+
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.ApiArgValidator;
+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.Parameter;
+import org.apache.cloudstack.api.response.PodResponse;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.SuccessResponse;
+
+import com.cloud.event.EventTypes;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.user.Account;
+
+@APICommand(name = DeleteManagementNetworkIpRangeCmd.APINAME,
+        description = "Deletes a management network IP range. This action is only allowed when no IPs in this range are allocated.",
+        responseObject = SuccessResponse.class,
+        since = "4.11.0.0",
+        requestHasSensitiveInfo = false,
+        responseHasSensitiveInfo = false,
+        authorized = {RoleType.Admin})
+public class DeleteManagementNetworkIpRangeCmd extends BaseAsyncCmd {
+    public static final Logger s_logger = Logger.getLogger(DeleteManagementNetworkIpRangeCmd.class);
+
+    public static final String APINAME = "deleteManagementNetworkIpRange";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.POD_ID,
+            type = CommandType.UUID,
+            entityType = PodResponse.class,
+            required = true,
+            description = "UUID of POD, where the IP range belongs to.",
+            validations = ApiArgValidator.PositiveNumber)
+    private Long podId;
+
+    @Parameter(name = ApiConstants.START_IP,
+            type = CommandType.STRING,
+            required = true,
+            description = "The starting IP address.",
+            validations = ApiArgValidator.NotNullOrEmpty)
+    private String startIp;
+
+    @Parameter(name = ApiConstants.END_IP,
+            type = CommandType.STRING,
+            required = true,
+            description = "The ending IP address.",
+            validations = ApiArgValidator.NotNullOrEmpty)
+    private String endIp;
+
+    @Parameter(name = ApiConstants.VLAN,
+            type = CommandType.STRING,
+            required = true,
+            description = "The vlan id the ip range sits on")
+    private String vlan;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getPodId() {
+        return podId;
+    }
+
+    public String getStartIp() {
+        return startIp;
+    }
+
+    public String getEndIp() {
+        return endIp;
+    }
+
+    public String getVlan() {
+        return vlan;
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_MANAGEMENT_IP_RANGE_DELETE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "Deleting management ip range from " + getStartIp() + " to " + getEndIp() + " of Pod: " + getPodId();
+    }
+
+    @Override
+    public void execute() {
+        try {
+            _configService.deletePodIpRange(this);
+            SuccessResponse response = new SuccessResponse(getCommandName());
+            this.setResponseObject(response);
+        } catch (ResourceUnavailableException ex) {
+            s_logger.warn("Exception: ", ex);
+            throw new ServerApiException(ApiErrorCode.RESOURCE_UNAVAILABLE_ERROR, ex.getMessage());
+        } catch (ConcurrentOperationException ex) {
+            s_logger.warn("Exception: ", ex);
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, ex.getMessage());
+        } catch (Exception e) {
+            s_logger.warn("Failed to delete management ip range from " + getStartIp() + " to " + getEndIp() + " of Pod: " + getPodId(), e);
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage());
+        }
+    }
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseAsyncCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return Account.ACCOUNT_ID_SYSTEM;
+    }
+
+}
\ No newline at end of file
diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/MigrateNetworkCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/MigrateNetworkCmd.java
new file mode 100644
index 00000000000..298d9b043e8
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/network/MigrateNetworkCmd.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.network;
+
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.acl.SecurityChecker.AccessType;
+import org.apache.cloudstack.api.ACL;
+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.ResponseObject.ResponseView;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.NetworkOfferingResponse;
+import org.apache.cloudstack.api.response.NetworkResponse;
+import org.apache.cloudstack.context.CallContext;
+
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.network.Network;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.user.Account;
+import com.cloud.user.User;
+
+@APICommand(name = MigrateNetworkCmd.APINAME, description = "moves a network to another physical network",
+            responseObject = NetworkResponse.class,
+            responseView = ResponseView.Restricted,
+            entityType = {Network.class},
+            requestHasSensitiveInfo = false,
+            responseHasSensitiveInfo = false,
+            since = "4.11.0",
+            authorized = {RoleType.Admin})
+public class MigrateNetworkCmd extends BaseAsyncCmd {
+    public static final Logger s_logger = Logger.getLogger(MigrateNetworkCmd.class.getName());
+
+    public static final String APINAME = "migrateNetwork";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+    @ACL(accessType = AccessType.OperateEntry)
+    @Parameter(name=ApiConstants.NETWORK_ID, type=CommandType.UUID, entityType = NetworkResponse.class,
+            required=true, description="the ID of the network")
+    protected Long id;
+
+    @Parameter(name = ApiConstants.NETWORK_OFFERING_ID, type = CommandType.UUID, entityType = NetworkOfferingResponse.class, description = "network offering ID")
+    private Long networkOfferingId;
+
+    @Parameter(name = ApiConstants.RESUME, type = CommandType.BOOLEAN, description = "true if previous network migration cmd failed")
+    private Boolean resume;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+
+    public Long getNetworkOfferingId() {
+        return networkOfferingId;
+    }
+
+    public Boolean getResume() {
+        return resume != null ? resume : false;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        Network network = _networkService.getNetwork(id);
+        if (network == null) {
+            throw new InvalidParameterValueException("Networkd id=" + id + " doesn't exist");
+        } else {
+            return _networkService.getNetwork(id).getAccountId();
+        }
+    }
+
+    @Override
+    public void execute() {
+        User callerUser = _accountService.getActiveUser(CallContext.current().getCallingUserId());
+        Account callerAccount = _accountService.getActiveAccountById(callerUser.getAccountId());
+        Network network = _networkService.getNetwork(id);
+        if (network == null) {
+            throw new InvalidParameterValueException("Couldn't find network by id");
+        }
+
+        Network result =
+            _networkService.migrateGuestNetwork(getId(), getNetworkOfferingId(), callerAccount, callerUser, getResume());
+
+        if (result != null) {
+            NetworkResponse response = _responseGenerator.createNetworkResponse(ResponseView.Restricted, result);
+            response.setResponseName(getCommandName());
+            setResponseObject(response);
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update network");
+        }
+    }
+
+    @Override
+    public String getEventDescription() {
+        StringBuilder eventMsg = new StringBuilder("Migrating network: " + getId());
+        if (getNetworkOfferingId() != null) {
+            Network network = _networkService.getNetwork(getId());
+            if (network == null) {
+                throw new InvalidParameterValueException("Network id=" + id + " doesn't exist");
+            }
+            if (network.getNetworkOfferingId() != getNetworkOfferingId()) {
+                NetworkOffering oldOff = _entityMgr.findById(NetworkOffering.class, network.getNetworkOfferingId());
+                NetworkOffering newOff = _entityMgr.findById(NetworkOffering.class, getNetworkOfferingId());
+                if (newOff == null) {
+                    throw new InvalidParameterValueException("Network offering id supplied is invalid");
+                }
+
+                eventMsg.append(". Original network offering id: " + oldOff.getUuid() + ", new network offering id: " + newOff.getUuid());
+            }
+        }
+
+        return eventMsg.toString();
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_NETWORK_MIGRATE;
+    }
+
+    @Override
+    public String getSyncObjType() {
+        return BaseAsyncCmd.networkSyncObject;
+    }
+
+    @Override
+    public Long getSyncObjId() {
+        return id;
+    }
+
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/MigrateVPCCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/MigrateVPCCmd.java
new file mode 100644
index 00000000000..a5611c67aa4
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/network/MigrateVPCCmd.java
@@ -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.
+package org.apache.cloudstack.api.command.admin.network;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.acl.SecurityChecker;
+import org.apache.cloudstack.api.ACL;
+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.ResponseObject;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.VpcOfferingResponse;
+import org.apache.cloudstack.api.response.VpcResponse;
+import org.apache.cloudstack.context.CallContext;
+
+import com.cloud.event.EventTypes;
+import com.cloud.network.vpc.Vpc;
+import com.cloud.user.Account;
+import com.cloud.user.User;
+
+@APICommand(name = MigrateVPCCmd.APINAME,
+            description = "moves a vpc to another physical network",
+            responseObject = VpcResponse.class,
+            responseView = ResponseObject.ResponseView.Restricted,
+            entityType = {Vpc.class},
+            requestHasSensitiveInfo = false,
+            responseHasSensitiveInfo = false,
+            since = "4.11.0",
+            authorized = {RoleType.Admin})
+public class MigrateVPCCmd extends BaseAsyncCmd {
+    public static final Logger s_logger = Logger.getLogger(MigrateVPCCmd.class.getName());
+
+    public static final String APINAME = "migrateVPC";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+    @ACL(accessType = SecurityChecker.AccessType.OperateEntry)
+    @Parameter(name= ApiConstants.VPC_ID, type=CommandType.UUID, entityType = VpcResponse.class,
+            required=true, description = "the ID of the vpc")
+    protected Long id;
+
+    @Parameter(name = ApiConstants.VPC_OFF_ID, type = CommandType.UUID, entityType = VpcOfferingResponse.class, required=true, description = "vpc offering ID")
+    private Long vpcOfferingId;
+
+    @Parameter(name = ApiConstants.TIER_NETWORK_OFFERINGS, type = CommandType.MAP, description = "network offering ids for each network in the vpc. Example: tierNetworkOfferings[0].networkId=networkId1&tierNetworkOfferings[0].networkOfferingId=newNetworkofferingId1&tierNetworkOfferings[1].networkId=networkId2&tierNetworkOfferings[1].networkOfferingId=newNetworkofferingId2")
+    private Map<Integer, HashMap<String, String>> tierNetworkOfferings;
+
+    @Parameter(name = ApiConstants.RESUME, type = CommandType.BOOLEAN, description = "true if previous network migration cmd failed")
+    private Boolean resume;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+
+    public Long getVpcOfferingId() {
+        return vpcOfferingId;
+    }
+
+    public Boolean getResume() {
+        return resume == null ? false : resume;
+    }
+
+    public Map<String, String> getTierNetworkOfferings() {
+        HashMap<String, String> flatMap = new HashMap<>();
+
+        if (tierNetworkOfferings == null) {
+            return flatMap;
+        }
+
+        for (HashMap<String, String> map : tierNetworkOfferings.values()) {
+            flatMap.put(map.get("networkid"), map.get("networkofferingid"));
+        }
+
+        return flatMap;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public void execute() {
+        User callerUser = _accountService.getActiveUser(CallContext.current().getCallingUserId());
+        Account callerAccount = _accountService.getActiveAccountById(callerUser.getAccountId());
+
+        Vpc result =
+                _networkService.migrateVpcNetwork(getId(), getVpcOfferingId(), getTierNetworkOfferings(), callerAccount, callerUser, getResume());
+
+        if (result != null) {
+            VpcResponse response = _responseGenerator.createVpcResponse(ResponseObject.ResponseView.Restricted, result);
+            response.setResponseName(getCommandName());
+            setResponseObject(response);
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to migrate vpc");
+        }
+    }
+
+    @Override
+    public String getEventDescription() { return "Migrating vpc: " + getId() + " to new vpc offering (" + vpcOfferingId + ")";  }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_NETWORK_MIGRATE;
+    }
+
+    @Override
+    public String getSyncObjType() {
+        return BaseAsyncCmd.networkSyncObject;
+    }
+
+    @Override
+    public Long getSyncObjId() {
+        return id;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        return CallContext.current().getCallingAccount().getId();
+    }
+
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/UpdateNetworkCmdByAdmin.java b/api/src/org/apache/cloudstack/api/command/admin/network/UpdateNetworkCmdByAdmin.java
index 269f43ec959..388348c592c 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/network/UpdateNetworkCmdByAdmin.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/network/UpdateNetworkCmdByAdmin.java
@@ -49,7 +49,7 @@ public void execute() throws InsufficientCapacityException, ConcurrentOperationE
         }
 
         Network result = _networkService.updateGuestNetwork(getId(), getNetworkName(), getDisplayText(), callerAccount,
-                callerUser, getNetworkDomain(), getNetworkOfferingId(), getChangeCidr(), getGuestVmCidr(), getDisplayNetwork(), getCustomId());
+                callerUser, getNetworkDomain(), getNetworkOfferingId(), getChangeCidr(), getGuestVmCidr(), getDisplayNetwork(), getCustomId(), getUpdateInSequence(),getForced());
 
 
         if (result != null) {
diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/UpdateNetworkOfferingCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/UpdateNetworkOfferingCmd.java
index 411da4fd36b..5c58530fe1f 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/network/UpdateNetworkOfferingCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/network/UpdateNetworkOfferingCmd.java
@@ -69,6 +69,9 @@
                description = "maximum number of concurrent connections supported by the network offering")
     private Integer maxConnections;
 
+    @Parameter(name = ApiConstants.TAGS, type = CommandType.STRING, description = "the tags for the network offering.", length = 4096)
+    private String tags;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -105,6 +108,10 @@ public Boolean getKeepAliveEnabled() {
         return keepAliveEnabled;
     }
 
+    public String getTags() {
+        return tags;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/ChangeOutOfBandManagementPasswordCmd.java b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/ChangeOutOfBandManagementPasswordCmd.java
index ea2e3cdb76b..0499a6e4577 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/ChangeOutOfBandManagementPasswordCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/ChangeOutOfBandManagementPasswordCmd.java
@@ -74,7 +74,7 @@ public void execute() throws ResourceUnavailableException, InsufficientCapacityE
         CallContext.current().setEventDetails("Host Id: " + host.getId() + " Password: " + getPassword().charAt(0) + "****");
         CallContext.current().putContextParameter(Host.class, host.getUuid());
 
-        final OutOfBandManagementResponse response = outOfBandManagementService.changeOutOfBandManagementPassword(host, getPassword());
+        final OutOfBandManagementResponse response = outOfBandManagementService.changePassword(host, getPassword());
         response.setResponseName(getCommandName());
         setResponseObject(response);
     }
diff --git a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/ConfigureOutOfBandManagementCmd.java b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/ConfigureOutOfBandManagementCmd.java
index db224108df0..d9c6c9f439e 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/ConfigureOutOfBandManagementCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/ConfigureOutOfBandManagementCmd.java
@@ -83,7 +83,7 @@ public void execute() throws ResourceUnavailableException, InsufficientCapacityE
             throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find host by ID: " + getHostId());
         }
         CallContext.current().putContextParameter(Host.class, host.getUuid());
-        final OutOfBandManagementResponse response = outOfBandManagementService.configureOutOfBandManagement(host, getHostPMOptions());
+        final OutOfBandManagementResponse response = outOfBandManagementService.configure(host, getHostPMOptions());
         response.setId(host.getUuid());
         response.setResponseName(getCommandName());
         setResponseObject(response);
diff --git a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/IssueOutOfBandManagementPowerActionCmd.java b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/IssueOutOfBandManagementPowerActionCmd.java
index 8d6bdd350d0..7593a3cbc52 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/IssueOutOfBandManagementPowerActionCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/IssueOutOfBandManagementPowerActionCmd.java
@@ -80,7 +80,7 @@ public void execute() throws ResourceUnavailableException, InsufficientCapacityE
         CallContext.current().setEventDetails("Host Id: " + host.getId() + " Action: " + powerOperation.toString());
         CallContext.current().putContextParameter(Host.class, host.getUuid());
 
-        final OutOfBandManagementResponse response = outOfBandManagementService.executeOutOfBandManagementPowerOperation(host, powerOperation, getActionTimeout());
+        final OutOfBandManagementResponse response = outOfBandManagementService.executePowerOperation(host, powerOperation, getActionTimeout());
         response.setResponseName(getCommandName());
         setResponseObject(response);
     }
diff --git a/api/src/org/apache/cloudstack/api/command/admin/resource/ListCapacityCmd.java b/api/src/org/apache/cloudstack/api/command/admin/resource/ListCapacityCmd.java
index d79ff07fbcc..76ca3a79b11 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/resource/ListCapacityCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/resource/ListCapacityCmd.java
@@ -17,6 +17,8 @@
 package org.apache.cloudstack.api.command.admin.resource;
 
 import java.text.DecimalFormat;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 import org.apache.log4j.Logger;
@@ -65,7 +67,8 @@
 
     @Parameter(name = ApiConstants.TYPE, type = CommandType.INTEGER, description = "lists capacity by type" + "* CAPACITY_TYPE_MEMORY = 0" + "* CAPACITY_TYPE_CPU = 1"
         + "* CAPACITY_TYPE_STORAGE = 2" + "* CAPACITY_TYPE_STORAGE_ALLOCATED = 3" + "* CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP = 4" + "* CAPACITY_TYPE_PRIVATE_IP = 5"
-        + "* CAPACITY_TYPE_SECONDARY_STORAGE = 6" + "* CAPACITY_TYPE_VLAN = 7" + "* CAPACITY_TYPE_DIRECT_ATTACHED_PUBLIC_IP = 8" + "* CAPACITY_TYPE_LOCAL_STORAGE = 9.")
+        + "* CAPACITY_TYPE_SECONDARY_STORAGE = 6" + "* CAPACITY_TYPE_VLAN = 7" + "* CAPACITY_TYPE_DIRECT_ATTACHED_PUBLIC_IP = 8" + "* CAPACITY_TYPE_LOCAL_STORAGE = 9"
+        + "* CAPACITY_TYPE_GPU = 19" + "* CAPACITY_TYPE_CPU_CORE = 90.")
     private Integer type;
 
     @Parameter(name = ApiConstants.SORT_BY, type = CommandType.STRING, since = "3.0.0", description = "Sort the results. Available values: Usage")
@@ -127,6 +130,17 @@ public void execute() {
 
         ListResponse<CapacityResponse> response = new ListResponse<CapacityResponse>();
         List<CapacityResponse> capacityResponses = _responseGenerator.createCapacityResponse(result, s_percentFormat);
+        Collections.sort(capacityResponses, new Comparator<CapacityResponse>() {
+            public int compare(CapacityResponse resp1, CapacityResponse resp2) {
+                int res = resp1.getZoneName().compareTo(resp2.getZoneName());
+                if (res != 0) {
+                    return res;
+                } else {
+                    return resp1.getCapacityType().compareTo(resp2.getCapacityType());
+                }
+            }
+        });
+
         response.setResponses(capacityResponses);
         response.setResponseName(getCommandName());
         this.setResponseObject(response);
diff --git a/api/src/org/apache/cloudstack/api/command/admin/template/CopyTemplateCmdByAdmin.java b/api/src/org/apache/cloudstack/api/command/admin/template/CopyTemplateCmdByAdmin.java
index 11c00e3a4b7..e0c798c7849 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/template/CopyTemplateCmdByAdmin.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/template/CopyTemplateCmdByAdmin.java
@@ -40,11 +40,20 @@
     @Override
     public void execute() throws ResourceAllocationException{
         try {
+            if (destZoneId == null && (destZoneIds == null || destZoneIds.size() == 0))
+                throw new ServerApiException(ApiErrorCode.PARAM_ERROR,
+                        "Either destzoneid or destzoneids parameters have to be specified.");
+
+            if (destZoneId != null && destZoneIds != null && destZoneIds.size() != 0)
+                throw new ServerApiException(ApiErrorCode.PARAM_ERROR,
+                        "Both destzoneid and destzoneids cannot be specified at the same time.");
+
             CallContext.current().setEventDetails(getEventDescription());
             VirtualMachineTemplate template = _templateService.copyTemplate(this);
 
             if (template != null){
-                List<TemplateResponse> listResponse = _responseGenerator.createTemplateResponses(ResponseView.Full, template, getDestinationZoneId(), false);
+                List<TemplateResponse> listResponse = _responseGenerator.createTemplateResponses(ResponseView.Full, template,
+                        getDestinationZoneIds(), false);
                 TemplateResponse response = new TemplateResponse();
                 if (listResponse != null && !listResponse.isEmpty()) {
                     response = listResponse.get(0);
diff --git a/api/src/org/apache/cloudstack/api/command/admin/template/RegisterTemplateCmdByAdmin.java b/api/src/org/apache/cloudstack/api/command/admin/template/RegisterTemplateCmdByAdmin.java
index 68d53f9df6f..ba4772b6697 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/template/RegisterTemplateCmdByAdmin.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/template/RegisterTemplateCmdByAdmin.java
@@ -40,10 +40,13 @@
     @Override
     public void execute() throws ResourceAllocationException{
         try {
+            validateParameters();
+
             VirtualMachineTemplate template = _templateService.registerTemplate(this);
             if (template != null){
                 ListResponse<TemplateResponse> response = new ListResponse<TemplateResponse>();
-                List<TemplateResponse> templateResponses = _responseGenerator.createTemplateResponses(ResponseView.Full, template, zoneId, false);
+                List<TemplateResponse> templateResponses = _responseGenerator.createTemplateResponses(ResponseView.Full, template,
+                        zoneIds, false);
                 response.setResponses(templateResponses);
                 response.setResponseName(getCommandName());
                 setResponseObject(response);
diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java b/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java
index 4cceb3b5f9f..90bc4f2153a 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java
@@ -19,6 +19,8 @@
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import org.apache.log4j.Logger;
 
@@ -31,6 +33,7 @@
 import org.apache.cloudstack.api.response.ListResponse;
 import org.apache.cloudstack.api.response.ProjectResponse;
 import org.apache.cloudstack.api.response.UsageRecordResponse;
+import org.apache.cloudstack.api.response.ResourceTagResponse;
 import org.apache.cloudstack.usage.Usage;
 
 import com.cloud.utils.Pair;
@@ -76,6 +79,9 @@
     @Parameter(name = ApiConstants.USAGE_ID, type = CommandType.STRING, description = "List usage records for the specified usage UUID. Can be used only together with TYPE parameter.")
     private String usageId;
 
+    @Parameter(name = ApiConstants.INCLUDE_TAGS, type = CommandType.BOOLEAN, description = "Flag to enable display of Tags for a resource")
+    private Boolean includeTags;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -115,6 +121,10 @@ public void setAccountName(String accountName) {
         this.accountName = accountName;
     }
 
+    public Boolean getIncludeTags() {
+        return includeTags;
+    }
+
     public void setDomainId(Long domainId) {
         this.domainId = domainId;
     }
@@ -150,12 +160,18 @@ public void execute() {
         Pair<List<? extends Usage>, Integer> usageRecords = _usageService.getUsageRecords(this);
         ListResponse<UsageRecordResponse> response = new ListResponse<UsageRecordResponse>();
         List<UsageRecordResponse> usageResponses = new ArrayList<UsageRecordResponse>();
+        Map<String, Set<ResourceTagResponse>> resourceTagResponseMap = null;
         if (usageRecords != null) {
+            //read the resource tags details for all the resources in usage data and store in Map
+            if(null != includeTags && includeTags) {
+                resourceTagResponseMap =  _responseGenerator.getUsageResourceTags();
+            }
             for (Usage usageRecord : usageRecords.first()) {
-                UsageRecordResponse usageResponse = _responseGenerator.createUsageResponse(usageRecord);
+                UsageRecordResponse usageResponse = _responseGenerator.createUsageResponse(usageRecord, resourceTagResponseMap);
                 usageResponse.setObjectName("usagerecord");
                 usageResponses.add(usageResponse);
             }
+
             response.setResponses(usageResponses, usageRecords.second());
         }
 
diff --git a/api/src/org/apache/cloudstack/api/command/admin/user/GetUserKeysCmd.java b/api/src/org/apache/cloudstack/api/command/admin/user/GetUserKeysCmd.java
new file mode 100644
index 00000000000..f93c6e11728
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/user/GetUserKeysCmd.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.command.admin.user;
+
+
+import com.cloud.user.Account;
+import com.cloud.user.User;
+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.RegisterResponse;
+import org.apache.cloudstack.api.response.UserResponse;
+
+import java.util.Map;
+import java.util.logging.Logger;
+
+@APICommand(name = GetUserKeysCmd.APINAME,
+            description = "This command allows the user to query the seceret and API keys for the account",
+            responseObject = RegisterResponse.class,
+            requestHasSensitiveInfo = false,
+            responseHasSensitiveInfo = true,
+            authorized = {RoleType.User, RoleType.Admin, RoleType.DomainAdmin, RoleType.ResourceAdmin},
+            since = "4.10.0")
+
+public class GetUserKeysCmd extends BaseCmd{
+
+    @Parameter(name= ApiConstants.ID, type = CommandType.UUID, entityType = UserResponse.class, required = true, description = "ID of the user whose keys are required")
+    private Long id;
+
+    public static final Logger s_logger = Logger.getLogger(RegisterCmd.class.getName());
+    public static final String APINAME = "getUserKeys";
+
+    public Long getID(){
+        return id;
+    }
+
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    public long getEntityOwnerId(){
+        User user = _entityMgr.findById(User.class, getID());
+        if(user != null){
+            return user.getAccountId();
+        }
+        else return Account.ACCOUNT_ID_SYSTEM;
+    }
+    public void execute(){
+        Map<String, String> keys = _accountService.getKeys(this);
+        RegisterResponse response = new RegisterResponse();
+        if(keys != null){
+            response.setApiKey(keys.get("apikey"));
+            response.setSecretKey(keys.get("secretkey"));
+        }
+
+        response.setObjectName("userkeys");
+        response.setResponseName(getCommandName());
+        this.setResponseObject(response);
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/user/MoveUserCmd.java b/api/src/org/apache/cloudstack/api/command/admin/user/MoveUserCmd.java
new file mode 100644
index 00000000000..b32aa2f1326
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/admin/user/MoveUserCmd.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 org.apache.cloudstack.api.command.admin.user;
+
+import com.cloud.user.Account;
+import com.cloud.user.User;
+import com.google.common.base.Preconditions;
+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.AccountResponse;
+import org.apache.cloudstack.api.response.SuccessResponse;
+import org.apache.cloudstack.api.response.UserResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.region.RegionService;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.log4j.Logger;
+
+import javax.inject.Inject;
+
+@APICommand(name = "moveUser",
+        description = "Moves a user to another account",
+        responseObject = SuccessResponse.class,
+        requestHasSensitiveInfo = false,
+        responseHasSensitiveInfo = false,
+        since = "4.11",
+        authorized = {RoleType.Admin})
+public class MoveUserCmd extends BaseCmd {
+    public static final Logger s_logger = Logger.getLogger(UpdateUserCmd.class.getName());
+
+    public static final String APINAME = "moveUser";
+
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+    @Parameter(name = ApiConstants.ID,
+            type = CommandType.UUID,
+            entityType = UserResponse.class,
+            required = true,
+            description = "id of the user to be deleted")
+    private Long id;
+
+    @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.")
+    private String accountName;
+
+    @Parameter(name = ApiConstants.ACCOUNT_ID,
+            type = CommandType.UUID,
+            entityType = AccountResponse.class,
+            description = "Creates the user under the specified domain. Has to be accompanied with the account parameter")
+    private Long accountId;
+
+    @Inject
+    RegionService _regionService;
+
+    /////////////////////////////////////////////////////
+    /////////////////// Accessors ///////////////////////
+    /////////////////////////////////////////////////////
+
+    public Long getId() {
+        return id;
+    }
+
+    public String getAccountName() {
+        return accountName;
+    }
+
+    public Long getAccountId() {
+        return accountId;
+    }
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        User user = _entityMgr.findById(User.class, getId());
+        if (user != null) {
+            return user.getAccountId();
+        }
+
+        return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked
+    }
+
+    @Override
+    public void execute() {
+        Preconditions.checkNotNull(getId(),"I have to have an user to move!");
+        Preconditions.checkState(ObjectUtils.anyNotNull(getAccountId(),getAccountName()),"provide either an account name or an account id!");
+
+        CallContext.current().setEventDetails("UserId: " + getId());
+        boolean result =
+                _regionService.moveUser(this);
+        if (result) {
+            SuccessResponse response = new SuccessResponse(getCommandName());
+            this.setResponseObject(response);
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to move the user to a new account");
+        }
+    }
+
+}
diff --git a/api/src/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java b/api/src/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java
index a2da7dbc8da..fa66fdde1a7 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java
@@ -112,6 +112,9 @@
     @Parameter(name = ApiConstants.IP6_CIDR, type = CommandType.STRING, description = "the CIDR of IPv6 network, must be at least /64")
     private String ip6Cidr;
 
+    @Parameter(name = ApiConstants.FOR_SYSTEM_VMS, type = CommandType.BOOLEAN, description = "true if IP range is set to system vms, false if not")
+    private Boolean forSystemVms;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -136,6 +139,10 @@ public String getGateway() {
         return gateway;
     }
 
+    public Boolean isForSystemVms() {
+        return forSystemVms == null ? Boolean.FALSE : forSystemVms;
+    }
+
     public String getNetmask() {
         return netmask;
     }
diff --git a/api/src/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java b/api/src/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java
index 435b7f18484..da5f68860bc 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java
@@ -29,9 +29,11 @@
 import org.apache.cloudstack.api.ServerApiException;
 import org.apache.cloudstack.api.response.DomainResponse;
 import org.apache.cloudstack.api.response.NetworkResponse;
+import org.apache.cloudstack.api.response.ProjectResponse;
 import org.apache.cloudstack.api.response.SecurityGroupResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
 
+import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.user.Account;
 import com.cloud.uservm.UserVm;
 import com.cloud.vm.VirtualMachine;
@@ -58,12 +60,15 @@
                description = "id of the VM to be moved")
     private Long virtualMachineId;
 
-    @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, required = true, description = "account name of the new VM owner.")
+    @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "account name of the new VM owner.")
     private String accountName;
 
-    @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, required = true, description = "domain id of the new VM owner.")
+    @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "domain id of the new VM owner.")
     private Long domainId;
 
+    @Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class, description = "an optional project for the new VM owner.")
+    private Long projectId;
+
     //Network information
     @Parameter(name = ApiConstants.NETWORK_IDS,
                type = CommandType.LIST,
@@ -98,6 +103,10 @@ public Long getDomainId() {
         return domainId;
     }
 
+    public Long getProjectId() {
+        return projectId;
+    }
+
     public List<Long> getNetworkIds() {
         return networkIds;
     }
@@ -125,6 +134,9 @@ public void execute() {
             UserVmResponse response = _responseGenerator.createUserVmResponse(ResponseView.Full, "virtualmachine", userVm).get(0);
             response.setResponseName(getCommandName());
             setResponseObject(response);
+        } catch (InvalidParameterValueException e){
+            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());
diff --git a/api/src/org/apache/cloudstack/api/command/admin/volume/ListVolumesCmdByAdmin.java b/api/src/org/apache/cloudstack/api/command/admin/volume/ListVolumesCmdByAdmin.java
index 5fe5bfea485..add22713931 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/volume/ListVolumesCmdByAdmin.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/volume/ListVolumesCmdByAdmin.java
@@ -16,50 +16,15 @@
 // under the License.
 package org.apache.cloudstack.api.command.admin.volume;
 
-import org.apache.log4j.Logger;
-
-import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.APICommand;
-import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ResponseObject.ResponseView;
 import org.apache.cloudstack.api.command.user.volume.ListVolumesCmd;
-import org.apache.cloudstack.api.response.PodResponse;
-import org.apache.cloudstack.api.response.StoragePoolResponse;
 import org.apache.cloudstack.api.response.VolumeResponse;
 
 import com.cloud.storage.Volume;
 
-
-@APICommand(name = "listVolumes", description = "Lists all volumes.", responseObject = VolumeResponse.class, responseView = ResponseView.Full, entityType = {Volume.class},
-        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+@APICommand(name = "listVolumes", description = "Lists all volumes.", responseObject = VolumeResponse.class, responseView = ResponseView.Full, entityType = {
+        Volume.class}, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
 public class ListVolumesCmdByAdmin extends ListVolumesCmd {
-    public static final Logger s_logger = Logger.getLogger(ListVolumesCmdByAdmin.class.getName());
-
-    @Parameter(name=ApiConstants.POD_ID, type=CommandType.UUID, entityType=PodResponse.class,
-            description="the pod id the disk volume belongs to")
-    private Long podId;
-
-
-    @Parameter(name=ApiConstants.STORAGE_ID, type=CommandType.UUID, entityType=StoragePoolResponse.class,
-            description="the ID of the storage pool, available to ROOT admin only", since="4.3", authorized = { RoleType.Admin })
-    private Long storageId;
-
-
-    /////////////////////////////////////////////////////
-    /////////////////// Accessors ///////////////////////
-    /////////////////////////////////////////////////////
-
-
-    @Override
-    public Long getPodId() {
-        return podId;
-    }
-
-
-    @Override
-    public Long getStorageId() {
-        return storageId;
-    }
 
 }
diff --git a/api/src/org/apache/cloudstack/api/command/user/address/AssociateIPAddrCmd.java b/api/src/org/apache/cloudstack/api/command/user/address/AssociateIPAddrCmd.java
index 75bd9d21d1b..15072ca9a4f 100644
--- a/api/src/org/apache/cloudstack/api/command/user/address/AssociateIPAddrCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/address/AssociateIPAddrCmd.java
@@ -57,7 +57,7 @@
 import com.cloud.projects.Project;
 import com.cloud.user.Account;
 
-@APICommand(name = "associateIpAddress", description = "Acquires and associates a public IP to an account.", responseObject = IPAddressResponse.class, responseView = ResponseView.Restricted,
+@APICommand(name = "associateIpAddress", description = "Acquires and associates a public IP to an account. Either of the parameters are required, i.e. either zoneId, or networkId, or vpcId  ", responseObject = IPAddressResponse.class, responseView = ResponseView.Restricted,
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
 public class AssociateIPAddrCmd extends BaseAsyncCreateCmd {
     public static final Logger s_logger = Logger.getLogger(AssociateIPAddrCmd.class.getName());
diff --git a/api/src/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java b/api/src/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java
index a4934fa1dd9..b98c30897a0 100644
--- a/api/src/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java
@@ -65,6 +65,9 @@
     @Parameter(name = ApiConstants.TYPE, type = CommandType.STRING, description = "the event type (see event types)")
     private String type;
 
+    @Parameter(name = ApiConstants.START_ID, type = CommandType.UUID, entityType = EventResponse.class, description = "the parent/start ID of the event, when provided this will list all the events with the start/parent ID including the parent event")
+    private Long startId;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -97,6 +100,10 @@ public String getType() {
         return type;
     }
 
+    public Long getStartId() {
+        return startId;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java
index 0303445af77..9299c3ddd2c 100644
--- a/api/src/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java
@@ -77,6 +77,9 @@
     @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the cidr list to forward traffic from")
     private List<String> cidrlist;
 
+    @Parameter(name = ApiConstants.DEST_CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the cidr list to forward traffic to")
+    private List<String> destCidrList;
+
     @Parameter(name = ApiConstants.ICMP_TYPE, type = CommandType.INTEGER, description = "type of the icmp message being sent")
     private Integer icmpType;
 
@@ -113,6 +116,11 @@ public String getProtocol() {
         }
     }
 
+    @Override
+    public List<String> getDestinationCidrList(){
+        return destCidrList;
+    }
+
     public Long getVpcId() {
         Network network = _networkService.getNetwork(getNetworkId());
         if (network == null) {
@@ -136,6 +144,10 @@ public void setSourceCidrList(List<String> cidrs) {
         cidrlist = cidrs;
     }
 
+    public void setDestCidrList(List<String> cidrs){
+        destCidrList = cidrs;
+    }
+
     @Override
     public void execute() throws ResourceUnavailableException {
         CallContext callerContext = CallContext.current();
@@ -234,10 +246,10 @@ public void create() {
             String guestCidr = _networkService.getNetwork(getNetworkId()).getCidr();
 
             for (String cidr : getSourceCidrList()) {
-                if (!NetUtils.isValidCIDR(cidr)) {
+                if (!NetUtils.isValidIp4Cidr(cidr) && !NetUtils.isValidIp6Cidr(cidr)) {
                     throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Source cidrs formatting error " + cidr);
                 }
-                if (cidr.equals(NetUtils.ALL_CIDRS)) {
+                if (cidr.equals(NetUtils.ALL_IP4_CIDRS)) {
                     continue;
                 }
                 if (!NetUtils.isNetworkAWithinNetworkB(cidr, guestCidr)) {
@@ -245,6 +257,16 @@ public void create() {
                 }
             }
         }
+
+        //Destination CIDR formatting check. Since it's optional param, no need to set a default as in the case of source.
+        if(destCidrList != null){
+            for(String cidr : destCidrList){
+                if(!NetUtils.isValidIp4Cidr(cidr) && !NetUtils.isValidIp6Cidr(cidr)) {
+                    throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Destination cidrs formatting error" + cidr);
+                }
+            }
+        }
+
         if (getProtocol().equalsIgnoreCase(NetUtils.ALL_PROTO)) {
             if (getSourcePortStart() != null && getSourcePortEnd() != null) {
                 throw new InvalidParameterValueException("Do not pass ports to protocol ALL, protocol ALL do not require ports. Unable to create " +
diff --git a/api/src/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java
index ee62aa5ad4a..fab7d9eef29 100644
--- a/api/src/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java
@@ -108,7 +108,7 @@ public String getProtocol() {
             return cidrlist;
         } else {
             List<String> oneCidrList = new ArrayList<String>();
-            oneCidrList.add(NetUtils.ALL_CIDRS);
+            oneCidrList.add(NetUtils.ALL_IP4_CIDRS);
             return oneCidrList;
         }
 
@@ -242,7 +242,7 @@ public long getDomainId() {
     public void create() {
         if (getSourceCidrList() != null) {
             for (String cidr : getSourceCidrList()) {
-                if (!NetUtils.isValidCIDR(cidr)) {
+                if (!NetUtils.isValidIp4Cidr(cidr) && !NetUtils.isValidIp6Cidr(cidr)) {
                     throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Source CIDRs formatting error " + cidr);
                 }
             }
@@ -349,6 +349,11 @@ public boolean isDisplay() {
         }
     }
 
+    @Override
+    public List<String> getDestinationCidrList(){
+        return null;
+    }
+
     @Override
     public Class<?> getEntityType() {
         return FirewallRule.class;
diff --git a/api/src/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java
index 9a0dffe1fdc..ea0cb00301a 100644
--- a/api/src/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java
@@ -348,7 +348,7 @@ public void create() {
 
         Ip privateIp = getVmSecondaryIp();
         if (privateIp != null) {
-            if (!NetUtils.isValidIp(privateIp.toString())) {
+            if (!NetUtils.isValidIp4(privateIp.toString())) {
                 throw new InvalidParameterValueException("Invalid vm ip address");
             }
         }
@@ -429,6 +429,11 @@ public TrafficType getTrafficType() {
         return null;
     }
 
+    @Override
+    public List<String> getDestinationCidrList(){
+        return null;
+    }
+
     @Override
     public boolean isDisplay() {
         if (display != null) {
diff --git a/api/src/org/apache/cloudstack/api/command/user/firewall/UpdatePortForwardingRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/firewall/UpdatePortForwardingRuleCmd.java
index 5f609b726f8..7de50761630 100644
--- a/api/src/org/apache/cloudstack/api/command/user/firewall/UpdatePortForwardingRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/firewall/UpdatePortForwardingRuleCmd.java
@@ -47,9 +47,13 @@
     @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = FirewallRuleResponse.class, required = true, description = "the ID of the port forwarding rule", since = "4.4")
     private Long id;
 
-    @Parameter(name=ApiConstants.PRIVATE_PORT, type=CommandType.INTEGER, description="the private port of the port forwarding rule")
+    @Parameter(name=ApiConstants.PRIVATE_START_PORT, type=CommandType.INTEGER, description="the private start port of the port forwarding rule")
     private Integer privatePort;
 
+
+    @Parameter(name=ApiConstants.PRIVATE_END_PORT, type=CommandType.INTEGER, description="the private end port of the port forwarding rule")
+    private Integer privateEndPort;
+
     @Parameter(name = ApiConstants.VIRTUAL_MACHINE_ID,
                type = CommandType.UUID,
                entityType = UserVmResponse.class,
@@ -74,6 +78,10 @@ public Integer getPrivatePort() {
         return privatePort;
     }
 
+    public Integer getPrivateEndPort() {
+        return privateEndPort;
+    }
+
     public Long getVirtualMachineId() {
         return virtualMachineId;
     }
@@ -130,7 +138,7 @@ public void checkUuid() {
 
     @Override
     public void execute() {
-        PortForwardingRule rule = _rulesService.updatePortForwardingRule(id, getPrivatePort(), getVirtualMachineId(), getVmGuestIp(), getCustomId(), getDisplay());
+        PortForwardingRule rule = _rulesService.updatePortForwardingRule(getId(), getPrivatePort(), getPrivateEndPort(), getVirtualMachineId(), getVmGuestIp(), getCustomId(), getDisplay());
         FirewallRuleResponse fwResponse = new FirewallRuleResponse();
         if (rule != null) {
             fwResponse = _responseGenerator.createPortForwardingRuleResponse(rule);
diff --git a/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java b/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java
index 599aac1fd03..745b87dd941 100644
--- a/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java
@@ -94,7 +94,7 @@
     @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "an optional account name. Must be used with domainId.")
     private String accountName;
 
-    @Parameter(name = ApiConstants.CHECKSUM, type = CommandType.STRING, description = "the MD5 checksum value of this ISO")
+    @Parameter(name = ApiConstants.CHECKSUM, type = CommandType.STRING, description = "the checksum value of this ISO. " + ApiConstants.CHECKSUM_PARAMETER_PREFIX_DESCRIPTION)
     private String checksum;
 
     @Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class, description = "Register ISO for the project")
@@ -108,6 +108,11 @@
                description = "true if ISO contains XS/VMWare tools inorder to support dynamic scaling of VM CPU/memory")
     protected Boolean isDynamicallyScalable;
 
+    @Parameter(name=ApiConstants.DIRECT_DOWNLOAD,
+            type = CommandType.BOOLEAN,
+            description = "true if ISO should bypass Secondary Storage and be downloaded to Primary Storage on deployment")
+    private Boolean directDownload;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -168,6 +173,10 @@ public Boolean isDynamicallyScalable() {
         return isDynamicallyScalable ==  null ? Boolean.FALSE : isDynamicallyScalable;
     }
 
+    public boolean isDirectDownload() {
+        return directDownload == null ? false : directDownload;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/AssignToLoadBalancerRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/AssignToLoadBalancerRuleCmd.java
index fdc8a31c59a..1e730370801 100644
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/AssignToLoadBalancerRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/AssignToLoadBalancerRuleCmd.java
@@ -140,7 +140,7 @@ public String getEventDescription() {
                 }
 
                 //check wether the given ip is valid ip or not
-                if (vmIp == null || !NetUtils.isValidIp(vmIp)) {
+                if (vmIp == null || !NetUtils.isValidIp4(vmIp)) {
                     throw new InvalidParameterValueException("Invalid ip address "+ vmIp +" passed in vmidipmap for " +
                             "vmid " + vmId);
                 }
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteSslCertCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteSslCertCmd.java
index 2efd036cc97..656c14c1048 100644
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteSslCertCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteSslCertCmd.java
@@ -34,7 +34,7 @@
 import com.cloud.exception.NetworkRuleConflictException;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.exception.ResourceUnavailableException;
-import com.cloud.network.lb.CertService;
+import org.apache.cloudstack.network.tls.CertService;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @APICommand(name = "deleteSslCert", description = "Delete a certificate to CloudStack", responseObject = SuccessResponse.class,
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListSslCertsCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListSslCertsCmd.java
index d1dbdcb2823..cfa56754850 100644
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListSslCertsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListSslCertsCmd.java
@@ -33,7 +33,7 @@
 import org.apache.cloudstack.api.response.SslCertResponse;
 import org.apache.cloudstack.context.CallContext;
 
-import com.cloud.network.lb.CertService;
+import org.apache.cloudstack.network.tls.CertService;
 import com.cloud.utils.exception.CloudRuntimeException;
 
 @APICommand(name = "listSslCerts", description = "Lists SSL certificates", responseObject = SslCertResponse.class,
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UpdateLoadBalancerRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UpdateLoadBalancerRuleCmd.java
index 6b1e0fddd54..6ee277a354c 100644
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UpdateLoadBalancerRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UpdateLoadBalancerRuleCmd.java
@@ -64,6 +64,9 @@
     @Parameter(name = ApiConstants.FOR_DISPLAY, type = CommandType.BOOLEAN, description = "an optional field, whether to the display the rule to the end user or not", since = "4.4", authorized = {RoleType.Admin})
     private Boolean display;
 
+    @Parameter(name = ApiConstants.PROTOCOL, type = CommandType.STRING, description = "The protocol for the LB")
+    private String lbProtocol;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -88,6 +91,10 @@ public Boolean getDisplay() {
         return display;
     }
 
+    public String getLbProtocol() {
+       return lbProtocol;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UploadSslCertCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UploadSslCertCmd.java
index 4bd2de9017f..309e43fcbbe 100644
--- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UploadSslCertCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UploadSslCertCmd.java
@@ -36,7 +36,7 @@
 import com.cloud.exception.NetworkRuleConflictException;
 import com.cloud.exception.ResourceAllocationException;
 import com.cloud.exception.ResourceUnavailableException;
-import com.cloud.network.lb.CertService;
+import org.apache.cloudstack.network.tls.CertService;
 
 @APICommand(name = "uploadSslCert", description = "Upload a certificate to CloudStack", responseObject = SslCertResponse.class,
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
@@ -73,6 +73,9 @@
     @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "domain ID of the account owning the SSL certificate")
     private Long domainId;
 
+    @Parameter(name = ApiConstants.NAME , type = CommandType.STRING, required = true, description = "Name for the uploaded certificate")
+    private String name;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -105,10 +108,15 @@ public Long getProjectId() {
         return projectId;
     }
 
+    public String getName() {
+        return name;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
 
+
     @Override
     public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException,
         ResourceAllocationException, NetworkRuleConflictException {
diff --git a/api/src/org/apache/cloudstack/api/command/user/nat/CreateIpForwardingRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/nat/CreateIpForwardingRuleCmd.java
index d85030e3cd9..1b367a9fa7b 100644
--- a/api/src/org/apache/cloudstack/api/command/user/nat/CreateIpForwardingRuleCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/nat/CreateIpForwardingRuleCmd.java
@@ -323,6 +323,11 @@ public boolean isDisplay() {
         return true;
     }
 
+    @Override
+    public List<String> getDestinationCidrList(){
+        return null;
+    }
+
     @Override
     public Class<?> getEntityType() {
         return FirewallRule.class;
diff --git a/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkACLCmd.java b/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkACLCmd.java
index c8a8f8cae39..4b6a836f32a 100644
--- a/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkACLCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkACLCmd.java
@@ -134,7 +134,7 @@ public String getProtocol() {
             return cidrlist;
         } else {
             List<String> oneCidrList = new ArrayList<String>();
-            oneCidrList.add(NetUtils.ALL_CIDRS);
+            oneCidrList.add(NetUtils.ALL_IP4_CIDRS);
             return oneCidrList;
         }
     }
diff --git a/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java b/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java
index 17312614808..befef999bfd 100644
--- a/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java
@@ -16,7 +16,6 @@
 // under the License.
 package org.apache.cloudstack.api.command.user.network;
 
-import com.cloud.utils.net.NetUtils;
 import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.acl.RoleType;
@@ -44,6 +43,7 @@
 import com.cloud.network.Network;
 import com.cloud.network.Network.GuestType;
 import com.cloud.offering.NetworkOffering;
+import com.cloud.utils.net.NetUtils;
 
 @APICommand(name = "createNetwork", description = "Creates a network", responseObject = NetworkResponse.class, responseView = ResponseView.Restricted, entityType = {Network.class},
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
@@ -134,6 +134,9 @@
     @Parameter(name = ApiConstants.IP6_CIDR, type = CommandType.STRING, description = "the CIDR of IPv6 network, must be at least /64")
     private String ip6Cidr;
 
+    @Parameter(name = ApiConstants.EXTERNAL_ID, type = CommandType.STRING, description = "ID of the network in an external system.")
+    private String externalId;
+
     @Parameter(name = ApiConstants.DISPLAY_NETWORK,
                type = CommandType.BOOLEAN,
  description = "an optional field, whether to the display the network to the end user or not.", authorized = {RoleType.Admin})
@@ -209,6 +212,10 @@ public Boolean getDisplayNetwork() {
         return displayNetwork;
     }
 
+    public String getExternalId() {
+        return externalId;
+    }
+
     @Override
     public boolean isDisplay() {
         if(displayNetwork == null)
diff --git a/api/src/org/apache/cloudstack/api/command/user/network/RestartNetworkCmd.java b/api/src/org/apache/cloudstack/api/command/user/network/RestartNetworkCmd.java
index 62566653bca..645ae5aff8e 100644
--- a/api/src/org/apache/cloudstack/api/command/user/network/RestartNetworkCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/network/RestartNetworkCmd.java
@@ -55,7 +55,10 @@
     private Long id;
 
     @Parameter(name = ApiConstants.CLEANUP, type = CommandType.BOOLEAN, required = false, description = "If cleanup old network elements")
-    private Boolean cleanup;
+    private Boolean cleanup = false;
+
+    @Parameter(name = ApiConstants.MAKEREDUNDANT, type = CommandType.BOOLEAN, required = false, description = "Turn the network into a network with redundant routers.", since = "4.11.1")
+    private Boolean makeRedundant = false;
 
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
@@ -71,10 +74,11 @@ public Long getNetworkId() {
     }
 
     public Boolean getCleanup() {
-        if (cleanup != null) {
-            return cleanup;
-        }
-        return true;
+        return cleanup;
+    }
+
+    public Boolean getMakeRedundant() {
+        return makeRedundant;
     }
 
     /////////////////////////////////////////////////////
@@ -92,7 +96,7 @@ public static String getResultObjectName() {
 
     @Override
     public void execute() throws ResourceUnavailableException, ResourceAllocationException, ConcurrentOperationException, InsufficientCapacityException {
-        boolean result = _networkService.restartNetwork(this, getCleanup());
+        boolean result = _networkService.restartNetwork(this, getCleanup(), getMakeRedundant());
         if (result) {
             SuccessResponse response = new SuccessResponse(getCommandName());
             setResponseObject(response);
diff --git a/api/src/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java b/api/src/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java
index 921e74b67b2..c313f369b0e 100644
--- a/api/src/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java
@@ -75,11 +75,17 @@
     @Parameter(name = ApiConstants.GUEST_VM_CIDR, type = CommandType.STRING, description = "CIDR for guest VMs, CloudStack allocates IPs to guest VMs only from this CIDR")
     private String guestVmCidr;
 
+    @Parameter(name =ApiConstants.Update_IN_SEQUENCE, type=CommandType.BOOLEAN, description = "if true, we will update the routers one after the other. applicable only for redundant router based networks using virtual router as provider")
+    private Boolean updateInSequence;
+
     @Parameter(name = ApiConstants.DISPLAY_NETWORK,
                type = CommandType.BOOLEAN,
  description = "an optional field, whether to the display the network to the end user or not.", authorized = {RoleType.Admin})
     private Boolean displayNetwork;
 
+    @Parameter(name= ApiConstants.FORCED, type = CommandType.BOOLEAN, description = "Setting this to true will cause a forced network update,", authorized = {RoleType.Admin})
+    private Boolean forced;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -119,6 +125,19 @@ public Boolean getDisplayNetwork() {
         return displayNetwork;
     }
 
+    public Boolean getUpdateInSequence(){
+        if(updateInSequence ==null)
+            return false;
+        else
+            return updateInSequence;
+    }
+
+    public boolean getForced(){
+        if(forced==null){
+            return false;
+        }
+        return forced;
+    }
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
@@ -149,7 +168,7 @@ public void execute() throws InsufficientCapacityException, ConcurrentOperationE
 
         Network result =
             _networkService.updateGuestNetwork(getId(), getNetworkName(), getDisplayText(), callerAccount, callerUser, getNetworkDomain(), getNetworkOfferingId(),
-                getChangeCidr(), getGuestVmCidr(), getDisplayNetwork(), getCustomId());
+                getChangeCidr(), getGuestVmCidr(), getDisplayNetwork(), getCustomId(), getUpdateInSequence(), getForced());
 
         if (result != null) {
             NetworkResponse response = _responseGenerator.createNetworkResponse(ResponseView.Restricted, result);
diff --git a/api/src/org/apache/cloudstack/api/command/user/resource/ListResourceLimitsCmd.java b/api/src/org/apache/cloudstack/api/command/user/resource/ListResourceLimitsCmd.java
index 14d1d55ff8b..68c09c27fb0 100644
--- a/api/src/org/apache/cloudstack/api/command/user/resource/ListResourceLimitsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/resource/ListResourceLimitsCmd.java
@@ -19,6 +19,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import com.cloud.configuration.Resource;
+import com.cloud.exception.InvalidParameterValueException;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd;
@@ -58,6 +60,21 @@
         + "11 - SecondaryStorage. Total secondary storage space (in GiB) a user can use. ")
     private Integer resourceType;
 
+    @Parameter(name = ApiConstants.RESOURCE_TYPE_NAME, type = CommandType.STRING, description = "Type of resource (wins over resourceType if both are provided). Values are: "
+            + "user_vm - Instance. Number of instances a user can create. "
+            + "public_ip - IP. Number of public IP addresses an account can own. "
+            + "volume - Volume. Number of disk volumes an account can own. "
+            + "snapshot - Snapshot. Number of snapshots an account can own. "
+            + "template - Template. Number of templates an account can register/create. "
+            + "project - Project. Number of projects an account can own. "
+            + "network - Network. Number of networks an account can own. "
+            + "vpc - VPC. Number of VPC an account can own. "
+            + "cpu - CPU. Number of CPU an account can allocate for his resources. "
+            + "memory - Memory. Amount of RAM an account can allocate for his resources. "
+            + "primary_storage - PrimaryStorage. Total primary storage space (in GiB) a user can use. "
+            + "secondary_storage - SecondaryStorage. Total secondary storage space (in GiB) a user can use. ")
+    private String resourceTypeName;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -70,6 +87,10 @@ public Integer getResourceType() {
         return resourceType;
     }
 
+    public String getResourceTypeName() {
+        return resourceTypeName;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
@@ -83,7 +104,7 @@ public String getCommandName() {
     public void execute() {
         List<? extends ResourceLimit> result =
                 _resourceLimitService.searchForLimits(id, _accountService.finalyzeAccountId(this.getAccountName(), this.getDomainId(), this.getProjectId(), false), this.getDomainId(),
-                resourceType, this.getStartIndex(), this.getPageSizeVal());
+                        getResourceTypeEnum(), this.getStartIndex(), this.getPageSizeVal());
         ListResponse<ResourceLimitResponse> response = new ListResponse<ResourceLimitResponse>();
         List<ResourceLimitResponse> limitResponses = new ArrayList<ResourceLimitResponse>();
         for (ResourceLimit limit : result) {
@@ -96,4 +117,23 @@ public void execute() {
         response.setResponseName(getCommandName());
         this.setResponseObject(response);
     }
+
+    private Resource.ResourceType getResourceTypeEnum() {
+        // Map resource type
+        Resource.ResourceType resourceTypeResult = null;
+        if (resourceTypeName != null) {
+            try {
+                resourceTypeResult = Resource.ResourceType.valueOf(resourceTypeName);
+            } catch (IllegalArgumentException e) {
+                throw new InvalidParameterValueException("Please specify a valid resource type name.");
+            }
+        } else if (resourceType != null) {
+            resourceTypeResult = Resource.ResourceType.fromOrdinal(resourceType);
+            if (resourceTypeResult == null) {
+                throw new InvalidParameterValueException("Please specify a valid resource type.");
+            }
+        }
+
+        return resourceTypeResult;
+    }
 }
diff --git a/api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java b/api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java
index 306ab5fb877..d66b6499399 100644
--- a/api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java
@@ -16,8 +16,15 @@
 // under the License.
 package org.apache.cloudstack.api.command.user.snapshot;
 
-import org.apache.log4j.Logger;
-
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.PermissionDeniedException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.projects.Project;
+import com.cloud.storage.Snapshot;
+import com.cloud.storage.Volume;
+import com.cloud.user.Account;
+import com.cloud.utils.exception.CloudRuntimeException;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiCommandJobType;
 import org.apache.cloudstack.api.ApiConstants;
@@ -30,16 +37,7 @@
 import org.apache.cloudstack.api.response.SnapshotPolicyResponse;
 import org.apache.cloudstack.api.response.SnapshotResponse;
 import org.apache.cloudstack.api.response.VolumeResponse;
-import org.apache.cloudstack.context.CallContext;
-
-import com.cloud.event.EventTypes;
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.exception.PermissionDeniedException;
-import com.cloud.exception.ResourceAllocationException;
-import com.cloud.projects.Project;
-import com.cloud.storage.Snapshot;
-import com.cloud.storage.Volume;
-import com.cloud.user.Account;
+import org.apache.log4j.Logger;
 
 @APICommand(name = "createSnapshot", description = "Creates an instant snapshot of a volume.", responseObject = SnapshotResponse.class, entityType = {Snapshot.class},
         requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
@@ -74,9 +72,16 @@
     @Parameter(name = ApiConstants.SNAPSHOT_QUIESCEVM, type = CommandType.BOOLEAN, required = false, description = "quiesce vm if true")
     private Boolean quiescevm;
 
+    @Parameter(name = ApiConstants.LOCATION_TYPE, type = CommandType.STRING, required = false, description = "Currently applicable only for managed storage. " +
+            "Valid location types: 'primary', 'secondary'. Default = 'primary'.")
+    private String locationType;
+
     @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "the name of the snapshot")
     private String snapshotName;
 
+    @Parameter(name = ApiConstants.ASYNC_BACKUP, type = CommandType.BOOLEAN, required = false, description = "asynchronous backup if true")
+    private Boolean asyncBackup;
+
     private String syncObjectType = BaseAsyncCmd.snapshotHostSyncObject;
 
     // ///////////////////////////////////////////////////
@@ -108,7 +113,7 @@ public String getSnapshotName() {
     }
 
     public String getVolumeUuid() {
-        Volume volume = (Volume)this._entityMgr.findById(Volume.class, getVolumeId());
+        Volume volume = _entityMgr.findById(Volume.class, getVolumeId());
         if (volume == null) {
             throw new InvalidParameterValueException("Unable to find volume's UUID");
         }
@@ -141,7 +146,7 @@ public String getCommandName() {
     }
 
     public static String getResultObjectName() {
-        return "snapshot";
+        return ApiConstants.SNAPSHOT;
     }
 
     @Override
@@ -184,7 +189,7 @@ public ApiCommandJobType getInstanceType() {
 
     @Override
     public void create() throws ResourceAllocationException {
-        Snapshot snapshot = _volumeService.allocSnapshot(getVolumeId(), getPolicyId(), getSnapshotName());
+        Snapshot snapshot = _volumeService.allocSnapshot(getVolumeId(), getPolicyId(), getSnapshotName(), getLocationType());
         if (snapshot != null) {
             setEntityId(snapshot.getId());
             setEntityUuid(snapshot.getUuid());
@@ -195,21 +200,37 @@ public void create() throws ResourceAllocationException {
 
     @Override
     public void execute() {
-        s_logger.info("VOLSS: createSnapshotCmd starts:" + System.currentTimeMillis());
-        CallContext.current().setEventDetails("Volume Id: " + getVolumeUuid());
         Snapshot snapshot;
         try {
             snapshot =
-                _volumeService.takeSnapshot(getVolumeId(), getPolicyId(), getEntityId(), _accountService.getAccount(getEntityOwnerId()), getQuiescevm());
+                _volumeService.takeSnapshot(getVolumeId(), getPolicyId(), getEntityId(), _accountService.getAccount(getEntityOwnerId()), getQuiescevm(), getLocationType(), getAsyncBackup());
+
             if (snapshot != null) {
                 SnapshotResponse response = _responseGenerator.createSnapshotResponse(snapshot);
                 response.setResponseName(getCommandName());
                 setResponseObject(response);
             } else {
-                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create snapshot due to an internal error creating snapshot for volume " + volumeId);
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create snapshot due to an internal error creating snapshot for volume " + getVolumeId());
             }
         } catch (Exception e) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create snapshot due to an internal error creating snapshot for volume " + volumeId);
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create snapshot due to an internal error creating snapshot for volume " + getVolumeId());
+        }
+    }
+
+    private Snapshot.LocationType getLocationType() {
+
+        if (Snapshot.LocationType.values() == null || Snapshot.LocationType.values().length == 0 || locationType == null) {
+            return null;
+        }
+
+        try {
+            String lType = locationType.trim().toUpperCase();
+            return Snapshot.LocationType.valueOf(lType);
+        } catch (IllegalArgumentException e) {
+            String errMesg = "Invalid locationType " + locationType + "Specified for volume " + getVolumeId()
+                        + " Valid values are: primary,secondary ";
+            s_logger.warn(errMesg);
+            throw  new CloudRuntimeException(errMesg);
         }
     }
 
@@ -228,4 +249,12 @@ public Long getSyncObjId() {
         }
         return null;
     }
+
+    public Boolean getAsyncBackup() {
+        if (asyncBackup == null) {
+            return false;
+        } else {
+            return asyncBackup;
+        }
+    }
 }
diff --git a/api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotFromVMSnapshotCmd.java b/api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotFromVMSnapshotCmd.java
new file mode 100644
index 00000000000..7a35d3462f5
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotFromVMSnapshotCmd.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 org.apache.cloudstack.api.command.user.snapshot;
+
+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.BaseAsyncCreateCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.response.SnapshotResponse;
+import org.apache.cloudstack.api.response.VMSnapshotResponse;
+import org.apache.cloudstack.api.response.VolumeResponse;
+import org.apache.cloudstack.context.CallContext;
+import org.apache.log4j.Logger;
+
+import com.cloud.event.EventTypes;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.PermissionDeniedException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.projects.Project;
+import com.cloud.storage.Snapshot;
+import com.cloud.user.Account;
+import com.cloud.uservm.UserVm;
+import com.cloud.vm.snapshot.VMSnapshot;
+
+@APICommand(name = "createSnapshotFromVMSnapshot", description = "Creates an instant snapshot of a volume from existing vm snapshot.", responseObject = SnapshotResponse.class, entityType = {Snapshot.class}, since = "4.10.0",
+        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+public class CreateSnapshotFromVMSnapshotCmd extends BaseAsyncCreateCmd {
+    public static final Logger s_logger = Logger.getLogger(CreateSnapshotFromVMSnapshotCmd.class.getName());
+    private static final String s_name = "createsnapshotfromvmsnapshotresponse";
+
+    // ///////////////////////////////////////////////////
+    // ////////////// API parameters /////////////////////
+    // ///////////////////////////////////////////////////
+
+    @Parameter(name = ApiConstants.VOLUME_ID, type = CommandType.UUID, entityType = VolumeResponse.class, required = true, description = "The ID of the disk volume")
+    private Long volumeId;
+
+    @Parameter(name=ApiConstants.VM_SNAPSHOT_ID, type=CommandType.UUID, entityType=VMSnapshotResponse.class,
+            required=true, description="The ID of the VM snapshot")
+    private Long vmSnapshotId;
+
+    @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "the name of the snapshot")
+    private String snapshotName;
+
+    private String syncObjectType = BaseAsyncCmd.snapshotHostSyncObject;
+
+    // ///////////////////////////////////////////////////
+    // ///////////////// Accessors ///////////////////////
+    // ///////////////////////////////////////////////////
+
+    public Long getVolumeId() {
+        return volumeId;
+    }
+
+    public Long getVMSnapshotId() {
+        return vmSnapshotId;
+    }
+
+    public String getSnapshotName() {
+        return snapshotName;
+    }
+
+    private Long getVmId() {
+        VMSnapshot vmsnapshot = _entityMgr.findById(VMSnapshot.class, getVMSnapshotId());
+        if (vmsnapshot == null) {
+            throw new InvalidParameterValueException("Unable to find vm snapshot by id=" + getVMSnapshotId());
+        }
+        UserVm vm = _entityMgr.findById(UserVm.class, vmsnapshot.getVmId());
+        if (vm == null) {
+            throw new InvalidParameterValueException("Unable to find vm by vm snapshot id=" + getVMSnapshotId());
+        }
+        return vm.getId();
+    }
+    private Long getHostId() {
+        VMSnapshot vmsnapshot = _entityMgr.findById(VMSnapshot.class, getVMSnapshotId());
+        if (vmsnapshot == null) {
+            throw new InvalidParameterValueException("Unable to find vm snapshot by id=" + getVMSnapshotId());
+        }
+        UserVm vm = _entityMgr.findById(UserVm.class, vmsnapshot.getVmId());
+        if (vm != null) {
+            if(vm.getHostId() != null) {
+                return vm.getHostId();
+            } else if(vm.getLastHostId() != null) {
+                return vm.getLastHostId();
+            }
+        }
+        return null;
+    }
+
+
+    // ///////////////////////////////////////////////////
+    // ///////////// API Implementation///////////////////
+    // ///////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    public static String getResultObjectName() {
+        return ApiConstants.SNAPSHOT;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+
+        VMSnapshot vmsnapshot = _entityMgr.findById(VMSnapshot.class, getVMSnapshotId());
+        if (vmsnapshot == null) {
+            throw new InvalidParameterValueException("Unable to find vmsnapshot by id=" + getVMSnapshotId());
+        }
+
+        Account account = _accountService.getAccount(vmsnapshot.getAccountId());
+        //Can create templates for enabled projects/accounts only
+        if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) {
+            Project project = _projectService.findByProjectAccountId(vmsnapshot.getAccountId());
+            if (project == null) {
+                throw new InvalidParameterValueException("Unable to find project by account id=" + account.getUuid());
+            }
+            if (project.getState() != Project.State.Active) {
+                throw new PermissionDeniedException("Can't add resources to the project id=" + project.getUuid() + " in state=" + project.getState() + " as it's no longer active");
+            }
+        } else if (account.getState() == Account.State.disabled) {
+            throw new PermissionDeniedException("The owner of template is disabled: " + account);
+        }
+
+        return vmsnapshot.getAccountId();
+    }
+
+    @Override
+    public String getEventType() {
+        return EventTypes.EVENT_SNAPSHOT_CREATE;
+    }
+
+    @Override
+    public String getEventDescription() {
+        return "creating snapshot from vm snapshot : " + getVMSnapshotId();
+    }
+
+    @Override
+    public ApiCommandJobType getInstanceType() {
+        return ApiCommandJobType.Snapshot;
+    }
+
+    @Override
+    public void create() throws ResourceAllocationException {
+        Snapshot snapshot = this._volumeService.allocSnapshotForVm(getVmId(), getVolumeId(), getSnapshotName());
+        if (snapshot != null) {
+            this.setEntityId(snapshot.getId());
+            this.setEntityUuid(snapshot.getUuid());
+        } else {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create snapshot from vm snapshot");
+        }
+    }
+
+    @Override
+    public void execute() {
+        s_logger.info("CreateSnapshotFromVMSnapshotCmd with vm snapshot id:" + getVMSnapshotId() + " and snapshot id:" + getEntityId() + " starts:" + System.currentTimeMillis());
+        CallContext.current().setEventDetails("Vm Snapshot Id: "+ getVMSnapshotId());
+        Snapshot snapshot = null;
+        try {
+            snapshot = _snapshotService.backupSnapshotFromVmSnapshot(getEntityId(), getVmId(), getVolumeId(), getVMSnapshotId());
+            if (snapshot != null) {
+                SnapshotResponse response = _responseGenerator.createSnapshotResponse(snapshot);
+                response.setResponseName(getCommandName());
+                this.setResponseObject(response);
+            } else {
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create snapshot due to an internal error creating snapshot from vm snapshot " + getVMSnapshotId());
+            }
+        } catch (InvalidParameterValueException ex) {
+            throw ex;
+        } catch (Exception e) {
+            s_logger.debug("Failed to create snapshot", e);
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create snapshot due to an internal error creating snapshot from vm snapshot " + getVMSnapshotId());
+        } finally {
+            if (snapshot == null) {
+                try {
+                    _snapshotService.deleteSnapshot(getEntityId());
+                } catch (Exception e) {
+                    s_logger.debug("Failed to clean failed snapshot" + getEntityId());
+                }
+            }
+        }
+    }
+
+
+    @Override
+    public String getSyncObjType() {
+        if (getSyncObjId() != null) {
+            return syncObjectType;
+        }
+        return null;
+    }
+
+    @Override
+    public Long getSyncObjId() {
+        if (getHostId() != null) {
+            return getHostId();
+        }
+        return null;
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java b/api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java
index 97bb187dd52..bdb23e4ad5b 100644
--- a/api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java
@@ -34,8 +34,8 @@
 import com.cloud.storage.Snapshot;
 import com.cloud.utils.Pair;
 
-@APICommand(name = "listSnapshots", description = "Lists all available snapshots for the account.", responseObject = SnapshotResponse.class, entityType = {Snapshot.class},
-        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+@APICommand(name = "listSnapshots", description = "Lists all available snapshots for the account.", responseObject = SnapshotResponse.class, entityType = {
+        Snapshot.class }, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
 public class ListSnapshotsCmd extends BaseListTaggedResourcesCmd {
     public static final Logger s_logger = Logger.getLogger(ListSnapshotsCmd.class.getName());
 
diff --git a/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java b/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java
index fdbdafd1446..d16b87cd95e 100644
--- a/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java
@@ -16,6 +16,7 @@
 // under the License.
 package org.apache.cloudstack.api.command.user.template;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.log4j.Logger;
@@ -51,25 +52,46 @@
     @Parameter(name = ApiConstants.DESTINATION_ZONE_ID,
                type = CommandType.UUID,
                entityType = ZoneResponse.class,
-               required = true,
+               required = false,
                description = "ID of the zone the template is being copied to.")
-    private Long destZoneId;
+    protected Long destZoneId;
 
-    @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = TemplateResponse.class, required = true, description = "Template ID.")
+    @Parameter(name = ApiConstants.ID, type = CommandType.UUID,
+            entityType = TemplateResponse.class, required = true, description = "Template ID.")
     private Long id;
 
     @Parameter(name = ApiConstants.SOURCE_ZONE_ID,
                type = CommandType.UUID,
                entityType = ZoneResponse.class,
-            description = "ID of the zone the template is currently hosted on. If not specified and template is cross-zone, then we will sync this template to region wide image store.")
+            description = "ID of the zone the template is currently hosted on. " +
+                    "If not specified and template is cross-zone, " +
+                    "then we will sync this template to region wide image store.")
     private Long sourceZoneId;
 
+    @Parameter(name = ApiConstants.DESTINATION_ZONE_ID_LIST,
+                    type=CommandType.LIST,
+                    collectionType = CommandType.UUID,
+                    entityType = ZoneResponse.class,
+                    required = false,
+                    description = "A list of IDs of the zones that the template needs to be copied to." +
+                            "Specify this list if the template needs to copied to multiple zones in one go. " +
+                            "Do not specify destzoneid and destzoneids together, however one of them is required.")
+    protected List<Long> destZoneIds;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
 
-    public Long getDestinationZoneId() {
-        return destZoneId;
+    public List<Long> getDestinationZoneIds() {
+        if (destZoneIds != null && destZoneIds.size() != 0) {
+            return destZoneIds;
+        }
+        if (destZoneId != null) {
+            List < Long > destIds = new ArrayList<>();
+            destIds.add(destZoneId);
+            return destIds;
+        }
+        return null;
     }
 
     public Long getId() {
@@ -111,7 +133,8 @@ public String getEventType() {
 
     @Override
     public String getEventDescription() {
-        return  "copying template: " + getId() + " from zone: " + getSourceZoneId() + " to zone: " + getDestinationZoneId();
+        return  "copying template: " + getId() + " from zone: " + getSourceZoneId()
+                + " to zone: " + getDestinationZoneIds();
     }
 
     @Override
@@ -127,11 +150,20 @@ public Long getInstanceId() {
     @Override
     public void execute() throws ResourceAllocationException {
         try {
+            if (destZoneId == null && (destZoneIds == null || destZoneIds.size() == 0))
+                throw new ServerApiException(ApiErrorCode.PARAM_ERROR,
+                        "Either destzoneid or destzoneids parameters have to be specified.");
+
+            if (destZoneId != null && destZoneIds != null && destZoneIds.size() != 0)
+                throw new ServerApiException(ApiErrorCode.PARAM_ERROR,
+                        "Both destzoneid and destzoneids cannot be specified at the same time.");
+
             CallContext.current().setEventDetails(getEventDescription());
             VirtualMachineTemplate template = _templateService.copyTemplate(this);
 
             if (template != null){
-                List<TemplateResponse> listResponse = _responseGenerator.createTemplateResponses(ResponseView.Restricted, template, getDestinationZoneId(), false);
+                List<TemplateResponse> listResponse = _responseGenerator.createTemplateResponses(ResponseView.Restricted,
+                                                            template, getDestinationZoneIds(), false);
                 TemplateResponse response = new TemplateResponse();
                 if (listResponse != null && !listResponse.isEmpty()) {
                     response = listResponse.get(0);
diff --git a/api/src/org/apache/cloudstack/api/command/user/template/DeleteTemplateCmd.java b/api/src/org/apache/cloudstack/api/command/user/template/DeleteTemplateCmd.java
old mode 100644
new mode 100755
index 98d53be836e..95b3eeee059
--- a/api/src/org/apache/cloudstack/api/command/user/template/DeleteTemplateCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/template/DeleteTemplateCmd.java
@@ -52,6 +52,9 @@
     @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the ID of zone of the template")
     private Long zoneId;
 
+    @Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN, required = false, description = "Force delete a template.", since = "4.9+")
+    private Boolean forced;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -64,6 +67,9 @@ public Long getZoneId() {
         return zoneId;
     }
 
+    public boolean isForced() {
+        return (forced != null) ? forced : true;
+    }
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java b/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
index 772ca2749e7..e7d328495ed 100644
--- a/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java
@@ -72,9 +72,12 @@
     @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "list templates by zoneId")
     private Long zoneId;
 
-    @Parameter(name=ApiConstants.SHOW_REMOVED, type=CommandType.BOOLEAN, description="show removed templates as well")
+    @Parameter(name = ApiConstants.SHOW_REMOVED, type = CommandType.BOOLEAN, description = "show removed templates as well")
     private Boolean showRemoved;
 
+    @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;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -103,6 +106,10 @@ public Boolean getShowRemoved() {
         return (showRemoved != null ? showRemoved : false);
     }
 
+    public Long getParentTemplateId() {
+        return parentTemplateId;
+    }
+
     public boolean listInReadyState() {
 
         Account account = CallContext.current().getCallingAccount();
diff --git a/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java b/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java
index 8ff0b6b449e..333b363d16a 100644
--- a/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java
@@ -16,7 +16,9 @@
 // under the License.
 package org.apache.cloudstack.api.command.user.template;
 
+import com.cloud.hypervisor.Hypervisor;
 import java.net.URISyntaxException;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -109,7 +111,7 @@
     private String url;
 
     @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID, entityType = ZoneResponse.class,
-            required=true, description="the ID of the zone the template is to be hosted on")
+            required=false, description="the ID of the zone the template is to be hosted on")
     protected Long zoneId;
 
     @Parameter(name = ApiConstants.DOMAIN_ID,
@@ -121,7 +123,7 @@
     @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "an optional accountName. Must be used with domainId.")
     private String accountName;
 
-    @Parameter(name = ApiConstants.CHECKSUM, type = CommandType.STRING, description = "the MD5 checksum value of this template")
+    @Parameter(name = ApiConstants.CHECKSUM, type = CommandType.STRING, description = "the checksum value of this template. " + ApiConstants.CHECKSUM_PARAMETER_PREFIX_DESCRIPTION)
     private String checksum;
 
     @Parameter(name = ApiConstants.TEMPLATE_TAG, type = CommandType.STRING, description = "the tag for this template.")
@@ -130,7 +132,8 @@
     @Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class, description = "Register template for the project")
     private Long projectId;
 
-    @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, description = "Template details in key/value pairs using format details[i].keyname=keyvalue. Example: details[0].hypervisortoolsversion=xenserver61")
+    @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP,
+            description = "Template details in key/value pairs using format details[i].keyname=keyvalue. Example: details[0].hypervisortoolsversion=xenserver61")
     protected Map details;
 
     @Parameter(name = ApiConstants.IS_DYNAMICALLY_SCALABLE,
@@ -141,6 +144,23 @@
     @Parameter(name = ApiConstants.ROUTING, type = CommandType.BOOLEAN, description = "true if the template type is routing i.e., if template is used to deploy router")
     protected Boolean isRoutingType;
 
+    @Parameter(name=ApiConstants.ZONE_ID_LIST,
+            type=CommandType.LIST,
+            collectionType = CommandType.UUID,
+            entityType = ZoneResponse.class,
+            required=false,
+            description="A list of zone ids where the template will be hosted. Use this parameter if the template needs " +
+                    "to be registered to multiple zones in one go. Use zoneid if the template " +
+                    "needs to be registered to only one zone." +
+                    "Passing only -1 to this will cause the template to be registered as a cross " +
+                    "zone template and will be copied to all zones. ")
+    protected List<Long> zoneIds;
+
+    @Parameter(name=ApiConstants.DIRECT_DOWNLOAD,
+                type = CommandType.BOOLEAN,
+                description = "true if template should bypass Secondary Storage and be downloaded to Primary Storage on deployment")
+    private Boolean directDownload;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -197,8 +217,22 @@ public String getUrl() {
         return url;
     }
 
-    public Long getZoneId() {
-        return zoneId;
+    public List<Long> getZoneIds() {
+        // This function will return null when the zoneId
+        //is -1 which means all zones.
+        if (zoneIds != null && !(zoneIds.isEmpty())) {
+            if ((zoneIds.size() == 1) && (zoneIds.get(0) == -1L))
+                return null;
+            else
+                return zoneIds;
+        }
+        if (zoneId == null)
+            return null;
+        if (zoneId!= null && zoneId == -1)
+            return null;
+        List<Long> zones = new ArrayList<>();
+        zones.add(zoneId);
+        return zones;
     }
 
     public Long getDomainId() {
@@ -235,6 +269,10 @@ public Boolean isRoutingType() {
         return isRoutingType;
     }
 
+    public boolean isDirectDownload() {
+        return directDownload == null ? false : directDownload;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
@@ -261,10 +299,13 @@ public long getEntityOwnerId() {
     @Override
     public void execute() throws ResourceAllocationException {
         try {
+            validateParameters();
+
             VirtualMachineTemplate template = _templateService.registerTemplate(this);
             if (template != null) {
                 ListResponse<TemplateResponse> response = new ListResponse<TemplateResponse>();
-                List<TemplateResponse> templateResponses = _responseGenerator.createTemplateResponses(ResponseView.Restricted, template, zoneId, false);
+                List<TemplateResponse> templateResponses = _responseGenerator.createTemplateResponses(ResponseView.Restricted,
+                        template, getZoneIds(), false);
                 response.setResponses(templateResponses);
                 response.setResponseName(getCommandName());
                 setResponseObject(response);
@@ -276,4 +317,23 @@ public void execute() throws ResourceAllocationException {
             throw new ServerApiException(ApiErrorCode.PARAM_ERROR, ex1.getMessage());
         }
     }
+
+    protected void validateParameters() {
+        if ((zoneId != null) && (zoneIds != null && !zoneIds.isEmpty()))
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR,
+                    "Both zoneid and zoneids cannot be specified at the same time");
+
+        if (zoneId == null && (zoneIds == null || zoneIds.isEmpty()))
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR,
+                    "Either zoneid or zoneids is required. Both cannot be null.");
+
+        if (zoneIds != null && zoneIds.size() > 1 && zoneIds.contains(-1L))
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR,
+                    "Parameter zoneids cannot combine all zones (-1) option with other zones");
+
+        if (isDirectDownload() && !getHypervisor().equalsIgnoreCase(Hypervisor.HypervisorType.KVM.toString())) {
+            throw new ServerApiException(ApiErrorCode.PARAM_ERROR,
+                    "Parameter directdownload is only allowed for KVM templates");
+        }
+    }
 }
diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/AddIpToVmNicCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/AddIpToVmNicCmd.java
index 4b805acc396..41481c8ff54 100644
--- a/api/src/org/apache/cloudstack/api/command/user/vm/AddIpToVmNicCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/AddIpToVmNicCmd.java
@@ -173,7 +173,7 @@ public void create() throws ResourceAllocationException {
         NicSecondaryIp result;
         String secondaryIp = null;
         if ((ip = getIpaddress()) != null) {
-            if (!NetUtils.isValidIp(ip)) {
+            if (!NetUtils.isValidIp4(ip)) {
                 throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Invalid ip address " + ip);
             }
         }
diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/AddNicToVMCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/AddNicToVMCmd.java
index f265ecf236a..ed2a4b56375 100644
--- a/api/src/org/apache/cloudstack/api/command/user/vm/AddNicToVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/AddNicToVMCmd.java
@@ -17,7 +17,10 @@
 package org.apache.cloudstack.api.command.user.vm;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.apache.log4j.Logger;
 
@@ -36,8 +39,11 @@
 import org.apache.cloudstack.context.CallContext;
 
 import com.cloud.event.EventTypes;
+import com.cloud.exception.InvalidParameterValueException;
 import com.cloud.user.Account;
 import com.cloud.uservm.UserVm;
+import com.cloud.utils.net.Dhcp;
+import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.VirtualMachine;
 
 @APICommand(name = "addNicToVirtualMachine", description = "Adds VM to specified network by creating a NIC", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = {VirtualMachine.class},
@@ -60,6 +66,13 @@
     @Parameter(name = ApiConstants.IP_ADDRESS, type = CommandType.STRING, description = "IP Address for the new network")
     private String ipaddr;
 
+    @Parameter(name = ApiConstants.MAC_ADDRESS, type = CommandType.STRING, description = "Mac Address for the new network")
+    private String macaddr;
+
+    @Parameter(name = ApiConstants.DHCP_OPTIONS, type = CommandType.MAP, description = "DHCP options which are passed to the nic"
+            + " Example: dhcpoptions[0].dhcp:114=url&dhcpoptions[0].dhcp:66=www.test.com")
+    private Map dhcpOptions;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -76,6 +89,18 @@ public String getIpAddress() {
         return ipaddr;
     }
 
+    public String getMacAddress() {
+        if (macaddr == null) {
+            return null;
+        }
+        if(!NetUtils.isValidMac(macaddr)) {
+            throw new InvalidParameterValueException("Mac address is not valid: " + macaddr);
+        } else if(!NetUtils.isUnicastMac(macaddr)) {
+            throw new InvalidParameterValueException("Mac address is not unicast: " + macaddr);
+        }
+        return NetUtils.standardizeMacAddress(macaddr);
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
@@ -108,6 +133,28 @@ public long getEntityOwnerId() {
         return vm.getAccountId();
     }
 
+    public Map<Integer, String> getDhcpOptionsMap() {
+        Map<Integer, String> dhcpOptionsMap = new HashMap<>();
+        if (dhcpOptions != null && !dhcpOptions.isEmpty()) {
+
+            Collection<Map<String, String>> paramsCollection = this.dhcpOptions.values();
+            for(Map<String, String> dhcpNetworkOptions : paramsCollection) {
+                for (String key : dhcpNetworkOptions.keySet()) {
+                    if (key.startsWith(ApiConstants.DHCP_PREFIX)) {
+                        int dhcpOptionValue = Integer.parseInt(key.replaceFirst(ApiConstants.DHCP_PREFIX, ""));
+                        dhcpOptionsMap.put(dhcpOptionValue, dhcpNetworkOptions.get(key));
+                    } else {
+                        Dhcp.DhcpOptionCode dhcpOptionEnum = Dhcp.DhcpOptionCode.valueOfString(key);
+                        dhcpOptionsMap.put(dhcpOptionEnum.getCode(), dhcpNetworkOptions.get(key));
+                    }
+                }
+
+            }
+        }
+
+        return dhcpOptionsMap;
+    }
+
     @Override
     public void execute() {
         CallContext.current().setEventDetails("Vm Id: " + getVmId() + " Network Id: " + getNetworkId());
diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
index da0ce2a2ff9..8161fb2564b 100644
--- a/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java
@@ -24,6 +24,8 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.log4j.Logger;
+
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.affinity.AffinityGroupResponse;
 import org.apache.cloudstack.api.ACL;
@@ -46,7 +48,7 @@
 import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
 import org.apache.cloudstack.context.CallContext;
-import org.apache.log4j.Logger;
+import org.apache.commons.collections.MapUtils;
 
 import com.cloud.event.EventTypes;
 import com.cloud.exception.ConcurrentOperationException;
@@ -58,7 +60,10 @@
 import com.cloud.hypervisor.Hypervisor.HypervisorType;
 import com.cloud.network.Network;
 import com.cloud.network.Network.IpAddresses;
+import com.cloud.offering.DiskOffering;
+import com.cloud.template.VirtualMachineTemplate;
 import com.cloud.uservm.UserVm;
+import com.cloud.utils.net.Dhcp;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.VirtualMachine;
 
@@ -147,7 +152,7 @@
     private List<String> securityGroupNameList;
 
     @Parameter(name = ApiConstants.IP_NETWORK_LIST, type = CommandType.MAP, description = "ip to network mapping. Can't be specified with networkIds parameter."
-            + " Example: iptonetworklist[0].ip=10.10.10.11&iptonetworklist[0].ipv6=fc00:1234:5678::abcd&iptonetworklist[0].networkid=uuid - requests to use ip 10.10.10.11 in network id=uuid")
+            + " Example: iptonetworklist[0].ip=10.10.10.11&iptonetworklist[0].ipv6=fc00:1234:5678::abcd&iptonetworklist[0].networkid=uuid&iptonetworklist[0].mac=aa:bb:cc:dd:ee::ff - requests to use ip 10.10.10.11 in network id=uuid")
     private Map ipToNetworkList;
 
     @Parameter(name = ApiConstants.IP_ADDRESS, type = CommandType.STRING, description = "the ip address for default vm's network")
@@ -156,6 +161,9 @@
     @Parameter(name = ApiConstants.IP6_ADDRESS, type = CommandType.STRING, description = "the ipv6 address for default vm's network")
     private String ip6Address;
 
+    @Parameter(name = ApiConstants.MAC_ADDRESS, type = CommandType.STRING, description = "the mac address for default vm's network")
+    private String macAddress;
+
     @Parameter(name = ApiConstants.KEYBOARD, type = CommandType.STRING, description = "an optional keyboard device type for the virtual machine. valid value can be one of de,de-ch,es,fi,fr,fr-be,fr-ch,is,it,jp,nl-be,no,pt,uk,us")
     private String keyboard;
 
@@ -184,6 +192,14 @@
     @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.DHCP_OPTIONS_NETWORK_LIST, type = CommandType.MAP, description = "DHCP options which are passed to the VM on start up"
+            + " Example: dhcpoptionsnetworklist[0].dhcp:114=url&dhcpoptionsetworklist[0].networkid=networkid&dhcpoptionsetworklist[0].dhcp:66=www.test.com")
+    private Map dhcpOptionsNetworkList;
+
+    @Parameter(name = ApiConstants.DATADISK_OFFERING_LIST, type = CommandType.MAP, since = "4.11", description = "datadisk template to disk-offering mapping;" +
+            " an optional parameter used to create additional data disks from datadisk templates; can't be specified with diskOfferingId parameter")
+    private Map dataDiskTemplateToDiskOfferingList;
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -333,10 +349,19 @@ public boolean getStartVm() {
                 }
                 String requestedIp = ips.get("ip");
                 String requestedIpv6 = ips.get("ipv6");
+                String requestedMac = ips.get("mac");
                 if (requestedIpv6 != null) {
                     requestedIpv6 = NetUtils.standardizeIp6Address(requestedIpv6);
                 }
-                IpAddresses addrs = new IpAddresses(requestedIp, requestedIpv6);
+                if (requestedMac != null) {
+                    if(!NetUtils.isValidMac(requestedMac)) {
+                        throw new InvalidParameterValueException("Mac address is not valid: " + requestedMac);
+                    } else if(!NetUtils.isUnicastMac(requestedMac)) {
+                        throw new InvalidParameterValueException("Mac address is not unicast: " + requestedMac);
+                    }
+                    requestedMac = NetUtils.standardizeMacAddress(requestedMac);
+                }
+                IpAddresses addrs = new IpAddresses(requestedIp, requestedIpv6, requestedMac);
                 ipToNetworkMap.put(networkId, addrs);
             }
         }
@@ -355,6 +380,19 @@ public String getIp6Address() {
         return NetUtils.standardizeIp6Address(ip6Address);
     }
 
+
+    public String getMacAddress() {
+        if (macAddress == null) {
+            return null;
+        }
+        if(!NetUtils.isValidMac(macAddress)) {
+            throw new InvalidParameterValueException("Mac address is not valid: " + macAddress);
+        } else if(!NetUtils.isUnicastMac(macAddress)) {
+            throw new InvalidParameterValueException("Mac address is not unicast: " + macAddress);
+        }
+        return NetUtils.standardizeMacAddress(macAddress);
+    }
+
     public List<Long> getAffinityGroupIdList() {
         if (affinityGroupNameList != null && affinityGroupIdList != null) {
             throw new InvalidParameterValueException("affinitygroupids parameter is mutually exclusive with affinitygroupnames parameter");
@@ -382,6 +420,68 @@ public String getKeyboard() {
         return keyboard;
     }
 
+    public Map<String, Map<Integer, String>> getDhcpOptionsMap() {
+        Map<String, Map<Integer, String>> dhcpOptionsMap = new HashMap<>();
+        if (dhcpOptionsNetworkList != null && !dhcpOptionsNetworkList.isEmpty()) {
+
+            Collection<Map<String, String>> paramsCollection = this.dhcpOptionsNetworkList.values();
+            for (Map<String, String> dhcpNetworkOptions : paramsCollection) {
+                String networkId = dhcpNetworkOptions.get(ApiConstants.NETWORK_ID);
+
+                if (networkId == null) {
+                    throw new IllegalArgumentException("No networkid specified when providing extra dhcp options.");
+                }
+
+                Map<Integer, String> dhcpOptionsForNetwork = new HashMap<>();
+                dhcpOptionsMap.put(networkId, dhcpOptionsForNetwork);
+
+                for (String key : dhcpNetworkOptions.keySet()) {
+                    if (key.startsWith(ApiConstants.DHCP_PREFIX)) {
+                        int dhcpOptionValue = Integer.parseInt(key.replaceFirst(ApiConstants.DHCP_PREFIX, ""));
+                        dhcpOptionsForNetwork.put(dhcpOptionValue, dhcpNetworkOptions.get(key));
+                    } else if (!key.equals(ApiConstants.NETWORK_ID)) {
+                        Dhcp.DhcpOptionCode dhcpOptionEnum = Dhcp.DhcpOptionCode.valueOfString(key);
+                        dhcpOptionsForNetwork.put(dhcpOptionEnum.getCode(), dhcpNetworkOptions.get(key));
+                    }
+                }
+
+            }
+        }
+
+        return dhcpOptionsMap;
+    }
+
+    public Map<Long, DiskOffering> getDataDiskTemplateToDiskOfferingMap() {
+        if (diskOfferingId != null && dataDiskTemplateToDiskOfferingList != null) {
+            throw new InvalidParameterValueException("diskofferingid paramter can't be specified along with datadisktemplatetodiskofferinglist parameter");
+        }
+        if (MapUtils.isEmpty(dataDiskTemplateToDiskOfferingList)) {
+            return new HashMap<Long, DiskOffering>();
+        }
+
+        HashMap<Long, DiskOffering> dataDiskTemplateToDiskOfferingMap = new HashMap<Long, DiskOffering>();
+        for (Object objDataDiskTemplates : dataDiskTemplateToDiskOfferingList.values()) {
+            HashMap<String, String> dataDiskTemplates = (HashMap<String, String>) objDataDiskTemplates;
+            Long dataDiskTemplateId;
+            DiskOffering dataDiskOffering = null;
+            VirtualMachineTemplate dataDiskTemplate= _entityMgr.findByUuid(VirtualMachineTemplate.class, dataDiskTemplates.get("datadisktemplateid"));
+            if (dataDiskTemplate == null) {
+                dataDiskTemplate = _entityMgr.findById(VirtualMachineTemplate.class, dataDiskTemplates.get("datadisktemplateid"));
+                if (dataDiskTemplate == null)
+                    throw new InvalidParameterValueException("Unable to translate and find entity with datadisktemplateid " + dataDiskTemplates.get("datadisktemplateid"));
+            }
+            dataDiskTemplateId = dataDiskTemplate.getId();
+            dataDiskOffering = _entityMgr.findByUuid(DiskOffering.class, dataDiskTemplates.get("diskofferingid"));
+            if (dataDiskOffering == null) {
+                dataDiskOffering = _entityMgr.findById(DiskOffering.class, dataDiskTemplates.get("diskofferingid"));
+                if (dataDiskOffering == null)
+                    throw new InvalidParameterValueException("Unable to translate and find entity with diskofferingId " + dataDiskTemplates.get("diskofferingid"));
+            }
+            dataDiskTemplateToDiskOfferingMap.put(dataDiskTemplateId, dataDiskOffering);
+        }
+        return dataDiskTemplateToDiskOfferingMap;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/ListNicsCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/ListNicsCmd.java
index ccec3e6ac13..30a3b8cce90 100644
--- a/api/src/org/apache/cloudstack/api/command/user/vm/ListNicsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/ListNicsCmd.java
@@ -18,7 +18,8 @@
 
 import java.util.ArrayList;
 import java.util.List;
-
+import com.cloud.vm.NicSecondaryIp;
+import org.apache.cloudstack.api.response.NicSecondaryIpResponse;
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiCommandJobType;
@@ -122,22 +123,45 @@ public static String getResultObjectName() {
     public void execute() throws ResourceUnavailableException, ResourceAllocationException, ConcurrentOperationException, InsufficientCapacityException {
 
         try {
-            List<? extends Nic> results = _networkService.listNics(this);
-            ListResponse<NicResponse> response = new ListResponse<NicResponse>();
-            List<NicResponse> resList = null;
-            if (results != null) {
-                resList = new ArrayList<NicResponse>(results.size());
-                for (Nic r : results) {
-                    NicResponse resp = _responseGenerator.createNicResponse(r);
-                    resp.setObjectName("nic");
-                    resList.add(resp);
+            if (this.getKeyword() != null && !this.getKeyword().isEmpty() && this.getNicId() != null) {
+                List<? extends NicSecondaryIp> results = _networkService.listVmNicSecondaryIps(this);
+                ListResponse<NicSecondaryIpResponse> response = new ListResponse<NicSecondaryIpResponse>();
+                List<NicSecondaryIpResponse> resList = new ArrayList<NicSecondaryIpResponse>();
+                NicSecondaryIpResponse res = new NicSecondaryIpResponse();
+                List<NicSecondaryIpResponse> res_List = new ArrayList<NicSecondaryIpResponse>();
+                if (results != null) {
+                    for (NicSecondaryIp r : results) {
+                        NicSecondaryIpResponse ipRes = _responseGenerator.createSecondaryIPToNicResponse(r);
+                        resList.add(ipRes);
+                        res.setSecondaryIpsList(resList);
+                        res.setObjectName("nic");
+                    }
+
+                    res_List.add(res);
+                    response.setResponses(res_List);
+                }
+                response.setResponses(res_List);
+                response.setResponseName(getCommandName());
+                this.setResponseObject(response);
+
+            } else {
+                List<? extends Nic> results = _networkService.listNics(this);
+                ListResponse<NicResponse> response = new ListResponse<NicResponse>();
+                List<NicResponse> resList = null;
+                if (results != null) {
+                    resList = new ArrayList<NicResponse>(results.size());
+                    for (Nic r : results) {
+                        NicResponse resp = _responseGenerator.createNicResponse(r);
+                        resp.setObjectName("nic");
+                        resList.add(resp);
+                    }
+                    response.setResponses(resList);
                 }
+
                 response.setResponses(resList);
+                response.setResponseName(getCommandName());
+                this.setResponseObject(response);
             }
-            response.setResponses(resList);
-            response.setResponseName(getCommandName());
-            this.setResponseObject(response);
-
         } catch (Exception e) {
             s_logger.warn("Failed to list secondary ip address per nic ");
             throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage());
diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVMCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVMCmd.java
index 4508f7e471a..57e2e9c3c01 100644
--- a/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVMCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVMCmd.java
@@ -17,9 +17,12 @@
 package org.apache.cloudstack.api.command.user.vm;
 
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.log4j.Logger;
+
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import org.apache.cloudstack.api.ACL;
@@ -34,12 +37,12 @@
 import org.apache.cloudstack.api.response.SecurityGroupResponse;
 import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.cloudstack.context.CallContext;
-import org.apache.log4j.Logger;
 
 import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.ResourceUnavailableException;
 import com.cloud.user.Account;
 import com.cloud.uservm.UserVm;
+import com.cloud.utils.net.Dhcp;
 import com.cloud.vm.VirtualMachine;
 
 @APICommand(name = "updateVirtualMachine", description="Updates properties of a virtual machine. The VM has to be stopped and restarted for the " +
@@ -116,6 +119,16 @@
             )
     private List<String> securityGroupNameList;
 
+    @Parameter(name = ApiConstants.CLEAN_UP_DETAILS,
+            type = CommandType.BOOLEAN,
+            description = "optional boolean field, which indicates if details should be cleaned up or not (if set to true, details removed for this resource, details field ignored; if false or not set, no action)")
+    private Boolean cleanupDetails;
+
+    @Parameter(name = ApiConstants.DHCP_OPTIONS_NETWORK_LIST, type = CommandType.MAP, description = "DHCP options which are passed to the VM on start up"
+            + " Example: dhcpoptionsnetworklist[0].dhcp:114=url&dhcpoptionsetworklist[0].networkid=networkid&dhcpoptionsetworklist[0].dhcp:66=www.test.com")
+    private Map dhcpOptionsNetworkList;
+
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
@@ -173,6 +186,41 @@ public String getInstanceName() {
         return securityGroupNameList;
     }
 
+    public boolean isCleanupDetails(){
+        return cleanupDetails == null ? false : cleanupDetails.booleanValue();
+    }
+
+    public Map<String, Map<Integer, String>> getDhcpOptionsMap() {
+        Map<String, Map<Integer, String>> dhcpOptionsMap = new HashMap<>();
+        if (dhcpOptionsNetworkList != null && !dhcpOptionsNetworkList.isEmpty()) {
+
+            Collection<Map<String, String>> paramsCollection = this.dhcpOptionsNetworkList.values();
+            for(Map<String, String> dhcpNetworkOptions : paramsCollection) {
+                String networkId = dhcpNetworkOptions.get(ApiConstants.NETWORK_ID);
+
+                if(networkId == null) {
+                    throw new IllegalArgumentException("No networkid specified when providing extra dhcp options.");
+                }
+
+                Map<Integer, String> dhcpOptionsForNetwork = new HashMap<>();
+                dhcpOptionsMap.put(networkId, dhcpOptionsForNetwork);
+
+                for (String key : dhcpNetworkOptions.keySet()) {
+                    if (key.startsWith(ApiConstants.DHCP_PREFIX)) {
+                        int dhcpOptionValue = Integer.parseInt(key.replaceFirst(ApiConstants.DHCP_PREFIX, ""));
+                        dhcpOptionsForNetwork.put(dhcpOptionValue, dhcpNetworkOptions.get(key));
+                    } else if (!key.equals(ApiConstants.NETWORK_ID)) {
+                        Dhcp.DhcpOptionCode dhcpOptionEnum = Dhcp.DhcpOptionCode.valueOfString(key);
+                        dhcpOptionsForNetwork.put(dhcpOptionEnum.getCode(), dhcpNetworkOptions.get(key));
+                    }
+                }
+
+            }
+        }
+
+        return dhcpOptionsMap;
+    }
+
     /////////////////////////////////////////////////////
     /////////////// API Implementation///////////////////
     /////////////////////////////////////////////////////
diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVmNicIpCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVmNicIpCmd.java
index c6fbedbf631..83fe72e7043 100644
--- a/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVmNicIpCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVmNicIpCmd.java
@@ -150,7 +150,7 @@ public void execute() throws ResourceUnavailableException, ResourceAllocationExc
         CallContext.current().setEventDetails("Nic Id: " + getNicId() );
         String ip;
         if ((ip = getIpaddress()) != null) {
-            if (!NetUtils.isValidIp(ip)) {
+            if (!NetUtils.isValidIp4(ip)) {
                 throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Invalid ip address " + ip);
             }
         }
diff --git a/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java b/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java
index f18793ac581..3e37bbe5e36 100644
--- a/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java
@@ -110,7 +110,7 @@ public String getEventType() {
     @Override
     public void execute() {
         CallContext.current().setEventDetails("VM Id: " + getVmId());
-        VMSnapshot result = _vmSnapshotService.creatVMSnapshot(getVmId(), getEntityId(), getQuiescevm());
+        VMSnapshot result = _vmSnapshotService.createVMSnapshot(getVmId(), getEntityId(), getQuiescevm());
         if (result != null) {
             VMSnapshotResponse response = _responseGenerator.createVMSnapshotResponse(result);
             response.setResponseName(getCommandName());
diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java
index 059def7c167..c858f494fef 100644
--- a/api/src/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java
@@ -16,9 +16,8 @@
 // under the License.
 package org.apache.cloudstack.api.command.user.volume;
 
-import org.apache.log4j.Logger;
-
 import java.util.List;
+
 import org.apache.cloudstack.acl.RoleType;
 import org.apache.cloudstack.api.APICommand;
 import org.apache.cloudstack.api.ApiCommandJobType;
@@ -26,6 +25,7 @@
 import org.apache.cloudstack.api.BaseListTaggedResourcesCmd;
 import org.apache.cloudstack.api.Parameter;
 import org.apache.cloudstack.api.ResponseObject.ResponseView;
+import org.apache.cloudstack.api.response.ClusterResponse;
 import org.apache.cloudstack.api.response.DiskOfferingResponse;
 import org.apache.cloudstack.api.response.HostResponse;
 import org.apache.cloudstack.api.response.ListResponse;
@@ -34,11 +34,12 @@
 import org.apache.cloudstack.api.response.UserVmResponse;
 import org.apache.cloudstack.api.response.VolumeResponse;
 import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.log4j.Logger;
 
 import com.cloud.storage.Volume;
 
-@APICommand(name = "listVolumes", description = "Lists all volumes.", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = {Volume.class},
-        requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+@APICommand(name = "listVolumes", description = "Lists all volumes.", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = {
+        Volume.class}, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
 public class ListVolumesCmd extends BaseListTaggedResourcesCmd {
     public static final Logger s_logger = Logger.getLogger(ListVolumesCmd.class.getName());
 
@@ -54,7 +55,7 @@
     @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = VolumeResponse.class, description = "the ID of the disk volume")
     private Long id;
 
-    @Parameter(name=ApiConstants.IDS, type=CommandType.LIST, collectionType=CommandType.UUID, entityType=VolumeResponse.class, description="the IDs of the volumes, mutually exclusive with id", since = "4.9")
+    @Parameter(name = ApiConstants.IDS, type = CommandType.LIST, collectionType = CommandType.UUID, entityType = VolumeResponse.class, description = "the IDs of the volumes, mutually exclusive with id", since = "4.9")
     private List<Long> ids;
 
     @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "the name of the disk volume")
@@ -63,6 +64,9 @@
     @Parameter(name = ApiConstants.POD_ID, type = CommandType.UUID, entityType = PodResponse.class, description = "the pod id the disk volume belongs to")
     private Long podId;
 
+    @Parameter(name = ApiConstants.CLUSTER_ID, type = CommandType.UUID, entityType = ClusterResponse.class, description = "the cluster id the disk volume belongs to", authorized = {RoleType.Admin})
+    private Long clusterId;
+
     @Parameter(name = ApiConstants.TYPE, type = CommandType.STRING, description = "the type of disk volume")
     private String type;
 
@@ -72,22 +76,15 @@
     @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the ID of the availability zone")
     private Long zoneId;
 
-    @Parameter(name = ApiConstants.STORAGE_ID,
-               type = CommandType.UUID,
-               entityType = StoragePoolResponse.class,
-               description = "the ID of the storage pool, available to ROOT admin only",
-               since = "4.3",
-               authorized = {RoleType.Admin})
-    private Long storageId;
-
-    @Parameter(name = ApiConstants.DISK_OFFERING_ID,
-            type = CommandType.UUID,
-            entityType = DiskOfferingResponse.class,
-            description = "list volumes by disk offering",
-            since = "4.4")
+    @Parameter(name = ApiConstants.STORAGE_ID, type = CommandType.STRING, entityType = StoragePoolResponse.class, description = "the ID of the storage pool, available to ROOT admin only", since = "4.3", authorized = {
+            RoleType.Admin})
+    private String storageId;
+
+    @Parameter(name = ApiConstants.DISK_OFFERING_ID, type = CommandType.UUID, entityType = DiskOfferingResponse.class, description = "list volumes by disk offering", since = "4.4")
     private Long diskOfferingId;
 
-    @Parameter(name = ApiConstants.DISPLAY_VOLUME, type = CommandType.BOOLEAN, description = "list resources by display flag; only ROOT admin is eligible to pass this parameter", since = "4.4", authorized = {RoleType.Admin})
+    @Parameter(name = ApiConstants.DISPLAY_VOLUME, 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;
 
     /////////////////////////////////////////////////////
@@ -98,6 +95,10 @@ public Long getHostId() {
         return hostId;
     }
 
+    public Long getClusterId() {
+        return clusterId;
+    }
+
     public Long getId() {
         return id;
     }
@@ -126,7 +127,7 @@ public Long getZoneId() {
         return zoneId;
     }
 
-    public Long getStorageId() {
+    public String getStorageId() {
         return storageId;
     }
 
diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java
index 4ec94494ac1..8eea632a72e 100644
--- a/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java
@@ -78,6 +78,14 @@
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
 
+    public ResizeVolumeCmd() {}
+
+    public ResizeVolumeCmd(Long id, Long minIops, Long maxIops) {
+        this.id = id;
+        this.minIops = minIops;
+        this.maxIops = maxIops;
+    }
+
     //TODO use the method getId() instead of this one.
     public Long getEntityId() {
         return id;
diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java
index 21749616753..a48a89b79b4 100644
--- a/api/src/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java
@@ -82,7 +82,7 @@
     @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "an optional accountName. Must be used with domainId.")
     private String accountName;
 
-    @Parameter(name = ApiConstants.CHECKSUM, type = CommandType.STRING, description = "the MD5 checksum value of this volume")
+    @Parameter(name = ApiConstants.CHECKSUM, type = CommandType.STRING, description = "the checksum value of this volume. " + ApiConstants.CHECKSUM_PARAMETER_PREFIX_DESCRIPTION)
     private String checksum;
 
     @Parameter(name = ApiConstants.IMAGE_STORE_UUID, type = CommandType.STRING, description = "Image store uuid")
diff --git a/api/src/org/apache/cloudstack/api/command/user/vpc/RestartVPCCmd.java b/api/src/org/apache/cloudstack/api/command/user/vpc/RestartVPCCmd.java
index ea34c6a9580..edfd93e785e 100644
--- a/api/src/org/apache/cloudstack/api/command/user/vpc/RestartVPCCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpc/RestartVPCCmd.java
@@ -49,10 +49,10 @@
     private Long id;
 
     @Parameter(name = ApiConstants.CLEANUP, type = CommandType.BOOLEAN, required = false, description = "If cleanup old network elements")
-    private Boolean cleanup;
+    private Boolean cleanup = false;
 
-    @Parameter(name = ApiConstants.MAKEREDUNDANTE, type = CommandType.BOOLEAN, required = false, description = "Turn a single VPC into a redundant one.")
-    private Boolean makeredundant;
+    @Parameter(name = ApiConstants.MAKEREDUNDANT, type = CommandType.BOOLEAN, required = false, description = "Turn a single VPC into a redundant one.")
+    private Boolean makeredundant = false;
 
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
@@ -63,17 +63,11 @@ public Long getId() {
     }
 
     public Boolean getCleanup() {
-        if (cleanup != null) {
-            return cleanup;
-        }
-        return true;
+        return cleanup;
     }
 
     public Boolean getMakeredundant() {
-        if (makeredundant != null) {
-            return makeredundant;
-        }
-        return true;
+        return makeredundant;
     }
 
     /////////////////////////////////////////////////////
diff --git a/api/src/org/apache/cloudstack/api/command/user/vpn/AddVpnUserCmd.java b/api/src/org/apache/cloudstack/api/command/user/vpn/AddVpnUserCmd.java
index 9993102eca1..9fd4c5a2dfc 100644
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/AddVpnUserCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/AddVpnUserCmd.java
@@ -119,8 +119,12 @@ public String getEventType() {
     public void execute() {
         VpnUser vpnUser = _entityMgr.findById(VpnUser.class, getEntityId());
         Account account = _entityMgr.findById(Account.class, vpnUser.getAccountId());
-        if (!_ravService.applyVpnUsers(vpnUser.getAccountId(), userName)) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add vpn user");
+        try {
+            if (!_ravService.applyVpnUsers(vpnUser.getAccountId(), userName)) {
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add vpn user");
+            }
+        }catch (Exception ex) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, ex.getMessage());
         }
 
         VpnUsersResponse vpnResponse = new VpnUsersResponse();
diff --git a/api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java b/api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java
index e1131092f02..5c2cbfe1128 100644
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java
@@ -89,7 +89,7 @@
     private Long domainId;
 
     @Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class,
-            description = "create site-to-site VPN customer gateway for the project")
+            description = "create site-to-site VPN customer gateway for the project", since = "4.6")
     private Long projectId;
 
     /////////////////////////////////////////////////////
diff --git a/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java b/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java
index 37b7b5aaa3e..12ab531375f 100644
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java
@@ -93,7 +93,7 @@ public String getEventType() {
 
     @Override
     public void execute() throws ResourceUnavailableException {
-        if (! _ravService.destroyRemoteAccessVpnForIp(publicIpId, CallContext.current().getCallingAccount())) {
+        if (! _ravService.destroyRemoteAccessVpnForIp(publicIpId, CallContext.current().getCallingAccount(), false)) {
                        throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete remote access vpn");
         }
     }
diff --git a/api/src/org/apache/cloudstack/api/command/user/vpn/RemoveVpnUserCmd.java b/api/src/org/apache/cloudstack/api/command/user/vpn/RemoveVpnUserCmd.java
index f552b14fbf1..140bdad717f 100644
--- a/api/src/org/apache/cloudstack/api/command/user/vpn/RemoveVpnUserCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/user/vpn/RemoveVpnUserCmd.java
@@ -115,9 +115,14 @@ public void execute() {
             throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to remove vpn user");
         }
 
-        if (!_ravService.applyVpnUsers(owner.getId(), userName)) {
-            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to apply vpn user removal");
+        try {
+            if (!_ravService.applyVpnUsers(owner.getId(), userName)) {
+                throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to apply vpn user removal");
+            }
+        }catch (Exception ex) {
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to remove vpn user due to resource unavailable");
         }
+
         SuccessResponse response = new SuccessResponse(getCommandName());
         setResponseObject(response);
     }
diff --git a/api/src/org/apache/cloudstack/api/response/AccountResponse.java b/api/src/org/apache/cloudstack/api/response/AccountResponse.java
index 7b48a1ea8a1..18b11f10bd1 100644
--- a/api/src/org/apache/cloudstack/api/response/AccountResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/AccountResponse.java
@@ -29,7 +29,6 @@
 import com.cloud.serializer.Param;
 import com.cloud.user.Account;
 
-@SuppressWarnings("unused")
 @EntityReference(value = Account.class)
 public class AccountResponse extends BaseResponse implements ResourceLimitAndCountResponse {
     @SerializedName(ApiConstants.ID)
@@ -222,7 +221,7 @@
 
     @SerializedName("secondarystoragetotal")
     @Param(description = "the total secondary storage space (in GiB) owned by account", since = "4.2.0")
-    private Long secondaryStorageTotal;
+    private float secondaryStorageTotal;
 
     @SerializedName("secondarystorageavailable")
     @Param(description = "the total secondary storage space (in GiB) available to be used for this account", since = "4.2.0")
@@ -501,7 +500,7 @@ public void setSecondaryStorageLimit(String secondaryStorageLimit) {
     }
 
     @Override
-    public void setSecondaryStorageTotal(Long secondaryStorageTotal) {
+    public void setSecondaryStorageTotal(float secondaryStorageTotal) {
         this.secondaryStorageTotal = secondaryStorageTotal;
     }
 
diff --git a/api/src/org/apache/cloudstack/api/response/AcquireIPAddressResponse.java b/api/src/org/apache/cloudstack/api/response/AcquireIPAddressResponse.java
new file mode 100644
index 00000000000..a74c95780d1
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/response/AcquireIPAddressResponse.java
@@ -0,0 +1,286 @@
+//Licensed to the Apache Software Foundation (ASF) under one
+//or more contributor license agreements.  See the NOTICE file
+//distributed with this work for additional information
+//regarding copyright ownership.  The ASF licenses this file
+//to you under the Apache License, Version 2.0 (the
+//"License"); you may not use this file except in compliance
+//with the License.  You may obtain a copy of the License at
+//
+//http://www.apache.org/licenses/LICENSE-2.0
+//
+//Unless required by applicable law or agreed to in writing,
+//software distributed under the License is distributed on an
+//"AS IS" BASIS, WITHOUT 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 java.util.Date;
+import java.util.List;
+
+import org.apache.cloudstack.acl.RoleType;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseResponse;
+import org.apache.cloudstack.api.EntityReference;
+
+import com.cloud.network.IpAddress;
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+
+@EntityReference(value = IpAddress.class)
+@SuppressWarnings("unused")
+public class AcquireIPAddressResponse  extends BaseResponse implements ControlledEntityResponse {
+ @SerializedName(ApiConstants.ID)
+ @Param(description = "public IP address id")
+ private String id;
+
+ @SerializedName(ApiConstants.IP_ADDRESS)
+ @Param(description = "public IP address")
+ private String ipAddress;
+
+ @SerializedName("allocated")
+ @Param(description = "date the public IP address was acquired")
+ private Date allocated;
+
+ @SerializedName(ApiConstants.ZONE_ID)
+ @Param(description = "the ID of the zone the public IP address belongs to")
+ private String zoneId;
+
+ @SerializedName(ApiConstants.ZONE_NAME)
+ @Param(description = "the name of the zone the public IP address belongs to")
+ private String zoneName;
+
+ @SerializedName("issourcenat")
+ @Param(description = "true if the IP address is a source nat address, false otherwise")
+ private Boolean sourceNat;
+
+ @SerializedName(ApiConstants.ACCOUNT)
+ @Param(description = "the account the public IP address is associated with")
+ private String accountName;
+
+ @SerializedName(ApiConstants.PROJECT_ID)
+ @Param(description = "the project id of the ipaddress")
+ private String projectId;
+
+ @SerializedName(ApiConstants.PROJECT)
+ @Param(description = "the project name of the address")
+ private String projectName;
+
+ @SerializedName(ApiConstants.DOMAIN_ID)
+ @Param(description = "the domain ID the public IP address is associated with")
+ private String domainId;
+
+ @SerializedName(ApiConstants.DOMAIN)
+ @Param(description = "the domain the public IP address is associated with")
+ private String domainName;
+
+ @SerializedName(ApiConstants.FOR_VIRTUAL_NETWORK)
+ @Param(description = "the virtual network for the IP address")
+ private Boolean forVirtualNetwork;
+
+ @SerializedName(ApiConstants.VLAN_ID)
+ @Param(description = "the ID of the VLAN associated with the IP address." + " This parameter is visible to ROOT admins only")
+ private String vlanId;
+
+ @SerializedName("vlanname")
+ @Param(description = "the VLAN associated with the IP address")
+ private String vlanName;
+
+ @SerializedName("isstaticnat")
+ @Param(description = "true if this ip is for static nat, false otherwise")
+ private Boolean staticNat;
+
+ @SerializedName(ApiConstants.IS_SYSTEM)
+ @Param(description = "true if this ip is system ip (was allocated as a part of deployVm or createLbRule)")
+ private Boolean isSystem;
+
+ @SerializedName(ApiConstants.VIRTUAL_MACHINE_ID)
+ @Param(description = "virtual machine id the ip address is assigned to (not null only for static nat Ip)")
+ private String virtualMachineId;
+
+ @SerializedName("vmipaddress")
+ @Param(description = "virtual machine (dnat) ip address (not null only for static nat Ip)")
+ private String virtualMachineIp;
+
+ @SerializedName("virtualmachinename")
+ @Param(description = "virtual machine name the ip address is assigned to (not null only for static nat Ip)")
+ private String virtualMachineName;
+
+ @SerializedName("virtualmachinedisplayname")
+ @Param(description = "virtual machine display name the ip address is assigned to (not null only for static nat Ip)")
+ private String virtualMachineDisplayName;
+
+ @SerializedName(ApiConstants.ASSOCIATED_NETWORK_ID)
+ @Param(description = "the ID of the Network associated with the IP address")
+ private String associatedNetworkId;
+
+ @SerializedName(ApiConstants.ASSOCIATED_NETWORK_NAME)
+ @Param(description = "the name of the Network associated with the IP address")
+ private String associatedNetworkName;
+
+ @SerializedName(ApiConstants.NETWORK_ID)
+ @Param(description = "the ID of the Network where ip belongs to")
+ private String networkId;
+
+ @SerializedName(ApiConstants.STATE)
+ @Param(description = "State of the ip address. Can be: Allocatin, Allocated and Releasing")
+ private String state;
+
+ @SerializedName(ApiConstants.PHYSICAL_NETWORK_ID)
+ @Param(description = "the physical network this belongs to")
+ private String physicalNetworkId;
+
+ @SerializedName(ApiConstants.PURPOSE)
+ @Param(description = "purpose of the IP address. In Acton this value is not null for Ips with isSystem=true, and can have either StaticNat or LB value")
+ private String purpose;
+
+ @SerializedName(ApiConstants.VPC_ID)
+ @Param(description = "VPC the ip belongs to")
+ private String vpcId;
+ @SerializedName(ApiConstants.TAGS)
+ @Param(description = "the list of resource tags associated with ip address", responseObject = ResourceTagResponse.class)
+ private List<ResourceTagResponse> tags;
+
+ @SerializedName(ApiConstants.IS_PORTABLE)
+ @Param(description = "is public IP portable across the zones")
+ private Boolean isPortable;
+
+ @SerializedName(ApiConstants.FOR_DISPLAY)
+ @Param(description = "is public ip for display to the regular user", since = "4.4", authorized = {RoleType.Admin})
+ private Boolean forDisplay;
+
+ public void setIpAddress(String ipAddress) {
+     this.ipAddress = ipAddress;
+ }
+
+ @Override
+ public String getObjectId() {
+     return this.getId();
+ }
+
+ public void setAllocated(Date allocated) {
+     this.allocated = allocated;
+ }
+
+ public void setZoneId(String zoneId) {
+     this.zoneId = zoneId;
+ }
+
+ public void setZoneName(String zoneName) {
+     this.zoneName = zoneName;
+ }
+
+ public void setSourceNat(Boolean sourceNat) {
+     this.sourceNat = sourceNat;
+ }
+
+ @Override
+ public void setAccountName(String accountName) {
+     this.accountName = accountName;
+ }
+
+ @Override
+ public void setDomainId(String domainId) {
+     this.domainId = domainId;
+ }
+
+ @Override
+ public void setDomainName(String domainName) {
+     this.domainName = domainName;
+ }
+
+ public void setForVirtualNetwork(Boolean forVirtualNetwork) {
+     this.forVirtualNetwork = forVirtualNetwork;
+ }
+
+ public void setVlanId(String vlanId) {
+     this.vlanId = vlanId;
+ }
+
+ public void setVlanName(String vlanName) {
+     this.vlanName = vlanName;
+ }
+
+ public void setStaticNat(Boolean staticNat) {
+     this.staticNat = staticNat;
+ }
+
+ public void setAssociatedNetworkId(String networkId) {
+     this.associatedNetworkId = networkId;
+ }
+
+ public void setNetworkId(String networkId) {
+     this.networkId = networkId;
+ }
+
+ public void setVirtualMachineId(String virtualMachineId) {
+     this.virtualMachineId = virtualMachineId;
+ }
+
+ public void setVirtualMachineIp(String virtualMachineIp) {
+     this.virtualMachineIp = virtualMachineIp;
+ }
+
+ public void setVirtualMachineName(String virtualMachineName) {
+     this.virtualMachineName = virtualMachineName;
+ }
+
+ public void setVirtualMachineDisplayName(String virtualMachineDisplayName) {
+     this.virtualMachineDisplayName = virtualMachineDisplayName;
+ }
+
+ public String getId() {
+     return id;
+ }
+
+ public void setId(String id) {
+     this.id = id;
+ }
+
+ public void setState(String state) {
+     this.state = state;
+ }
+
+ @Override
+ public void setProjectId(String projectId) {
+     this.projectId = projectId;
+ }
+
+ @Override
+ public void setProjectName(String projectName) {
+     this.projectName = projectName;
+ }
+
+ public void setPhysicalNetworkId(String physicalNetworkId) {
+     this.physicalNetworkId = physicalNetworkId;
+ }
+
+ public void setIsSystem(Boolean isSystem) {
+     this.isSystem = isSystem;
+ }
+
+ public void setPurpose(String purpose) {
+     this.purpose = purpose;
+ }
+
+ public void setVpcId(String vpcId) {
+     this.vpcId = vpcId;
+ }
+
+ public void setTags(List<ResourceTagResponse> tags) {
+     this.tags = tags;
+ }
+
+ public void setAssociatedNetworkName(String associatedNetworkName) {
+     this.associatedNetworkName = associatedNetworkName;
+ }
+
+ public void setPortable(Boolean portable) {
+     this.isPortable = portable;
+ }
+
+ public void setForDisplay(Boolean forDisplay) {
+     this.forDisplay = forDisplay;
+ }
+}
diff --git a/api/src/org/apache/cloudstack/api/response/AcquirePodIpCmdResponse.java b/api/src/org/apache/cloudstack/api/response/AcquirePodIpCmdResponse.java
new file mode 100644
index 00000000000..3eece1d7afb
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/response/AcquirePodIpCmdResponse.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.response;
+
+import com.google.gson.annotations.SerializedName;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseResponse;
+
+import com.cloud.serializer.Param;
+
+public class AcquirePodIpCmdResponse extends BaseResponse {
+
+    @SerializedName(ApiConstants.IP_ADDRESS)
+    @Param(description = "Allocated IP address")
+    private String ipAddress;
+
+    @SerializedName(ApiConstants.POD_ID)
+    @Param(description = "the ID of the pod the  IP address belongs to")
+    private Long podId;
+
+    @SerializedName(ApiConstants.GATEWAY)
+    @Param(description = "Gateway for Pod ")
+    private String gateway;
+
+    @SerializedName(ApiConstants.CIDR)
+    @Param(description = "CIDR of the Pod")
+    private String cidrAddress;
+
+    @SerializedName(ApiConstants.NIC_ID)
+    @Param(description = "the ID of the nic")
+    private Long instanceId;
+
+    @SerializedName(ApiConstants.HOST_MAC)
+    @Param(description = "MAC address of the pod the  IP")
+    private Long macAddress;
+
+    @SerializedName(ApiConstants.ID)
+    @Param(description = "the ID of the pod the  IP address")
+    private long id;
+
+    public void setIpAddress(String ipAddress) {
+        this.ipAddress = ipAddress;
+    }
+
+    public void setInstanceId(Long instanceId) {
+        this.instanceId = instanceId;
+    }
+
+    public void setPodId(long podId) {
+        this.podId = podId;
+    }
+
+    public void setMacAddress(long macAddress) {
+        this.macAddress = macAddress;
+    }
+
+    public void setGateway(String gateway) {
+        this.gateway = gateway;
+    }
+
+    public void setCidrAddress(String cidrAddress) {
+        this.cidrAddress = cidrAddress;
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public Long getInstanceId() {
+        return instanceId;
+    }
+
+    public long getPodId() {
+        return podId;
+    }
+
+    public String getIpAddress() {
+        return ipAddress;
+    }
+
+    public long getMacAddress() {
+        return macAddress;
+    }
+
+    public String getCidrAddress() {
+        return cidrAddress;
+    }
+
+    public String getGateway() {
+        return gateway;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+}
\ No newline at end of file
diff --git a/api/src/org/apache/cloudstack/api/response/AnnotationResponse.java b/api/src/org/apache/cloudstack/api/response/AnnotationResponse.java
new file mode 100644
index 00000000000..c16971ae7f3
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/response/AnnotationResponse.java
@@ -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.
+package org.apache.cloudstack.api.response;
+
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+import org.apache.cloudstack.annotation.Annotation;
+import org.apache.cloudstack.annotation.AnnotationService;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseResponse;
+import org.apache.cloudstack.api.EntityReference;
+
+import java.util.Date;
+
+/**
+ * @since 4.11
+ */
+@EntityReference(value = Annotation.class)
+public class AnnotationResponse extends BaseResponse {
+    @SerializedName(ApiConstants.ID)
+    @Param(description = "the (uu)id of the annotation")
+    private String uuid;
+
+    @SerializedName(ApiConstants.ENTITY_TYPE)
+    @Param(description = "the type of the annotated entity")
+    private String entityType;
+
+    @SerializedName(ApiConstants.ENTITY_ID)
+    @Param(description = "the (uu)id of the entitiy to which this annotation pertains")
+    private String entityUuid;
+
+    @SerializedName(ApiConstants.ANNOTATION)
+    @Param(description = "the contents of the annotation")
+    private String annotation;
+
+    @SerializedName(ApiConstants.USER_ID)
+    @Param(description = "The (uu)id of the user that entered the annotation")
+    private String userUuid;
+
+    @SerializedName(ApiConstants.CREATED)
+    @Param(description = "the creation timestamp for this annotation")
+    private Date created;
+
+    @SerializedName(ApiConstants.REMOVED)
+    @Param(description = "the removal timestamp for this annotation")
+    private Date removed;
+
+    public String getUuid() {
+        return uuid;
+    }
+
+    public void setUuid(String uuid) {
+        this.uuid = uuid;
+    }
+
+    public String getEntityType() {
+        return entityType;
+    }
+
+    public void setEntityType(String entityType) {
+        this.entityType = entityType;
+    }
+
+    public void setEntityType(AnnotationService.EntityType entityType) {
+        this.entityType = entityType.toString();
+    }
+
+    public String getEntityUuid() {
+        return entityUuid;
+    }
+
+    public void setEntityUuid(String entityUuid) {
+        this.entityUuid = entityUuid;
+    }
+
+    public String getAnnotation() {
+        return annotation;
+    }
+
+    public void setAnnotation(String annotation) {
+        this.annotation = annotation;
+    }
+
+    public String getUserUuid() {
+        return userUuid;
+    }
+
+    public void setUserUuid(String userUuid) {
+        this.userUuid = userUuid;
+    }
+
+    public Date getCreated() {
+        return created;
+    }
+
+    public void setCreated(Date created) {
+        this.created = created;
+    }
+
+    public Date getRemoved() {
+        return removed;
+    }
+
+    public void setRemoved(Date removed) {
+        this.removed = removed;
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/response/AutoScaleVmProfileResponse.java b/api/src/org/apache/cloudstack/api/response/AutoScaleVmProfileResponse.java
index 2c219357150..412af1c2736 100644
--- a/api/src/org/apache/cloudstack/api/response/AutoScaleVmProfileResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/AutoScaleVmProfileResponse.java
@@ -75,6 +75,7 @@
     @Parameter(name = ApiConstants.CS_URL,
                type = CommandType.STRING,
                description = "the API URL including port of the CloudStack Management Server example: http://server.cloud.com:8080/client/api?")
+    // leaving cloud.com reference above as it serves only as an example
     private String csUrl;
 
     @SerializedName(ApiConstants.ACCOUNT)
diff --git a/api/src/org/apache/cloudstack/api/response/CAProviderResponse.java b/api/src/org/apache/cloudstack/api/response/CAProviderResponse.java
new file mode 100644
index 00000000000..94d5882e18a
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/response/CAProviderResponse.java
@@ -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.
+
+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;
+import org.apache.cloudstack.api.EntityReference;
+import org.apache.cloudstack.framework.ca.CAProvider;
+
+@EntityReference(value = CAProvider.class)
+public class CAProviderResponse extends BaseResponse {
+    @SerializedName(ApiConstants.NAME)
+    @Param(description = "the CA service provider name")
+    private String name;
+
+    @SerializedName(ApiConstants.DESCRIPTION)
+    @Param(description = "the description of the CA service provider")
+    private String description;
+
+    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/org/apache/cloudstack/api/response/CapacityResponse.java b/api/src/org/apache/cloudstack/api/response/CapacityResponse.java
index 460e4af8926..e9724497c38 100644
--- a/api/src/org/apache/cloudstack/api/response/CapacityResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/CapacityResponse.java
@@ -28,6 +28,10 @@
     @Param(description = "the capacity type")
     private Short capacityType;
 
+    @SerializedName(ApiConstants.NAME)
+    @Param(description="the capacity name")
+    private String capacityName;
+
     @SerializedName(ApiConstants.ZONE_ID)
     @Param(description = "the Zone ID")
     private String zoneId;
@@ -52,6 +56,10 @@
     @Param(description = "the Cluster name")
     private String clusterName;
 
+    @SerializedName("capacityallocated")
+    @Param(description="the capacity currently in allocated")
+    private Long capacityAllocated;
+
     @SerializedName("capacityused")
     @Param(description = "the capacity currently in use")
     private Long capacityUsed;
@@ -72,6 +80,14 @@ public void setCapacityType(Short capacityType) {
         this.capacityType = capacityType;
     }
 
+    public String getCapacityName() {
+        return capacityName;
+    }
+
+    public void setCapacityName(String capacityName) {
+        this.capacityName = capacityName;
+    }
+
     public String getZoneId() {
         return zoneId;
     }
@@ -120,6 +136,14 @@ public void setClusterName(String clusterName) {
         this.clusterName = clusterName;
     }
 
+    public Long getCapacityAllocated() {
+        return capacityAllocated;
+    }
+
+    public void setCapacityAllocated(Long capacityAllocated) {
+        this.capacityAllocated = capacityAllocated;
+    }
+
     public Long getCapacityUsed() {
         return capacityUsed;
     }
diff --git a/api/src/org/apache/cloudstack/api/response/CertificateResponse.java b/api/src/org/apache/cloudstack/api/response/CertificateResponse.java
new file mode 100644
index 00000000000..f8c3ecc7404
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/response/CertificateResponse.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 org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseResponse;
+
+import com.cloud.serializer.Param;
+import com.google.gson.annotations.SerializedName;
+
+public class CertificateResponse extends BaseResponse {
+    @SerializedName(ApiConstants.CERTIFICATE)
+    @Param(description = "The client certificate")
+    private String certificate = "";
+
+    @SerializedName(ApiConstants.PRIVATE_KEY)
+    @Param(description = "Private key for the certificate")
+    private String privateKey;
+
+    @SerializedName(ApiConstants.CA_CERTIFICATES)
+    @Param(description = "The CA certificate(s)")
+    private String caCertificate;
+
+    public CertificateResponse() {
+        setObjectName("certificates");
+    }
+
+    public CertificateResponse(final String objectName) {
+        setObjectName(objectName);
+    }
+
+    public void setCertificate(final String certificate) {
+        this.certificate = certificate;
+    }
+
+    public void setPrivateKey(final String privateKey) {
+        this.privateKey = privateKey;
+    }
+
+    public void setCaCertificate(final String caCertificate) {
+        this.caCertificate = caCertificate;
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/response/ChildTemplateResponse.java b/api/src/org/apache/cloudstack/api/response/ChildTemplateResponse.java
new file mode 100644
index 00000000000..b036cd48e87
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/response/ChildTemplateResponse.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.api.response;
+
+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.cloud.template.VirtualMachineTemplate;
+import com.google.gson.annotations.SerializedName;
+
+@EntityReference(value = VirtualMachineTemplate.class)
+@SuppressWarnings("unused")
+public class ChildTemplateResponse extends BaseResponse {
+    @SerializedName(ApiConstants.ID)
+    @Param(description = "the template ID")
+    private String id;
+
+    @SerializedName(ApiConstants.NAME)
+    @Param(description = "the template name")
+    private String name;
+
+    @SerializedName(ApiConstants.SIZE)
+    @Param(description = "the size of the template")
+    private Integer size;
+
+    @SerializedName("templatetype")
+    @Param(description = "the type of the template")
+    private String templateType;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void setSize(Integer size) {
+        this.size = size;
+    }
+
+    public void setTemplateType(String templateType) {
+        this.templateType = templateType;
+    }
+
+}
diff --git a/api/src/org/apache/cloudstack/api/response/DomainResponse.java b/api/src/org/apache/cloudstack/api/response/DomainResponse.java
index e848759c9e4..7e5bd970d29 100644
--- a/api/src/org/apache/cloudstack/api/response/DomainResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/DomainResponse.java
@@ -165,7 +165,7 @@
     private String secondaryStorageLimit;
 
     @SerializedName("secondarystoragetotal") @Param(description="the total secondary storage space (in GiB) owned by domain", since="4.2.0")
-    private Long secondaryStorageTotal;
+    private float secondaryStorageTotal;
 
     @SerializedName("secondarystorageavailable") @Param(description="the total secondary storage space (in GiB) available to be used for this domain", since="4.2.0")
     private String secondaryStorageAvailable;
@@ -399,7 +399,7 @@ public void setSecondaryStorageLimit(String secondaryStorageLimit) {
     }
 
     @Override
-    public void setSecondaryStorageTotal(Long secondaryStorageTotal) {
+    public void setSecondaryStorageTotal(float secondaryStorageTotal) {
         this.secondaryStorageTotal = secondaryStorageTotal;
     }
 
diff --git a/api/src/org/apache/cloudstack/api/response/EventResponse.java b/api/src/org/apache/cloudstack/api/response/EventResponse.java
index 5ce66edcd28..da15434e6d0 100644
--- a/api/src/org/apache/cloudstack/api/response/EventResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/EventResponse.java
@@ -78,7 +78,7 @@
     @Param(description = "the state of the event")
     private Event.State state;
 
-    @SerializedName("parentid")
+    @SerializedName(ApiConstants.PARENT_ID)
     @Param(description = "whether the event is parented")
     private String parentId;
 
diff --git a/api/src/org/apache/cloudstack/api/response/FirewallResponse.java b/api/src/org/apache/cloudstack/api/response/FirewallResponse.java
index 462bd1bd1b0..eabc935f424 100644
--- a/api/src/org/apache/cloudstack/api/response/FirewallResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/FirewallResponse.java
@@ -79,6 +79,10 @@
     @Param(description = "is rule for display to the regular user", since = "4.4", authorized = {RoleType.Admin})
     private Boolean forDisplay;
 
+    @SerializedName(ApiConstants.DEST_CIDR_LIST)
+    @Param(description = "the cidr list to forward traffic to")
+    private String destCidr;
+
     public void setId(String id) {
         this.id = id;
     }
@@ -130,4 +134,8 @@ public void setTags(List<ResourceTagResponse> tags) {
     public void setForDisplay(Boolean forDisplay) {
         this.forDisplay = forDisplay;
     }
+
+    public void setDestCidr(String cidrList){
+        this.destCidr = cidrList;
+    }
 }
diff --git a/api/src/org/apache/cloudstack/api/response/GuestOSResponse.java b/api/src/org/apache/cloudstack/api/response/GuestOSResponse.java
index 6822288a862..c1a57c3e0e1 100644
--- a/api/src/org/apache/cloudstack/api/response/GuestOSResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/GuestOSResponse.java
@@ -41,7 +41,7 @@
 
     @SerializedName(ApiConstants.IS_USER_DEFINED)
     @Param(description = "is the guest OS user defined")
-    private String isUserDefined;
+    private Boolean isUserDefined;
 
     public String getId() {
         return id;
@@ -67,11 +67,11 @@ public void setDescription(String description) {
         this.description = description;
     }
 
-    public String getIsUserDefined() {
+    public Boolean getIsUserDefined() {
         return isUserDefined;
     }
 
-    public void setIsUserDefined(String isUserDefined) {
+    public void setIsUserDefined(Boolean isUserDefined) {
         this.isUserDefined = isUserDefined;
     }
 
diff --git a/api/src/org/apache/cloudstack/api/response/HAProviderResponse.java b/api/src/org/apache/cloudstack/api/response/HAProviderResponse.java
new file mode 100644
index 00000000000..d75cbc3e120
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/response/HAProviderResponse.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;
+import org.apache.cloudstack.api.EntityReference;
+import org.apache.cloudstack.ha.HAConfig;
+
+import java.util.List;
+
+@EntityReference(value = HAConfig.class)
+public final class HAProviderResponse extends BaseResponse {
+    @SerializedName(ApiConstants.HA_PROVIDER)
+    @Param(description = "the HA provider")
+    private String provider;
+
+    @SerializedName(ApiConstants.TYPE)
+    @Param(description = "the HA provider resource type detail")
+    private List<String> supportedResourceTypes;
+
+    public HAProviderResponse() {
+        super("haprovider");
+    }
+
+    public String getProvider() {
+        return provider;
+    }
+
+    public void setProvider(String provider) {
+        this.provider = provider;
+    }
+
+    public List<String> getSupportedResourceTypes() {
+        return supportedResourceTypes;
+    }
+
+    public void setSupportedResourceTypes(List<String> supportedResourceTypes) {
+        this.supportedResourceTypes = supportedResourceTypes;
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/response/HostForMigrationResponse.java b/api/src/org/apache/cloudstack/api/response/HostForMigrationResponse.java
index 2f3c86b0a0c..8cc31097205 100644
--- a/api/src/org/apache/cloudstack/api/response/HostForMigrationResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/HostForMigrationResponse.java
@@ -107,6 +107,15 @@
     @Param(description = "the amount of the host's CPU after applying the cpu.overprovisioning.factor ")
     private String cpuWithOverprovisioning;
 
+    @Deprecated
+    @SerializedName("memorytotal")
+    @Param(description = "the memory total of the host, this parameter is deprecated use memorywithoverprovisioning")
+    private Long memoryTotal;
+
+    @SerializedName("memorywithoverprovisioning")
+    @Param(description = "the amount of the host's memory after applying the mem.overprovisioning.factor ")
+    private String memWithOverprovisioning;
+
     @SerializedName("averageload")
     @Param(description = "the cpu average load on the host")
     private Long averageLoad;
@@ -119,13 +128,9 @@
     @Param(description = "the outgoing network traffic on the host")
     private Long networkKbsWrite;
 
-    @SerializedName("memorytotal")
-    @Param(description = "the memory total of the host")
-    private Long memoryTotal;
-
     @SerializedName("memoryallocated")
     @Param(description = "the amount of the host's memory currently allocated")
-    private Long memoryAllocated;
+    private String memoryAllocated;
 
     @SerializedName("memoryused")
     @Param(description = "the amount of the host's memory currently used")
@@ -305,11 +310,7 @@ public void setNetworkKbsWrite(Long networkKbsWrite) {
         this.networkKbsWrite = networkKbsWrite;
     }
 
-    public void setMemoryTotal(Long memoryTotal) {
-        this.memoryTotal = memoryTotal;
-    }
-
-    public void setMemoryAllocated(Long memoryAllocated) {
+    public void setMemoryAllocated(String memoryAllocated) {
         this.memoryAllocated = memoryAllocated;
     }
 
@@ -401,6 +402,10 @@ public void setCpuWithOverprovisioning(String cpuWithOverprovisioning) {
         this.cpuWithOverprovisioning = cpuWithOverprovisioning;
     }
 
+    public void setMemWithOverprovisioning(String memWithOverprovisioning){
+        this.memWithOverprovisioning=memWithOverprovisioning;
+    }
+
     public void setHypervisorVersion(String hypervisorVersion) {
         this.hypervisorVersion = hypervisorVersion;
     }
@@ -408,4 +413,8 @@ public void setHypervisorVersion(String hypervisorVersion) {
     public void setHaHost(Boolean haHost) {
         this.haHost = haHost;
     }
+
+    public void setMemoryTotal(Long memoryTotal) {
+        this.memoryTotal = memoryTotal;
+    }
 }
diff --git a/api/src/org/apache/cloudstack/api/response/HostHAResponse.java b/api/src/org/apache/cloudstack/api/response/HostHAResponse.java
new file mode 100644
index 00000000000..a8b44bd5649
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/response/HostHAResponse.java
@@ -0,0 +1,107 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT 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;
+import org.apache.cloudstack.api.EntityReference;
+import org.apache.cloudstack.ha.HAConfig;
+
+@EntityReference(value = HAConfig.class)
+public final class HostHAResponse extends BaseResponse {
+    @SerializedName(ApiConstants.HOST_ID)
+    @Param(description = "the ID of the host")
+    private String id;
+
+    @SerializedName(ApiConstants.HA_ENABLE)
+    @Param(description = "if host HA is enabled for the host")
+    private Boolean enabled;
+
+    @SerializedName(ApiConstants.HA_STATE)
+    @Param(description = "the HA state of the host")
+    private HAConfig.HAState haState;
+
+    @SerializedName(ApiConstants.HA_PROVIDER)
+    @Param(description = "the host HA provider")
+    private String provider;
+
+    @SerializedName(ApiConstants.STATUS)
+    @Param(description = "operation status")
+    private Boolean status;
+
+    public HostHAResponse() {
+        super("hostha");
+    }
+
+    public HostHAResponse(final HAConfig config) {
+        this();
+        if (config == null) {
+            this.enabled = false;
+            this.haState = HAConfig.HAState.Disabled;
+            return;
+        }
+        setProvider(config.getHaProvider());
+        setEnabled(config.isEnabled());
+        setHaState(config.getState());
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    public void setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public HAConfig.HAState getHaState() {
+        return haState;
+    }
+
+    public void setHaState(HAConfig.HAState haState) {
+        this.haState = haState;
+        if (haState == null) {
+            this.haState = HAConfig.HAState.Disabled;
+        }
+    }
+
+    public String getProvider() {
+        return provider;
+    }
+
+    public void setProvider(String provider) {
+        this.provider = provider;
+    }
+
+    public Boolean getStatus() {
+        return status;
+    }
+
+    public void setStatus(Boolean status) {
+        this.status = status;
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/response/HostResponse.java b/api/src/org/apache/cloudstack/api/response/HostResponse.java
index 90fe800a8bc..b9667eca241 100644
--- a/api/src/org/apache/cloudstack/api/response/HostResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/HostResponse.java
@@ -24,6 +24,7 @@
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseResponse;
 import org.apache.cloudstack.api.EntityReference;
+import org.apache.cloudstack.ha.HAConfig;
 import org.apache.cloudstack.outofbandmanagement.OutOfBandManagement;
 
 import java.util.Date;
@@ -125,13 +126,18 @@
     @Param(description = "the outgoing network traffic on the host")
     private Long networkKbsWrite;
 
+    @Deprecated
     @SerializedName("memorytotal")
-    @Param(description = "the memory total of the host")
+    @Param(description = "the memory total of the host, this parameter is deprecated use memorywithoverprovisioning")
     private Long memoryTotal;
 
+    @SerializedName("memorywithoverprovisioning")
+    @Param(description = "the amount of the host's memory after applying the mem.overprovisioning.factor")
+    private String memWithOverprovisioning;
+
     @SerializedName("memoryallocated")
     @Param(description = "the amount of the host's memory currently allocated")
-    private Long memoryAllocated;
+    private long memoryAllocated;
 
     @SerializedName("memoryused")
     @Param(description = "the amount of the host's memory currently used")
@@ -201,6 +207,10 @@
     @Param(description = "true if this host is suitable(has enough capacity and satisfies all conditions like hosttags, max guests vm limit etc) to migrate a VM to it , false otherwise")
     private Boolean suitableForMigration;
 
+    @SerializedName("hostha")
+    @Param(description = "the host HA information information")
+    private HostHAResponse hostHAResponse;
+
     @SerializedName("outofbandmanagement")
     @Param(description = "the host out-of-band management information")
     private OutOfBandManagementResponse outOfBandManagementResponse;
@@ -221,6 +231,17 @@
     @Param(description = "Host details in key/value pairs.", since = "4.5")
     private Map details;
 
+    @SerializedName(ApiConstants.ANNOTATION)
+    @Param(description = "the last annotation set on this host by an admin", since = "4.11")
+    private String annotation;
+
+    @SerializedName(ApiConstants.LAST_ANNOTATED)
+    @Param(description = "the last time this host was annotated", since = "4.11")
+    private Date lastAnnotated;
+
+    @SerializedName(ApiConstants.USERNAME)
+    @Param(description = "the admin that annotated this host", since = "4.11")
+    private String username;
 
     // Default visibility to support accessing the details from unit tests
     Map getDetails() {
@@ -328,11 +349,11 @@ public void setNetworkKbsWrite(Long networkKbsWrite) {
         this.networkKbsWrite = networkKbsWrite;
     }
 
-    public void setMemoryTotal(Long memoryTotal) {
-        this.memoryTotal = memoryTotal;
+    public void setMemWithOverprovisioning(String memWithOverprovisioning){
+        this.memWithOverprovisioning=memWithOverprovisioning;
     }
 
-    public void setMemoryAllocated(Long memoryAllocated) {
+    public void setMemoryAllocated(long memoryAllocated) {
         this.memoryAllocated = memoryAllocated;
     }
 
@@ -408,6 +429,14 @@ public void setSuitableForMigration(Boolean suitableForMigration) {
         this.suitableForMigration = suitableForMigration;
     }
 
+    public HostHAResponse getHostHAResponse() {
+        return hostHAResponse;
+    }
+
+    public void setHostHAResponse(final HAConfig config) {
+        this.hostHAResponse = new HostHAResponse(config);
+    }
+
     public OutOfBandManagementResponse getOutOfBandManagementResponse() {
         return outOfBandManagementResponse;
     }
@@ -440,6 +469,18 @@ public void setHaHost(Boolean haHost) {
         this.haHost = haHost;
     }
 
+    public void setAnnotation(String annotation) {
+        this.annotation = annotation;
+    }
+
+    public void setLastAnnotated(Date lastAnnotated) {
+        this.lastAnnotated = lastAnnotated;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
     public void setDetails(Map details) {
 
         if (details == null) {
@@ -458,6 +499,9 @@ public void setDetails(Map details) {
 
     }
 
+    public void setMemoryTotal(Long memoryTotal) {
+        this.memoryTotal = memoryTotal;
+    }
     public String getName() {
         return name;
     }
@@ -542,7 +586,7 @@ public Long getMemoryTotal() {
         return memoryTotal;
     }
 
-    public Long getMemoryAllocated() {
+    public long getMemoryAllocated() {
         return memoryAllocated;
     }
 
diff --git a/api/src/org/apache/cloudstack/api/response/IPAddressResponse.java b/api/src/org/apache/cloudstack/api/response/IPAddressResponse.java
index 3c03247eddb..d3d98c87f17 100644
--- a/api/src/org/apache/cloudstack/api/response/IPAddressResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/IPAddressResponse.java
@@ -96,19 +96,19 @@
     private Boolean isSystem;
 
     @SerializedName(ApiConstants.VIRTUAL_MACHINE_ID)
-    @Param(description = "virutal machine id the ip address is assigned to (not null only for static nat Ip)")
+    @Param(description = "virtual machine id the ip address is assigned to (not null only for static nat Ip)")
     private String virtualMachineId;
 
     @SerializedName("vmipaddress")
-    @Param(description = "virutal machine (dnat) ip address (not null only for static nat Ip)")
+    @Param(description = "virtual machine (dnat) ip address (not null only for static nat Ip)")
     private String virtualMachineIp;
 
     @SerializedName("virtualmachinename")
-    @Param(description = "virutal machine name the ip address is assigned to (not null only for static nat Ip)")
+    @Param(description = "virtual machine name the ip address is assigned to (not null only for static nat Ip)")
     private String virtualMachineName;
 
     @SerializedName("virtualmachinedisplayname")
-    @Param(description = "virutal machine display name the ip address is assigned to (not null only for static nat Ip)")
+    @Param(description = "virtual machine display name the ip address is assigned to (not null only for static nat Ip)")
     private String virtualMachineDisplayName;
 
     @SerializedName(ApiConstants.ASSOCIATED_NETWORK_ID)
diff --git a/api/src/org/apache/cloudstack/api/response/ImageStoreResponse.java b/api/src/org/apache/cloudstack/api/response/ImageStoreResponse.java
index bb44a01979c..aaef652073e 100644
--- a/api/src/org/apache/cloudstack/api/response/ImageStoreResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/ImageStoreResponse.java
@@ -16,9 +16,6 @@
 // under the License.
 package org.apache.cloudstack.api.response;
 
-import java.util.LinkedHashSet;
-import java.util.Set;
-
 import com.google.gson.annotations.SerializedName;
 
 import org.apache.cloudstack.api.ApiConstants;
@@ -63,12 +60,7 @@
     @Param(description = "the scope of the image store")
     private ScopeType scope;
 
-    @SerializedName("details")
-    @Param(description = "the details of the image store")
-    private Set<ImageStoreDetailResponse> details;
-
     public ImageStoreResponse() {
-        this.details = new LinkedHashSet<ImageStoreDetailResponse>();
     }
 
     @Override
@@ -140,16 +132,4 @@ public void setProtocol(String protocol) {
         this.protocol = protocol;
     }
 
-    public Set<ImageStoreDetailResponse> getDetails() {
-        return details;
-    }
-
-    public void setDetails(Set<ImageStoreDetailResponse> details) {
-        this.details = details;
-    }
-
-    public void addDetail(ImageStoreDetailResponse detail) {
-        this.details.add(detail);
-    }
-
 }
diff --git a/api/src/org/apache/cloudstack/api/response/LoadBalancerResponse.java b/api/src/org/apache/cloudstack/api/response/LoadBalancerResponse.java
index 21e1dab450e..1eb8fca5087 100644
--- a/api/src/org/apache/cloudstack/api/response/LoadBalancerResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/LoadBalancerResponse.java
@@ -95,6 +95,10 @@
     @Param(description = "the id of the zone the rule belongs to")
     private String zoneId;
 
+    @SerializedName(ApiConstants.ZONE_NAME)
+    @Param(description = "the name of the zone the load balancer rule belongs to", since = "4.11")
+    private String zoneName;
+
     @SerializedName(ApiConstants.PROTOCOL)
     @Param(description = "the protocol of the loadbalanacer rule")
     private String lbProtocol;
@@ -166,6 +170,10 @@ public void setZoneId(String zoneId) {
         this.zoneId = zoneId;
     }
 
+    public void setZoneName(String zoneName) {
+        this.zoneName = zoneName;
+    }
+
     @Override
     public void setProjectId(String projectId) {
         this.projectId = projectId;
diff --git a/api/src/org/apache/cloudstack/api/response/LoginCmdResponse.java b/api/src/org/apache/cloudstack/api/response/LoginCmdResponse.java
index 55eb2c40a38..d2d122efb66 100644
--- a/api/src/org/apache/cloudstack/api/response/LoginCmdResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/LoginCmdResponse.java
@@ -58,6 +58,10 @@
     @Param(description = "user time zone")
     private String timeZone;
 
+    @SerializedName(value = ApiConstants.TIMEZONEOFFSET)
+    @Param(description = "user time zoneoffset")
+    private String timeZoneOffset;
+
     @SerializedName(value = ApiConstants.REGISTERED)
     @Param(description = "Is user registered")
     private String registered;
@@ -138,6 +142,12 @@ public void setTimeZone(String timeZone) {
         this.timeZone = timeZone;
     }
 
+    public String getTimeZoneOffset() {
+        return timeZoneOffset;
+    }
+
+    public void setTimeZoneOffset(String timeZoneOffset) { this.timeZoneOffset = timeZoneOffset; }
+
     public String getRegistered() {
         return registered;
     }
diff --git a/api/src/org/apache/cloudstack/api/response/NetworkOfferingResponse.java b/api/src/org/apache/cloudstack/api/response/NetworkOfferingResponse.java
index 775c9a8fdd1..93cbb12976b 100644
--- a/api/src/org/apache/cloudstack/api/response/NetworkOfferingResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/NetworkOfferingResponse.java
@@ -120,6 +120,10 @@
     @Param(description = "true if network offering supports network that span multiple zones", since = "4.4")
     private Boolean supportsStrechedL2Subnet;
 
+    @SerializedName(ApiConstants.SUPPORTS_PUBLIC_ACCESS)
+    @Param(description = "true if network offering supports public access for guest networks", since = "4.10.0")
+    private Boolean supportsPublicAccess;
+
     public void setId(String id) {
         this.id = id;
     }
@@ -207,4 +211,8 @@ public void setConcurrentConnections(Integer concurrentConnections) {
     public void setSupportsStrechedL2Subnet(Boolean supportsStrechedL2Subnet) {
         this.supportsStrechedL2Subnet = supportsStrechedL2Subnet;
     }
+
+    public void setSupportsPublicAccess(Boolean supportsPublicAccess) {
+        this.supportsPublicAccess = supportsPublicAccess;
+    }
 }
diff --git a/api/src/org/apache/cloudstack/api/response/NetworkResponse.java b/api/src/org/apache/cloudstack/api/response/NetworkResponse.java
index 40c90729cd6..8d0f725500b 100644
--- a/api/src/org/apache/cloudstack/api/response/NetworkResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/NetworkResponse.java
@@ -225,6 +225,14 @@
     @Param(description = "If a network is enabled for 'streched l2 subnet' then represents zones on which network currently spans", since = "4.4")
     private Set<String> networkSpannedZones;
 
+    @SerializedName(ApiConstants.EXTERNAL_ID)
+    @Param(description = "The external id of the network", since = "4.11")
+    private String externalId;
+
+    @SerializedName(ApiConstants.REDUNDANT_ROUTER)
+    @Param(description = "If the network has redundant routers enabled", since = "4.11.1")
+    private Boolean redundantRouter;
+
     public Boolean getDisplayNetwork() {
         return displayNetwork;
     }
@@ -429,4 +437,16 @@ public void setStrechedL2Subnet(Boolean strechedL2Subnet) {
     public void setNetworkSpannedZones(Set<String> networkSpannedZones) {
         this.networkSpannedZones = networkSpannedZones;
     }
+
+    public void setExternalId(String externalId) {
+        this.externalId = externalId;
+    }
+
+    public Boolean getRedundantRouter() {
+        return redundantRouter;
+    }
+
+    public void setRedundantRouter(Boolean redundantRouter) {
+        this.redundantRouter = redundantRouter;
+    }
 }
diff --git a/api/src/org/apache/cloudstack/api/response/NicExtraDhcpOptionResponse.java b/api/src/org/apache/cloudstack/api/response/NicExtraDhcpOptionResponse.java
new file mode 100644
index 00000000000..4af89a37d8d
--- /dev/null
+++ b/api/src/org/apache/cloudstack/api/response/NicExtraDhcpOptionResponse.java
@@ -0,0 +1,99 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT 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.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.serializer.Param;
+
+@EntityReference(value = NicExtraDhcpOptionResponse.class)
+public class NicExtraDhcpOptionResponse extends BaseResponse {
+
+    @SerializedName(ApiConstants.ID)
+    @Param(description = "the ID of the extra dhcp option")
+    private String id;
+
+    @SerializedName(ApiConstants.NIC_ID)
+    @Param(description = "the ID of the nic")
+    private String nicId;
+
+    @SerializedName(ApiConstants.EXTRA_DHCP_OPTION_NAME)
+    @Param(description = "the name of the extra DHCP option")
+    private String codeName;
+
+    @SerializedName(ApiConstants.EXTRA_DHCP_OPTION_CODE)
+    @Param(description = "the extra DHCP option code")
+    private int code;
+
+    @SerializedName(ApiConstants.EXTRA_DHCP_OPTION_VALUE)
+    @Param(description = "the extra DHCP option value")
+    private String value;
+
+    public NicExtraDhcpOptionResponse() {
+        super();
+    }
+
+    public NicExtraDhcpOptionResponse(String codeName, int code, String value) {
+        this.codeName = codeName;
+        this.code = code;
+        this.value = value;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getNicId() {
+        return nicId;
+    }
+
+    public void setNicId(String nicId) {
+        this.nicId = nicId;
+    }
+
+    public String getCodeName() {
+        return codeName;
+    }
+
+    public void setCodeName(String codeName) {
+        this.codeName = codeName;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}
diff --git a/api/src/org/apache/cloudstack/api/response/NicResponse.java b/api/src/org/apache/cloudstack/api/response/NicResponse.java
index 7689123cbaf..5c3fd7a75a6 100644
--- a/api/src/org/apache/cloudstack/api/response/NicResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/NicResponse.java
@@ -29,15 +29,15 @@
 @EntityReference(value = Nic.class)
 public class NicResponse extends BaseResponse {
 
-    @SerializedName("id")
+    @SerializedName(ApiConstants.ID)
     @Param(description = "the ID of the nic")
     private String id;
 
-    @SerializedName("networkid")
+    @SerializedName(ApiConstants.NETWORK_ID)
     @Param(description = "the ID of the corresponding network")
     private String networkId;
 
-    @SerializedName("networkname")
+    @SerializedName(ApiConstants.NETWORK_NAME)
     @Param(description = "the name of the corresponding network")
     private String networkName;
 
@@ -53,11 +53,11 @@
     @Param(description = "the ip address of the nic")
     private String ipaddress;
 
-    @SerializedName("isolationuri")
+    @SerializedName(ApiConstants.ISOLATION_URI)
     @Param(description = "the isolation uri of the nic")
     private String isolationUri;
 
-    @SerializedName("broadcasturi")
+    @SerializedName(ApiConstants.BROADCAST_URI)
     @Param(description = "the broadcast uri of the nic")
     private String broadcastUri;
 
@@ -73,7 +73,7 @@
     @Param(description = "true if nic is default, false otherwise")
     private Boolean isDefault;
 
-    @SerializedName("macaddress")
+    @SerializedName(ApiConstants.MAC_ADDRESS)
     @Param(description = "true if nic is default, false otherwise")
     private String macAddress;
 
@@ -89,10 +89,14 @@
     @Param(description = "the IPv6 address of network")
     private String ip6Address;
 
-    @SerializedName("secondaryip")
+    @SerializedName(ApiConstants.SECONDARY_IP)
     @Param(description = "the Secondary ipv4 addr of nic")
     private List<NicSecondaryIpResponse> secondaryIps;
 
+    @SerializedName(ApiConstants.EXTRA_DHCP_OPTION)
+    @Param(description = "the extra dhcp options on the nic", since = "4.11.0")
+    private List<NicExtraDhcpOptionResponse> extraDhcpOptions;
+
     @SerializedName(ApiConstants.DEVICE_ID)
     @Param(description = "device id for the network when plugged into the virtual machine", since = "4.4")
     private String deviceId;
@@ -101,11 +105,11 @@
     @Param(description = "Id of the vm to which the nic belongs")
     private String vmId;
 
-    @SerializedName("nsxlogicalswitch")
+    @SerializedName(ApiConstants.NSX_LOGICAL_SWITCH)
     @Param(description = "Id of the NSX Logical Switch (if NSX based), null otherwise", since="4.6.0")
     private String nsxLogicalSwitch;
 
-    @SerializedName("nsxlogicalswitchport")
+    @SerializedName(ApiConstants.NSX_LOGICAL_SWITCH_PORT)
     @Param(description = "Id of the NSX Logical Switch Port (if NSX based), null otherwise", since="4.6.0")
     private String nsxLogicalSwitchPort;
 
@@ -181,6 +185,10 @@ public void setDeviceId(String deviceId) {
         this.deviceId = deviceId;
     }
 
+    public void setExtraDhcpOptions(List<NicExtraDhcpOptionResponse> extraDhcpOptions) {
+        this.extraDhcpOptions = extraDhcpOptions;
+    }
+
     @Override
     public int hashCode() {
         final int prime = 31;
diff --git a/api/src/org/apache/cloudstack/api/response/NicSecondaryIpResponse.java b/api/src/org/apache/cloudstack/api/response/NicSecondaryIpResponse.java
index e0884c08df1..467a1c9e987 100644
--- a/api/src/org/apache/cloudstack/api/response/NicSecondaryIpResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/NicSecondaryIpResponse.java
@@ -17,7 +17,7 @@
 package org.apache.cloudstack.api.response;
 
 import com.google.gson.annotations.SerializedName;
-
+import java.util.List;
 import org.apache.cloudstack.api.ApiConstants;
 import org.apache.cloudstack.api.BaseResponse;
 import org.apache.cloudstack.api.EntityReference;
@@ -33,6 +33,10 @@
     @Param(description = "the ID of the secondary private IP addr")
     private String id;
 
+    @SerializedName("secondaryip")
+    @Param(description = "the list of Secondary ipv4 addr of nic")
+    private List<NicSecondaryIpResponse> secondaryIpsList;
+
     @SerializedName(ApiConstants.IP_ADDRESS)
     @Param(description = "Secondary IP address")
     private String ipAddr;
@@ -94,4 +98,11 @@ public void setId(String id) {
         this.id = id;
     }
 
+    public List<NicSecondaryIpResponse> getSecondaryIpsList() {
+        return secondaryIpsList;
+    }
+
+    public void setSecondaryIpsList(List<NicSecondaryIpResponse> secondaryIpsList) {
+        this.secondaryIpsList = secondaryIpsList;
+    }
 }
diff --git a/api/src/org/apache/cloudstack/api/response/OutOfBandManagementResponse.java b/api/src/org/apache/cloudstack/api/response/OutOfBandManagementResponse.java
index 19594d29506..c0282c8a823 100644
--- a/api/src/org/apache/cloudstack/api/response/OutOfBandManagementResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/OutOfBandManagementResponse.java
@@ -91,7 +91,7 @@ public OutOfBandManagementResponse(final OutOfBandManagement outOfBandManagement
         this.setDriver(outOfBandManagementConfig.getDriver());
         this.setIpAddress(outOfBandManagementConfig.getAddress());
         if (outOfBandManagementConfig.getPort() != null) {
-            this.setPort(String.valueOf(outOfBandManagementConfig.getPort()));
+            this.setPort(outOfBandManagementConfig.getPort());
         }
         this.setUsername(outOfBandManagementConfig.getUsername());
         if (!Strings.isNullOrEmpty(outOfBandManagementConfig.getPassword())) {
diff --git a/api/src/org/apache/cloudstack/api/response/PodResponse.java b/api/src/org/apache/cloudstack/api/response/PodResponse.java
index 7ff0bfc8bcb..27ebf71a994 100644
--- a/api/src/org/apache/cloudstack/api/response/PodResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/PodResponse.java
@@ -55,11 +55,19 @@
 
     @SerializedName("startip")
     @Param(description = "the starting IP for the Pod")
-    private String startIp;
+    private List<String> startIp;
 
     @SerializedName("endip")
     @Param(description = "the ending IP for the Pod")
-    private String endIp;
+    private List<String> endIp;
+
+    @SerializedName("forsystemvms")
+    @Param(description = "indicates if range is dedicated for CPVM and SSVM")
+    private List<String> forSystemVms;
+
+    @SerializedName("vlanid")
+    @Param(description = "indicates Vlan ID for the range")
+    private List<String> vlanId;
 
     @SerializedName("allocationstate")
     @Param(description = "the allocation state of the Pod")
@@ -117,22 +125,38 @@ public void setNetmask(String netmask) {
         this.netmask = netmask;
     }
 
-    public String getStartIp() {
+    public List<String> getStartIp() {
         return startIp;
     }
 
-    public void setStartIp(String startIp) {
+    public void setStartIp(List<String> startIp) {
         this.startIp = startIp;
     }
 
-    public String getEndIp() {
+    public List<String> getEndIp() {
         return endIp;
     }
 
-    public void setEndIp(String endIp) {
+    public void setEndIp(List<String> endIp) {
         this.endIp = endIp;
     }
 
+    public void setForSystemVms(List<String> forSystemVms) {
+        this.forSystemVms = forSystemVms;
+    }
+
+    public List<String> getForSystemVms() {
+        return forSystemVms;
+    }
+
+    public List<String> getVlanId() {
+        return vlanId;
+    }
+
+    public void setVlanId(List<String> vlanId) {
+        this.vlanId = vlanId;
+    }
+
     public String getAllocationState() {
         return allocationState;
     }
diff --git a/api/src/org/apache/cloudstack/api/response/ProjectResponse.java b/api/src/org/apache/cloudstack/api/response/ProjectResponse.java
index ad29d2b18cb..8bfa6d94b63 100644
--- a/api/src/org/apache/cloudstack/api/response/ProjectResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/ProjectResponse.java
@@ -29,7 +29,6 @@
 import com.cloud.serializer.Param;
 
 @EntityReference(value = Project.class)
-@SuppressWarnings("unused")
 public class ProjectResponse extends BaseResponse implements ResourceLimitAndCountResponse {
 
     @SerializedName(ApiConstants.ID)
@@ -56,6 +55,10 @@
     @Param(description = "the account name of the project's owner")
     private String ownerName;
 
+    @SerializedName("projectaccountname")
+    @Param(description="the project account name of the project")
+    private String projectAccountName;
+
     @SerializedName(ApiConstants.STATE)
     @Param(description = "the state of the project")
     private String state;
@@ -130,7 +133,7 @@
 
     @SerializedName("secondarystoragetotal")
     @Param(description = "the total secondary storage space (in GiB) owned by project", since = "4.2.0")
-    private Long secondaryStorageTotal;
+    private float secondaryStorageTotal;
 
     @SerializedName("secondarystorageavailable")
     @Param(description = "the total secondary storage space (in GiB) available to be used for this project", since = "4.2.0")
@@ -228,6 +231,10 @@ public void setOwner(String owner) {
         ownerName = owner;
     }
 
+    public void setProjectAccountName(String projectAccountName) {
+        this.projectAccountName = projectAccountName;
+    }
+
     public void setState(String state) {
         this.state = state;
     }
@@ -406,7 +413,7 @@ public void setSecondaryStorageLimit(String secondaryStorageLimit) {
     }
 
     @Override
-    public void setSecondaryStorageTotal(Long secondaryStorageTotal) {
+    public void setSecondaryStorageTotal(float secondaryStorageTotal) {
         this.secondaryStorageTotal = secondaryStorageTotal;
     }
 
diff --git a/api/src/org/apache/cloudstack/api/response/ResourceCountResponse.java b/api/src/org/apache/cloudstack/api/response/ResourceCountResponse.java
index 7173235608e..d0a4982f872 100644
--- a/api/src/org/apache/cloudstack/api/response/ResourceCountResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/ResourceCountResponse.java
@@ -16,6 +16,7 @@
 // under the License.
 package org.apache.cloudstack.api.response;
 
+import com.cloud.configuration.Resource;
 import com.google.gson.annotations.SerializedName;
 
 import org.apache.cloudstack.api.ApiConstants;
@@ -49,6 +50,10 @@
     @Param(description = "resource type. Values include 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. See the resourceType parameter for more information on these values.")
     private String resourceType;
 
+    @SerializedName(ApiConstants.RESOURCE_TYPE_NAME)
+    @Param(description = "resource type name. Values include user_vm, public_ip, volume, snapshot, template, project, network, vpc, cpu, memory, primary_storage, secondary_storage.")
+    private String resourceTypeName;
+
     @SerializedName("resourcecount")
     @Param(description = "resource count")
     private long resourceCount;
@@ -68,8 +73,9 @@ public void setDomainName(String domainName) {
         this.domainName = domainName;
     }
 
-    public void setResourceType(String resourceType) {
-        this.resourceType = resourceType;
+    public void setResourceType(Resource.ResourceType resourceType) {
+        this.resourceType = Integer.valueOf(resourceType.getOrdinal()).toString();
+        this.resourceTypeName = resourceType.getName();
     }
 
     public void setResourceCount(Long resourceCount) {
diff --git a/api/src/org/apache/cloudstack/api/response/ResourceLimitAndCountResponse.java b/api/src/org/apache/cloudstack/api/response/ResourceLimitAndCountResponse.java
index ba97c2c83ce..f247be834cb 100644
--- a/api/src/org/apache/cloudstack/api/response/ResourceLimitAndCountResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/ResourceLimitAndCountResponse.java
@@ -54,7 +54,7 @@
 
     public void setSecondaryStorageLimit(String secondaryStorageLimit);
 
-    public void setSecondaryStorageTotal(Long secondaryStorageTotal);
+    public void setSecondaryStorageTotal(float secondaryStorageTotal);
 
     public void setSecondaryStorageAvailable(String secondaryStorageAvailable);
 
diff --git a/api/src/org/apache/cloudstack/api/response/ResourceLimitResponse.java b/api/src/org/apache/cloudstack/api/response/ResourceLimitResponse.java
index 6890915fdde..13e1198177d 100644
--- a/api/src/org/apache/cloudstack/api/response/ResourceLimitResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/ResourceLimitResponse.java
@@ -16,6 +16,7 @@
 // under the License.
 package org.apache.cloudstack.api.response;
 
+import com.cloud.configuration.Resource;
 import com.google.gson.annotations.SerializedName;
 
 import org.apache.cloudstack.api.ApiConstants;
@@ -44,6 +45,10 @@
     @Param(description = "resource type. Values include 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11. See the resourceType parameter for more information on these values.")
     private String resourceType;
 
+    @SerializedName(ApiConstants.RESOURCE_TYPE_NAME)
+    @Param(description = "resource type name. Values include user_vm, public_ip, volume, snapshot, template, project, network, vpc, cpu, memory, primary_storage, secondary_storage.")
+    private String resourceTypeName;
+
     @SerializedName("max")
     @Param(description = "the maximum number of the resource. A -1 means the resource currently has no limit.")
     private Long max;
@@ -76,8 +81,9 @@ public void setDomainName(String domainName) {
         this.domainName = domainName;
     }
 
-    public void setResourceType(String resourceType) {
-        this.resourceType = resourceType;
+    public void setResourceType(Resource.ResourceType resourceType) {
+        this.resourceType = Integer.valueOf(resourceType.getOrdinal()).toString();
+        this.resourceTypeName = resourceType.getName();
     }
 
     public void setMax(Long max) {
diff --git a/api/src/org/apache/cloudstack/api/response/SnapshotResponse.java b/api/src/org/apache/cloudstack/api/response/SnapshotResponse.java
index aa8de5c6fd4..bb2ff7f6d0e 100644
--- a/api/src/org/apache/cloudstack/api/response/SnapshotResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/SnapshotResponse.java
@@ -16,17 +16,15 @@
 // under the License.
 package org.apache.cloudstack.api.response;
 
-import java.util.Date;
-import java.util.List;
-
+import com.cloud.serializer.Param;
+import com.cloud.storage.Snapshot;
 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.serializer.Param;
-import com.cloud.storage.Snapshot;
+import java.util.Date;
+import java.util.List;
 
 @EntityReference(value = Snapshot.class)
 public class SnapshotResponse extends BaseResponse implements ControlledEntityResponse {
@@ -82,6 +80,10 @@
     @Param(description = "valid types are hourly, daily, weekly, monthy, template, and none.")
     private String intervalType;
 
+    @SerializedName(ApiConstants.LOCATION_TYPE)
+    @Param(description = "valid location types are primary and secondary.")
+    private String locationType;
+
     @SerializedName(ApiConstants.STATE)
     @Param(description = "the state of the snapshot. BackedUp means that snapshot is ready to be used; Creating - the snapshot is being allocated on the primary storage; BackingUp - the snapshot is being backed up on secondary storage")
     private Snapshot.State state;
@@ -102,6 +104,18 @@
     @Param(description = "indicates whether the underlying storage supports reverting the volume to this snapshot")
     private boolean revertable;
 
+    @SerializedName(ApiConstants.OS_TYPE_ID)
+    @Param(description = "id of the os on volume", since = "4.10")
+    private String osTypeId;
+
+    @SerializedName(ApiConstants.OS_DISPLAY_NAME)
+    @Param(description = "display name of the os on volume")
+    private String osDisplayName;
+
+    @SerializedName(ApiConstants.VIRTUAL_SIZE)
+    @Param(description = "virtual size of backedup snapshot on image store")
+    private long virtualSize;
+
     @Override
     public String getObjectId() {
         return this.getId();
@@ -166,6 +180,10 @@ public void setIntervalType(String intervalType) {
         this.intervalType = intervalType;
     }
 
+    public void setLocationType(String locationType) {
+        this.locationType = locationType;
+    }
+
     public void setState(Snapshot.State state) {
         this.state = state;
     }
@@ -192,11 +210,23 @@ public void setTags(List<ResourceTagResponse> tags) {
         this.tags = tags;
     }
 
-    public boolean isRevertable() {
-        return revertable;
-    }
-
     public void setRevertable(boolean revertable) {
         this.revertable = revertable;
     }
-}
+
+    public String getOsTypeId() {
+        return osTypeId;
+    }
+
+    public void setOsTypeId(String osTypeId) {
+        this.osTypeId = osTypeId;
+    }
+
+    public void setOsDisplayName(String osDisplayName) {
+        this.osDisplayName = osDisplayName;
+    }
+
+    public void setVirtualSize(long virtualSize) {
+        this.virtualSize = virtualSize;
+    }
+}
\ No newline at end of file
diff --git a/api/src/org/apache/cloudstack/api/response/SslCertResponse.java b/api/src/org/apache/cloudstack/api/response/SslCertResponse.java
index 8b3db465bfa..aa729f123b4 100644
--- a/api/src/org/apache/cloudstack/api/response/SslCertResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/SslCertResponse.java
@@ -24,7 +24,7 @@
 import org.apache.cloudstack.api.BaseResponse;
 import org.apache.cloudstack.api.EntityReference;
 
-import com.cloud.network.lb.SslCert;
+import org.apache.cloudstack.network.tls.SslCert;
 import com.cloud.serializer.Param;
 
 //import org.apache.cloudstack.api.EntityReference;
@@ -72,6 +72,10 @@
     @Param(description = "List of loabalancers this certificate is bound to")
     List<String> lbIds;
 
+    @SerializedName(ApiConstants.NAME)
+    @Param(description = "name")
+    private String name;
+
     public SslCertResponse() {
     }
 
@@ -83,6 +87,10 @@ public void setCertificate(String cert) {
         this.certificate = cert;
     }
 
+    public void setName(String name) {
+        this.name = name;
+    }
+
     public void setAccountName(String accountName) {
         this.accountName = accountName;
     }
diff --git a/api/src/org/apache/cloudstack/api/response/StoragePoolResponse.java b/api/src/org/apache/cloudstack/api/response/StoragePoolResponse.java
index b7f7d0b41ee..a03c2d8d751 100644
--- a/api/src/org/apache/cloudstack/api/response/StoragePoolResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/StoragePoolResponse.java
@@ -16,18 +16,16 @@
 // under the License.
 package org.apache.cloudstack.api.response;
 
-import java.util.Date;
-import java.util.Map;
-
+import com.cloud.serializer.Param;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.StoragePoolStatus;
 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.serializer.Param;
-import com.cloud.storage.StoragePool;
-import com.cloud.storage.StoragePoolStatus;
+import java.util.Date;
+import java.util.Map;
 
 @EntityReference(value = StoragePool.class)
 public class StoragePoolResponse extends BaseResponse {
@@ -95,6 +93,10 @@
     @Param(description = "IOPS CloudStack can provision from this storage pool")
     private Long capacityIops;
 
+    @SerializedName("allocatediops")
+    @Param(description = "total min IOPS currently in use by volumes")
+    private Long allocatedIops;
+
     @SerializedName("tags")
     @Param(description = "the tags for the storage pool")
     private String tags;
@@ -119,6 +121,10 @@
     @Param(description = "true if this pool is suitable to migrate a volume," + " false otherwise")
     private Boolean suitableForMigration;
 
+    @SerializedName("provider")
+    @Param(description = "Storage provider for this pool")
+    private String provider;
+
     @SerializedName(ApiConstants.STORAGE_CAPABILITIES)
     @Param(description = "the storage pool capabilities")
     private Map<String, String> caps;
@@ -286,6 +292,10 @@ public void setCapacityIops(Long capacityIops) {
         this.capacityIops = capacityIops;
     }
 
+    public void setAllocatedIops(Long allocatedIops) {
+       this.allocatedIops = allocatedIops;
+    }
+
     public String getTags() {
         return tags;
     }
@@ -317,4 +327,12 @@ public String getOverProvisionFactor() {
     public Boolean getSuitableForMigration() {
         return suitableForMigration;
     }
+
+    public String getProvider() {
+        return provider;
+    }
+
+    public void setProvider(String provider) {
+        this.provider = provider;
+    }
 }
diff --git a/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java b/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java
index 9e20b49dfde..49ab473a37a 100644
--- a/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java
@@ -17,6 +17,7 @@
 package org.apache.cloudstack.api.response;
 
 import java.util.Date;
+import java.util.List;
 
 import com.google.gson.annotations.SerializedName;
 
@@ -141,7 +142,13 @@
     @Param(description = "the number of active console sessions for the console proxy system vm")
     private Integer activeViewerSessions;
 
-    // private Long objectId;
+    @SerializedName("guestvlan")
+    @Param(description = "guest vlan range")
+    private String guestVlan;
+
+    @SerializedName("publicvlan")
+    @Param(description = "public vlan range")
+    private List<String> publicVlan;
 
     @Override
     public String getObjectId() {
@@ -355,4 +362,20 @@ public String getLinkLocalNetmask() {
     public void setLinkLocalNetmask(String linkLocalNetmask) {
         this.linkLocalNetmask = linkLocalNetmask;
     }
+
+    public String getGuestVlan() {
+        return guestVlan;
+    }
+
+    public void setGuestVlan(String guestVlan) {
+        this.guestVlan = guestVlan;
+    }
+
+    public List<String> getPublicVlan() {
+        return publicVlan;
+    }
+
+    public void setPublicVlan(List<String> publicVlan) {
+        this.publicVlan = publicVlan;
+    }
 }
diff --git a/api/src/org/apache/cloudstack/api/response/TemplateResponse.java b/api/src/org/apache/cloudstack/api/response/TemplateResponse.java
index 237f181d4d8..373198ed29f 100644
--- a/api/src/org/apache/cloudstack/api/response/TemplateResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/TemplateResponse.java
@@ -117,6 +117,10 @@
     @Param(description = "the size of the template")
     private Long size;
 
+    @SerializedName(ApiConstants.PHYSICAL_SIZE)
+    @Param(description = "the physical size of the template")
+    private Long physicalSize;
+
     @SerializedName("templatetype")
     @Param(description = "the type of the template")
     private String templateType;
@@ -169,6 +173,10 @@
     @Param(description = "additional key/value details tied with template")
     private Map details;
 
+    @SerializedName(ApiConstants.BITS)
+    @Param(description = "the processor bit size", since = "4.10")
+    private int bits;
+
     @SerializedName(ApiConstants.SSHKEY_ENABLED)
     @Param(description = "true if template is sshkey enabled, false otherwise")
     private Boolean sshKeyEnabled;
@@ -177,6 +185,18 @@
     @Param(description = "true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory")
     private Boolean isDynamicallyScalable;
 
+    @SerializedName(ApiConstants.DIRECT_DOWNLOAD)
+    @Param(description = "KVM Only: true if template is directly downloaded to Primary Storage bypassing Secondary Storage")
+    private Boolean directDownload;
+
+    @SerializedName("parenttemplateid")
+    @Param(description = "if Datadisk template, then id of the root disk template this template belongs to")
+    private String parentTemplateId;
+
+    @SerializedName("childtemplates")
+    @Param(description = "if root disk template, then ids of the datas disk templates this template owns")
+    private Set<ChildTemplateResponse> childTemplates;
+
     public TemplateResponse() {
         tags = new LinkedHashSet<ResourceTagResponse>();
     }
@@ -271,6 +291,10 @@ public void setSize(Long size) {
         this.size = size;
     }
 
+    public void setPhysicalSize(Long physicalSize) {
+        this.physicalSize = physicalSize;
+    }
+
     public void setTemplateType(String templateType) {
         this.templateType = templateType;
     }
@@ -347,4 +371,24 @@ public String getZoneId() {
         return zoneId;
     }
 
+    public void setBits(int bits) {
+        this.bits = bits;
+    }
+
+    public void setDirectDownload(Boolean directDownload) {
+        this.directDownload = directDownload;
+    }
+
+    public Boolean getDirectDownload() {
+        return directDownload;
+    }
+
+    public void setParentTemplateId(String parentTemplateId) {
+        this.parentTemplateId = parentTemplateId;
+    }
+
+    public void setChildTemplates(Set<ChildTemplateResponse> childTemplateIds) {
+        this.childTemplates = childTemplateIds;
+    }
+
 }
diff --git a/api/src/org/apache/cloudstack/api/response/UsageRecordResponse.java b/api/src/org/apache/cloudstack/api/response/UsageRecordResponse.java
index 87a085c2a5c..c53f2b99e0b 100644
--- a/api/src/org/apache/cloudstack/api/response/UsageRecordResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/UsageRecordResponse.java
@@ -19,12 +19,15 @@
 import com.google.gson.annotations.SerializedName;
 
 import org.apache.cloudstack.api.ApiConstants;
-import org.apache.cloudstack.api.BaseResponse;
 
 import com.cloud.serializer.Param;
+import org.apache.cloudstack.api.BaseResponseWithTagInformation;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
 
 @SuppressWarnings("unused")
-public class UsageRecordResponse extends BaseResponse implements ControlledEntityResponse {
+public class UsageRecordResponse extends BaseResponseWithTagInformation implements ControlledEntityResponse {
     @SerializedName(ApiConstants.ACCOUNT)
     @Param(description = "the user account name")
     private String accountName;
@@ -137,6 +140,14 @@
     @Param(description = "True if the resource is default")
     private Boolean isDefault;
 
+    public UsageRecordResponse() {
+        tags = new LinkedHashSet<ResourceTagResponse>();
+    }
+
+    public void setTags(Set<ResourceTagResponse> tags) {
+        this.tags = tags;
+    }
+
     @Override
     public void setAccountName(String accountName) {
         this.accountName = accountName;
@@ -253,4 +264,8 @@ public void setCpuSpeed(Long cpuSpeed) {
     public void setMemory(Long memory) {
         this.memory = memory;
     }
+
+    public String getDomainName(){
+        return domainName;
+    }
 }
diff --git a/api/src/org/apache/cloudstack/api/response/UserResponse.java b/api/src/org/apache/cloudstack/api/response/UserResponse.java
index cc986b38a1c..dd10510c03c 100644
--- a/api/src/org/apache/cloudstack/api/response/UserResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/UserResponse.java
@@ -66,6 +66,10 @@
     @Param(description = "the account type of the user")
     private Short accountType;
 
+    @SerializedName("usersource")
+    @Param(description = "the source type of the user in lowercase, such as native, ldap, saml2")
+    private String userSource;
+
     @SerializedName(ApiConstants.ROLE_ID)
     @Param(description = "the ID of the role")
     private String roleId;
@@ -94,6 +98,7 @@
     @Param(description = "the api key of the user", isSensitive = true)
     private String apiKey;
 
+    @Deprecated
     @SerializedName("secretkey")
     @Param(description = "the secret key of the user", isSensitive = true)
     private String secretKey;
@@ -236,7 +241,6 @@ public void setApiKey(String apiKey) {
     public String getSecretKey() {
         return secretKey;
     }
-
     public void setSecretKey(String secretKey) {
         this.secretKey = secretKey;
     }
@@ -260,4 +264,15 @@ public void setIsCallerChildDomain(boolean isCallerChildDomain) {
     public void setIsDefault(Boolean isDefault) {
         this.isDefault = isDefault;
     }
+
+    public String getUserSource() {
+        return userSource;
+    }
+
+    public void setUserSource(User.Source userSource) {
+        this.userSource = userSource.toString().toLowerCase();
+        if (this.userSource.equals(User.Source.UNKNOWN.toString().toLowerCase())) {
+            this.userSource = User.Source.NATIVE.toString().toLowerCase();
+        }
+    }
 }
diff --git a/api/src/org/apache/cloudstack/api/response/VlanIpRangeResponse.java b/api/src/org/apache/cloudstack/api/response/VlanIpRangeResponse.java
index 59214847a92..5656a92955d 100644
--- a/api/src/org/apache/cloudstack/api/response/VlanIpRangeResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/VlanIpRangeResponse.java
@@ -116,10 +116,22 @@
     @Param(description = "the cidr of IPv6 network")
     private String ip6Cidr;
 
+    @SerializedName(ApiConstants.FOR_SYSTEM_VMS)
+    @Param(description = "indicates whether VLAN IP range is dedicated to system vms or not")
+    private Boolean forSystemVms;
+
     public void setId(String id) {
         this.id = id;
     }
 
+    public Boolean getForSystemVms() {
+        return forSystemVms;
+    }
+
+    public void setForSystemVms(Boolean forSystemVms) {
+        this.forSystemVms = forSystemVms;
+    }
+
     public void setForVirtualNetwork(Boolean forVirtualNetwork) {
         this.forVirtualNetwork = forVirtualNetwork;
     }
diff --git a/api/src/org/apache/cloudstack/api/response/VolumeResponse.java b/api/src/org/apache/cloudstack/api/response/VolumeResponse.java
index e25adf618d8..895e13c5c5c 100644
--- a/api/src/org/apache/cloudstack/api/response/VolumeResponse.java
+++ b/api/src/org/apache/cloudstack/api/response/VolumeResponse.java
@@ -228,9 +228,36 @@
     String chainInfo;
 
     @SerializedName(ApiConstants.SNAPSHOT_QUIESCEVM)
-    @Param(description = "need quiesce vm or not when taking snapshot", since="4.3")
+    @Param(description = "need quiesce vm or not when taking snapshot", since = "4.3")
     private boolean needQuiescevm;
 
+    @SerializedName(ApiConstants.PHYSICAL_SIZE)
+    @Param(description = "the bytes alloaated")
+    private Long physicalsize;
+
+    @SerializedName(ApiConstants.VIRTUAL_SIZE)
+    @Param(description = "the bytes actually consumed on disk")
+    private Long virtualsize;
+
+    @SerializedName(ApiConstants.UTILIZATION)
+    @Param(description = "the disk utilization")
+    private String utilization;
+
+    @SerializedName(ApiConstants.CLUSTER_ID)
+    @Param(description = "cluster id of the volume")
+    private String clusterid;
+
+    @SerializedName(ApiConstants.CLUSTER_NAME)
+    @Param(description = "cluster name where the volume is allocated")
+    private String clustername;
+
+    @SerializedName(ApiConstants.POD_ID)
+    @Param(description = "pod id of the volume")
+    private String podid;
+
+    @SerializedName(ApiConstants.POD_NAME)
+    @Param(description = "pod name of the volume")
+    private String podname;
 
     public String getPath() {
         return path;
@@ -301,7 +328,7 @@ public void setVirtualMachineState(String virtualMachineState) {
         this.virtualMachineState = virtualMachineState;
     }
 
-    public void setProvisioningType(String provisioningType){
+    public void setProvisioningType(String provisioningType) {
         this.provisioningType = provisioningType;
     }
 
@@ -649,4 +676,61 @@ public String getStatus() {
     public Boolean getDisplayVolume() {
         return displayVolume;
     }
+
+    public Long getPhysicalsize() {
+        return physicalsize;
+    }
+
+    public void setPhysicalsize(Long physicalsize) {
+        this.physicalsize = physicalsize;
+    }
+
+    public Long getVirtualsize() {
+        return virtualsize;
+    }
+
+    public void setVirtualsize(Long virtualsize) {
+        this.virtualsize = virtualsize;
+    }
+
+    public String getUtilization() {
+        return utilization;
+    }
+
+    public void setUtilization(String utilization) {
+        this.utilization = utilization;
+    }
+
+    public String getClusterId() {
+        return clusterid;
+    }
+
+    public void setClusterId(String clusterid) {
+        this.clusterid = clusterid;
+    }
+
+    public String getClusterName() {
+        return clustername;
+    }
+
+    public void setClusterName(String clustername) {
+        this.clustername = clustername;
+    }
+
+    public String getPodId() {
+        return podid;
+    }
+
+    public void setPodId(String podid) {
+        this.podid = podid;
+    }
+
+    public String getPodName() {
+        return podname;
+    }
+
+    public void setPodName(String podname) {
+        this.podname = podname;
+    }
+
 }
diff --git a/api/src/org/apache/cloudstack/ca/CAManager.java b/api/src/org/apache/cloudstack/ca/CAManager.java
new file mode 100644
index 00000000000..c32cfbfe345
--- /dev/null
+++ b/api/src/org/apache/cloudstack/ca/CAManager.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.ca;
+
+import java.io.IOException;
+import java.math.BigInteger;
+import java.security.cert.X509Certificate;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cloudstack.framework.ca.CAProvider;
+import org.apache.cloudstack.framework.ca.CAService;
+import org.apache.cloudstack.framework.ca.Certificate;
+import org.apache.cloudstack.framework.config.ConfigKey;
+import org.apache.cloudstack.framework.config.Configurable;
+
+import com.cloud.exception.AgentUnavailableException;
+import com.cloud.exception.OperationTimedoutException;
+import com.cloud.host.Host;
+import com.cloud.utils.component.PluggableService;
+
+public interface CAManager extends CAService, Configurable, PluggableService {
+
+    ConfigKey<String> CAProviderPlugin = new ConfigKey<>("Advanced", String.class,
+            "ca.framework.provider.plugin",
+            "root",
+            "The CA provider plugin that is used for secure CloudStack management server-agent communication for encryption and authentication. Restart management server(s) when changed.", true);
+
+    ConfigKey<Integer> CertKeySize = new ConfigKey<>("Advanced", Integer.class,
+                                    "ca.framework.cert.keysize",
+                                    "2048",
+                                    "The key size to be used for random certificate keypair generation.", true);
+
+    ConfigKey<String> CertSignatureAlgorithm = new ConfigKey<>("Advanced", String.class,
+            "ca.framework.cert.signature.algorithm",
+            "SHA256withRSA",
+            "The default signature algorithm to use for certificate generation.", true);
+
+
+    ConfigKey<Integer> CertValidityPeriod = new ConfigKey<>("Advanced", Integer.class,
+                                            "ca.framework.cert.validity.period",
+                                            "365",
+                                            "The validity period of a client certificate in number of days. Set the value to be more than the expiry alert period.", true);
+
+    ConfigKey<Boolean> AutomaticCertRenewal = new ConfigKey<>("Advanced", Boolean.class,
+            "ca.framework.cert.automatic.renewal",
+            "true",
+            "Enable automatic renewal and provisioning of certificate to agents as supported by the configured CA plugin.", true, ConfigKey.Scope.Cluster);
+
+    ConfigKey<Long> CABackgroundJobDelay = new ConfigKey<>("Advanced", Long.class,
+            "ca.framework.background.task.delay",
+            "3600",
+            "The CA framework background task delay in seconds. Background task runs expiry checks and renews certificate if auto-renewal is enabled.", true);
+
+    ConfigKey<Integer> CertExpiryAlertPeriod = new ConfigKey<>("Advanced", Integer.class,
+                                                    "ca.framework.cert.expiry.alert.period",
+                                                    "15",
+                                                    "The number of days before expiry of a client certificate, the validations are checked. Admins are alerted when auto-renewal is not allowed, otherwise auto-renewal is attempted.", true, ConfigKey.Scope.Cluster);
+
+    /**
+     * Returns a list of available CA provider plugins
+     * @return returns list of CAProvider
+     */
+    List<CAProvider> getCaProviders();
+
+    /**
+     * Returns a map of active agents/hosts certificates
+     * @return returns a non-null map
+     */
+    Map<String, X509Certificate> getActiveCertificatesMap();
+
+    /**
+     * Checks whether the configured CA plugin can provision/create certificates
+     * @return returns certificate creation capability
+     */
+    boolean canProvisionCertificates();
+
+    /**
+     * Returns PEM-encoded chained CA certificate
+     * @param caProvider
+     * @return returns CA certificate chain string
+     */
+    String getCaCertificate(final String caProvider) throws IOException;
+
+    /**
+     * Issues client Certificate
+     * @param csr
+     * @param ipAddresses
+     * @param domainNames
+     * @param validityDays
+     * @param provider
+     * @return returns Certificate
+     */
+    Certificate issueCertificate(final String csr, final List<String> domainNames, final List<String> ipAddresses, final Integer validityDays, final String provider);
+
+    /**
+     * Revokes certificate from provided serial and CN
+     * @param certSerial
+     * @param certCn
+     * @return returns success/failure as boolean
+     */
+    boolean revokeCertificate(final BigInteger certSerial, final String certCn, final String provider);
+
+    /**
+     * Provisions certificate for given active and connected agent host
+     * @param host
+     * @param provider
+     * @return returns success/failure as boolean
+     */
+    boolean provisionCertificate(final Host host, final Boolean reconnect, final String provider);
+
+    /**
+     * Setups up a new keystore and generates CSR for a host
+     * @param host
+     * @param sshAccessDetails when provided, VirtualRoutingResource uses router proxy to execute commands via SSH in systemvms
+     * @return
+     * @throws AgentUnavailableException
+     * @throws OperationTimedoutException
+     */
+    String generateKeyStoreAndCsr(final Host host, final Map<String, String> sshAccessDetails) throws AgentUnavailableException, OperationTimedoutException;
+
+    /**
+     * Deploys a Certificate payload to a provided host
+     * @param host
+     * @param certificate
+     * @param reconnect when true the host/agent is reconnected on successful deployment of the certificate
+     * @param sshAccessDetails when provided, VirtualRoutingResource uses router proxy to execute commands via SSH in systemvms
+     * @return
+     * @throws AgentUnavailableException
+     * @throws OperationTimedoutException
+     */
+    boolean deployCertificate(final Host host, final Certificate certificate, final Boolean reconnect, final Map<String, String> sshAccessDetails) throws AgentUnavailableException, OperationTimedoutException;
+
+    /**
+     * Removes the host from an internal active client/certificate map
+     * @param host
+     */
+    void purgeHostCertificate(final Host host);
+
+    /**
+     * Sends a CA cert event alert to admins with a subject and a message
+     * @param host
+     * @param subject
+     * @param message
+     */
+    void sendAlert(final Host host, final String subject, final String message);
+
+}
diff --git a/api/src/org/apache/cloudstack/config/ApiServiceConfiguration.java b/api/src/org/apache/cloudstack/config/ApiServiceConfiguration.java
index 701af625884..55e8202ff48 100644
--- a/api/src/org/apache/cloudstack/config/ApiServiceConfiguration.java
+++ b/api/src/org/apache/cloudstack/config/ApiServiceConfiguration.java
@@ -16,19 +16,19 @@
 // under the License.
 package org.apache.cloudstack.config;
 
-import javax.ejb.Local;
-
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.Configurable;
 
-@Local(value = {ApiServiceConfiguration.class})
 public class ApiServiceConfiguration implements Configurable {
-    public static final ConfigKey<String> ManagementHostIPAdr = new ConfigKey<String>("Advanced", String.class, "host", "localhost", "The ip address of management server", true);
+    public static final ConfigKey<String> ManagementServerAddresses = new ConfigKey<String>("Advanced", String.class, "host", "localhost", "The ip address of management server. This can also accept comma separated addresses.", true);
     public static final ConfigKey<String> ApiServletPath = new ConfigKey<String>("Advanced", String.class, "endpointe.url", "http://localhost:8080/client/api",
             "API end point. Can be used by CS components/services deployed remotely, for sending CS API requests", true);
     public static final ConfigKey<Long> DefaultUIPageSize = new ConfigKey<Long>("Advanced", Long.class, "default.ui.page.size", "20",
             "The default pagesize to be used by UI and other clients when making list* API calls", true, ConfigKey.Scope.Global);
-
+    public static final ConfigKey<Boolean> ApiSourceCidrChecksEnabled = new ConfigKey<>("Advanced", Boolean.class, "api.source.cidr.checks.enabled",
+            "true", "Are the source checks on API calls enabled (true) or not (false)? See api.allowed.source.cidr.list", true, ConfigKey.Scope.Global);
+    public static final ConfigKey<String> ApiAllowedSourceCidrList = new ConfigKey<String>("Advanced", String.class, "api.allowed.source.cidr.list",
+            "0.0.0.0/0,::/0", "Comma separated list of IPv4/IPv6 CIDRs from which API calls can be performed. Can be set on Global and Account levels.", true, ConfigKey.Scope.Account);
     @Override
     public String getConfigComponentName() {
         return ApiServiceConfiguration.class.getSimpleName();
@@ -36,7 +36,7 @@ public String getConfigComponentName() {
 
     @Override
     public ConfigKey<?>[] getConfigKeys() {
-        return new ConfigKey<?>[] {ManagementHostIPAdr, ApiServletPath, DefaultUIPageSize};
+        return new ConfigKey<?>[] {ManagementServerAddresses, ApiServletPath, DefaultUIPageSize, ApiSourceCidrChecksEnabled, ApiAllowedSourceCidrList};
     }
 
 }
diff --git a/api/src/org/apache/cloudstack/direct/download/DirectDownloadManager.java b/api/src/org/apache/cloudstack/direct/download/DirectDownloadManager.java
new file mode 100644
index 00000000000..b3f0841a6e8
--- /dev/null
+++ b/api/src/org/apache/cloudstack/direct/download/DirectDownloadManager.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 org.apache.cloudstack.direct.download;
+
+import com.cloud.utils.component.PluggableService;
+import org.apache.cloudstack.framework.agent.direct.download.DirectDownloadService;
+
+public interface DirectDownloadManager extends DirectDownloadService, PluggableService {
+
+}
diff --git a/api/src/org/apache/cloudstack/ha/HAConfig.java b/api/src/org/apache/cloudstack/ha/HAConfig.java
new file mode 100644
index 00000000000..95b5c9bdfd7
--- /dev/null
+++ b/api/src/org/apache/cloudstack/ha/HAConfig.java
@@ -0,0 +1,146 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT 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.ha;
+
+import com.cloud.utils.fsm.StateMachine2;
+import com.cloud.utils.fsm.StateObject;
+import org.apache.cloudstack.api.InternalIdentity;
+import org.apache.cloudstack.utils.identity.ManagementServerNode;
+
+public interface HAConfig extends StateObject<HAConfig.HAState>, InternalIdentity {
+
+    long getResourceId();
+    HAResource.ResourceType getResourceType();
+    boolean isEnabled();
+    HAState getState();
+    String getHaProvider();
+    Long getManagementServerId();
+
+    enum Event {
+        Eligible,
+        Ineligible,
+        Disabled,
+        Enabled,
+        HealthCheckPassed,
+        HealthCheckFailed,
+        PerformActivityCheck,
+        TooFewActivityCheckSamples,
+        PeriodicRecheckResourceActivity,
+        ActivityCheckFailureOverThresholdRatio,
+        ActivityCheckFailureUnderThresholdRatio,
+        PowerCycle,
+        Recovered,
+        RetryRecovery,
+        RecoveryWaitPeriodTimeout,
+        RecoveryOperationThresholdExceeded,
+        RetryFencing,
+        Fenced;
+
+        public Long getServerId() {
+            // TODO: change in future if we've better claim & ownership
+            // Right now the first one to update the db wins
+            // and mgmt server id would eventually become consistent
+            return ManagementServerNode.getManagementServerId();
+        }
+    }
+
+    enum HAState {
+        Disabled("HA Operations disabled"),
+        Available("The resource is healthy"),
+        Ineligible("The current state does not support HA/recovery"),
+        Suspect("Most recent health check failed"),
+        Degraded("The resource cannot be managed, but services end user requests"),
+        Checking("The activity checks are currently being performed"),
+        Recovering("The resource is undergoing recovery operation"),
+        Recovered("The resource is recovered"),
+        Fencing("The resource is undergoing fence operation"),
+        Fenced("The resource is fenced");
+
+        String description;
+
+        HAState(String description) {
+            this.description = description;
+        }
+
+        public static StateMachine2<HAState, Event, HAConfig> getStateMachine() {
+            return FSM;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        private static final StateMachine2<HAState, Event, HAConfig> FSM = new StateMachine2<>();
+
+        static {
+            FSM.addInitialTransition(Event.Disabled, Disabled);
+            FSM.addInitialTransition(Event.Enabled, Available);
+            FSM.addInitialTransition(Event.Ineligible, Ineligible);
+
+            FSM.addTransition(Disabled, Event.Enabled, Available);
+
+            FSM.addTransition(Ineligible, Event.Disabled, Disabled);
+            FSM.addTransition(Ineligible, Event.Ineligible, Ineligible);
+            FSM.addTransition(Ineligible, Event.Eligible, Available);
+
+            FSM.addTransition(Available, Event.Disabled, Disabled);
+            FSM.addTransition(Available, Event.Ineligible, Ineligible);
+            FSM.addTransition(Available, Event.HealthCheckPassed, Available);
+            FSM.addTransition(Available, Event.HealthCheckFailed, Suspect);
+
+            FSM.addTransition(Suspect, Event.Disabled, Disabled);
+            FSM.addTransition(Suspect, Event.Ineligible, Ineligible);
+            FSM.addTransition(Suspect, Event.HealthCheckFailed, Suspect);
+            FSM.addTransition(Suspect, Event.PerformActivityCheck, Checking);
+            FSM.addTransition(Suspect, Event.HealthCheckPassed, Available);
+
+            FSM.addTransition(Checking, Event.Disabled, Disabled);
+            FSM.addTransition(Checking, Event.Ineligible, Ineligible);
+            FSM.addTransition(Checking, Event.TooFewActivityCheckSamples, Suspect);
+            FSM.addTransition(Checking, Event.ActivityCheckFailureUnderThresholdRatio, Degraded);
+            FSM.addTransition(Checking, Event.ActivityCheckFailureOverThresholdRatio, Recovering);
+
+            FSM.addTransition(Degraded, Event.Disabled, Disabled);
+            FSM.addTransition(Degraded, Event.Ineligible, Ineligible);
+            FSM.addTransition(Degraded, Event.HealthCheckFailed, Degraded);
+            FSM.addTransition(Degraded, Event.HealthCheckPassed, Available);
+            FSM.addTransition(Degraded, Event.PeriodicRecheckResourceActivity, Suspect);
+
+            FSM.addTransition(Recovering, Event.Disabled, Disabled);
+            FSM.addTransition(Recovering, Event.Ineligible, Ineligible);
+            FSM.addTransition(Recovering, Event.RetryRecovery, Recovering);
+            FSM.addTransition(Recovering, Event.Recovered, Recovered);
+            FSM.addTransition(Recovering, Event.RecoveryOperationThresholdExceeded, Fencing);
+
+            FSM.addTransition(Recovered, Event.Disabled, Disabled);
+            FSM.addTransition(Recovered, Event.Ineligible, Ineligible);
+            FSM.addTransition(Recovered, Event.RecoveryWaitPeriodTimeout, Available);
+
+            FSM.addTransition(Fencing, Event.Disabled, Disabled);
+            FSM.addTransition(Fencing, Event.Ineligible, Ineligible);
+            FSM.addTransition(Fencing, Event.RetryFencing, Fencing);
+            FSM.addTransition(Fencing, Event.Fenced, Fenced);
+
+            FSM.addTransition(Fenced, Event.Disabled, Disabled);
+            FSM.addTransition(Fenced, Event.HealthCheckPassed, Ineligible);
+            FSM.addTransition(Fenced, Event.HealthCheckFailed, Fenced);
+        }
+    }
+}
diff --git a/api/src/org/apache/cloudstack/ha/HAConfigManager.java b/api/src/org/apache/cloudstack/ha/HAConfigManager.java
new file mode 100644
index 00000000000..c9a20358c36
--- /dev/null
+++ b/api/src/org/apache/cloudstack/ha/HAConfigManager.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.ha;
+
+import com.cloud.dc.DataCenter;
+import com.cloud.org.Cluster;
+
+import java.util.List;
+
+/**
+ * @since 4.11
+ */
+public interface HAConfigManager {
+    /**
+     * Configures HA for a resource by accepting the resource type and HA provider
+     * @param resourceId the ID of the resource
+     * @param resourceType the type of the resource
+     * @param haProvider the name of the HA provider
+     */
+    boolean configureHA(Long resourceId, HAResource.ResourceType resourceType, String haProvider);
+
+    /**
+     * Enables HA for resource Id of a specific resource type
+     * @param resourceId the ID of the resource
+     * @param resourceType the type of the resource
+     * @return returns true on successful enable
+     */
+    boolean enableHA(Long resourceId, HAResource.ResourceType resourceType);
+
+    /**
+     * Disables HA for resource Id of a specific resource type
+     * @param resourceId the ID of the resource
+     * @param resourceType the type of the resource
+     * @return returns true on successful disable
+     */
+    boolean disableHA(Long resourceId, HAResource.ResourceType resourceType);
+
+    /**
+     * Enables HA across a cluster
+     * @param cluster the cluster
+     * @return returns operation success
+     */
+    boolean enableHA(final Cluster cluster);
+
+    /**
+     * Disables HA across a cluster
+     * @param cluster the cluster
+     * @return returns operation success
+     */
+    boolean disableHA(final Cluster cluster);
+
+    /**
+     * Enables HA across a zone
+     * @param zone the zone
+     * @return returns operation success
+     */
+    boolean enableHA(final DataCenter zone);
+
+    /**
+     * Disables HA across a zone
+     * @param zone the zone
+     * @return returns operation success
+     */
+    boolean disableHA(final DataCenter zone);
+
+    /**
+     * Returns list of HA config for resources, by resource ID and/or type if provided
+     * @param resourceId (optional) ID of the resource
+     * @param resourceType (optional) type of the resource
+     * @return returns list of ha config for the resource
+     */
+    List<HAConfig> listHAResources(final Long resourceId, final HAResource.ResourceType resourceType);
+
+    /**
+     * Returns list of HA providers for resources
+     * @param resourceType type of the resource
+     * @param entityType sub-type of the resource
+     * @return returns list of ha provider names
+     */
+    List<String> listHAProviders(final HAResource.ResourceType resourceType, final HAResource.ResourceSubType entityType);
+}
diff --git a/api/src/org/apache/cloudstack/ha/HAResource.java b/api/src/org/apache/cloudstack/ha/HAResource.java
new file mode 100644
index 00000000000..650a58b3297
--- /dev/null
+++ b/api/src/org/apache/cloudstack/ha/HAResource.java
@@ -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.
+
+package org.apache.cloudstack.ha;
+
+import org.apache.cloudstack.kernel.Partition;
+
+public interface HAResource extends Partition {
+    enum ResourceType {
+        Host,
+        VirtualMachine
+    }
+
+    enum ResourceSubType {
+        KVM,
+        Simulator,
+        Unknown
+    }
+
+    long getDataCenterId();
+    Long getClusterId();
+    ResourceType resourceType();
+}
diff --git a/api/src/org/apache/cloudstack/kernel/Partition.java b/api/src/org/apache/cloudstack/kernel/Partition.java
new file mode 100644
index 00000000000..6d93e3e23ce
--- /dev/null
+++ b/api/src/org/apache/cloudstack/kernel/Partition.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 org.apache.cloudstack.kernel;
+
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
+public interface Partition extends InternalIdentity, Identity {
+    enum PartitionType {
+        Zone, Pod, Cluster, Host, VM
+    }
+    PartitionType partitionType();
+}
diff --git a/api/src/org/apache/cloudstack/network/tls/CertService.java b/api/src/org/apache/cloudstack/network/tls/CertService.java
new file mode 100644
index 00000000000..6f4feff9fab
--- /dev/null
+++ b/api/src/org/apache/cloudstack/network/tls/CertService.java
@@ -0,0 +1,36 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT 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.network.tls;
+
+import java.security.cert.Certificate;
+import java.util.List;
+
+import org.apache.cloudstack.api.command.user.loadbalancer.DeleteSslCertCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.ListSslCertsCmd;
+import org.apache.cloudstack.api.command.user.loadbalancer.UploadSslCertCmd;
+import org.apache.cloudstack.api.response.SslCertResponse;
+
+public interface CertService {
+
+    public SslCertResponse uploadSslCert(UploadSslCertCmd certCmd);
+
+    public void deleteSslCert(DeleteSslCertCmd deleteSslCertCmd);
+
+    public List<SslCertResponse> listSslCerts(ListSslCertsCmd listSslCertCmd);
+
+    public Certificate parseCertificate(final String cert);
+}
\ No newline at end of file
diff --git a/api/src/org/apache/cloudstack/network/tls/SslCert.java b/api/src/org/apache/cloudstack/network/tls/SslCert.java
new file mode 100644
index 00000000000..074bba6c111
--- /dev/null
+++ b/api/src/org/apache/cloudstack/network/tls/SslCert.java
@@ -0,0 +1,35 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package org.apache.cloudstack.network.tls;
+
+import org.apache.cloudstack.acl.ControlledEntity;
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
+public interface SslCert extends InternalIdentity, Identity, ControlledEntity {
+
+    public String getCertificate();
+
+    public String getKey();
+
+    public String getChain();
+
+    public String getPassword();
+
+    public String getFingerPrint();
+    public String getName();
+}
diff --git a/api/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagement.java b/api/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagement.java
index 1a22328e02e..972d6261674 100644
--- a/api/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagement.java
+++ b/api/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagement.java
@@ -39,7 +39,7 @@
 
     String getAddress();
 
-    Integer getPort();
+    String getPort();
 
     String getUsername();
 
@@ -53,7 +53,7 @@
 
     void setAddress(String address);
 
-    void setPort(Integer port);
+    void setPort(String port);
 
     void setUsername(String username);
 
diff --git a/api/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementService.java b/api/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementService.java
index 699b2c6a99b..a8b73b73889 100644
--- a/api/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementService.java
+++ b/api/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementService.java
@@ -30,9 +30,6 @@
     ConfigKey<Long> ActionTimeout = new ConfigKey<Long>("Advanced", Long.class, "outofbandmanagement.action.timeout", "60",
                     "The out of band management action timeout in seconds, configurable by cluster", true, ConfigKey.Scope.Cluster);
 
-    ConfigKey<Long> SyncThreadInterval = new ConfigKey<Long>("Advanced", Long.class, "outofbandmanagement.sync.interval", "300000",
-            "The interval (in milliseconds) when the out-of-band management background sync are retrieved", true, ConfigKey.Scope.Global);
-
     ConfigKey<Integer> SyncThreadPoolSize = new ConfigKey<Integer>("Advanced", Integer.class, "outofbandmanagement.sync.poolsize", "50",
             "The out of band management background sync thread pool size", true, ConfigKey.Scope.Global);
 
@@ -49,7 +46,7 @@
     OutOfBandManagementResponse disableOutOfBandManagement(Cluster cluster);
     OutOfBandManagementResponse disableOutOfBandManagement(Host host);
 
-    OutOfBandManagementResponse configureOutOfBandManagement(Host host, ImmutableMap<OutOfBandManagement.Option, String> options);
-    OutOfBandManagementResponse executeOutOfBandManagementPowerOperation(Host host, OutOfBandManagement.PowerOperation operation, Long timeout);
-    OutOfBandManagementResponse changeOutOfBandManagementPassword(Host host, String password);
+    OutOfBandManagementResponse configure(Host host, ImmutableMap<OutOfBandManagement.Option, String> options);
+    OutOfBandManagementResponse executePowerOperation(Host host, OutOfBandManagement.PowerOperation operation, Long timeout);
+    OutOfBandManagementResponse changePassword(Host host, String password);
 }
diff --git a/api/src/org/apache/cloudstack/poll/BackgroundPollManager.java b/api/src/org/apache/cloudstack/poll/BackgroundPollManager.java
new file mode 100644
index 00000000000..b9d55000294
--- /dev/null
+++ b/api/src/org/apache/cloudstack/poll/BackgroundPollManager.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.poll;
+
+public interface BackgroundPollManager {
+    /**
+     * Submits a background poll task that need to run continuously in the background
+     * to poll external resources, update states, trigger actions etc.
+     * Tasks must be submitted by a manager in configure-phase, the list of submitted tasks
+     * are then submitted to the internal executor service during start-phase.
+     * @param task periodic background task
+     * @since 4.11
+     */
+    void submitTask(final BackgroundPollTask task);
+}
diff --git a/api/src/org/apache/cloudstack/poll/BackgroundPollTask.java b/api/src/org/apache/cloudstack/poll/BackgroundPollTask.java
new file mode 100644
index 00000000000..5f1b3300c48
--- /dev/null
+++ b/api/src/org/apache/cloudstack/poll/BackgroundPollTask.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.poll;
+
+public interface BackgroundPollTask extends Runnable {
+    /**
+     * Returns delay in milliseconds between two rounds
+     * When it returns null a default value is used
+     * @return
+     */
+    Long getDelay();
+}
diff --git a/api/src/org/apache/cloudstack/region/RegionService.java b/api/src/org/apache/cloudstack/region/RegionService.java
index afefcc7672e..bee66910b4d 100644
--- a/api/src/org/apache/cloudstack/region/RegionService.java
+++ b/api/src/org/apache/cloudstack/region/RegionService.java
@@ -27,6 +27,7 @@
 import org.apache.cloudstack.api.command.admin.user.DeleteUserCmd;
 import org.apache.cloudstack.api.command.admin.user.DisableUserCmd;
 import org.apache.cloudstack.api.command.admin.user.EnableUserCmd;
+import org.apache.cloudstack.api.command.admin.user.MoveUserCmd;
 import org.apache.cloudstack.api.command.admin.user.UpdateUserCmd;
 import org.apache.cloudstack.api.command.user.region.ListRegionsCmd;
 
@@ -110,10 +111,17 @@
      */
     boolean deleteUser(DeleteUserCmd deleteUserCmd);
 
+    /**
+     * Deletes user by Id
+     * @param moveUserCmd
+     * @return true if delete was successful, false otherwise
+     */
+    boolean moveUser(MoveUserCmd moveUserCmd);
+
     /**
      * update an existing domain
      *
-     * @param cmd
+     * @param updateDomainCmd
      *            - the command containing domainId and new domainName
      * @return Domain object if the command succeeded
      */
diff --git a/api/src/org/apache/cloudstack/usage/UsageTypes.java b/api/src/org/apache/cloudstack/usage/UsageTypes.java
index d9cfc132e15..f03d9a9f733 100644
--- a/api/src/org/apache/cloudstack/usage/UsageTypes.java
+++ b/api/src/org/apache/cloudstack/usage/UsageTypes.java
@@ -42,6 +42,8 @@
     public static final int VM_DISK_BYTES_READ = 23;
     public static final int VM_DISK_BYTES_WRITE = 24;
     public static final int VM_SNAPSHOT = 25;
+    public static final int VOLUME_SECONDARY = 26;
+    public static final int VM_SNAPSHOT_ON_PRIMARY = 27;
 
     public static List<UsageTypeResponse> listUsageTypes() {
         List<UsageTypeResponse> responseList = new ArrayList<UsageTypeResponse>();
@@ -64,6 +66,7 @@
         responseList.add(new UsageTypeResponse(VM_DISK_BYTES_READ, "VM Disk usage(Bytes Read)"));
         responseList.add(new UsageTypeResponse(VM_DISK_BYTES_WRITE, "VM Disk usage(Bytes Write)"));
         responseList.add(new UsageTypeResponse(VM_SNAPSHOT, "VM Snapshot storage usage"));
+        responseList.add(new UsageTypeResponse(VM_SNAPSHOT_ON_PRIMARY, "VM Snapshot on primary storage usage"));
         return responseList;
     }
 }
diff --git a/api/test/com/cloud/network/IsolationMethodTest.java b/api/test/com/cloud/network/IsolationMethodTest.java
new file mode 100644
index 00000000000..2db3ec55db2
--- /dev/null
+++ b/api/test/com/cloud/network/IsolationMethodTest.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 com.cloud.network;
+
+import org.junit.After;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+public class IsolationMethodTest {
+    @After
+    public void cleanTheRegistry() {
+        PhysicalNetwork.IsolationMethod.registeredIsolationMethods.removeAll(PhysicalNetwork.IsolationMethod.registeredIsolationMethods);
+    }
+
+    @Test
+    public void equalsTest() throws Exception {
+        PhysicalNetwork.IsolationMethod method = new PhysicalNetwork.IsolationMethod("bla");
+        assertEquals(PhysicalNetwork.IsolationMethod.UNKNOWN_PROVIDER, method.provider);
+        assertEquals(new PhysicalNetwork.IsolationMethod("bla", PhysicalNetwork.IsolationMethod.UNKNOWN_PROVIDER), method);
+    }
+
+    @Test
+    public void toStringTest() throws Exception {
+        PhysicalNetwork.IsolationMethod method = new PhysicalNetwork.IsolationMethod("bla", "blob");
+        assertEquals("bla", method.toString());
+
+    }
+
+    @Test
+    public void getGeneric() throws Exception {
+        PhysicalNetwork.IsolationMethod method = new PhysicalNetwork.IsolationMethod("bla", "blob");
+        method = new PhysicalNetwork.IsolationMethod("bla");
+
+        assertEquals("blob",PhysicalNetwork.IsolationMethod.getIsolationMethod("bla").getProvider());
+    }
+
+    @Test
+    public void removeUnregistered() throws Exception {
+        assertFalse(PhysicalNetwork.IsolationMethod.remove("bla", "blob"));
+    }
+
+    @Test
+    public void removeSuccesfulGeneric() throws Exception {
+        PhysicalNetwork.IsolationMethod method = new PhysicalNetwork.IsolationMethod("bla", "blob");
+        method = new PhysicalNetwork.IsolationMethod("bla");
+
+        PhysicalNetwork.IsolationMethod.remove("bla", "blob");
+        assertEquals(PhysicalNetwork.IsolationMethod.UNKNOWN_PROVIDER,PhysicalNetwork.IsolationMethod.getIsolationMethod("bla").getProvider());
+    }
+
+    @Test(expected= PhysicalNetwork.IsolationMethod.IsolationMethodNotRegistered.class)
+    public void removeSuccesfulSpecificByString() throws Exception {
+        PhysicalNetwork.IsolationMethod method = new PhysicalNetwork.IsolationMethod("bla", "blob");
+
+        PhysicalNetwork.IsolationMethod.remove("bla", "blob");
+        PhysicalNetwork.IsolationMethod.getIsolationMethod("bla");
+    }
+
+    @Test(expected= PhysicalNetwork.IsolationMethod.IsolationMethodNotRegistered.class)
+    public void removeSuccesfulSpecificObject() throws Exception {
+        PhysicalNetwork.IsolationMethod method = new PhysicalNetwork.IsolationMethod("bla");
+
+        PhysicalNetwork.IsolationMethod.remove(method);
+        PhysicalNetwork.IsolationMethod.getIsolationMethod("bla");
+    }
+
+    @Test
+    public void getIsolationMethodTest() throws Exception {
+        PhysicalNetwork.IsolationMethod method = new PhysicalNetwork.IsolationMethod("bla");
+        final PhysicalNetwork.IsolationMethod isolationMethod = PhysicalNetwork.IsolationMethod.getIsolationMethod("bla");
+        assertEquals(method, isolationMethod);
+    }
+}
diff --git a/api/test/com/cloud/network/NetworksTest.java b/api/test/com/cloud/network/NetworksTest.java
index c9102d3a02a..ef582924342 100644
--- a/api/test/com/cloud/network/NetworksTest.java
+++ b/api/test/com/cloud/network/NetworksTest.java
@@ -16,16 +16,16 @@
 // under the License.
 package com.cloud.network;
 
-import java.net.URISyntaxException;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-
 import com.cloud.dc.Vlan;
 import com.cloud.network.Networks.BroadcastDomainType;
 import com.cloud.network.Networks.IsolationType;
 import com.cloud.utils.exception.CloudRuntimeException;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.net.URI;
+import java.net.URISyntaxException;
 
 /**
  * @author dhoogland
@@ -43,6 +43,13 @@ public void emptyBroadcastDomainTypeTest() throws URISyntaxException {
         Assert.assertEquals("an empty uri should mean a broadcasttype of undecided", BroadcastDomainType.UnDecided, type);
     }
 
+    @Test
+    public void vlanCommaSeparatedTest() throws URISyntaxException {
+        Assert.assertEquals(BroadcastDomainType.getValue(new URI("vlan://100")), "100");
+        Assert.assertEquals(BroadcastDomainType.getValue(new URI("vlan://100-200")), "100-200");
+        Assert.assertEquals(BroadcastDomainType.getValue(new URI("vlan://10-50,12,11,112-170")), "10-50,12,11,112-170");
+    }
+
     @Test
     public void vlanBroadcastDomainTypeTest() throws URISyntaxException {
         String uri1 = "vlan://1";
diff --git a/api/test/com/cloud/storage/StorageTest.java b/api/test/com/cloud/storage/StorageTest.java
new file mode 100644
index 00000000000..332a8060d08
--- /dev/null
+++ b/api/test/com/cloud/storage/StorageTest.java
@@ -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.
+package com.cloud.storage;
+
+import com.cloud.storage.Storage.StoragePoolType;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class StorageTest {
+    @Before
+    public void setUp() {
+    }
+
+    @Test
+    public void isSharedStoragePool() {
+        Assert.assertFalse(StoragePoolType.Filesystem.isShared());
+        Assert.assertTrue(StoragePoolType.NetworkFilesystem.isShared());
+        Assert.assertTrue(StoragePoolType.IscsiLUN.isShared());
+        Assert.assertTrue(StoragePoolType.Iscsi.isShared());
+        Assert.assertFalse(StoragePoolType.ISO.isShared());
+        Assert.assertTrue(StoragePoolType.Iscsi.isShared());
+        Assert.assertFalse(StoragePoolType.LVM.isShared());
+        Assert.assertTrue(StoragePoolType.CLVM.isShared());
+        Assert.assertTrue(StoragePoolType.RBD.isShared());
+        Assert.assertTrue(StoragePoolType.SharedMountPoint.isShared());
+        Assert.assertTrue(StoragePoolType.VMFS.isShared());
+        Assert.assertTrue(StoragePoolType.PreSetup.isShared());
+        Assert.assertFalse(StoragePoolType.EXT.isShared());
+        Assert.assertTrue(StoragePoolType.OCFS2.isShared());
+        Assert.assertTrue(StoragePoolType.SMB.isShared());
+        Assert.assertTrue(StoragePoolType.Gluster.isShared());
+        Assert.assertTrue(StoragePoolType.ManagedNFS.isShared());
+    }
+
+    @Test
+    public void supportsOverprovisioningStoragePool() {
+        Assert.assertTrue(StoragePoolType.Filesystem.supportsOverProvisioning());
+        Assert.assertTrue(StoragePoolType.NetworkFilesystem.supportsOverProvisioning());
+        Assert.assertFalse(StoragePoolType.IscsiLUN.supportsOverProvisioning());
+        Assert.assertFalse(StoragePoolType.Iscsi.supportsOverProvisioning());
+        Assert.assertFalse(StoragePoolType.ISO.supportsOverProvisioning());
+        Assert.assertFalse(StoragePoolType.Iscsi.supportsOverProvisioning());
+        Assert.assertFalse(StoragePoolType.LVM.supportsOverProvisioning());
+        Assert.assertFalse(StoragePoolType.CLVM.supportsOverProvisioning());
+        Assert.assertTrue(StoragePoolType.RBD.supportsOverProvisioning());
+        Assert.assertFalse(StoragePoolType.SharedMountPoint.supportsOverProvisioning());
+        Assert.assertTrue(StoragePoolType.VMFS.supportsOverProvisioning());
+        Assert.assertTrue(StoragePoolType.PreSetup.supportsOverProvisioning());
+        Assert.assertTrue(StoragePoolType.EXT.supportsOverProvisioning());
+        Assert.assertFalse(StoragePoolType.OCFS2.supportsOverProvisioning());
+        Assert.assertFalse(StoragePoolType.SMB.supportsOverProvisioning());
+        Assert.assertFalse(StoragePoolType.Gluster.supportsOverProvisioning());
+        Assert.assertFalse(StoragePoolType.ManagedNFS.supportsOverProvisioning());
+    }
+}
diff --git a/api/test/org/apache/cloudstack/api/command/admin/annotation/AddAnnotationCmdTest.java b/api/test/org/apache/cloudstack/api/command/admin/annotation/AddAnnotationCmdTest.java
new file mode 100644
index 00000000000..06656868994
--- /dev/null
+++ b/api/test/org/apache/cloudstack/api/command/admin/annotation/AddAnnotationCmdTest.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.command.admin.annotation;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.MockitoAnnotations;
+
+public class AddAnnotationCmdTest {
+
+    private AddAnnotationCmd addAnnotationCmd = new AddAnnotationCmd();
+
+    @Before
+    public void setUp() throws Exception {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test (expected = IllegalStateException.class)
+    public void wrongEntityType() throws Exception {
+        addAnnotationCmd.setEntityType("BLA");
+        addAnnotationCmd.setEntityUuid("1");
+        addAnnotationCmd.execute();
+    }
+}
diff --git a/api/test/org/apache/cloudstack/api/command/test/CreateSnapshotCmdTest.java b/api/test/org/apache/cloudstack/api/command/test/CreateSnapshotCmdTest.java
new file mode 100644
index 00000000000..bc2beb6cb66
--- /dev/null
+++ b/api/test/org/apache/cloudstack/api/command/test/CreateSnapshotCmdTest.java
@@ -0,0 +1,132 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT 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 com.cloud.storage.Snapshot;
+import com.cloud.storage.VolumeApiService;
+import com.cloud.user.Account;
+import com.cloud.user.AccountService;
+import junit.framework.TestCase;
+import org.apache.cloudstack.api.ResponseGenerator;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.command.user.snapshot.CreateSnapshotCmd;
+import org.apache.cloudstack.api.response.SnapshotResponse;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.mockito.Mockito;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.isNull;
+
+public class CreateSnapshotCmdTest extends TestCase {
+
+    private CreateSnapshotCmd createSnapshotCmd;
+    private ResponseGenerator responseGenerator;
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Override
+    @Before
+    public void setUp() {
+
+        createSnapshotCmd = new CreateSnapshotCmd() {
+
+            @Override
+            public String getCommandName() {
+                return "createsnapshotresponse";
+            }
+
+            @Override
+            public Long getVolumeId(){
+                return 1L;
+            }
+
+            @Override
+            public long getEntityOwnerId(){
+                return 1L;
+            }
+        };
+
+    }
+
+    @Test
+    public void testCreateSuccess() {
+
+        AccountService accountService = Mockito.mock(AccountService.class);
+        Account account = Mockito.mock(Account.class);
+        Mockito.when(accountService.getAccount(anyLong())).thenReturn(account);
+
+        VolumeApiService volumeApiService = Mockito.mock(VolumeApiService.class);
+        Snapshot snapshot = Mockito.mock(Snapshot.class);
+        try {
+
+            Mockito.when(volumeApiService.takeSnapshot(anyLong(), anyLong(), anyLong(),
+                    any(Account.class), anyBoolean(), isNull(Snapshot.LocationType.class), anyBoolean())).thenReturn(snapshot);
+
+        } catch (Exception e) {
+            Assert.fail("Received exception when success expected " + e.getMessage());
+        }
+
+        responseGenerator = Mockito.mock(ResponseGenerator.class);
+        SnapshotResponse snapshotResponse = Mockito.mock(SnapshotResponse.class);
+        Mockito.when(responseGenerator.createSnapshotResponse(snapshot)).thenReturn(snapshotResponse);
+        Mockito.doNothing().when(snapshotResponse).setAccountName(anyString());
+
+        createSnapshotCmd._accountService = accountService;
+        createSnapshotCmd._responseGenerator = responseGenerator;
+        createSnapshotCmd._volumeService = volumeApiService;
+
+        try {
+            createSnapshotCmd.execute();
+        } catch (Exception e) {
+            Assert.fail("Received exception when success expected " + e.getMessage());
+        }
+    }
+
+    @Test
+    public void testCreateFailure() {
+
+        AccountService accountService = Mockito.mock(AccountService.class);
+        Account account = Mockito.mock(Account.class);
+        Mockito.when(accountService.getAccount(anyLong())).thenReturn(account);
+
+        VolumeApiService volumeApiService = Mockito.mock(VolumeApiService.class);
+
+        try {
+                Mockito.when(volumeApiService.takeSnapshot(anyLong(), anyLong(), anyLong(),
+                        any(Account.class), anyBoolean(), isNull(Snapshot.LocationType.class), anyBoolean())).thenReturn(null);
+        } catch (Exception e) {
+            Assert.fail("Received exception when success expected " + e.getMessage());
+        }
+
+        createSnapshotCmd._accountService = accountService;
+        createSnapshotCmd._volumeService = volumeApiService;
+
+        try {
+            createSnapshotCmd.execute();
+        } catch (ServerApiException exception) {
+            Assert.assertEquals("Failed to create snapshot due to an internal error creating snapshot for volume 1", exception.getDescription());
+        }
+    }
+}
diff --git a/api/test/org/apache/cloudstack/api/command/test/UpdateRoleCmdTest.java b/api/test/org/apache/cloudstack/api/command/test/UpdateRoleCmdTest.java
new file mode 100644
index 00000000000..c0bd390c196
--- /dev/null
+++ b/api/test/org/apache/cloudstack/api/command/test/UpdateRoleCmdTest.java
@@ -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.
+
+package org.apache.cloudstack.api.command.test;
+
+import junit.framework.TestCase;
+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.UpdateRoleCmd;
+import org.apache.cloudstack.api.response.RoleResponse;
+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 UpdateRoleCmdTest extends TestCase{
+
+    private UpdateRoleCmd updateRoleCmd;
+    private RoleService roleService;
+    private Role role;
+
+    @Override
+    @Before
+    public void setUp() {
+        roleService = Mockito.spy(RoleService.class);
+        updateRoleCmd = new UpdateRoleCmd();
+        ReflectionTestUtils.setField(updateRoleCmd,"roleService",roleService);
+        ReflectionTestUtils.setField(updateRoleCmd,"roleId",1L);
+        ReflectionTestUtils.setField(updateRoleCmd,"roleName","user");
+        ReflectionTestUtils.setField(updateRoleCmd,"roleType", "User");
+        ReflectionTestUtils.setField(updateRoleCmd,"roleDescription","Description Initial");
+        role = Mockito.mock(Role.class);
+    }
+
+    @Test
+    public void testUpdateSuccess() {
+        when(roleService.findRole(updateRoleCmd.getRoleId())).thenReturn(role);
+        when(role.getId()).thenReturn(1L);
+        when(role.getUuid()).thenReturn("12345-abcgdkajd");
+        when(role.getDescription()).thenReturn("Defualt user");
+        when(role.getName()).thenReturn("User");
+        when(role.getRoleType()).thenReturn(RoleType.User);
+        when(roleService.updateRole(role,updateRoleCmd.getRoleName(),updateRoleCmd.getRoleType(),updateRoleCmd.getRoleDescription())).thenReturn(role);
+        when(role.getId()).thenReturn(1L);
+        when(role.getDescription()).thenReturn("Description Initial");
+        when(role.getName()).thenReturn("User");
+        updateRoleCmd.execute();
+        RoleResponse response = (RoleResponse) updateRoleCmd.getResponseObject();
+        assertEquals((String)ReflectionTestUtils.getField(response, "roleName"),role.getName());
+        assertEquals((String)ReflectionTestUtils.getField(response, "roleDescription"),role.getDescription());
+    }
+}
diff --git a/api/test/org/apache/cloudstack/api/command/user/template/CopyTemplateCmdByAdminTest.java b/api/test/org/apache/cloudstack/api/command/user/template/CopyTemplateCmdByAdminTest.java
new file mode 100644
index 00000000000..d34c31ffaf2
--- /dev/null
+++ b/api/test/org/apache/cloudstack/api/command/user/template/CopyTemplateCmdByAdminTest.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.command.user.template;
+
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.template.TemplateApiService;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.command.admin.template.CopyTemplateCmdByAdmin;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.ArrayList;
+
+/**
+ * Created by stack on 7/21/16.
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class CopyTemplateCmdByAdminTest{
+
+    @InjectMocks
+    private CopyTemplateCmdByAdmin copyTemplateCmdByAdmin;
+
+    @Mock
+    public TemplateApiService _templateService;
+
+    @Test
+    public void testZoneidAndZoneIdListEmpty() throws ResourceAllocationException {
+        try {
+            copyTemplateCmdByAdmin = new CopyTemplateCmdByAdmin();
+            copyTemplateCmdByAdmin.execute();
+        } catch (ServerApiException e) {
+            if(e.getErrorCode() != ApiErrorCode.PARAM_ERROR) {
+                Assert.fail("API should fail when no parameters are passed.");
+            }
+        }
+    }
+
+    @Test
+    public void testDestZoneidAndDestZoneIdListBothPresent() throws ResourceAllocationException {
+        try {
+            copyTemplateCmdByAdmin = new CopyTemplateCmdByAdmin();
+            copyTemplateCmdByAdmin.destZoneId = -1L;
+            copyTemplateCmdByAdmin.destZoneIds = new ArrayList<>();
+            copyTemplateCmdByAdmin.destZoneIds.add(-1L);
+
+            copyTemplateCmdByAdmin.execute();
+        } catch (ServerApiException e) {
+            if(e.getErrorCode() != ApiErrorCode.PARAM_ERROR) {
+                Assert.fail("Api should fail when both destzoneid and destzoneids are passed");
+            }
+        }
+    }
+
+
+}
+
diff --git a/api/test/org/apache/cloudstack/api/command/user/template/CopyTemplateCmdTest.java b/api/test/org/apache/cloudstack/api/command/user/template/CopyTemplateCmdTest.java
new file mode 100644
index 00000000000..145aaa68d83
--- /dev/null
+++ b/api/test/org/apache/cloudstack/api/command/user/template/CopyTemplateCmdTest.java
@@ -0,0 +1,75 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.cloudstack.api.command.user.template;
+
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.template.TemplateApiService;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.ServerApiException;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+
+import java.util.ArrayList;
+
+/**
+ * Created by stack on 7/21/16.
+ */
+@RunWith(MockitoJUnitRunner.class)
+public class CopyTemplateCmdTest{
+
+    @InjectMocks
+    private CopyTemplateCmd copyTemplateCmd;
+
+    @Mock
+    public TemplateApiService _templateService;
+
+    @Test
+    public void testZoneidAndZoneIdListEmpty() throws ResourceAllocationException {
+        try {
+            copyTemplateCmd = new CopyTemplateCmd();
+            copyTemplateCmd.execute();
+        } catch (ServerApiException e) {
+            if(e.getErrorCode() != ApiErrorCode.PARAM_ERROR) {
+                Assert.fail("API should fail when no parameters are passed.");
+            }
+        }
+    }
+
+    @Test
+    public void testDestZoneidAndDestZoneIdListBothPresent() throws ResourceAllocationException {
+        try {
+            copyTemplateCmd = new CopyTemplateCmd();
+            copyTemplateCmd.destZoneId = -1L;
+            copyTemplateCmd.destZoneIds = new ArrayList<>();
+            copyTemplateCmd.destZoneIds.add(-1L);
+
+            copyTemplateCmd.execute();
+        } catch (ServerApiException e) {
+            if(e.getErrorCode() != ApiErrorCode.PARAM_ERROR) {
+                Assert.fail("Api should fail when both destzoneid and destzoneids are passed");
+            }
+        }
+    }
+
+
+}
+
diff --git a/api/test/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmdByAdminTest.java b/api/test/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmdByAdminTest.java
new file mode 100644
index 00000000000..1ba7963b2b9
--- /dev/null
+++ b/api/test/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmdByAdminTest.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.user.template;
+
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.template.TemplateApiService;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.command.admin.template.RegisterTemplateCmdByAdmin;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import java.util.ArrayList;
+
+@RunWith(MockitoJUnitRunner.class)
+public class RegisterTemplateCmdByAdminTest{
+
+    @InjectMocks
+    private RegisterTemplateCmdByAdmin registerTemplateCmdByAdmin;
+
+    @Mock
+    public TemplateApiService _templateService;
+
+    @Test
+    public void testZoneidAndZoneIdListEmpty() throws ResourceAllocationException {
+        try {
+            registerTemplateCmdByAdmin = new RegisterTemplateCmdByAdmin();
+            registerTemplateCmdByAdmin.execute();
+        } catch (ServerApiException e) {
+            if(e.getErrorCode() != ApiErrorCode.PARAM_ERROR) {
+                Assert.fail("Api should fail when both zoneid and zoneids aren't passed");
+            }
+        }
+    }
+
+    @Test
+    public void testZoneidAndZoneIdListBothPresent() throws ResourceAllocationException {
+        try {
+            registerTemplateCmdByAdmin = new RegisterTemplateCmdByAdmin();
+            registerTemplateCmdByAdmin.zoneId = -1L;
+            registerTemplateCmdByAdmin.zoneIds = new ArrayList<>();
+            registerTemplateCmdByAdmin.zoneIds.add(-1L);
+
+            registerTemplateCmdByAdmin.execute();
+        } catch (ServerApiException e) {
+            if(e.getErrorCode() != ApiErrorCode.PARAM_ERROR) {
+                Assert.fail("Api should fail when both zoneid and zoneids are passed");
+            }
+        }
+    }
+
+
+    @Test
+    public void testZoneidMinusOne() throws ResourceAllocationException {
+        // If zoneId is passed as -1, then zone ids list should be null.
+        registerTemplateCmdByAdmin = new RegisterTemplateCmdByAdmin();
+        registerTemplateCmdByAdmin.zoneId = -1L;
+
+        Assert.assertNull(registerTemplateCmdByAdmin.getZoneIds());
+    }
+
+    @Test
+    public void testZoneidListMinusOne() throws ResourceAllocationException {
+        // If zoneId List has only one parameter -1, then zone ids list should be null.
+        registerTemplateCmdByAdmin = new RegisterTemplateCmdByAdmin();
+        registerTemplateCmdByAdmin.zoneIds = new ArrayList<>();
+        registerTemplateCmdByAdmin.zoneIds.add(-1L);
+
+        Assert.assertNull(registerTemplateCmdByAdmin.getZoneIds());
+    }
+
+    @Test
+    public void testZoneidListMoreThanMinusOne() throws ResourceAllocationException {
+        try {
+            registerTemplateCmdByAdmin = new RegisterTemplateCmdByAdmin();
+            registerTemplateCmdByAdmin.zoneIds = new ArrayList<>();
+            registerTemplateCmdByAdmin.zoneIds.add(-1L);
+            registerTemplateCmdByAdmin.zoneIds.add(1L);
+            registerTemplateCmdByAdmin.execute();
+        } catch (ServerApiException e) {
+            if (e.getErrorCode() != ApiErrorCode.PARAM_ERROR) {
+                Assert.fail("Parameter zoneids cannot combine all zones (-1) option with other zones");
+            }
+        }
+    }
+   @Test
+    public void testZoneidPresentZoneidListAbsent() throws ResourceAllocationException {
+           registerTemplateCmdByAdmin  = new RegisterTemplateCmdByAdmin();
+           registerTemplateCmdByAdmin.zoneIds = null;
+           registerTemplateCmdByAdmin.zoneId = 1L;
+           Assert.assertEquals((Long)1L,registerTemplateCmdByAdmin.getZoneIds().get(0));
+    }
+}
diff --git a/api/test/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmdTest.java b/api/test/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmdTest.java
new file mode 100644
index 00000000000..f0cf6a91af2
--- /dev/null
+++ b/api/test/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmdTest.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.user.template;
+
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.template.TemplateApiService;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.ServerApiException;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import java.util.ArrayList;
+
+@RunWith(MockitoJUnitRunner.class)
+public class RegisterTemplateCmdTest{
+
+    @InjectMocks
+    private RegisterTemplateCmd registerTemplateCmd;
+
+    @Mock
+    public TemplateApiService _templateService;
+
+    @Test
+    public void testZoneidAndZoneIdListEmpty() throws ResourceAllocationException {
+        try {
+            registerTemplateCmd = new RegisterTemplateCmd();
+            registerTemplateCmd.execute();
+        } catch (ServerApiException e) {
+            if(e.getErrorCode() != ApiErrorCode.PARAM_ERROR) {
+                Assert.fail("Api should fail when both zoneid and zoneids aren't passed");
+            }
+        }
+    }
+
+    @Test
+    public void testZoneidAndZoneIdListBothPresent() throws ResourceAllocationException {
+        try {
+            registerTemplateCmd = new RegisterTemplateCmd();
+            registerTemplateCmd.zoneId = -1L;
+            registerTemplateCmd.zoneIds = new ArrayList<>();
+            registerTemplateCmd.zoneIds.add(-1L);
+
+            registerTemplateCmd.execute();
+        } catch (ServerApiException e) {
+            if(e.getErrorCode() != ApiErrorCode.PARAM_ERROR) {
+                Assert.fail("Api should fail when both zoneid and zoneids are passed");
+            }
+        }
+    }
+
+
+    @Test
+    public void testZoneidMinusOne() throws ResourceAllocationException {
+        // If zoneId is passed as -1, then zone ids list should be null.
+        registerTemplateCmd = new RegisterTemplateCmd();
+        registerTemplateCmd.zoneId = -1L;
+
+        Assert.assertNull(registerTemplateCmd.getZoneIds());
+    }
+
+    @Test
+    public void testZoneidListMinusOne() throws ResourceAllocationException {
+        // If zoneId List has only one parameter -1, then zone ids list should be null.
+        registerTemplateCmd = new RegisterTemplateCmd();
+        registerTemplateCmd.zoneIds = new ArrayList<>();
+        registerTemplateCmd.zoneIds.add(-1L);
+
+        Assert.assertNull(registerTemplateCmd.getZoneIds());
+    }
+    @Test
+    public void testZoneidListMoreThanMinusOne() throws ResourceAllocationException {
+        try {
+            registerTemplateCmd = new RegisterTemplateCmd();
+            registerTemplateCmd.zoneIds = new ArrayList<>();
+            registerTemplateCmd.zoneIds.add(-1L);
+            registerTemplateCmd.zoneIds.add(1L);
+            registerTemplateCmd.execute();
+        } catch (ServerApiException e) {
+            if (e.getErrorCode() != ApiErrorCode.PARAM_ERROR) {
+                Assert.fail("Parameter zoneids cannot combine all zones (-1) option with other zones");
+            }
+        }
+    }
+    @Test
+    public void testZoneidPresentZoneidListAbsent() throws ResourceAllocationException {
+            registerTemplateCmd = new RegisterTemplateCmd();
+            registerTemplateCmd.zoneIds = null;
+            registerTemplateCmd.zoneId = 1L;
+            Assert.assertEquals((Long)1L,registerTemplateCmd.getZoneIds().get(0));
+    }
+}
diff --git a/build/replace.properties b/build/replace.properties
index 9e0b65c6901..3d9a4597060 100644
--- a/build/replace.properties
+++ b/build/replace.properties
@@ -27,4 +27,4 @@ AGENTLOG=logs/agent.log
 MSMNTDIR=/mnt
 COMPONENTS-SPEC=components.xml
 REMOTEHOST=localhost
-COMMONLIBDIR=client/target/cloud-client-ui-4.7.0/WEB-INF/lib/
+COMMONLIBDIR=client/target/common/
diff --git a/client/WEB-INF/classes/resources/messages.properties b/client/WEB-INF/classes/resources/messages.properties
deleted file mode 100644
index 327e1d9db1f..00000000000
--- a/client/WEB-INF/classes/resources/messages.properties
+++ /dev/null
@@ -1,2291 +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.
-label.add.ldap.account=Add LDAP account
-label.vm.ip=VM IP Address
-message.listView.subselect.multi=(Ctrl/Cmd-click)
-label.use.vm.ips=Use VM IPs
-label.reinstall.vm=Reinstall VM
-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.
-label.recover.vm=Recover VM
-message.recover.vm=Please confirm that you would like to recover this VM.
-label.port=Port
-label.remove.ldap=Remove LDAP
-label.configure.ldap=Configure LDAP
-label.ldap.configuration=LDAP Configuration
-label.ldap.port=LDAP port
-label.create.nfs.secondary.staging.store=Create NFS secondary staging store
-label.volatile=Volatile
-label.planner.mode=Planner mode
-label.deployment.planner=Deployment planner
-label.quiesce.vm=Quiesce VM
-label.smb.username=SMB Username
-label.smb.password=SMB Password
-label.smb.domain=SMB Domain
-label.hypervisors=Hypervisors
-label.home=Home
-label.sockets=CPU Sockets
-label.root.disk.size=Root disk size (GB)
-label.s3.nfs.server=S3 NFS Server
-label.s3.nfs.path=S3 NFS Path
-label.delete.events=Delete events
-label.delete.alerts=Delete alerts
-label.archive.alerts=Archive alerts
-label.archive.events=Archive events
-label.by.alert.type=By alert type
-label.by.event.type=By event type
-label.by.date.start=By date (start)
-label.by.date.end=By date (end)
-label.switch.type=Switch Type
-label.service.state=Service State
-label.egress.default.policy=Egress Default Policy
-label.routing=Routing
-label.hvm=HVM
-label.about=About
-label.app.name=CloudStack
-label.about.app=About CloudStack
-label.custom.disk.iops=Custom IOPS
-label.disk.iops.min=Min IOPS
-label.disk.iops.max=Max IOPS
-label.disk.iops.total=IOPS Total
-label.hypervisor.snapshot.reserve=Hypervisor Snapshot Reserve
-label.secondary.ips=Secondary IPs
-label.edit.secondary.ips=Edit secondary IPs
-label.view.secondary.ips=View secondary IPs
-message.validate.invalid.characters=Invalid characters found; please correct.
-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.select.affinity.groups=Please select any affinity groups you want this VM to belong to:
-message.no.affinity.groups=You do not have any affinity groups. Please continue to the next step.
-label.action.delete.nic=Remove NIC
-message.action.delete.nic=Please confirm that want to remove this NIC, which will also remove the associated network from the VM.
-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.ldap.is.enabled=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.
-label.extractable=Extractable
-force.delete.domain.warning=Warning\: Choosing this option will cause the deletion of all child domains and all associated accounts and their resources.
-force.delete=Force Delete
-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.remove=Force Remove
-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.
-force.stop=Force Stop
-ICMP.code=ICMP Code
-ICMP.type=ICMP Type
-image.directory=Image Directory
-inline=Inline
-instances.actions.reboot.label=Reboot instance
-label.accept.project.invitation=Accept project invitation
-label.account.and.security.group=Account, Security group
-label.account.id=Account ID
-label.account.name=Account Name
-label.account.specific=Account-Specific
-label.account=Account
-label.accounts=Accounts
-label.acquire.new.ip=Acquire New IP
-label.acquire.new.secondary.ip=Acquire new secondary IP
-label.action.attach.disk.processing=Attaching Disk....
-label.action.attach.disk=Attach Disk
-label.action.attach.iso.processing=Attaching ISO....
-label.action.attach.iso=Attach ISO
-label.action.cancel.maintenance.mode.processing=Cancelling Maintenance Mode....
-label.action.cancel.maintenance.mode=Cancel Maintenance Mode
-label.action.change.password=Change Password
-label.action.configure.samlauthorization=Configure SAML SSO Authorization
-label.action.change.service.processing=Changing Service....
-label.action.change.service=Change Service
-label.action.copy.ISO.processing=Copying ISO....
-label.action.copy.ISO=Copy ISO
-label.action.copy.template.processing=Copying Template....
-label.action.copy.template=Copy 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.template=Create Template
-label.action.create.vm.processing=Creating VM....
-label.action.create.vm=Create VM
-label.action.create.volume.processing=Creating Volume....
-label.action.create.volume=Create Volume
-label.action.delete.account.processing=Deleting account....
-label.action.delete.account=Delete account
-label.action.delete.cluster.processing=Deleting Cluster....
-label.action.delete.cluster=Delete Cluster
-label.action.delete.disk.offering.processing=Deleting Disk Offering....
-label.action.delete.disk.offering=Delete Disk Offering
-label.action.delete.domain.processing=Deleting Domain....
-label.action.delete.domain=Delete Domain
-label.action.delete.firewall.processing=Deleting Firewall....
-label.action.delete.firewall=Delete firewall rule
-label.action.delete.ingress.rule.processing=Deleting Ingress Rule....
-label.action.delete.ingress.rule=Delete Ingress Rule
-label.action.delete.IP.range.processing=Deleting IP Range....
-label.action.delete.IP.range=Delete IP Range
-label.action.delete.ISO.processing=Deleting ISO....
-label.action.delete.ISO=Delete ISO
-label.action.delete.load.balancer.processing=Deleting Load Balancer....
-label.action.delete.load.balancer=Delete load balancer rule
-label.action.delete.network.processing=Deleting Network....
-label.action.delete.network=Delete Network
-label.action.delete.nexusVswitch=Delete Nexus 1000v
-label.action.delete.physical.network=Delete physical network
-label.action.delete.pod.processing=Deleting Pod....
-label.action.delete.pod=Delete Pod
-label.action.delete.primary.storage.processing=Deleting Primary Storage....
-label.action.delete.primary.storage=Delete Primary Storage
-label.action.delete.secondary.storage.processing=Deleting Secondary Storage....
-label.action.delete.secondary.storage=Delete Secondary Storage
-label.action.delete.security.group.processing=Deleting Security Group....
-label.action.delete.security.group=Delete Security Group
-label.action.delete.service.offering.processing=Deleting Service Offering....
-label.action.delete.service.offering=Delete Service Offering
-label.action.delete.snapshot.processing=Deleting Snapshot....
-label.action.delete.snapshot=Delete Snapshot
-label.action.delete.system.service.offering=Delete System Service Offering
-label.action.delete.template.processing=Deleting Template....
-label.action.delete.template=Delete Template
-label.action.delete.user.processing=Deleting User....
-label.action.delete.user=Delete User
-label.action.delete.volume.processing=Deleting Volume....
-label.action.delete.volume=Delete Volume
-label.action.delete.zone.processing=Deleting Zone....
-label.action.delete.zone=Delete Zone
-label.action.destroy.instance.processing=Destroying Instance....
-label.action.destroy.instance=Destroy Instance
-label.action.destroy.systemvm.processing=Destroying System VM....
-label.action.destroy.systemvm=Destroy System VM
-label.action.detach.disk.processing=Detaching Disk....
-label.action.detach.disk=Detach Disk
-label.action.detach.iso.processing=Detaching ISO....
-label.action.detach.iso=Detach ISO
-label.action.disable.account.processing=Disabling account....
-label.action.disable.account=Disable account
-label.action.disable.cluster.processing=Disabling Cluster....
-label.action.disable.cluster=Disable Cluster
-label.action.disable.nexusVswitch=Disable Nexus 1000v
-label.action.disable.physical.network=Disable physical network
-label.action.disable.pod.processing=Disabling Pod....
-label.action.disable.pod=Disable Pod
-label.action.disable.static.NAT.processing=Disabling Static NAT....
-label.action.disable.static.NAT=Disable Static NAT
-label.action.disable.user.processing=Disabling User....
-label.action.disable.user=Disable User
-label.action.disable.zone.processing=Disabling Zone....
-label.action.disable.zone=Disable Zone
-label.action.download.ISO=Download ISO
-label.action.download.template=Download Template
-label.action.download.volume.processing=Downloading Volume....
-label.action.download.volume=Download 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.offering=Edit Network Offering
-label.action.edit.network.processing=Editing Network....
-label.action.edit.network=Edit 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.processing=Enabling account....
-label.action.enable.account=Enable account
-label.action.enable.cluster.processing=Enabling Cluster....
-label.action.enable.cluster=Enable Cluster
-label.action.enable.maintenance.mode.processing=Enabling Maintenance Mode....
-label.action.enable.maintenance.mode=Enable Maintenance Mode
-label.action.enable.nexusVswitch=Enable Nexus 1000v
-label.action.enable.physical.network=Enable physical network
-label.action.enable.pod.processing=Enabling Pod....
-label.action.enable.pod=Enable Pod
-label.action.enable.static.NAT.processing=Enabling Static NAT....
-label.action.enable.static.NAT=Enable Static NAT
-label.action.enable.user.processing=Enabling User....
-label.action.enable.user=Enable User
-label.action.enable.zone.processing=Enabling Zone....
-label.action.enable.zone=Enable Zone
-label.action.expunge.instance=Expunge Instance
-label.action.expunge.instance.processing=Expunging Instance....
-label.action.force.reconnect.processing=Reconnecting....
-label.action.force.reconnect=Force Reconnect
-label.action.generate.keys.processing=Generate Keys....
-label.action.generate.keys=Generate Keys
-label.action.list.nexusVswitch=List Nexus 1000v
-label.action.lock.account.processing=Locking account....
-label.action.lock.account=Lock account
-label.action.manage.cluster.processing=Managing Cluster....
-label.action.manage.cluster=Manage Cluster
-label.action.migrate.instance.processing=Migrating Instance....
-label.action.migrate.instance=Migrate Instance
-label.action.migrate.router.processing=Migrating Router....
-label.action.migrate.router=Migrate Router
-label.action.migrate.systemvm.processing=Migrating System VM....
-label.action.migrate.systemvm=Migrate System VM
-label.action.reboot.instance.processing=Rebooting Instance....
-label.action.reboot.instance=Reboot Instance
-label.action.reboot.router.processing=Rebooting Router....
-label.action.reboot.router=Reboot Router
-label.action.reboot.systemvm.processing=Rebooting System VM....
-label.action.reboot.systemvm=Reboot System VM
-label.action.recurring.snapshot=Recurring Snapshots
-label.action.register.iso=Register ISO
-label.action.register.template=Register Template from URL
-label.action.release.ip.processing=Releasing IP....
-label.action.release.ip=Release IP
-label.action.remove.host.processing=Removing Host....
-label.action.remove.host=Remove Host
-label.action.reset.password.processing=Resetting Password....
-label.action.reset.password=Reset Password
-label.action.resize.volume.processing=Resizing Volume....
-label.action.resize.volume=Resize Volume
-label.action.resource.limits=Resource limits
-label.action.restore.instance.processing=Restoring Instance....
-label.action.restore.instance=Restore Instance
-label.action.start.instance.processing=Starting Instance....
-label.action.start.instance=Start Instance
-label.action.start.router.processing=Starting Router....
-label.action.start.router=Start Router
-label.action.start.systemvm.processing=Starting System VM....
-label.action.start.systemvm=Start System VM
-label.action.stop.instance.processing=Stopping Instance....
-label.action.stop.instance=Stop Instance
-label.action.stop.router.processing=Stopping Router....
-label.action.stop.router=Stop Router
-label.action.stop.systemvm.processing=Stopping System VM....
-label.action.stop.systemvm=Stop System VM
-label.action.take.snapshot.processing=Taking Snapshot....
-label.action.take.snapshot=Take Snapshot
-label.action.revert.snapshot.processing=Reverting to Snapshot...
-label.action.revert.snapshot=Revert to Snapshot
-label.action.unmanage.cluster.processing=Unmanaging Cluster....
-label.action.unmanage.cluster=Unmanage Cluster
-label.action.update.OS.preference.processing=Updating OS Preference....
-label.action.update.OS.preference=Update OS Preference
-label.action.update.resource.count.processing=Updating Resource Count....
-label.action.update.resource.count=Update 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=Activate Project
-label.active.sessions=Active Sessions
-label.add.account.to.project=Add account to project
-label.add.account=Add Account
-label.add.accounts.to=Add accounts to
-label.add.accounts=Add accounts
-label.add.ACL=Add ACL
-label.add.affinity.group=Add new affinity group
-label.add.BigSwitchBcf.device=Add BigSwitch BCF Controller
-label.add.by.cidr=Add By CIDR
-label.add.by.group=Add By Group
-label.add.by=Add by
-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.guest.network=Add guest network
-label.add.isolated.guest.network=Add Isolated Guest Network
-label.add.host=Add Host
-label.add.ingress.rule=Add Ingress Rule
-label.add.intermediate.certificate=Add intermediate certificate
-label.add.ip.range=Add IP Range
-label.add.load.balancer=Add Load Balancer
-label.add.more=Add More
-label.add.netScaler.device=Add Netscaler device
-label.add.network.ACL=Add network ACL
-label.add.network.device=Add Network Device
-label.add.network.offering=Add network offering
-label.add.network=Add Network
-label.add.new.F5=Add new F5
-label.add.new.gateway=Add new gateway
-label.add.new.NetScaler=Add new NetScaler
-label.add.new.SRX=Add new SRX
-label.add.new.PA=Add new Palo Alto
-label.add.new.tier=Add new tier
-label.add.NiciraNvp.device=Add Nvp Controller
-label.add.NuageVsp.device=Add Nuage Virtualized Services Directory (VSD)
-label.add.BrocadeVcs.device=Add Brocade Vcs Switch
-label.add.physical.network=Add physical network
-label.add.pod=Add Pod
-label.add.port.forwarding.rule=Add port forwarding rule
-label.add.primary.storage=Add Primary Storage
-label.add.region=Add Region
-label.add.resources=Add Resources
-label.add.route=Add route
-label.add.rule=Add 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.PA.device=Add Palo Alto 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.user=Add User
-label.add.userdata=Userdata
-label.add.vlan=Add VLAN
-label.add.vxlan=Add VXLAN
-label.add.VM.to.tier=Add VM to tier
-label.add.vm=Add VM
-label.add.vms.to.lb=Add VM(s) to load balancer rule
-label.add.vms=Add VMs
-label.add.volume=Add Volume
-label.add.vpc=Add VPC
-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.zone=Add Zone
-label.add=Add
-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.adding=Adding
-label.additional.networks=Additional Networks
-label.admin.accounts=Admin Accounts
-label.admin=Admin
-label.advanced.mode=Advanced Mode
-label.advanced.search=Advance Search
-label.advanced=Advanced
-label.affinity.group=Affinity Group
-label.affinity.groups=Affinity Groups
-label.affinity=Affinity
-label.agent.password=Agent Password
-label.agent.port=Agent Port
-label.agent.username=Agent Username
-label.agree=Agree
-label.alert=Alert
-label.algorithm=Algorithm
-label.allocated=Allocated
-label.allocation.state=Allocation State
-label.anti.affinity.group=Anti-affinity Group
-label.anti.affinity.groups=Anti-affinity Groups
-label.anti.affinity=Anti-affinity
-label.api.key=API Key
-label.api.version=API Version
-label.apply=Apply
-label.assign.to.load.balancer=Assigning instance to load balancer
-label.assign=Assign
-label.associated.network.id=Associated Network ID
-label.associated.network=Associated Network
-label.attached.iso=Attached ISO
-label.author.email=Author e-mail
-label.author.name=Author name
-label.availability.zone=Availability Zone
-label.availability=Availability
-label.available.public.ips=Available Public IP Addresses
-label.available=Available
-label.back=Back
-label.bandwidth=Bandwidth
-label.basic.mode=Basic Mode
-label.basic=Basic
-label.bigswitch.controller.address=BigSwitch BCF Controller Address
-label.bootable=Bootable
-label.broadcast.domain.range=Broadcast domain range
-label.broadcast.domain.type=Broadcast Domain Type
-label.broadcast.uri=Broadcast URI
-label.by.account=By Account
-label.by.availability=By Availability
-label.by.domain=By Domain
-label.by.end.date=By End Date
-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.id=By Type ID
-label.by.type=By Type
-label.by.zone=By Zone
-label.bytes.received=Bytes Received
-label.bytes.sent=Bytes Sent
-label.cancel=Cancel
-label.capacity=Capacity
-label.capacity.bytes=Capacity Bytes
-label.capacity.iops=Capacity IOPS
-label.certificate=Server certificate
-label.change.ipaddress=Change IP address for NIC
-label.change.service.offering=Change service offering
-label.change.value=Change value
-label.character=Character
-label.md5.checksum=MD5 checksum
-label.cidr.account=CIDR or Account/Security Group
-label.CIDR.list=CIDR list
-label.cidr.list=Source CIDR
-label.CIDR.of.destination.network=CIDR of destination network
-label.cidr=CIDR
-label.clean.up=Clean up
-label.make.redundant=Make redundant
-label.clear.list=Clear list
-label.close=Close
-label.cloud.console=Cloud Management Console
-label.cloud.managed=Cloud.com Managed
-label.cluster.name=Cluster Name
-label.cluster.type=Cluster Type
-label.cluster=Cluster
-label.clusters=Clusters
-label.clvm=CLVM
-label.custom.disk.offering=Custom Disk Offering
-label.rbd=RBD
-label.rbd.monitor=Ceph monitor
-label.rbd.pool=Ceph pool
-label.rbd.id=Cephx user
-label.rbd.secret=Cephx secret
-label.code=Code
-label.community=Community
-label.compute.and.storage=Compute and Storage
-label.compute.offering=Compute offering
-label.compute.offerings=Compute Offerings
-label.compute=Compute
-label.configuration=Configuration
-label.configure.network.ACLs=Configure Network ACLs
-label.configure.vpc=Configure VPC
-label.configure=Configure
-label.confirm.password=Confirm password
-label.confirmation=Confirmation
-label.congratulations=Congratulations\!
-label.conserve.mode=Conserve mode
-label.console.proxy=Console proxy
-label.continue.basic.install=Continue with basic installation
-label.continue=Continue
-label.corrections.saved=Corrections saved
-label.cpu.allocated.for.VMs=CPU Allocated for VMs
-label.cpu.allocated=CPU Allocated
-label.CPU.cap=CPU Cap
-label.cpu.limits=CPU limits
-label.cpu.mhz=CPU (in MHz)
-label.cpu.utilized=CPU Utilized
-label.cpu=CPU
-label.create.project=Create project
-label.create.ssh.key.pair=Create a SSH Key Pair
-label.create.template=Create template
-label.create.VPN.connection=Create VPN Connection
-label.created.by.system=Created by system
-label.created=Created
-label.cross.zones=Cross Zones
-label.custom.disk.size=Custom Disk Size
-label.daily=Daily
-label.data.disk.offering=Data Disk Offering
-label.date=Date
-label.day.of.month=Day of Month
-label.day.of.week=Day of Week
-label.dead.peer.detection=Dead Peer Detection
-label.decline.invitation=Decline invitation
-label.dedicated=Dedicated
-label.default.use=Default Use
-label.default.view=Default View
-label.default=Default
-label.delete.affinity.group=Delete Affinity Group
-label.delete.BigSwitchBcf=Remove BigSwitch BCF Controller
-label.delete.F5=Delete F5
-label.delete.gateway=Delete gateway
-label.delete.NetScaler=Delete NetScaler
-label.delete.NiciraNvp=Remove Nvp Controller
-label.delete.NuageVsp=Remove Nuage VSD
-label.delete.BrocadeVcs=Remove Brocade Vcs Switch
-label.delete.project=Delete project
-label.delete.SRX=Delete SRX
-label.delete.PA=Delete Palo Alto
-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.delete=Delete
-label.deleting.failed=Deleting Failed
-label.deleting.processing=Deleting....
-label.description=Description
-label.destination.physical.network.id=Destination physical network ID
-label.destination.zone=Destination Zone
-label.destroy.router=Destroy router
-label.destroy=Destroy
-label.detaching.disk=Detaching Disk
-label.details=Details
-label.device.id=Device ID
-label.devices=Devices
-label.DHCP.server.type=DHCP Server Type
-label.dhcp=DHCP
-label.direct.ips=Shared Network IPs
-label.disable.provider=Disable provider
-label.disable.vpn=Disable Remote Access VPN
-label.disabled=Disabled
-label.disabling.vpn.access=Disabling VPN Access
-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.read.rate=Disk Read Rate (IOPS)
-label.disk.iops.write.rate=Disk Write Rate (IOPS)
-label.disk.offering=Disk Offering
-label.disk.provisioningtype=Provisioning Type
-label.disk.read.bytes=Disk Read (Bytes)
-label.disk.read.io=Disk Read (IO)
-label.disk.size.gb=Disk Size (in GB)
-label.disk.size=Disk Size
-label.disk.total=Disk Total
-label.disk.volume=Disk Volume
-label.disk.write.bytes=Disk Write (Bytes)
-label.disk.write.io=Disk Write (IO)
-label.display.text=Display Text
-label.dns.1=DNS 1
-label.dns.2=DNS 2
-label.DNS.domain.for.guest.networks=DNS domain for Guest Networks
-label.dns=DNS
-label.domain.admin=Domain Admin
-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.domain=Domain
-label.done=Done
-label.double.quotes.are.not.allowed=Double quotes are not allowed
-label.download.progress=Download Progress
-label.drag.new.position=Drag to new position
-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.tags=Edit tags
-label.edit.traffic.type=Edit traffic type
-label.edit.vpc=Edit VPC
-label.edit=Edit
-label.egress.rule=Egress rule
-label.egress.rules=Egress rules
-label.elastic.IP=Elastic IP
-label.elastic.LB=Elastic LB
-label.elastic=Elastic
-label.email=Email
-label.enable.provider=Enable provider
-label.enable.s3=Enable S3-backed Secondary Storage
-label.enable.swift=Enable Swift
-label.enable.vpn=Enable Remote Access VPN
-label.enabling.vpn.access=Enabling VPN Access
-label.enabling.vpn=Enabling VPN
-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.or.operation=Endpoint or Operation
-label.endpoint=Endpoint
-label.enter.token=Enter token
-label.error.code=Error Code
-label.error=Error
-label.ESP.encryption=ESP Encryption
-label.ESP.hash=ESP Hash
-label.ESP.lifetime=ESP Lifetime (second)
-label.ESP.policy=ESP policy
-label.esx.host=ESX/ESXi Host
-label.example=Example
-label.expunge=Expunge
-label.external.link=External link
-label.f5=F5
-label.failed=Failed
-label.featured=Featured
-label.fetch.latest=Fetch latest
-label.fingerprint=FingerPrint
-label.filterBy=Filter by
-label.firewall=Firewall
-label.first.name=First Name
-label.format=Format
-label.friday=Friday
-label.full.path=Full path
-label.full=Full
-label.gateway=Gateway
-label.general.alerts=General Alerts
-label.generating.url=Generating URL
-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.group.optional=Group (Optional)
-label.group=Group
-label.guest.cidr=Guest CIDR
-label.guest.end.ip=Guest end IP
-label.guest.gateway=Guest Gateway
-label.guest.ip.range=Guest IP Range
-label.guest.ip=Guest IP Address
-label.guest.netmask=Guest Netmask
-label.guest.networks=Guest networks
-label.guest.start.ip=Guest start IP
-label.guest.traffic=Guest Traffic
-label.guest.type=Guest Type
-label.guest=Guest
-label.ha.enabled=HA Enabled
-label.help=Help
-label.hide.ingress.rule=Hide Ingress Rule
-label.hints=Hints
-label.host.alerts=Hosts in Alert State
-label.host.MAC=Host MAC
-label.host.name=Host Name
-label.host.tag=Host Tag
-label.host.tags=Host Tags
-label.host=Host
-label.hosts=Hosts
-label.hourly=Hourly
-label.hypervisor.capabilities=Hypervisor capabilities
-label.hypervisor.type=Hypervisor Type
-label.hypervisor.version=Hypervisor version
-label.hypervisor=Hypervisor
-label.id=ID
-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.info=Info
-label.ingress.rule=Ingress Rule
-label.initiated.by=Initiated By
-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.limits=Instance Limits
-label.instance.name=Instance Name
-label.instance=Instance
-label.instances=Instances
-label.intermediate.certificate=Intermediate certificate {0}
-label.internal.dns.1=Internal DNS 1
-label.internal.dns.2=Internal DNS 2
-label.internal.name=Internal name
-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.to=Invite to
-label.invite=Invite
-label.invited.accounts=Invited accounts
-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.ip=IP
-label.ipaddress=IP Address
-label.ips=IPs
-label.IPsec.preshared.key=IPsec Preshared-Key
-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.boot=ISO Boot
-label.iso=ISO
-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.keep=Keep
-label.key=Key
-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=English
-label.lang.french=French
-label.lang.german=German
-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.lang.hungarian=Hungarian
-label.last.disconnected=Last Disconnected
-label.last.name=Last Name
-label.latest.events=Latest events
-label.launch.vm=Launch VM
-label.launch.zone=Launch zone
-label.launch=Launch
-label.lb.algorithm.leastconn=Least connections
-label.lb.algorithm.roundrobin=Round-robin
-label.lb.algorithm.source=Source
-label.LB.isolation=LB isolation
-label.level=Level
-label.linklocal.ip=Link Local IP Address
-label.load.balancer=Load Balancer
-label.load.balancing.policies=Load balancing policies
-label.load.balancing=Load Balancing
-label.loading=Loading
-label.local.storage.enabled=Enable local storage for User VMs
-label.local.storage.enabled.system.vms=Enable local storage for System VMs
-label.local.storage=Local Storage
-label.local=Local
-label.local.file=Local file
-label.login=Login
-label.logout=Logout
-label.saml.enable=Authorize SAML SSO
-label.saml.entity=Identity Provider
-label.add.LDAP.account=Add LDAP Account
-label.LUN.number=LUN \#
-label.lun=LUN
-label.make.project.owner=Make account project owner
-label.manage.resources=Manage Resources
-label.management.server=Management Server
-label.manage=Manage
-label.managed=Managed
-label.management.ips=Management IP Addresses
-label.management=Management
-label.max.cpus=Max. CPU cores
-label.max.guest.limit=Max guest limit
-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.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.memory=Memory
-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=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.offerings=Network Offerings
-label.menu.network=Network
-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.stopped.instances=Stopped Instances
-label.menu.storage=Storage
-label.menu.system.service.offerings=System Offerings
-label.menu.system.vms=System VMs
-label.menu.system=System
-label.menu.templates=Templates
-label.menu.virtual.appliances=Virtual Appliances
-label.menu.virtual.resources=Virtual Resources
-label.menu.volumes=Volumes
-label.menu.sshkeypair=SSH KeyPair
-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.iops.total=IOPS
-label.metrics.disk.read=Read
-label.metrics.disk.size=Size
-label.metrics.disk.storagetype=Type
-label.metrics.disk.usage=Disk Usage
-label.metrics.disk.used=Used
-label.metrics.disk.total=Total
-label.metrics.disk.allocated=Allocated
-label.metrics.disk.unallocated=Unallocated
-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.usage=Network Usage
-label.metrics.network.read=Read
-label.metrics.network.write=Write
-label.metrics.num.cpu.cores=Cores
-label.metrics.property=Property
-label.metrics.scope=Scope
-label.metrics.state=State
-label.metrics.outofbandmanagementpowerstate=Power State
-label.metrics.storagepool=Storage Pool
-label.metrics.vm.name=VM Name
-label.migrate.instance.to.host=Migrate instance to another host
-label.migrate.instance.to.ps=Migrate instance to another primary storage
-label.migrate.instance.to=Migrate instance to
-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.to.primary.storage=Migrate volume to another primary storage
-label.migrate.volume=Migrate Volume
-label.minimum=Minimum
-label.minute.past.hour=minute(s) past the hour
-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.optional=Name (Optional)
-label.name=Name
-label.nat.port.range=NAT Port Range
-label.netmask=Netmask
-label.netScaler=NetScaler
-label.network.ACL.total=Network ACL Total
-label.network.ACL=Network ACL
-label.network.ACLs=Network ACLs
-label.network.desc=Network Desc
-label.network.device.type=Network Device Type
-label.network.device=Network Device
-label.network.domain.text=Network domain
-label.network.domain=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.display.text=Network Offering Display Text
-label.network.offering.id=Network Offering ID
-label.network.offering.name=Network Offering Name
-label.network.offering=Network Offering
-label.network.rate.megabytes=Network Rate (MB/s)
-label.network.rate=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.network=Network
-label.networking.and.security=Networking and security
-label.networks=Networks
-label.new.password=New Password
-label.new.project=New Project
-label.new.ssh.key.pair=New SSH Key Pair
-label.new.vm=New VM
-label.new=New
-label.next=Next
-label.nexusVswitch=Nexus 1000v
-label.nfs.server=NFS Server
-label.nfs.storage=NFS Storage
-label.nfs=NFS
-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.transportzoneuuid=Transport Zone Uuid
-label.brocade.vcs.address=Vcs Switch Address
-label.nics=NICs
-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.isos=No available ISOs
-label.no.items=No Available Items
-label.no.security.groups=No Available Security Groups
-label.no.thanks=No thanks
-label.no=No
-label.none=None
-label.not.found=Not Found
-label.notifications=Notifications
-label.num.cpu.cores=\# of CPU Cores
-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.numretries=Number of Retries
-label.ocfs2=OCFS2
-label.offer.ha=Offer HA
-label.ok=OK
-label.optional=Optional
-label.order=Order
-label.os.preference=OS Preference
-label.os.type=OS Type
-label.ovm3.vip=Master Vip IP
-label.ovm3.pool=Native Pooling
-label.ovm3.cluster=Native Clustering
-label.ovm3.traffic.label=OVM3 traffic label
-label.owned.public.ips=Owned Public IP Addresses
-label.owner.account=Owner Account
-label.owner.domain=Owner Domain
-label.PA.log.profile=Palo Alto Log Profile
-label.PA.threat.profile=Palo Alto Threat Profile
-label.parent.domain=Parent Domain
-label.password.enabled=Password Enabled
-label.password=Password
-label.path=Path
-label.perfect.forward.secrecy=Perfect Forward Secrecy
-label.physical.network.ID=Physical network ID
-label.physical.network=Physical Network
-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.please.specify.netscaler.info=Please specify Netscaler info
-label.please.wait=Please Wait
-label.plugin.details=Plugin details
-label.plugins=Plugins
-label.pod.name=Pod name
-label.pod=Pod
-label.pods=Pods
-label.port.forwarding.policies=Port forwarding policies
-label.port.forwarding=Port Forwarding
-label.port.range=Port Range
-label.powerstate=Power State
-label.outofbandmanagement=Out-of-band Management
-label.outofbandmanagement.action.issue=Issue Out-of-band Management Power Action
-label.outofbandmanagement.action=Action
-label.outofbandmanagement.address=Address
-label.outofbandmanagement.changepassword=Change Out-of-band Management Password
-label.outofbandmanagement.configure=Configure Out-of-band Management
-label.outofbandmanagement.driver=Driver
-label.outofbandmanagement.disable=Disable Out-of-band Management
-label.outofbandmanagement.enable=Enable Out-of-band Management
-label.outofbandmanagement.password=Password
-label.outofbandmanagement.reenterpassword=Re-enter Password
-label.outofbandmanagement.port=Port
-label.outofbandmanagement.username=Username
-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.outofbandmanagement.action.maintenance=Warning host is in maintenance mode
-label.PreSetup=PreSetup
-label.prev=Prev
-label.previous=Previous
-label.primary.allocated=Primary Storage Allocated
-label.primary.network=Primary Network
-label.primary.storage.count=Primary Storage Pools
-label.primary.storage.limits=Primary Storage limits (GiB)
-label.primary.storage=Primary Storage
-label.primary.used=Primary Storage Used
-label.private.Gateway=Private Gateway
-label.private.interface=Private Interface
-label.private.ip.range=Private IP Range
-label.private.ip=Private IP Address
-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.project.dashboard=Project dashboard
-label.project.id=Project ID
-label.project.invite=Invite to project
-label.project.name=Project name
-label.project.view=Project View
-label.project=Project
-label.projects=Projects
-label.protocol=Protocol
-label.provider=Provider
-label.providers=Providers
-label.public.interface=Public Interface
-label.public.ip=Public IP Address
-label.public.ips=Public IP Addresses
-label.public.key=Public Key
-label.public.network=Public network
-label.public.port=Public Port
-label.public.traffic=Public traffic
-label.public.zone=Public Zone
-label.public=Public
-label.purpose=Purpose
-label.Pxe.server.type=Pxe Server Type
-label.quickview=Quickview
-label.reboot=Reboot
-label.recent.errors=Recent Errors
-label.redundant.router.capability=Redundant router capability
-label.redundant.router=Redundant Router
-label.redundant.vpc=Redundant VPC
-label.redundant.state=Redundant state
-label.refresh=Refresh
-label.region=Region
-label.related=Related
-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.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.tier=Remove tier
-label.remove.vm.from.lb=Remove VM from load balancer rule
-label.remove.vpc=Remove VPC
-label.removing.user=Removing User
-label.removing=Removing
-label.required=Required
-label.reserved.system.gateway=Reserved system gateway
-label.reserved.system.ip=Reserved System IP
-label.reserved.system.netmask=Reserved system netmask
-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.resize.new.offering.id=New Offering
-label.resize.new.size=New Size (GB)
-label.resize.shrink.ok=Shrink OK
-label.resource.limits=Resource Limits
-label.resource.state=Resource state
-label.resource=Resource
-label.resources=Resources
-label.restart.network=Restart network
-label.restart.required=Restart required
-label.restart.vpc=Restart 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>
-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.add.role=Add Role
-label.edit.role=Edit Role
-label.delete.role=Delete Role
-message.role.ordering.fail=Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again.
-label.root.certificate=Root certificate
-label.root.disk.controller=Root disk controller
-label.root.disk.offering=Root Disk Offering
-label.permission=Permission
-label.rule=Rule
-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.secret_key=Secret Key
-label.s3.socket_timeout=Socket Timeout
-label.s3.use_https=Use HTTPS
-label.saturday=Saturday
-label.save.and.continue=Save and continue
-label.save=Save
-label.saving.processing=Saving....
-label.scope=Scope
-label.search=Search
-label.secondary.storage.count=Secondary Storage Pools
-label.secondary.storage.limits=Secondary Storage limits (GiB)
-label.secondary.storage.vm=Secondary storage VM
-label.secondary.storage=Secondary Storage
-label.secondary.used=Secondary Storage Used
-label.secret.key=Secret Key
-label.security.group.name=Security Group Name
-label.security.group=Security Group
-label.security.groups.enabled=Security Groups Enabled
-label.security.groups=Security Groups
-label.select-view=Select view
-label.select.a.template=Select a template
-label.select.a.zone=Select a zone
-label.select.instance.to.attach.volume.to=Select instance to attach volume to
-label.select.instance=Select instance
-label.select.iso.or.template=Select ISO or template
-label.select.offering=Select offering
-label.select.project=Select Project
-label.select.tier=Select Tier
-label.select.vm.for.static.nat=Select VM for static NAT
-label.select=Select
-label.sent=Sent
-label.server=Server
-label.service.capabilities=Service Capabilities
-label.service.offering=Service Offering
-label.session.expired=Session Expired
-label.set.up.zone.type=Set up zone type
-label.setup.network=Set up Network
-label.setup.zone=Set up Zone
-label.setup=Setup
-label.shared=Shared
-label.SharedMountPoint=SharedMountPoint
-label.show.ingress.rule=Show Ingress Rule
-label.shutdown.provider=Shutdown provider
-label.site.to.site.VPN=Site-to-site VPN
-label.size=Size
-label.skip.guide=I have used CloudStack before, skip this guide
-label.snapshot.limits=Snapshot Limits
-label.snapshot.name=Snapshot Name
-label.snapshot.s=Snapshots
-label.snapshot.schedule=Set up Recurring Snapshot
-label.snapshot=Snapshot
-label.snapshots=Snapshots
-label.source.nat=Source NAT
-label.specify.IP.ranges=Specify IP ranges
-label.specify.vlan=Specify VLAN
-label.specify.vxlan=Specify VXLAN
-label.SR.name=SR Name-Label
-label.srx=SRX
-label.ssh.key.pair=SSH Key Pair
-label.ssh.key.pair.details=SSH Key Pair Details
-label.PA=Palo Alto
-label.start.IP=Start IP
-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.enabled=Static NAT Enabled
-label.static.nat.to=Static NAT to
-label.static.nat.vm.details=Static NAT VM Details
-label.static.nat=Static NAT
-label.statistics=Statistics
-label.status=Status
-label.step.1.title=Step 1\: <strong>Select a Template</strong>
-label.step.1=Step 1
-label.step.2.title=Step 2\: <strong>Service Offering</strong>
-label.step.2=Step 2
-label.step.3.title=Step 3\: <strong id\="step3_label">Select a Disk Offering</strong>
-label.step.3=Step 3
-label.step.4.title=Step 4\: <strong>Network</strong>
-label.step.4=Step 4
-label.step.5.title=Step 5\: <strong>Review</strong>
-label.step.5=Step 5
-label.stickiness=Stickiness
-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.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.stopped.vms=Stopped VMs
-label.storage.tags=Storage Tags
-label.storage.traffic=Storage Traffic
-label.storage.type=Storage Type
-label.qos.type=QoS Type
-label.cache.mode=Write-cache Type
-label.storage=Storage
-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.suspend.project=Suspend Project
-label.system.capacity=System Capacity
-label.system.offering=System Offering
-label.system.service.offering=System Service Offering
-label.system.vm.type=System VM Type
-label.system.vm=System VM
-label.system.vms=System VMs
-label.system.wide.capacity=System-wide capacity
-label.tagged=Tagged
-label.tags=Tags
-label.target.iqn=Target IQN
-label.task.completed=Task completed
-label.template.limits=Template Limits
-label.template=Template
-label.TFTP.dir=TFTP Directory
-label.theme.default=Default Theme
-label.theme.grey=Custom - Grey
-label.theme.lightblue=Custom - Light Blue
-label.thursday=Thursday
-label.tier.details=Tier details
-label.tier=Tier
-label.time.zone=Timezone
-label.time=Time
-label.timeout.in.second = Timeout (seconds)
-label.timeout=Timeout
-label.timezone=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.vms=Total VMs
-label.traffic.label=Traffic label
-label.traffic.type=Traffic Type
-label.traffic.types=Traffic Types
-label.tuesday=Tuesday
-label.type.id=Type ID
-label.type=Type
-label.unavailable=Unavailable
-label.unlimited=Unlimited
-label.untagged=Untagged
-label.update.project.resources=Update project resources
-label.update.ssl.cert= SSL Certificate
-label.update.ssl= SSL Certificate
-label.updating=Updating
-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.upload=Upload
-label.url=URL
-label.usage.interface=Usage Interface
-label.use.vm.ip=Use VM IP\:
-label.used=Used
-label.user=User
-label.username=Username
-label.users=Users
-label.value=Value
-label.vcdcname=vCenter DC name
-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.view.all=View all
-label.view.console=View console
-label.view.more=View more
-label.view=View
-label.viewing=Viewing
-label.virtual.appliance=Virtual Appliance
-label.virtual.appliances=Virtual Appliances
-label.virtual.machines=Virtual Machines
-label.virtual.machine=Virtual Machine
-label.virtual.network=Virtual Network
-label.virtual.router=Virtual Router
-label.virtual.routers=Virtual Routers
-label.vlan.id=VLAN/VNI ID
-label.vlan.range=VLAN/VNI Range
-label.vlan=VLAN/VNI
-label.vnet=VLAN/VNI
-label.vnet.id=VLAN/VNI ID
-label.vxlan.id=VXLAN ID
-label.vxlan.range=VXLAN Range
-label.vxlan=VXLAN
-label.vm.add=Add Instance
-label.vm.destroy=Destroy
-label.vm.display.name=VM display name
-label.vm.name=VM name
-label.vm.reboot=Reboot
-label.vm.start=Start
-label.vm.state=VM state
-label.vm.stop=Stop
-label.VMFS.datastore=VMFS datastore
-label.vmfs=VMFS
-label.VMs.in.tier=VMs in tier
-label.vms=VMs
-label.vmsnapshot.current=isCurrent
-label.vmsnapshot.memory=Snapshot memory
-label.vmsnapshot.parentname=Parent
-label.vmsnapshot.type=Type
-label.vmsnapshot=VM Snapshots
-label.vmware.traffic.label=VMware traffic label
-label.volgroup=Volume Group
-label.volume.limits=Volume Limits
-label.volume.name=Volume Name
-label.volume=Volume
-label.volumes=Volumes
-label.vpc.id=VPC ID
-label.VPC.router.details=VPC router details
-label.vpc=VPC
-label.VPN.connection=VPN Connection
-label.VPN.customer.gateway=VPN Customer Gateway
-label.vpn.customer.gateway=VPN Customer Gateway
-label.VPN.gateway=VPN Gateway
-label.vpn=VPN
-label.vsmctrlvlanid=Control VLAN ID
-label.vsmpktvlanid=Packet VLAN ID
-label.vsmstoragevlanid=Storage VLAN ID
-label.vsphere.managed=vSphere Managed
-label.waiting=Waiting
-label.warn=Warn
-label.warning=Warning
-label.wednesday=Wednesday
-label.weekly=Weekly
-label.welcome.cloud.console=Welcome to Management Console
-label.welcome=Welcome
-label.what.is.cloudstack=What is CloudStack&\#8482?
-label.xenserver.traffic.label=XenServer traffic label
-label.yes=Yes
-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.zone=Zone
-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
-label.ldap.group.name=LDAP Group
-label.password.reset.confirm=Password has been reset to 
-label.provider=Provider
-label.resetVM=Reset VM
-label.openDaylight=OpenDaylight
-label.assign.instance.another=Assign Instance to Another Account
-label.network.addVM=Add network to VM
-label.set.default.NIC=Set default NIC
-label.Xenserver.Tools.Version61plus=Original XS Version is 6.1\+
-label.supportsstrechedl2subnet=Supports Streched L2 Subnet
-label.menu.vpc.offerings=VPC Offerings
-label.vpc.offering=VPC Offering
-label.regionlevelvpc=Region Level VPC
-label.add.vpc.offering=Add VPC Offering
-label.distributedrouter=Distributed Router
-label.vpc.offering.details=VPC offering details
-label.disable.vpc.offering=Disable VPC offering
-label.enable.vpc.offering=Enable VPC offering
-label.remove.vpc.offering=Remove VPC offering
-label.vpc.distributedvpcrouter=Distributed VPC Router
-label.vpc.supportsregionlevelvpc=Supports Region Level VPC
-label.dynamically.scalable=Dynamically Scalable
-label.instance.scaled.up=Instance scaled to the requested offering
-label.tag.key=Tag Key
-label.tag.value=Tag Value
-label.ipv6.address=IPv6 IP Address
-label.ipv6.gateway=IPv6 Gateway
-label.ipv6.CIDR=IPv6 CIDR
-label.VPC.limits=VPC limits
-label.edit.region=Edit Region
-label.gslb.domain.name=GSLB Domain Name
-label.add.gslb=Add GSLB
-label.gslb.servicetype=Service Type
-label.gslb.details=GSLB details
-label.gslb.delete=Delete GSLB
-label.opendaylight.controller=OpenDaylight Controller
-label.opendaylight.controllers=OpenDaylight Controllers
-label.portable.ip.ranges=Portable IP Ranges
-label.add.portable.ip.range=Add Portable IP Range
-label.delete.portable.ip.range=Delete Portable IP Range
-label.opendaylight.controllerdetail=OpenDaylight Controller Details
-label.portable.ip.range.details=Portable IP Range details
-label.portable.ips=Portable IPs
-label.gslb.assigned.lb=Assigned load balancing
-label.gslb.assigned.lb.more=Assign more load balancing
-label.gslb.lb.rule=Load balancing rule
-label.gslb.lb.details=Load balancing details
-label.gslb.lb.remove=Remove load balancing from this GSLB
-label.enable.autoscale=Enable Autoscale
-label.disable.autoscale=Disable Autoscale
-label.min.instances=Min Instances
-label.max.instances=Max Instances
-label.add.OpenDaylight.device=Add OpenDaylight Controller
-label.show.advanced.settings=Show advanced settings
-label.delete.OpenDaylight.device=Delete OpenDaylight Controller
-label.polling.interval.sec=Polling Interval (in sec)
-label.quiet.time.sec=Quiet Time (in sec)
-label.usage.type=Usage Type
-label.usage.unit=Unit
-label.quota.value=Quota Value
-label.quota.description=Quota Description
-label.quota.configuration=Quota Configuration
-label.quota.configure=Configure Quota
-label.quota.remove=Remove Quota
-label.quota.totalusage=Total Usage
-label.quota.balance=Balance
-label.quota.minbalance=Min Balance
-label.quota.enforcequota=Enforce Quota
-label.quota.summary=Summary
-label.quota.fullsummary=All Accounts
-label.quota.tariff=Tariff
-label.quota.state=State
-label.quota.startdate=Start Date
-label.quota.enddate=End Date
-label.quota.total=Total
-label.quota.startquota=Start Quota
-label.quota.endquota=End Quota
-label.quota.type.name=Usage Type
-label.quota.type.unit=Usage Unit
-label.quota.usage=Quota Consumption
-label.quota.add.credits=Add Credits
-label.quota.email.template=Email Template
-label.quota.statement=Statement
-label.quota.statement.balance=Quota Balance
-label.quota.statement.quota=Quota Usage
-label.quota.statement.tariff=Quota Tariff
-label.quota.tariff.value=Tariff Value
-label.quota.tariff.edit=Edit Tariff
-label.quota.tariff.effectivedate=Effective Date
-label.quota.date=Date
-label.quota.dates=Update Dates
-label.quota.credit=Credit
-label.quota.credits=Credits
-label.quota.value=Quota Value
-label.quota.statement.bydates=Statement
-label.quota.email.subject=Subject
-label.quota.email.body=Body
-label.quota.email.lastupdated=Last Update
-label.destroy.vm.graceperiod=Destroy VM Grace Period
-label.SNMP.community=SNMP Community
-label.SNMP.port=SNMP Port
-label.add.ucs.manager=Add UCS Manager
-label.ovm.traffic.label=OVM traffic label
-label.lxc.traffic.label=LXC Traffic Label
-label.hyperv.traffic.label=HyperV Traffic Label
-label.resource.name=Resource Name
-label.reource.id=Resource ID
-label.vnmc.devices=VNMC Devices
-label.add.vnmc.provider=Add VNMC provider
-label.enable.vnmc.provider=Enable VNMC provider
-label.add.vnmc.device=Add VNMC device
-label.ciscovnmc.resource.details=CiscoVNMC resource details
-label.delete.ciscovnmc.resource=Delete CiscoVNMC resource
-label.enable.vnmc.device=Enable VNMC device
-label.disbale.vnmc.device=Disable VNMC device
-label.disable.vnmc.provider=Disable VNMC provider
-label.services=Services
-label.secondary.staging.store=Secondary Staging Store
-label.release.account=Release from Account
-label.release.account.lowercase=Release from account
-label.vlan.vni.ranges=VLAN/VNI Range(s)
-label.dedicated.vlan.vni.ranges=Dedicated VLAN/VNI Ranges
-label.dedicate.vlan.vni.range=Dedicate VLAN/VNI Range
-label.vlan.vni.range=VLAN/VNI Range
-label.vlan.range.details=VLAN Range details
-label.release.dedicated.vlan.range=Release dedicated VLAN range
-label.broadcat.uri=Broadcast URI
-label.ipv4.cidr=IPv4 CIDR
-label.guest.network.details=Guest network details
-label.ipv4.gateway=IPv4 Gateway
-label.release.dedicated.vlan.range=Release dedicated VLAN range
-label.vlan.ranges=VLAN Range(s)
-label.virtual.appliance.details=Virtual applicance details
-label.start.lb.vm=Start LB VM
-label.stop.lb.vm=Stop LB VM
-label.migrate.lb.vm=Migrate LB VM
-label.vpc.virtual.router=VPC Virtual Router
-label.ovs=OVS
-label.gslb.service=GSLB service
-label.gslb.service.public.ip=GSLB service Public IP
-label.gslb.service.private.ip=GSLB service Private IP
-label.baremetal.dhcp.provider=Baremetal DHCP Provider
-label.add.baremetal.dhcp.device=Add Baremetal DHCP Device
-label.baremetal.pxe.provider=Baremetal PXE Provider
-label.baremetal.pxe.device=Add Baremetal PXE Device
-label.tftp.root.directory=Tftp root directory
-label.add.vmware.datacenter=Add VMware datacenter
-label.remove.vmware.datacenter=Remove VMware datacenter
-label.dc.name=DC Name
-label.vcenter=vcenter
-label.dedicate.zone=Dedicate Zone
-label.zone.dedicated=Zone Dedicated
-label.release.dedicated.zone=Release Dedicated Zone
-label.ipv6.dns1=IPv6 DNS1
-label.ipv6.dns2=IPv6 DNS2
-label.vmware.datacenter.name=VMware datacenter Name
-label.vmware.datacenter.vcenter=VMware datacenter vcenter
-label.vmware.datacenter.id=VMware datacenter ID
-label.system.vm.details=System VM details
-label.system.vm.scaled.up=System VM Scaled Up
-label.console.proxy.vm=Console Proxy VM
-label.settings=Settings
-label.requires.upgrade=Requires Upgrade
-label.upgrade.router.newer.template=Upgrade Router to Use Newer Template
-label.router.vm.scaled.up=Router VM Scaled Up
-label.total.virtual.routers=Total of Virtual Routers
-label.upgrade.required=Upgrade is required
-label.virtual.routers.group.zone=Virtual Routers group by zone
-label.total.virtual.routers.upgrade=Total of Virtual Routers that require upgrade
-label.virtual.routers.group.pod=Virtual Routers group by pod
-label.virtual.routers.group.cluster=Virtual Routers group by cluster
-label.zone.lower=zone
-label.virtual.routers.group.account=Virtual Routers group by account
-label.netscaler.details=NetScaler details
-label.baremetal.dhcp.devices=Baremetal DHCP Devices
-label.baremetal.pxe.devices=Baremetal PXE Devices
-label.addes.new.f5=Added new F5
-label.f5.details=F5 details
-label.srx.details=SRX details
-label.palo.alto.details=Palo Alto details
-label.added.nicira.nvp.controller=Added new Nicira NVP Controller
-label.nicira.nvp.details=Nicira NVP details
-label.added.brocade.vcs.switch=Added new Brocade Vcs Switch
-label.brocade.vcs.details=Brocade Vcs Switch details
-label.added.new.bigswitch.bcf.controller=Added new BigSwitch BCF Controller
-label.bigswitch.bcf.details=BigSwitch BCF details
-label.bigswitch.bcf.nat=BigSwitch BCF NAT Enabled
-label.dedicate=Dedicate
-label.dedicate.pod=Dedicate Pod
-label.pod.dedicated=Pod Dedicated
-label.release.dedicated.pod=Release Dedicated Pod
-label.override.public.traffic=Override Public-Traffic
-label.public.traffic.vswitch.type=Public Traffic vSwitch Type
-label.public.traffic.vswitch.name=Public Traffic vSwitch Name
-label.override.guest.traffic=Override Guest-Traffic
-label.guest.traffic.vswitch.type=Guest Traffic vSwitch Type
-label.guest.traffic.vswitch.name=Guest Traffic vSwitch Name
-label.cisco.nexus1000v.ip.address=Nexus 1000v IP Address
-label.cisco.nexus1000v.username=Nexus 1000v Username
-label.cisco.nexus1000v.password=Nexus 1000v Password
-label.dedicate.cluster=Dedicate Cluster
-label.release.dedicated.cluster=Release Dedicated Cluster
-label.dedicate.host=Dedicate Host
-label.release.dedicated.host=Release Dedicated Host
-label.number.of.cpu.sockets=The Number of CPU Sockets
-label.delete.ucs.manager=Delete UCS Manager
-label.blades=Blades
-label.chassis=Chassis
-label.blade.id=Blade ID
-label.associated.profile=Associated Profile
-label.refresh.blades=Refresh Blades
-label.instanciate.template.associate.profile.blade=Instanciate Template and Associate Profile to Blade
-label.select.template=Select Template
-label.profile=Profile
-label.delete.profile=Delete Profile
-label.disassociate.profile.blade=Disassociate Profile from Blade
-label.secondary.storage.details=Secondary storage details
-label.secondary.staging.store.details=Secondary Staging Store details
-label.add.nfs.secondary.staging.store=Add NFS Secondary Staging Store
-label.delete.secondary.staging.store=Delete Secondary Staging Store
-label.ipv4.start.ip=IPv4 Start IP
-label.ipv4.end.ip=IPv4 End IP
-label.ipv6.start.ip=IPv6 Start IP
-label.ipv6.end.ip=IPv6 End IP
-label.vm.password=Password of the VM is
-label.group.by.zone=Group by zone
-label.group.by.pod=Group by pod
-label.group.by.cluster=Group by cluster
-label.group.by.account=Group by account
-label.no.grouping=(no grouping)
-label.create.nfs.secondary.staging.storage=Create NFS Secondary Staging Store
-label.username.lower=username
-label.password.lower=password
-label.email.lower=email
-label.firstname.lower=firstname
-label.lastname.lower=lastname
-label.domain.lower=domain
-label.account.lower=account
-label.type.lower=type
-label.rule.number=Rule Number
-label.action=Action
-label.name.lower=name
-label.ucs=UCS
-label.change.affinity=Change Affinity
-label.persistent=Persistent 
-label.broadcasturi=broadcasturi
-label.network.cidr=Network CIDR
-label.reserved.ip.range=Reserved IP Range
-label.autoscale=AutoScale
-label.health.check=Health Check
-label.public.load.balancer.provider=Public Load Balancer Provider
-label.add.isolated.network=Add Isolated Network
-label.add.isolated.guest.network=Add Isolated Guest Network
-label.vlan.only=VLAN
-label.secondary.isolated.vlan.id=Secondary Isolated VLAN ID
-label.ipv4.netmask=IPv4 Netmask
-label.custom=Custom
-label.disable.network.offering=Disable network offering
-label.enable.network.offering=Enable network offering
-label.remove.network.offering=Remove network offering
-label.system.offering.for.router=System Offering for Router
-label.mode=Mode
-label.associate.public.ip=Associate Public IP
-label.acl=ACL
-label.user.data=User Data
-label.virtual.networking=Virtual Networking
-label.allow=Allow
-label.deny=Deny
-label.default.egress.policy=Default egress policy
-label.xenserver.tools.version.61.plus=Original XS Version is 6.1\+
-label.gpu=GPU
-label.vgpu.type=vGPU type
-label.vgpu.video.ram=Video RAM
-label.vgpu.max.resolution=Max resolution
-label.vgpu.max.vgpu.per.gpu=vGPUs per GPU
-label.vgpu.remaining.capacity=Remaining capacity
-label.routing.host=Routing Host
-label.usage.server=Usage Server
-label.user.vm=User VM
-label.resource.limit.exceeded=Resource Limit Exceeded
-label.direct.attached.public.ip=Direct Attached Public IP
-label.usage.sanity.result=Usage Sanity Result
-label.select.region=Select region
-label.info.upper=INFO
-label.warn.upper=WARN
-label.error.upper=ERROR
-label.event.deleted=Event Deleted
-label.add.ciscoASA1000v=Add CiscoASA1000v Resource
-label.delete.ciscoASA1000v=Delete CiscoASA1000v
-label.inside.port.profile=Inside Port Profile
-label.archive=Archive
-label.event.archived=Event Archived
-label.alert.details=Alert details
-label.alert.deleted=Alert Deleted
-label.alert.archived=Alert Archived
-label.volume.details=Volume details
-label.volume.migrated=Volume migrated
-label.storage.pool=Storage Pool
-label.enable.host=Enable Host
-label.disable.host=Disable Host
-label.copying.iso=Copying ISO
-label.add.internal.lb=Add Internal LB
-label.internal.lb.details=Internal LB details
-label.delete.internal.lb=Delete Internal LB
-label.remove.vm.load.balancer=Remove VM from load balancer
-label.add.acl.list=Add ACL List
-label.add.list.name=ACL List Name
-label.add.network.acl.list=Add Network ACL List
-label.delete.acl.list=Delete ACL List
-label.acl.replaced=ACL replaced
-label.ipv4.dns1=IPv4 DNS1
-label.ipv4.dns2=IPv4 DNS2
-label.protocol.number=Protocol Number
-label.edit.acl.rule=Edit ACL rule
-label.source.ip.address=Source IP Address
-label.source.port=Source Port
-label.instance.port=Instance Port
-label.assigned.vms=Assigned VMs
-label.replace.acl=Replace ACL
-label.source.nat.supported=SourceNAT Supported
-label.acl.name=ACL Name
-label.acl.id=ACL ID
-label.passive=Passive
-label.replace.acl.list=Replace ACL List
-label.vswitch.name=vSwitch Name
-label.vSwitch.type=vSwitch Type
-label.ping.path=Ping Path
-label.response.timeout.in.sec=Response Timeout (in sec)
-label.health.check.interval.in.sec=Health Check Interval (in sec)
-label.healthy.threshold=Healthy Threshold
-label.unhealthy.threshold=Unhealthy Threshold
-label.other=Other
-label.vm.id=VM ID
-label.vnmc=VNMC
-label.scale.up.policy=SCALE UP POLICY
-label.counter=Counter
-label.operator=Operator
-label.threshold=Threshold
-label.load.balancer.type=Load Balancer Type
-label.vgpu=VGPU
-label.sticky.name=Sticky Name
-label.stickiness.method=Stickiness method
-label.gslb=GSLB
-label.portable.ip=Portable IP
-label.internallbvm=InternalLbVm
-label.agent.state=Agent State
-label.duration.in.sec=Duration (in sec)
-managed.state=Managed State
-message.acquire.new.ip.vpc=Please confirm that you would like to acquire a new IP for this VPC.
-message.acquire.new.ip=Please confirm that you would like to acquire a new IP for this network.
-message.acquire.public.ip=Please select a zone from which you want to acquire your new IP from.
-message.action.cancel.maintenance.mode=Please confirm that you want to cancel this maintenance.
-message.action.cancel.maintenance=Your host has been successfully canceled for maintenance. This process can take up to several minutes.
-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.for.all.zones=The ISO is used by all zones. Please confirm that you want to delete it from all zones.
-message.action.delete.ISO=Please confirm that you want to delete this ISO.
-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.for.all.zones=The template is used by all zones. Please confirm that you want to delete it from all zones.
-message.action.delete.template=Please confirm that you want to delete this template.
-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.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.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.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.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.revert.snapshot=Please confirm that you want to revert the owning volume to this snapshot.
-message.action.unmanage.cluster=Please confirm that you want to unmanage the cluster.
-message.action.vmsnapshot.delete=Please confirm that you want to delete this VM snapshot.
-message.action.vmsnapshot.revert=Revert VM snapshot
-message.activate.project=Are you sure you want to activate this project?
-message.add.cluster.zone=Add a hypervisor managed cluster for zone <b><span id\="zone_name"></span></b>
-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.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.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.ip.range=Add an IP range to public network in zone
-message.add.load.balancer.under.ip=The load balancer rule has been added under IP\:
-message.add.load.balancer=Add a load balancer to zone
-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.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.pod=Add a new pod for zone <b><span id\="add_pod_zone_name"></span></b>
-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.primary=Please specify the following parameters to add a new primary storage
-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.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.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.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.configure.all.traffic.types=You have multiple physical networks; please configure labels for each traffic type by clicking on the Edit button.
-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.delete.F5=Please confirm that you would like to delete F5
-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.NetScaler=Please confirm that you would like to delete NetScaler
-message.confirm.delete.NuageVsp=Please confirm that you would like to delete Nuage Virtualized Services Directory
-message.confirm.delete.SRX=Please confirm that you would like to delete SRX
-message.confirm.delete.PA=Please confirm that you would like to delete Palo Alto
-message.confirm.destroy.router=Please confirm that you would like to destroy this router
-message.confirm.disable.provider=Please confirm that you would like to disable this provider
-message.confirm.enable.provider=Please confirm that you would like to enable this provider
-message.confirm.join.project=Please confirm you wish to join this project.
-message.confirm.remove.IP.range=Please confirm that you would like to remove this IP range.
-message.confirm.shutdown.provider=Please confirm that you would like to shutdown this provider
-message.confirm.current.guest.CIDR.unchanged=Do you want to keep the current guest network CIDR unchanged?
-message.confirm.delete.ciscoASA1000v=Please confirm you want to delete CiscoASA1000v
-message.confirm.remove.selected.events=Please confirm you would like to remove the selected events
-message.confirm.archive.selected.events=Please confirm you would like to archive the selected events
-message.confirm.remove.event=Are you sure you want to remove this event?
-message.confirm.archive.event=Please confirm that you want to archive this event.
-message.confirm.remove.selected.alerts=Please confirm you would like to remove the selected alerts
-message.confirm.archive.selected.alerts=Please confirm you would like to archive the selected alerts
-message.confirm.delete.alert=Are you sure you want to delete this alert ?
-message.confirm.archive.alert=Please confirm that you want to archive this alert.
-message.confirm.migrate.volume=Do you want to migrate this volume?
-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.enable.host=Please confirm that you want to enable the host
-message.confirm.disable.host=Please confirm that you want to disable the host
-message.confirm.delete.internal.lb=Please confirm you want to delete Internal LB
-message.confirm.remove.load.balancer=Please confirm you want to remove VM from load balancer
-message.confirm.delete.acl.list=Are you sure you want to delete this ACL list?
-message.confirm.replace.acl.new.one=Do you want to replace the ACL with a new one?
-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.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.template=Are you sure you want to create template?
-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.zone=Creating zone
-message.decline.invitation=Are you sure you want to decline this project invitation?
-message.dedicate.zone=Dedicating zone
-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.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.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.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.access=Please confirm that you want to disable Remote Access VPN.
-message.disable.vpn=Are you sure you want to disable VPN?
-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.confirm=Please confirm that you want to download this volume.
-message.download.volume=Please click <a href\="\#">00000</a> to download 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.access=VPN is currently disabled for this IP Address.  Would you like to enable VPN access?
-message.enable.vpn=Please confirm that you want Remote Access VPN enabled for this IP address.
-message.enabled.vpn.ip.sec=Your IPSec pre-shared key is
-message.enabled.vpn=Your Remote Access VPN is currently enabled and can be accessed via the IP
-message.enabling.security.group.provider=Enabling Security Group provider
-message.enabling.zone=Enabling zone
-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.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.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.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.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.new.user=Specify the following to add a new user to the account
-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.network.support=Your selected hypervisor, vSphere, does not have any additional network features.  Please continue to step 5.
-message.no.projects.adminOnly=You do not have any projects.<br/>Please ask your administrator to create a new project.
-message.no.projects=You do not have any projects.<br/>Please create a new one from the projects section.
-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.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.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.wait.while.zone.is.being.created=Please wait while your zone is being created; this may take a while...
-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.redirecting.region=Redirecting to region...
-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.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.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.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.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.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.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.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.template.desc=OS image that can be used to boot VMs
-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.succeeded=Update SSL Certificates succeeded
-message.update.ssl.failed=Failed to update SSL Certificate.
-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.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.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.you.must.have.at.least.one.physical.network=You must have at least one physical network
-message.zone.creation.complete.would.you.like.to.enable.this.zone=Zone creation complete. Would you like to enable this zone?
-message.Zone.creation.complete=Zone creation complete
-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?
-message.validate.fieldrequired=This field is required.
-message.validate.fixfield=Please fix this field.
-message.validate.email.address=Please enter a valid email address.
-message.validate.URL=Please enter a valid URL.
-message.validate.date=Please enter a valid date.
-message.validate.date.ISO=Please enter a valid date (ISO).
-message.validate.number=Please enter a valid number.
-message.validate.digits=Please enter only digits.
-message.validate.creditcard=Please enter a valid credit card number.
-message.validate.equalto=Please enter the same value again.
-message.validate.accept=Please enter a value with a valid extension.
-message.validate.maxlength=Please enter no more than {0} characters.
-message.validate.minlength=Please enter at least {0} characters.
-message.validate.range.length=Please enter a value between {0} and {1} characters long.
-message.validate.range=Please enter a value between {0} and {1}.
-message.validate.max=Please enter a value less than or equal to {0}.
-messgae.validate.min=Please enter a value greater than or equal to {0}.
-message.creating.systemVM=Creating system VMs (this may take a while)
-message.enabling.zone.dots=Enabling zone...
-message.restoreVM=Do you want to restore the VM ?
-message.no.host.available=No Hosts are available for Migration
-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.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.instance.scaled.up.confirm=Do you really want to scale Up your instance ?
-message.copy.template.confirm=Are you sure you want to copy template?
-message.template.copying=Template is being copied.
-message.XSTools61plus.update.failed=Failed to update Original XS Version is 6.1\+ field. Error\:
-message.gslb.delete.confirm=Please confirm you want to delete this GSLB
-message.portable.ip.delete.confirm=Please confirm you want to delete Portable IP Range
-message.gslb.lb.remove.confirm=Please confirm you want to remove load balancing from GSLB
-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.tier.required=Tier is required
-message.remove.ldap=Are you sure you want to delete the LDAP configuration?
-message.action.downloading.template=Downloading template.
-message.configure.ldap=Please confirm you would like to configure LDAP.
-message.confirm.delete.ciscovnmc.resource=Please confirm you want to delete CiscoVNMC resource
-message.confirm.add.vnmc.provider=Please confirm you would like to add the VNMC provider.
-message.confirm.enable.vnmc.provider=Please confirm you would like to enable the VNMC provider.
-message.confirm.disable.vnmc.provider=Please confirm you would like to disable the VNMC provider.
-message.vnmc.available.list=VNMC is not available from provider list.
-message.vnmc.not.available.list=VNMC is not available from provider list.
-message.confirm.release.dedicate.vlan.range=Please confirm you want to release dedicated VLAN range
-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.remove.vmware.datacenter=Please confirm you want to remove VMware datacenter
-message.confirm.dedicate.zone=Do you really want to dedicate this zone to a domain/account?
-message.confirm.release.dedicated.zone=Do you want to release this dedicated zone ? 
-message.dedicated.zone.released=Zone dedication released
-message.read.admin.guide.scaling.up=Please read the dynamic scaling section in the admin guide before scaling up.
-message.confirm.scale.up.system.vm=Do you really want to scale up the system VM ?
-message.confirm.upgrade.router.newer.template=Please confirm that you want to upgrade router to use newer template
-message.confirm.scale.up.router.vm=Do you really want to scale up the Router VM ?
-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.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.account.newtemplate=Please confirm that you want to upgrade all routers in this account to use newer template
-message.confirm.dedicate.pod.domain.account=Do you really want to dedicate this pod to a domain/account? 
-message.confirm.release.dedicated.pod=Do you want to release this dedicated pod ?
-message.pod.dedication.released=Pod dedication released
-message.confirm.dedicate.cluster.domain.account=Do you really want to dedicate this cluster to a domain/account? 
-message.cluster.dedicated=Cluster Dedicated
-message.confirm.release.dedicated.cluster=Do you want to release this dedicated cluster ?
-message.cluster.dedication.released=Cluster dedication released
-message.confirm.dedicate.host.domain.account=Do you really want to dedicate this host to a domain/account? 
-message.host.dedicated=Host Dedicated
-message.confirm.release.dedicated.host=Do you want to release this dedicated host ?
-message.host.dedication.released=Host dedication released
-message.confirm.delete.ucs.manager=Please confirm that you want to delete UCS Manager
-message.confirm.refresh.blades=Please confirm that you want to refresh blades.
-message.confirm.delete.secondary.staging.store=Please confirm you want to delete Secondary Staging Store.
-message.select.tier=Please select a tier
-message.disallowed.characters=Disallowed characters: \<\,\>
-message.waiting.for.builtin.templates.to.load=Waiting for builtin templates to load...
-message.systems.vms.ready=System VMs ready.
-message.your.cloudstack.is.ready=Your CloudStack is ready\!
-message.specifiy.tag.key.value=Please specify a tag key and value
-message.enter.seperated.list.multiple.cidrs=Please enter a comma separated list of CIDRs if more than one
-message.disabling.network.offering=Disabling network offering
-message.confirm.enable.network.offering=Are you sure you want to enable this network offering?
-message.enabling.network.offering=Enabling network offering
-message.confirm.remove.network.offering=Are you sure you want to remove this network offering?
-message.confirm.disable.network.offering=Are you sure you want to disable this network offering?
-message.disabling.vpc.offering=Disabling VPC offering
-message.confirm.enable.vpc.offering=Are you sure you want to enable this VPC offering?
-message.enabling.vpc.offering=Enabling VPC offering
-message.confirm.remove.vpc.offering=Are you sure you want to remove this VPC offering?
-message.confirm.disable.vpc.offering=Are you sure you want to disable this VPC offering?
-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.detached=Detached
-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
-ui.listView.filters.all=All
-ui.listView.filters.mine=Mine
-label.na=N/A
-label.added.network.offering=Added network offering
-hint.type.part.storage.tag=Type in part of a storage tag
-hint.type.part.host.tag=Type in part of a host tag
-hint.no.storage.tags=No storage tags found
-hint.no.host.tags=No host tags found
-label.availabilityZone=availabilityZone
-label.diskoffering=diskoffering
-title.upload.volume=Upload Volume
-label.format.lower=format
-label.checksum=checksum
-label.assign.vms=Assign VMs
-label.extractable.lower=extractable
-label.globo.dns=GloboDNS
-label.add.globo.dns=Add GloboDNS
-label.globo.dns.configuration=GloboDNS Configuration
-label.region.details=Region details
-label.baremetal.rack.configuration=Baremetal Rack Configuration
-label.add.baremetal.rack.configuration=Add Baremetal Rack Configuration
-label.delete.baremetal.rack.configuration=Delete Baremetal Rack Configuration
-message.confirm.delete.baremetal.rack.configuration=Please confirm that you want to delete Baremetal Rack Configuration.
-message.added.new.nuage.vsp.controller=Added new Nuage Vsp Controller
-message.added.vpc.offering=Added VPC offering
-label.keyboard.language=Keyboard language
-label.standard.us.keyboard=Standard (US) keyboard
-label.uk.keyboard=UK keyboard
-label.japanese.keyboard=Japanese keyboard
-label.simplified.chinese.keyboard=Simplified Chinese keyboard
-label.display.name=Display Name
-label.zone.name=Zone Name
-label.instances=Instances
-label.event=Event
-label.minutes.past.hour=minutes(s) past the hour
-label.time.colon=Time:
-label.min.past.the.hr=min past the hr
-label.timezone.colon=Timezone:
-label.keep.colon=Keep:
-label.every=Every
-label.day=Day
-label.of.month=of month
-label.add.private.gateway=Add Private Gateway
-label.link.domain.to.ldap=Link Domain to LDAP
-message.link.domain.to.ldap=Enable autosync for this domain in LDAP
-label.ldap.link.type=Type
-label.account.type=Account Type
-message.desc.created.ssh.key.pair=Created a SSH Key Pair.
-message.please.confirm.remove.ssh.key.pair=Please confirm that you want to remove this SSH Key Pair
-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.question.are.you.sure.you.want.to.add=Are you sure you want to add
-label.domain.details=Domain details
-label.account.details=Account details
-label.user.details=User details
-label.service.offering.details=Service offering details
-label.system.service.offering.details=System service offering details
-label.disk.offering.details=Disk offering details
-label.network.offering.details=Network offering details
-label.remove.this.physical.network=Remove this physical network
-label.physical.network.name=Physical network name
-label.save.changes=Save changes
-label.autoscale.configuration.wizard=AutoScale Configuration Wizard
-label.health.check.wizard=Health Check Wizard
-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.configurations.options=Configuration Options:
-label.health.check.advanced.options=Advanced Options:
-label.add.isolated.guest.network.with.sourcenat=Add Isolated Guest Network with SourceNat
-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.
-label.vpc.router.details=VPC Router Details
-label.edit.rule=Edit rule
-label.advanced.search=Advanced Search
-label.internal.lb=Internal LB
-label.public.lb=Public LB
-label.acl.list.rules=ACL List Rules
-label.static.routes=Static Routes
-label.network.details=Network Details
-label.scaleup.policy=ScaleUp Policy
-label.scaledown.policy=ScaleDown Policy
-label.configure.sticky.policy=Configure Sticky Policy
-label.please.complete.the.following.fields=Please complete the following fields
-message.desc.add.new.lb.sticky.rule=Add new LB sticky rule
-label.ssh.key.pairs=SSH Key Pairs
-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.removed.ssh.key.pair=Removed a SSH Key Pair
-message.please.select.ssh.key.pair.use.with.this.vm=Please select a ssh key pair you want this VM to use:
-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.ldap.group.import=All The users from the given group name will be imported
-label.vpn.force.encapsulation=Force UDP Encapsulation of ESP Packets
diff --git a/client/WEB-INF/classes/resources/messages_ar.properties b/client/WEB-INF/classes/resources/messages_ar.properties
deleted file mode 100644
index d1832c456a4..00000000000
--- a/client/WEB-INF/classes/resources/messages_ar.properties
+++ /dev/null
@@ -1,284 +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.
-
-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.
-instances.actions.reboot.label=\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0646\u0645\u0648\u0630\u062c
-label.accept.project.invitation=\u0642\u0628\u0648\u0644 \u062f\u0639\u0648\u0629 \u0627\u0644\u0645\u0634\u0631\u0648\u0639
-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.disable.physical.network=\u062a\u0639\u0637\u064a\u0644 \u0634\u0628\u0643\u0629 \u0641\u064a\u0632\u064a\u0627\u0626\u064a\u0629
-label.action.enable.physical.network=\u062a\u0645\u0643\u064a\u0646 \u0634\u0628\u0643\u0629 \u0641\u064a\u0632\u064a\u0627\u0626\u064a\u0629
-label.activate.project=\u062a\u0641\u0639\u064a\u0644 \u0627\u0644\u0645\u0634\u0631\u0648\u0639
-label.add.accounts.to=\u0625\u0636\u0627\u0641\u0629 \u062d\u0633\u0627\u0628\u0627\u062a \u0625\u0644\u0649
-label.add.accounts=\u0625\u0636\u0627\u0641\u0629 \u062d\u0633\u0627\u0628\u0627\u062a
-label.add.account.to.project=\u0625\u0636\u0627\u0641\u0629 \u062d\u0633\u0627\u0628 \u0644\u0644\u0645\u0634\u0631\u0648\u0639
-label.add.ACL=\u0625\u0636\u0627\u0641\u0629 ACL
-label.add.network.ACL=\u0625\u0636\u0627\u0641\u0629 \u0634\u0628\u0643\u0629 ACL
-label.add.new.gateway=\u0623\u0636\u0641 \u0628\u0648\u0627\u0628\u0629 \u062c\u062f\u064a\u062f\u0629
-label.add.new.tier=\u0625\u0636\u0627\u0641\u0629 \u0637\u0628\u0642\u0629 \u062c\u062f\u064a\u062f\u0629
-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.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.static.route=\u0625\u0636\u0627\u0641\u0629 \u062a\u0648\u062c\u064a\u0647 \u062b\u0627\u0628\u062a
-label.add.to.group=\u0625\u0636\u0627\u0641\u0629 \u0625\u0644\u0649 \u0627\u0644\u0645\u062c\u0645\u0648\u0639\u0629
-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.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.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.allocated=\u062a\u062e\u0635\u064a\u0635
-label.apply=\u062a\u0637\u0628\u064a\u0642
-label.associated.network=\u0634\u0628\u0643\u0629 \u0645\u0631\u062a\u0628\u0637\u0629
-label.broadcast.uri=\u0628\u062b \u0627\u0644\u0631\u0627\u0628\u0637
-label.broadcat.uri=\u0628\u062b \u0627\u0644\u0631\u0627\u0628\u0637
-label.change.value=\u062a\u063a\u064a\u0631 \u0627\u0644\u0642\u064a\u0645\u0629
-label.CIDR.list=\u0642\u0627\u0626\u0645\u0629 CIDR
-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.clean.up=\u062a\u0646\u0638\u064a\u0641
-label.clear.list=\u0645\u0633\u062d \u0627\u0644\u0642\u0627\u0626\u0645\u0629
-label.configuration=\u062a\u0631\u062a\u064a\u0628
-label.configure.network.ACLs=\u0636\u0628\u0637 \u0634\u0628\u0643\u0629 ACLs
-label.configure=\u0642\u0645 \u0628\u062a\u0643\u0648\u064a\u0646
-label.configure.vpc=\u062a\u0643\u0648\u064a\u0646 VPC
-label.corrections.saved=\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u062a\u0635\u062d\u064a\u062d\u0627\u062a
-label.cpu.mhz=\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.cpu=\u0648 \u0645 \u0645
-label.create.project=\u0623\u0646\u0634\u0626 \u0645\u0634\u0631\u0648\u0639
-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.dead.peer.detection=\u0643\u0634\u0641 \u0627\u0644\u0642\u0631\u064a\u0646 \u0627\u0644\u0645\u0641\u0642\u0648\u062f
-label.decline.invitation=\u0631\u0641\u0636 \u0627\u0644\u062f\u0639\u0648\u0629
-label.default=\u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a
-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.gateway=\u0627\u062d\u0630\u0641 \u0627\u0644\u0628\u0648\u0627\u0628\u0629
-label.delete.project=\u062d\u0630\u0641 \u0627\u0644\u0645\u0634\u0631\u0648\u0639
-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.destroy=\u0647\u062f\u0645
-label.devices=\u0627\u0644\u0623\u062c\u0647\u0632\u0629
-label.direct.ips=\u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0645\u0634\u062a\u0631\u0643\u0629 IPs
-label.DNS.domain.for.guest.networks=\u0645\u062c\u0627\u0644 DNS \u0644\u0634\u0628\u0643\u0627\u062a \u0627\u0644\u0632\u0627\u0626\u0631
-label.dns=\u0646\u0638\u0627\u0645 \u062a\u0633\u0645\u064a\u0629 \u0627\u0644\u0645\u062c\u0627\u0644 DNS
-label.drag.new.position=\u0627\u0633\u062d\u0628 \u0644\u0645\u0648\u0642\u0641 \u062c\u062f\u064a\u062f
-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.tags=\u062a\u0639\u062f\u064a\u0644 \u0627\u0644\u0639\u0644\u0627\u0645\u0627\u062a
-label.edit.vpc=\u062a\u0639\u062f\u064a\u0644 VPC
-label.egress.rules=\u0642\u0648\u0627\u0639\u062f \u0627\u0644\u062e\u0631\u0648\u062c
-label.elastic=\u0645\u0631\u0646
-label.enable.s3=\u062a\u0645\u0643\u064a\u0646 \u0627\u0644\u062a\u062e\u0632\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u0648\u064a S3
-label.endpoint=\u0646\u0642\u0637\u0629 \u0627\u0644\u0646\u0647\u0627\u064a\u0629
-label.error=\u062e\u0637\u0623
-label.ESP.lifetime=\u0639\u0645\u0631 ESP (\u062b\u0627\u0646\u064a\u0629)
-label.ESP.policy=\u0633\u064a\u0627\u0633\u0629 ESP
-label.failed=\u062e\u0637\u0623
-label.filterBy=\u062a\u0635\u0641\u064a\u0629 \u062d\u0633\u0628
-label.full.path=\u0645\u0633\u0627\u0631 \u0643\u0627\u0645\u0644
-label.gpu=\u0648\u0639\u0631
-label.guest.type=\u0646\u0648\u0639 \u0627\u0644\u0636\u064a\u0641
-label.IKE.lifetime=\u0639\u0645\u0631 IKE (\u062b\u0627\u0646\u064a\u0629)
-label.IKE.policy=\u0633\u064a\u0627\u0633\u0629 IKE
-label.instances=\u0627\u0644\u062d\u0627\u0644\u0627\u062a
-label.invitations=\u062f\u0639\u0648\u0627\u062a
-label.invited.accounts=\u062f\u0639\u0648\u0629 \u062d\u0633\u0627\u0628\u0627\u062a
-label.invite.to=\u062f\u0639\u0648\u0629 \u0644\u0640
-label.IPsec.preshared.key=\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.isolation.uri=\u0639\u0632\u0644 \u0627\u0644\u0631\u0627\u0628\u0637
-label.keyboard.type=\u0646\u0648\u0639 \u0644\u0648\u062d\u0629 \u0627\u0644\u0645\u0641\u0627\u062a\u064a\u062d
-label.lb.algorithm.leastconn=\u0623\u0642\u0644 \u0627\u0644\u0625\u062a\u0635\u0627\u0644\u0627\u062a
-label.lb.algorithm.source=\u0645\u0635\u062f\u0631
-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.max.guest.limit=\u0627\u0644\u062d\u062f \u0627\u0644\u0623\u0642\u0635\u0627\u0621 \u0644\u0636\u064a\u0641
-label.memory.mb=\u0627\u0644\u0630\u0627\u0643\u0631\u0629 ( \u0628\u0627\u0644\u0645\u064a\u062c\u0627\u0628\u0627\u064a\u0628\u062a)
-label.memory=\u0627\u0644\u0630\u0627\u0643\u0631\u0629
-label.menu.alerts=\u0627\u0644\u062a\u0646\u0628\u064a\u0647\u0627\u062a
-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.configuration=\u062a\u0631\u062a\u064a\u0628
-label.menu.dashboard=\u0644\u0648\u062d\u0629 \u0627\u0644\u0642\u064a\u0627\u062f\u0629
-label.menu.destroyed.instances=\u062d\u0627\u0644\u0627\u062a \u0627\u0644\u062a\u062f\u0645\u064a\u0631
-label.menu.disk.offerings=\u0639\u0631\u0648\u0636 \u0627\u0644\u0642\u0631\u0635
-label.menu.domains=\u0627\u0644\u0645\u062c\u0627\u0644\u0627\u062a
-label.menu.events=\u0623\u062d\u062f\u0627\u062b
-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.global.settings=\u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0627\u0644\u0639\u0645\u0648\u0645\u064a\u0629
-label.menu.instances=\u0627\u0644\u062d\u0627\u0644\u0627\u062a
-label.metrics.allocated=\u062a\u062e\u0635\u064a\u0635
-label.metrics.disk.allocated=\u062a\u062e\u0635\u064a\u0635
-label.metrics.scope=\u0627\u0644\u0645\u062c\u0627\u0644
-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.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.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.network=\u0634\u0628\u0643\u062a\u064a
-label.my.templates=\u0642\u0648\u0627\u0644\u0628\u064a
-label.network.ACLs=\u0634\u0628\u0643\u0629 ACLs
-label.network.ACL.total=\u0625\u062c\u0645\u0627\u0644 \u0634\u0628\u0643\u0629 ACL
-label.network.ACL=\u0634\u0628\u0643\u0629 ACL
-label.networks=\u0627\u0644\u0634\u0628\u0643\u0627\u062a
-label.new.project=\u0645\u0634\u0631\u0648\u0639 \u062c\u062f\u064a\u062f
-label.new=\u062c\u062f\u064a\u062f
-label.no.data=\u0644\u0627 \u064a\u0648\u062c\u062f \u0628\u064a\u0627\u0646\u0627\u062a \u0644\u0644\u0639\u0631\u0636
-label.no.thanks=\u0644\u0627\u061b \u0634\u0643\u0631\u0627\u064b
-label.notifications=\u0627\u0644\u062a\u0646\u0628\u064a\u0647\u0627\u062a
-label.ok=\u0645\u0648\u0627\u0641\u0642
-label.order=\u062a\u0631\u062a\u064a\u0628
-label.previous=\u0627\u0644\u0633\u0627\u0628\u0642
-label.private.Gateway=\u0645\u0646\u0641\u0630\\Gateway \u062e\u0627\u0635
-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.projects=\u0627\u0644\u0645\u0634\u0627\u0631\u064a\u0639
-label.project=\u0645\u0634\u0631\u0648\u0639
-label.project.view=\u0639\u0631\u0636 \u0627\u0644\u0645\u0634\u0631\u0648\u0639
-label.quickview=\u0646\u0638\u0631\u0629 \u0633\u0631\u064a\u0639\u0629
-label.quota.fullsummary=\u062c\u0645\u064a\u0639 \u0627\u0644\u062d\u0633\u0627\u0628\u0627\u062a
-label.reboot=\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644
-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.static.route=\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u062a\u0648\u062c\u064a\u0647 \u062b\u0627\u0628\u062a
-label.remove.tier=\u0625\u0636\u0627\u0641\u0629 \u0637\u0628\u0642\u0629
-label.remove.vpc=\u0625\u0632\u0627\u0644\u0629 VPC
-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.restart.network=\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0634\u0628\u0643\u0629
-label.restart.required=\u0645\u0637\u0644\u0648\u0628 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0634\u063a\u064a\u0644
-label.restart.vpc=\u0625\u0639\u062f\u0627\u0629 \u062a\u0634\u063a\u064a\u0644 VPC
-label.restore=\u0625\u0633\u062a\u0639\u0627\u062f\u0629
-label.review=\u0645\u0631\u0627\u062c\u0639\u0629
-label.revoke.project.invite=\u0625\u0644\u063a\u0627\u0621 \u0627\u0644\u062f\u0639\u0648\u0629
-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.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.scope=\u0627\u0644\u0645\u062c\u0627\u0644
-label.search=\u0628\u062d\u062b
-label.secret.key=\u0627\u0644\u0645\u0641\u062a\u0627\u062d \u0627\u0644\u0633\u0631\u064a
-label.select.a.template=\u0627\u062e\u062a\u0631 \u0642\u0627\u0644\u0628
-label.select.project=\u062d\u062f\u062f \u0627\u0644\u0645\u0634\u0631\u0648\u0639
-label.select.tier=\u062d\u062f\u062f \u0637\u0628\u0642\u0629
-label.select-view=\u062d\u062f\u062f \u0637\u0631\u064a\u0642\u0629 \u0627\u0644\u0639\u0631\u0636
-label.service.capabilities=\u0642\u062f\u0631\u0627\u062a \u0627\u0644\u062e\u062f\u0645\u0629
-label.setup=\u0627\u0644\u062a\u062b\u0628\u064a\u062a
-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.specify.IP.ranges=\u062a\u062d\u062f\u064a\u062f \u0646\u0637\u0627\u0642\u0627\u062a IP
-label.sticky.tablesize=\u062d\u062c\u0645 \u0627\u0644\u062c\u062f\u0648\u0644
-label.stop=\u062a\u0648\u0642\u0641
-label.super.cidr.for.guest.networks=CIDR \u0645\u0645\u062a\u0627\u0632 \u0644\u0634\u0628\u0643\u0627\u062a \u0627\u0644\u0636\u064a\u0641.
-label.supported.services=\t\u0627\u0644\u062e\u062f\u0645\u0627\u062a \u0627\u0644\u0645\u062f\u0639\u0648\u0645\u0629
-label.suspend.project=\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0645\u0634\u0631\u0648\u0639
-label.tier.details=\u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0637\u0628\u0642\u0629
-label.tier=\u0637\u0628\u0642\u0629
-label.upload=\u0631\u0641\u0639
-label.view.all=\u0639\u0631\u0636 \u0627\u0644\u0643\u0644
-label.viewing=\u0639\u0631\u0636
-label.view=\u0639\u0631\u0636
-label.vm.destroy=\u0647\u062f\u0645
-label.vm.reboot=\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644
-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.vm.stop=\u062a\u0648\u0642\u0641
-label.volume.limits=\u062d\u062f\u0648\u062f \u0627\u0644\u0645\u0646\u0637\u0642\u0629
-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.router.details=\u062a\u0641\u0627\u0635\u064a\u0644 \u062c\u0647\u0627\u0632 \u0627\u0644\u062a\u0648\u062c\u064a\u0647 VPC
-label.vpc=\u0633\u062d\u0627\u0628\u0629 \u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u062e\u0627\u0635\u0629 VPC
-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.customer.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 \u0644\u0644\u0639\u0645\u064a\u0644
-label.VPN.customer.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 \u0644\u0644\u0639\u0645\u064a\u0644
-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.waiting=\u0642\u064a\u062f \u0627\u0644\u0625\u0646\u062a\u0638\u0627\u0631
-label.warn=\u062a\u062d\u0630\u064a\u0631
-label.wednesday=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621
-label.weekly=\u0625\u0633\u0628\u0648\u0639\u064a
-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.welcome=\u0645\u0631\u062d\u0628\u0627
-label.yes=\u0646\u0639\u0645
-label.zone.details=\u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0645\u0646\u0637\u0642\u0629
-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.wide=\u0645\u0646\u0637\u0642\u0629 \u0648\u0627\u0633\u0639\u0629
-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.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.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.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.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.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.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.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.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.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.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.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.decline.invitation=\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
-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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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
-notification.reboot.instance=\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0646\u0645\u0648\u0630\u062c
-notification.start.instance=\u0628\u062f\u0621 \u0627\u0644\u0646\u0645\u0648\u0630\u062c
-notification.stop.instance=\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0646\u0645\u0648\u0630\u062c
-state.Accepted=\u062a\u0645 \u0627\u0644\u0642\u0628\u0648\u0644
-state.Active=\u0646\u0634\u0637
-state.Allocated=\u062a\u062e\u0635\u064a\u0635
-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.Enabled=\u062a\u0645\u0643\u064a\u0646
-state.Error=\u062e\u0637\u0623
-state.Expunging=\u0645\u062d\u0648
-state.Pending=\u0641\u064a \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631
-state.Ready=\u062c\u0627\u0647\u0632
-state.Stopped=\u062a\u0648\u0642\u0641
-state.Suspended=\u062a\u0645 \u0627\u0644\u0625\u064a\u0642\u0627\u0641
-ui.listView.filters.all=\u0627\u0644\u0643\u0644
diff --git a/client/WEB-INF/classes/resources/messages_ca.properties b/client/WEB-INF/classes/resources/messages_ca.properties
deleted file mode 100644
index 8b17a566d52..00000000000
--- a/client/WEB-INF/classes/resources/messages_ca.properties
+++ /dev/null
@@ -1,298 +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.
-
-confirm.enable.swift=Si us plau ompliu la seg\u00fcent informaci\u00f3 per habilitar el suport per a Swift
-error.installWizard.message=Quelcom ha fallat, vost\u00e8 pot tornar enrere i corregir els errors detalls suggerime
-error.password.not.match=Els camps de contrasenya no coincideixen
-inline=En l\u00ednia
-label.accept.project.invitation=Accpetar invitaci\u00f3 al projecte
-label.action.edit.host=Editar Host
-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.activate.project=Activar projecte
-label.add.accounts=Afegir comptes
-label.add.accounts.to=Afegir comptes a
-label.add.account.to.project=Afegir compte al projecte
-label.add.by=Afegir per
-label.add.egress.rule=Afegir regla de sortida
-label.add.new.F5=Afegir nou F5
-label.add.new.NetScaler=Afegir un nou NetScaler
-label.add.new.SRX=Afegir nou SRX
-label.add.physical.network=Afegir xarxa f\u00edsica
-label.add.rule=Afegir regla
-label.add.static.nat.rule=Afegir regla de NAT est\u00e0tic
-label.add.to.group=Afegir a grup
-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\u00e0rrega
-label.add.vpn.user=Afegir usuari VPN
-label.agree=D\\'acord
-label.apply=Aplicar
-label.bandwidth=Ample de banda
-label.broadcast.domain.range=Rang del domini de broadcast
-label.capacity=Capacitat
-label.change.service.offering=Canvia oferta de servei
-label.change.value=Canviar valor
-label.clear.list=Esborra llista
-label.community=Comunitat
-label.compute.and.storage=Computaci\u00f3 i Emmagatzematge
-label.compute=Computaci\u00f3
-label.configuration=Configuraci\u00f3
-label.configure=Configurar
-label.confirm.password=Confirmar contrasenya
-label.congratulations=Enorabona\!
-label.continue.basic.install=Continueu amb la instal\u00b7laci\u00f3 b\u00e0sica
-label.continue=Continuar
-label.corrections.saved=Correccions guardades
-label.create.project=Crear projecte
-label.decline.invitation=Declinar invitaci\u00f3
-label.dedicated=Dedicat
-label.default=Per defecte
-label.delete.F5=Esborrar F5
-label.delete.NetScaler=Esborrar NetScaler
-label.delete.project=Esborrar projecte
-label.delete.SRX=Esborar SRX
-label.delete.vpn.user=Esborrar usuari VPN
-label.destination.physical.network.id=ID de xarxa f\u00edsica de dest\u00ed
-label.destination.zone=Zona de dest\u00ed
-label.destroy.router=Destruir router
-label.dhcp=DHCP
-label.disabled=Deshabilitat
-label.disable.provider=Deshabilitar prove\u00efdor
-label.disable.vpn=Deshabilitar VPN
-label.drag.new.position=Arrosegar a la nova posici\u00f3
-label.edit.project.details=Editar detalls del projecte
-label.egress.rule=Regla de sortida
-label.elastic=El\u00e0stic
-label.enable.provider=Habilitar prove\u00efdor
-label.enable.swift=Habilitar Swift
-label.enable.vpn=Habilitar VPN
-label.extractable=Es pot extreure
-label.f5=F5
-label.full.path=Cam\u00ed sencer
-label.guest.end.ip=Fi d\\'IP per a MV
-label.guest=MV
-label.guest.start.ip=Inici d\\'IP per a MV
-label.guest.traffic=Tr\u00e0fic de MV
-label.hints=Pistes
-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.addZone.title=Afegir 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.introduction.to.cloudstack=Introducci\u00f3 a la CloudStack&\#8482
-label.invitations=Invitacions
-label.invite=Convidar
-label.invited.accounts=Comptes convidades
-label.invite.to=Convidar a
-label.ip.ranges=Rangs d\\'IPs
-label.item.listing=Llista d\\'articles
-label.keyboard.type=Tipus de teclat
-label.key=Clau
-label.launch=Iniciar
-label.launch.vm=Arrencar MV
-label.load.balancing=Balanceig de c\u00e0rrega
-label.load.balancing.policies=Pol\u00b7l\u00edtiques de balanceig de c\u00e0rrega
-label.local.storage=Emmagatzemament local
-label.make.project.owner=Feu la compta propiet\u00e0ria del projecte
-label.management=Administraci\u00f3
-label.manage.resources=Administrar Recursos
-label.max.public.ips=Max. IP p\u00fabliques
-label.max.snapshots=Max. instant\u00e0nies
-label.max.templates=Max. plantilles
-label.max.vms=Max. MV d\\'usuari
-label.max.volumes=Max. Volums
-label.may.continue=Ara pot continuar
-label.menu.configuration=Configuraci\u00f3
-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.router.to=Migrar router a
-label.migrate.systemvm.to=Migrar MV de sistema a\:
-label.mode=Mode
-label.move.down.row=Moure una fila cap a baix
-label.move.to.top=Moure a dalt
-label.move.up.row=Moure una fla cap a dalt
-label.my.network=La meva xarxa
-label.my.templates=Les meves plantilles
-label.netScaler=NetScaler
-label.networking.and.security=Xarxa i seguretat
-label.network.rate=Velocitat de xarxa
-label.networks=Xarxes
-label.new=Nou
-label.new.project=Nou projecte
-label.new.vm=Nova MV
-label.nic.adapter.type=Tipus de tarja de xarxa
-label.no.data=No hi ha dades
-label.no.thanks=No gr\u00e0cies
-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.zones=Nombre de zones
-label.ocfs2=OCFS2
-label.order=Ordre
-label.physical.network.ID=ID de xarxa f\u00edsica
-label.please.specify.netscaler.info=Si us plau doneu informaci\u00f3 del NetScaler
-label.pod.name=Nom de rack
-label.pods=Racks
-label.port.forwarding.policies=Pol\u00b7l\u00edtiques de reenviament de ports
-label.previous=Anterior
-label.private.network=Xarxa privada
-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=Projecte
-label.projects=Projectes
-label.providers=Prove\u00efdors
-label.public.network=Xarxa p\u00fablica
-label.Pxe.server.type=Tipus de servidor PXE
-label.redundant.state=Estat redundant
-label.remind.later=Recordeu-m\\'ho despr\u00e9s
-label.remove.egress.rule=Esborrar regla de sortida
-label.remove.ingress.rule=Esborrar regla d\\'entrada
-label.remove.pf=Esborrar regla de reenviament de port
-label.remove.rule=Esborrar regla
-label.remove.static.nat.rule=Esborrar regla de NAT est\u00e0tic
-label.remove.vm.from.lb=Treure VM de la regla de balanceig de c\u00e0rrega
-label.removing=Esborrant
-label.reserved.system.gateway=Pasarel\u00b7la reservada del sistema
-label.reserved.system.netmask=M\u00e0scara reservada del sistema
-label.revoke.project.invite=Revocar invitaci\u00f3
-label.root.disk.controller=Controlador de disc arrel
-label.save.and.continue=Desa i continua
-label.select.a.template=Sel\u00b7leccioni una plantilla
-label.select.a.zone=Sel\u00b7leccioni una zona
-label.select.iso.or.template=Sel\u00b7leccioni ISO o plantilla
-label.select.project=Sel\u00b7leccionar projecte
-label.select-view=Sel\u00b7lecioni vista
-label.setup=Configuraci\u00f3
-label.shutdown.provider=Apagar prove\u00efdor
-label.skip.guide=Si heu utilitzat CloudStack abans, ometi aquesta guia
-label.srx=SRX
-label.static.nat.enabled=NAT est\u00e0tic habilitat
-label.stickiness=Tend\u00e8ncia
-label.sticky.mode=Mode
-label.storage.traffic=Tr\u00e0fic d\\'emmagatzemament
-label.subdomain.access=Acc\u00e9s de subdomini
-label.suspend.project=Suspendre projecte
-label.task.completed=Tasca complerta
-label.timeout=Timeout
-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.storage=Total d\\'emmagatzemament
-label.traffic.types=Tipus de tr\u00e0fics
-label.update.project.resources=Actualitzar recursos del projecte
-label.view.all=Veure tots
-label.view.console=Veure consola
-label.viewing=Veient
-label.view.more=Veure m\u00e9s
-label.view=Veure
-label.virtual.router=Router virtual
-label.what.is.cloudstack=Que \u00e9s CloudStack&\#8482?
-label.zone.details=Detalls de la zona
-label.zones=Zones
-message.acquire.new.ip=Si us plau confirmeu que voleu adquirir una nova IP per aquesta xarxa.
-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.activate.project=Esteu segurs d\\'activar aquest projecte?
-message.add.domain=Si us plau especifiqueu el sub-domini que voleu crear sota aquest domini
-message.add.guest.network=Si us plau confirmeu que voleu afegir una xarxa per a MVs
-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.change.password=Si us plau, canvieu la contrasenya.
-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.SRX=Si us plau confirmeu que voleu esborrar l\\'SRX
-message.confirm.destroy.router=Si us plau confirmeu que voleu destruir aquest router
-message.confirm.disable.provider=Si us plau confirmeu que voleu deshabilitar aquest prove\u00efdor
-message.confirm.enable.provider=Si us plau confirmeu que voleu habilitar aquest prove\u00efdor
-message.confirm.join.project=Si us plau confirmeu que voleu unir-vos al projecte.
-message.confirm.shutdown.provider=Si us plau confirmeu que voleu apagar aquest prove\u00efdor
-message.decline.invitation=Esteu segurs de declinar aquesta invitaci\u00f3 per al projecte?
-message.delete.project=Esteu segurs d\\'eliminar el projecte?
-message.delete.user=Si us plau confirmeu que voleu esborrar aquest usuari.
-message.disable.user=Si us plao confirmeu que voleu deshabilitar aquest usuari.
-message.disable.vpn=\u00bfEsteu segurs de deshabilitar la VPN?
-message.edit.account=Editar ("-1" indica que no hi ha limit en la quantitat de recursos a crear)
-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.generate.keys=Si us plau confirmeu que voleu generar noves claus per aquest usuari.
-message.installWizard.click.retry=Feu clic al bot\u00f3 per tornar a intentar l\\'inici.
-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.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.configureGuestTraffic.description=Una descripci\u00f3 de la xarxa
-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.name=Un nom per a la teva xarxa
-message.instanceWizard.noTemplates=No teniu cap plantilla disponible; si us plau afegiu una plantilla disponible i torneu a usar l\\'assistent.
-message.join.project=Us heu unit a un projecte. Si us pla canvieu a vista de projecte per veure el projecte.
-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.no.projects.adminOnly=No teniu cap projecte.<br/>Si us plau demaneu a l\\'administrador que us en crei un.
-message.no.projects=No teniu cap projecte.<br/>Si us plau creeu-ne un des de la secci\u00f3 de projecte.
-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.project.invite.sent=Invitaci\u00f3 enviada a l\\'usuari; ser\u00e0 afegit al projecte quan accepti l\\'invitaci\u00f3
-message.select.item=Si us plau sel\u00b7leccioneu un article
-message.setup.successful=Instal\u00b7laci\u00f3 del cloud correcte\!
-message.suspend.project=Esteu segurs de suspendre aquest projecte?
-message.update.resource.count=Si us plau confirmeu que voleu actualitzar el comptatge de recursos per aquest compte.
-mode=Mode
-network.rate=Velocitat de xarxa
-side.by.side=Costat a costat
-state.Accepted=Acceptat
-state.Active=Actiu
-state.Completed=Complert
-state.Creating=Creant
-state.Declined=Declinat
-state.Disabled=Deshabilitat
-state.Enabled=Habilitat
-state.Expunging=Esborrant
-state.Pending=Pendent
-state.Ready=Preparat
-state.Starting=Arrencant
-state.Suspended=Susp\u00e9s
diff --git a/client/WEB-INF/classes/resources/messages_de_DE.properties b/client/WEB-INF/classes/resources/messages_de_DE.properties
deleted file mode 100644
index d850ab744d8..00000000000
--- a/client/WEB-INF/classes/resources/messages_de_DE.properties
+++ /dev/null
@@ -1,2284 +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.
-
-changed.item.properties=Ge\u00e4nderte Eintragseigenschaften
-confirm.enable.s3=Bitte f\u00fcgen Sie die folgenden Informationen hinzu, um die Unterst\u00fctzung f\u00fcr "S3-backed Secondary Storage" hinzuzuf\u00fcgen
-confirm.enable.swift=Bitte f\u00fcgen Sie die folgenden Informationen hinzu, um die Unterst\u00fctzung f\u00fcr Swift zu erm\u00f6glichen.
-error.could.not.change.your.password.because.ldap.is.enabled=Fehler\! Ihr Passwort konnte nicht ge\u00e4ndert werden, weil LDAP konfiguriert wurde.
-error.could.not.enable.zone=Zone konnte nicht aktiviert werden
-error.installWizard.message=Etwas ging schief; Sie k\u00f6nnen zur\u00fcckgehen um m\u00f6gliche Fehler zu beheben
-error.invalid.username.password=Ung\u00fcltiger Benutzername oder ung\u00fcltiges Passwort
-error.login=Ihr Benutzername / Passwort stimmt nicht mit unseren Aufzeichnungen \u00fcberein.
-error.menu.select=Es ist nicht m\u00f6glich dies auszuf\u00fchren, weil nichts ausgew\u00e4hlt wurde.
-error.mgmt.server.inaccessible=Der Verwaltungsserver ist nicht erreichbar. Bitte versuche Sie es sp\u00e4ter noch einmal.
-error.password.not.match=Die Passwortfelder stimmen nicht \u00fcberein
-error.please.specify.physical.network.tags=Netzwerk-Angebote sind nicht verf\u00fcgbar solange Sie keine Tags f\u00fcr dieses physische Netzwerk auff\u00fchren.
-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\u00f6st werden.
-force.delete.domain.warning=Achtung\: Diese Auswahl f\u00fchrt zu einer L\u00f6schung aller untergeordneten Domains und aller angeschlossenen Konten sowie ihrer Quellen.
-force.delete=Erzwinge L\u00f6schung
-force.remove=Erzwinge Entfernung
-force.remove.host.warning=Achtung\: Diese Auswahl wird CloudStack zum sofortigen Anhalten der virtuellen Maschine f\u00fchren, 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\u00fchren.
-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=ICMP-Code
-ICMP.type=ICMP-Typ
-image.directory=Bildverzeichnis
-inline=Inline
-instances.actions.reboot.label=Instanz neu starten
-label.about.app=\u00dcber CloudStack
-label.about=\u00dcber
-label.accept.project.invitation=Projekteinladung annehmen
-label.account.and.security.group=Konto, Sicherheitsgruppe
-label.account=Benutzerkonto
-label.account.details=Kontodetails
-label.account.id=Benutzerkonto-ID
-label.account.lower=Konto
-label.account.name=Benutzerkonto-Name
-label.accounts=Benutzerkonten
-label.account.specific=Besonderheiten des Benutzerkontos
-label.account.type=Benutzerkontotyp
-label.acl=ACL
-label.acl.id=ACL-Kennung
-label.acl.list.rules=ACL-Listenregeln
-label.acl.name=ACL-Name
-label.acl.replaced=ACL ersetzt
-label.acquire.new.ip=Neue IP erwerben
-label.acquire.new.secondary.ip=Neue sekund\u00e4re IP erwerben
-label.action=Aktion
-label.action.attach.disk=Festplatte hinzuf\u00fcgen
-label.action.attach.disk.processing=Festplatte wird hinzugef\u00fcgt....
-label.action.attach.iso=ISO hinzuf\u00fcgen
-label.action.attach.iso.processing=ISO wird hinzugef\u00fcgt....
-label.action.cancel.maintenance.mode.processing=Abbruch des Wartungsmodus
-label.action.cancel.maintenance.mode=Wartungsmodus abbrechen
-label.action.change.password=Passwort \u00e4ndern
-label.action.change.service=Dienst \u00e4ndern
-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.processing=Vorlage wird kopiert....
-label.action.copy.template=Vorlage kopieren
-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.template=Vorlage erstellen
-label.action.create.vm=Erstelle VM
-label.action.create.vm.processing=VM wird erstellt....
-label.action.create.volume.processing=Volumen wird erstellt....
-label.action.create.volume=Volumen erstellen
-label.action.delete.account=Benutzerkonto l\u00f6schen
-label.action.delete.account.processing=Konto wird gel\u00f6scht....
-label.action.delete.cluster=L\u00f6schen des Clusters
-label.action.delete.cluster.processing=Cluster wird gel\u00f6scht....
-label.action.delete.disk.offering=Festplattenangebot l\u00f6schen
-label.action.delete.disk.offering.processing=Festplattenangebot wird gel\u00f6scht....
-label.action.delete.domain=L\u00f6schen der Domain
-label.action.delete.domain.processing=Dom\u00e4ne wird gel\u00f6scht....
-label.action.delete.firewall=Firewall-Regel l\u00f6schen
-label.action.delete.firewall.processing=Firewall wird gel\u00f6scht....
-label.action.delete.ingress.rule.processing=Zutrittsregel wird gel\u00f6scht....
-label.action.delete.ingress.rule=Zutrittsregel l\u00f6schen
-label.action.delete.IP.range=IP-Bereich l\u00f6schen
-label.action.delete.IP.range.processing=IP-Bereich wird gel\u00f6scht....
-label.action.delete.ISO=ISO l\u00f6schen
-label.action.delete.ISO.processing=ISO wird gel\u00f6scht....
-label.action.delete.load.balancer=Lastverteilerregel l\u00f6schen
-label.action.delete.load.balancer.processing=Lastverteiler wird gel\u00f6scht....
-label.action.delete.network=L\u00f6schen des Netzwerks
-label.action.delete.network.processing=Netzwerk wird gel\u00f6scht....
-label.action.delete.nexusVswitch=Nexus 1000v l\u00f6schen
-label.action.delete.nic=NIC entfernen
-label.action.delete.physical.network=Physikalisches Netzwerk l\u00f6schen
-label.action.delete.pod=Pod l\u00f6schen
-label.action.delete.pod.processing=Pod wird gel\u00f6scht....
-label.action.delete.primary.storage=Hauptspeicher l\u00f6schen
-label.action.delete.primary.storage.processing=Hauptspeicher wird gel\u00f6scht....
-label.action.delete.secondary.storage.processing=Sekund\u00e4rspeicher wird gel\u00f6scht....
-label.action.delete.secondary.storage=Sekund\u00e4rspeicher l\u00f6schen
-label.action.delete.security.group.processing=Sicherheitsgruppe wird gel\u00f6scht....
-label.action.delete.security.group=Sicherheitsgruppe l\u00f6schen
-label.action.delete.service.offering=Dienstangebot l\u00f6schen
-label.action.delete.service.offering.processing=Dienstangebot wird gel\u00f6scht....
-label.action.delete.snapshot.processing=Schnappschuss wird gel\u00f6scht....
-label.action.delete.snapshot=Schnappschuss l\u00f6schen
-label.action.delete.system.service.offering=Systemdienstangebot l\u00f6schen
-label.action.delete.template.processing=Vorlage wird gel\u00f6scht....
-label.action.delete.template=Vorlage l\u00f6schen
-label.action.delete.user=Benutzer l\u00f6schen
-label.action.delete.user.processing=Benutzer wird gel\u00f6scht....
-label.action.delete.volume.processing=Volumen wird gel\u00f6scht....
-label.action.delete.volume=Volumen l\u00f6schen
-label.action.delete.zone.processing=Zone wird gel\u00f6scht....
-label.action.delete.zone=Zone l\u00f6schen
-label.action.destroy.instance=Die Instanz vernichten
-label.action.destroy.instance.processing=Instanz wird zerst\u00f6rt....
-label.action.destroy.systemvm.processing=System-VM wird zerst\u00f6rt....
-label.action.destroy.systemvm=System-VM vernichten
-label.action.detach.disk=Festplatte losl\u00f6sen
-label.action.detach.disk.processing=Festplatte wird losgel\u00f6st...
-label.action.detach.iso=ISO losl\u00f6sen
-label.action.detach.iso.processing=ISO wird losgel\u00f6st....
-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.processing=Statische NAT wird deaktiviert....
-label.action.disable.static.NAT=Statische NAT deaktivieren
-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.processing=Volumen wird heruntergeladen....
-label.action.download.volume=Volumen herunterladen
-label.action.edit.account=Benutzerkonto bearbeiten
-label.action.edit.disk.offering=Festplattenangebot bearbeiten

  (This diff was longer than 20,000 lines, and has been truncated...)


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


> KVM hosts reboot if there is a short transient storage error
> ------------------------------------------------------------
>
>                 Key: CLOUDSTACK-10310
>                 URL: https://issues.apache.org/jira/browse/CLOUDSTACK-10310
>             Project: CloudStack
>          Issue Type: Improvement
>      Security Level: Public(Anyone can view this level - this is the default.) 
>          Components: KVM
>    Affects Versions: 4.9.0, 4.10.0.0
>            Reporter: Sean Lair
>            Priority: Major
>
> If the KVM heartbeat file can't be written to, the host is rebooted, and thus taking down all VMs running on it.  The code does try 5x times before the reboot, but the there is not a delay between the retires, so they are 5 simultaneous retries, which doesn't help.  Standard SAN storage HA operations or quick network blip could cause this reboot to occur.
> Some discussions on the dev mailing list revealed that some people are just commenting out the reboot line in their version of the CloudStack source.
> A better option (and a new PR is being issued) would be have it sleep between tries so it isn't 5x almost simultaneous tries.  Plus, instead of rebooting, the cloudstack-agent could just be stopped on the host instead.  This will cause alerts to be issued and if the host is disconnected long-enough, depending on the HA code in use, VM HA could handle the host failure.
> The built-in reboot of the host seemed drastic



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message