.. Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information#
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at
   http://www.apache.org/licenses/LICENSE-2.0
   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.


What's New in |version|
=======================

Version |version| is a maintainance release containing over 140 fixes and improvements on the 4.11.0 release.

These include the speeding up of virtual router deployments and fixes for corner cases 
effecting the new config drive and L2 features and some hypervisor specific fixes to improve compatibility
with current hypervisor versions including the XCP-ng fork of XenServer.

What's New in 4.11.0.0
======================

Version 4.11.0.0 included more than 400 commits, 220 pull requests that fixes
more than 250 issues since the last release. Version 4.11.0.0 was a large
release that was worked on for 8 months.

A LOT changed in this release, so this is not a complete list, but here is a
quick summary of some of the changes:

* Support for XenServer 7.1, 7.2, 7.3 and 7.4, and support for XCP-ng 7.4.
* Improved support for VMware 6.5.
* Host-HA framework and HA-provider for KVM hosts with and NFS as primary storage, and a new background polling task manager.
* Secure agents communication: new certificate authority framework and a default built-in root CA provider.
* New network type - L2.
* CloudStack metrics exporter for Prometheus.
* Cloudian Hyperstore connector for CloudStack.
* Annotation feature for CloudStack entities such as hosts.
* Separation of volume snapshot creation on primary storage and backing operation on secondary storage.
* Limit admin access from specified CIDRs.
* Expansion of Management IP Range.
* Dedication of public IPs to SSVM and CPVM.
* Support for separate subnet for SSVM and CPVM.
* Bypass secondary storage template copy/transfer for KVM.
* Support for multi-disk OVA template for VMware.
* Storage overprovisioning for local storage.
* LDAP mapping with domain scope, and mapping of LDAP group to an account.
* Move user across accounts.
* Managed storage enhancements.
* Extend config drive support for user data, metadata, and password (Nuage Networks).
* Extra DHCP options support (Nuage Networks).
* Nuage VSP 5.0 support and caching of NuageVsp ID's.
* Nuage domain template selection per VPC and support for network migration.
* Support for watchdog timer to KVM Instances.
* Support for Secondary IPv6 Addresses and Subnets.
* IPv6 Prefix Delegation support in basic networking.
* Ability to specific MAC address while deploying VM or adding a NIC to a VM.
* VMware dvSwitch security policies configuration in network offering
* Allow more than 7 NICs to be added to a VMware VM.
* Network rate usage for guest offering for VRs.
* Usage metrics for VM snapshot on primary storage.
* Enable Netscaler inline mode.
* NCC integration in CloudStack.
* The retirement of the Midonet network plugin.
* Several UI Improvements.
* Embedded Jetty and improved CloudStack management server configuration.
* Improved support for Java 8 for building artifacts/modules, packaging, and in
  the systemvm template.
* A faster console proxy startup and service availability.
* A new Debian 9 based smaller systemvm template that patches systemvm without
  requiring reboot.
* Several optimizations and improvements to the virtual router including better
  support for redundant virtual routers and strongswan provided s2s and remote
  access vpn.

