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 2014 Board report
Apache Aries delivers a set of pluggable Java components enabling an enterprise OSGi application programming model.

## Releases

* Apache Aries Blueprint Core 1.3.0 [25Oct2013] 

 Fix to a problem when looking up the container and that resulting in a not-found exception during refresh.

* Apache Aries Blueprint Core 1.4.0 [23Dec2013]

 Custom namespace extensions to allow a service reference to implement multiple interfaces

* Apache Aries Blueprint Parser 1.2.0 [23Dec2013]

 Custom namespace extensions to allow a service reference to implement multiple interfaces

* Apache Aries Blueprint Web OSGi 1.0.0 [25Oct2013]

 An OSGi-aware Servlet ContextListener for bootstrapping Blueprint inside web-bundle containers.

* Apache Aries Blueprint Web OSGi 1.0.1 [08Nov2013]

 Bug fix release.

* Apache Aries Blueprint CM 1.0.2 [14Oct2013]

 Integration of OSGi Blueprint with the OSGi Configuration Admin Service. Bug fix.

* Apache Aries Blueprint CM 1.0.3 [25Oct2013]

 Bug fix release

* Apache Aries Proxy Service 1.0.2 [25Oct2013]

 Proxy service implementation bug fixes.

* Apache Aries Transaction Enlisting JDBC Datasource 2.0.0 [23Dec2013]

 Provide a correct JDBC wrapping for XA datasources & bug fixes.

* Apache Aries Transaction Manager 1.1.0 [23Dec2013]

 Bug fix release

##Project update

The last time the PMC roster was updated was with the addition of John Ross on 28th July 2013.
Discussions on both dev@ and user@ lists continue to be varied. After 3 quarters of user@ mailing list membership growth, it has plateau'd over the last quarter. 

There are no board level issues.