<!--
   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.2-SNAPSHOT</version>  
	</parent>
	<modelVersion>4.0.0</modelVersion>
	<artifactId>abdera-extensions-parent</artifactId>
	<packaging>pom</packaging>
	<name>Abdera Extensions</name>
	<version>1.2-SNAPSHOT</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>
