Title:
Notice:    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.

# July 2015 Board report

Apache Aries delivers a set of pluggable Java components enabling an enterprise OSGi application programming model.

## Releases

After some discussion at the end of May, we resolved to alter our release
process. The new process means we'll be compromising slightly on OSGi
semantic versioning at the bundle level in favour of making the release
process simpler and easier to do often.

The following releases have been created with dates they were promoted to
maven central:

* Apache Aries Transaction Manager (transaction-manager) 1.2.0 2015/05/09
* Apache Aries Parent POM (parent) 2.0.1 2015/06/08
* Apache Aries JPA 2.0.0 (jpa) 2015/06/19
* Apache Aries Subsystems API 2.0.1 (subsystem-api) 2015/06/29
* Apache Aries Subsystems Core 2.0.1 (subsystem-core) 2015/06/29
* Apache Aries Subsystems Bundle 2.0.1 (subsystem-bundle) 2015/06/29
* Apache Aries Blueprint Parser (blueprint-parser) 1.3.1 2015/06/02
* Apache Aries Blueprint Web (blueprint-web) 1.1.1 2015/06/02
* Apache Aries Blueprint no-OSGI (blueprint-noosgi) 1.1.1 2015/06/02
* Apache Aries Subsystems API 2.0.2 (subsystem-api) 2015/07/03
* Apache Aries Subsystems Core 2.0.2 (subsystem-core) 2015/07/03
* Apache Aries Subsystems Bundle 2.0.2 (subsystem-bundle) 2015/07/03
* Apache Aries Transaction Manager (transaction-manager) 1.2.1 2015/07/10

## Project update
A new module containing an implementation of the OSGi Async service has
been contributed.

Jean-Baptiste Onofre & Christian Schneider added to the PMC on 2015/04/10

New committers: Giuseppe Gerla 2015/05/26

User list activity has decreased over the past few months, whereas the
dev@ traffic remains fairly consistent. This may be due to Aries 'library'
nature.

There are no issues requiring board attention at this time.