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

Downloading vhd-util
--------------------

This procedure is required only for installations where XenServer is
installed on the hypervisor hosts.

Before setting up the Management Server, download
`vhd-util <http://download.cloudstack.org/tools/vhd-util>`_ from
http://download.cloudstack.org/tools/vhd-util.
and copy it into ``/usr/share/cloudstack-common/scripts/vm/hypervisor/xenserver``
of the Management Server.