<!-- 
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. 
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">;
<modelVersion>4.0.0</modelVersion>

<packaging>pom</packaging>

<parent>
<groupId>org.apache.felix</groupId>
<artifactId>felix</artifactId>
<version>0.9.0-incubator-SNAPSHOT</version>
<relativePath>../pom/pom.xml</relativePath>
</parent>

<name>Apache Felix EventAdmin Projects</name>
<artifactId>org.apache.felix.eventadmin-projects</artifactId>

<modules>
<module>impl</module>
<module>bridge.upnp</module>
<module>bridge.configuration</module>
<module>bridge.useradmin</module>
<module>bridge.wireadmin</module>
</modules>
</project>
