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.

# April 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: 
 - New module: Aries Remote Service Admin seeded from Apache CXF DOSGi for providing an implementation of the OSGi Remote Service Admin specification with pluggable transports. http://aries.apache.org/modules/rsa.html
 - New module: Aries Transaction Control Service. An implementation of the in development RFC221 at the OSGi Alliance.
 - 8 releases since the last report in January
    
## 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 49 committers. 
 - No new committers added in the last 3 months 
 - Last committer addition was Sam Bratton at Mon Dec 21 2015 
   
## Releases: 
   
 - Aries JPA container (jpa-container) 1.0.4 2016-03-08
 - Apache Aries Proxy Service (proxy-impl) 1.0.5 2016-03-25
 - Apache Aries JMX Core (jmx-core) 1.1.6 2016-03-25
 - Aries Blueprint Core (blueprint-core) 1.6.0 2016-03-25
 - Aries Blueprint Spring Support (blueprint-spring) 0.2.0 2016-03-25
 - Aries Blueprint Spring Extender Support (blueprint-spring-extender) 0.2.0 2016-03-25
 - Aries Blueprint no-OSGI (blueprint-noosgi) 1.1.2 2016-03-25
 - Aries Blueprint CM (blueprint-cm) 1.0.8 2016-03-25
  
## Mailing list activity: 
   
 - dev@aries.apache.org:  
    - 131 subscribers (down -4 in the last 3 months): 
    - 488 emails sent to list (527 in previous quarter) 
   
 - user@aries.apache.org:  
    - 236 subscribers (up 0 in the last 3 months): 
    - 37 emails sent to list (37 in previous quarter) 
   
   
## JIRA activity: 
   
 - 44 JIRA tickets created in the last 3 months 
 - 50 JIRA tickets closed/resolved in the last 3 months 
