.. 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.


Apache Wave (incubating)'s Protocol documentation
=================================================

The following Papers talk about the protocols and foundations of Apache Wave. Were applicable the original authors have
been credited for the publication and each document has had revision by the Apache Software Foundation.

Apache Wave has been through many revisions, first Google Wave then WIAB (Wave in a Box) until it joined the Apache
Incubator. The structure of wave is complicated and has many moving parts and specification, these papers will include
high level technical information about how Apache Wave comes together.

.. toctree::
   :maxdepth: 1

   faq
   operational-transform/operational-transform
   google-wave-architecture/google-wave-architecture
   client-server-protocol/client-server-protocol
   access-control/access-control
   attachments/attachments

