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.

# November 2015 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:
  - 23 releases since the last report in July.
  - Increasingly, contributions come in via GitHub pull requests.
  - Good discussions on both user@ and dev@ lists.

## PMC changes:

 - Currently 38 PMC members.
 - No new PMC members added in the last 3 months
 - Last PMC addition was Jean-Baptiste Onofre on Fri Apr 10 2015

## Committer base changes:

 - Currently 48 committers.
 - No new committers added in the last 3 months
 - Last committer addition was Giuseppe Gerla at Wed May 27 2015

## Releases:

 - Aries Versioning 0.3.1 2015-07-16
 - Aries Blueprint Core (blueprint-core) 1.4.4 2015-07-16
 - Aries Blueprint CM (blueprint-cm) 1.0.7 2015-07-16
 - Aries Transaction Manager (transaction-manager) 1.3.0 2015-08-10
 - Aries Util (util) 1.1.1 2015-08-10
 - Aries Asynchronous OSGi Services 1.0.1 2015-08-10
 - Aries JPA (jpa) 2.1.0 2015-08-10
 - Aries Transaction Blueprint (transaction-blueprint) 1.1.1 2015-08-11
 - Aries JMX (jmx) 1.1.5 2015-08-30
 - Aries Blueprint Maven Plugin (blueprint-maven-plugin) 1.2.0 2015-09-25
 - Aries Transaction Blueprint (transaction-blueprint) 2.0.0 2015-09-25
 - Aries JPA (jpa) 2.2.0 2015-09-26
 - Aries Subsystem Gogo Command (subsystem-gogo-command) 1.0.0 2015-10-05
 - Aries Subsystems Bundle (subsystem-bundle) 2.0.4 2015-10-07
 - Aries Subsystem API (subsystem-api) 2.0.4 2015-10-07
 - Aries Subsystem Core (subsystem-core) 2.0.4 2015-10-07
 - Aries Subsystem OBR (subsystem-obr) 1.0.4 2015-10-07
 - Aries Blueprint Core (blueprint-core) 1.4.5 2015-10-26
 - Aries Blueprint Parser (blueprint-parser) 1.3.2 2015-10-26
 - Aries Subsystems Bundle (subsystem-bundle) 2.0.6 2015-11-01
 - Aries Subsystem API (subsystem-api) 2.0.6 2015-11-01
 - Aries Subsystem Core (subsystem-core) 2.0.6 2015-11-01
 - Aries SPI-Fly (spi-fly) 1.0.6 2015-11-09

## Mailing list activity:

 - dev@aries.apache.org:
    - 136 subscribers (up 4 in the last 3 months):
    - 824 emails sent to list (533 in previous quarter)

 - user@aries.apache.org:
    - 233 subscribers (down -1 in the last 3 months):
    - 98 emails sent to list (29 in previous quarter)


## JIRA activity:

 - 72 JIRA tickets created in the last 3 months
 - 74 JIRA tickets closed/resolved in the last 3 months