﻿.. Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information#
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at
   http://www.apache.org/licenses/LICENSE-2.0
   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT 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 |release|
=======================
Version |release| is a |version| LTS release adding almost 200 new features, enhancements and fixes 
since 4.12. 

Apache CloudStack |release| is a |version| LTS release nearly 200 new features, enhancements and fixes since 4.12, such as enhanced hypervisor support, performance increases and more user configurable controls.  Highlights include:

•	Supporting configuration of virtualised appliances
•	VMware 6.7 support
•	Increased granularity & control of instance  deployment
•	Improvements in system VM performance 
•	Allow live migration of DPDK enabled instances
•	More flexible UI branding 
•	Allowing users to create layer 2 network offerings


The full list of new features can be found in the project release notes at http://docs.cloudstack.apache.org/en/4.13.0.0/releasenotes/changes.html

Apache CloudStack powers numerous elastic Cloud computing services, including solutions that have ranked as Gartner Magic Quadrant leaders. Highlighted in the Forrester Q4 2017 Enterprise Open Source Cloud Adoption report, Apache CloudStack "sits beneath hundreds of service provider clouds", including Fortune 5 multinational corporations. A list of known Apache CloudStack users are available at http://cloudstack.apache.org/users.html

