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 2016 Board report

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

 - As a community we made 8 releases this quarter: one was the initial release of
   Aries Transaction Control, the were 4 function releases and 3 fix releases.
 - We welcome two new committers: Dominik Przybysz and Carlos Sierra Andrés.
   
## Health report: 

 - Mailing list discussion and project contributions continue to be healthy.

   
## PMC changes: 
   
 - Currently 37 PMC members. 
 - No new PMC members added in the last 3 months 
 - Last PMC addition was Christian Schneider on Fri Apr 10 2015 
   
## Committer base changes: 
   
 - Currently 51 committers. 
 - New commmitters: 
    - Dominik Przybysz was added as a committer on Mon May 30 2016 
    - Carlos Sierra Andrés was added as a committer on Fri Jun 17 2016 
   
## Releases: 

 - Aries Remote Service Admin (aries-rsa) 1.8.0 2016-04-04   
 - Aries Blueprint Core (blueprint-core) 1.6.1 2016-04-17
 - Aries Blueprint Core (blueprint-core) 1.6.2 2016-05-03
 - Aries Blueprint Maven Plugin 1.4.0 2016-05-07
 - Aries Transaction Enlisting JDBC Datasource 2.1.2 2016-06-02
 - Aries JPA 2.4.0 2016-06-14
 - Aries Transaction Control Service 0.0.1 2016-06-21
 - Aries Remote Service Admin (aries-rsa) 1.9.0 2016-07-12
   
## Mailing list activity: 
   
 - dev@aries.apache.org:  
    - 134 subscribers (up 4 in the last 3 months): 
    - 552 emails sent to list (399 in previous quarter) 
   
 - user@aries.apache.org:  
    - 241 subscribers (up 4 in the last 3 months): 
    - 193 emails sent to list (36 in previous quarter) 
   
## JIRA activity: 
   
 - 56 JIRA tickets created in the last 3 months 
 - 46 JIRA tickets closed/resolved in the last 3 months