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.

# October 2016 Board report

   Apache Aries delivers a set of pluggable Java components enabling an
   enterprise OSGi application programming model.
   
## Issues: 
 - There are no issues requiring board attention at this time.
   
## Activity: 
 - As a community we made 3 releases this quarter and 3 further releases currently under vote, and added Johannes Utzig as a new committer.
   
## Health report: 
 - The number of subscribes has remained consistent over the last three months.
The user@ traffic has been significantly greater than the previous three months with a wide range of discussion across the Aries sub-modules.
 - Despite 32 issues being closed off, the number opened was slightly higher in the past 3 months.
   
## 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 52 committers. 
 - Johannes Utzig was added as a committer on Wed Sep 14 2016 
   
## Releases: 
   
 - Aries Blueprint Core 1.7.0 (blueprint-core) 2016-09-19
 - Aries Blueprint CM 1.0.9 (blueprint-cm) 2016-09-19
 - Aries Transaction Manager (transaction-manager) 1.3.1 2016-10-07
 - Aries Blueprint Core 1.7.1 (blueprint-core) voting in progres
 - Aries JMX Core 1.1.7 (jmx-core) voting in progress
 - Aries Util 1.1.3 (util) voting in progress
   
## Mailing list activity: 
   
 - dev@aries.apache.org:  
    - 135 subscribers (up 1 in the last 3 months): 
    - 481 emails sent to list (546 in previous quarter) 
   
 - user@aries.apache.org:  
    - 239 subscribers (up 0 in the last 3 months): 
    - 269 emails sent to list (91 in previous quarter) 
   
   
## JIRA activity: 
   
 - 42 JIRA tickets created in the last 3 months 
 - 32 JIRA tickets closed/resolved in the last 3 months 
   
