<!--
   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">
	<parent>
		<groupId>org.apache.abdera</groupId>
		<artifactId>abdera</artifactId>
		<version>1.1.3</version>  
	</parent>
	<modelVersion>4.0.0</modelVersion>
	<artifactId>abdera-extensions-parent</artifactId>
	<packaging>pom</packaging>
	<name>Abdera Extensions</name>
	<version>1.1.3</version>  
	<description>Abdera Extensions</description>

  <properties>
    <topDir>${basedir}/..</topDir>
  </properties>
  
	<modules>
    <module>gdata</module>
    <module>geo</module>
    <module>html</module>
    <module>json</module>
    <module>main</module>
    <module>media</module>
    <module>oauth</module>
    <module>opensearch</module>
	<module>rss</module>
    <module>serializer</module>
    <module>sharing</module>
    <module>wsse</module>
    <module>features</module>
	</modules>

</project>
