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.

# January 2017 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 PMC were requested by the board to consider if there are any potential PMC candidates among the current committers. There was some discussion, but no people were decided upon. This will be discussed again in the coming days.
 - A new contribution of the JAX-RS Services OSGi specification Reference Implementation has been contributed from Carlos Sierra Andrés. This specification is currently in draft.
 - The number of subscribers to the dev@ user@ private@ and commits@ lists are roughly consistent (down by 0-3 in the last 3 months).
 - The dev@ list traffic is consistent, while the user@ traffic has been down over last three months. However, there has been a wide variety of discussion across the different modules within Aries.
 - 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. 
 - No new committers added in the last 3 months 
 - Last committer addition was Johannes Utzig at Wed Sep 14 2016 
   
## Releases: 
   
 - Aries Blueprint Core 1.7.1 (blueprint-core) 2016-10-19
 - Aries JMX Core 1.1.7 (jmx-core) 2016-10-19
 - Aries Util 1.1.3 (util) 2016-10-20
 - Aries Transaction Control service (tx-control) 2016-10-21
 - Aries JPA 2.5.0 (jpa) 2016-10-31
 - Aries Apache Aries Blueprint Plugin SPI 1.0.0 (blueprint-maven-plugin-spi) 2016-12-05
 - Aries Blueprint Plugin Annotations 1.0.0 (blueprint-maven-plugin-annotation) 2016-12-05
 - Aries Blueprint Maven Plugin 1.5.0 (blueprint-maven-plugin) 2016-12-05
 - Aries Transaction Manager 1.3.2 (transaction-manager) 2017-01-03
 - Aries Proxy Service 1.0.6 (proxy-impl) 2017-01-03

## 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) 

