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

.. CloudStack Release Notes documentation master file, created by
   sphinx-quickstart on Fri Feb  7 16:00:59 2014.
   You can adapt this file completely to your liking, but it should at least
   contain the root `toctree` directive.


Apache CloudStack Release Notes
===============================

.. figure:: /_static/images/acslogo.png
   :align: center

This document contains information specific to this release of CloudStack, 
including upgrade instructions from prior releases, new features added to 
CloudStack, API changes, and issues fixed in the release. For installation 
instructions, please see the `CloudStack Installation Guide`_. For usage and 
administration instructions, please see the `CloudStack Administrator's Guide`_.


Contents:

.. toctree::
   :maxdepth: 2

   about


.. toctree::
   :maxdepth: 2

   fixed_issues


.. toctree::
   :maxdepth: 2

   compat
   

.. toctree::
   :maxdepth: 2

   api-changes


.. toctree::
   :maxdepth: 2

   upgrade/upgrade_notes


.. toctree::
   :maxdepth: 1

   upgrade/upgrade-4.11
   upgrade/upgrade-4.10
   upgrade/upgrade-4.9
   upgrade/upgrade-4.8
   upgrade/upgrade-4.7
   upgrade/upgrade-4.6
   upgrade/upgrade-4.5
   upgrade/upgrade-4.4
   upgrade/upgrade-4.3
..   upgrade/upgrade-4.2
..   upgrade/upgrade-4.1
..   upgrade/upgrade-4.0
..   upgrade/upgrade-3.0.x
..   upgrade/upgrade-2.2.14
   upgrade/valid_source


.. toctree::
   :maxdepth: 2

   known_issues   
  
   
.. include:: global.rst
