Index: src/test/pom-with-parent.xml
===================================================================
--- src/test/pom-with-parent.xml	(revision 0)
+++ src/test/pom-with-parent.xml	(revision 0)
@@ -0,0 +1,10 @@
+<project>
+  <parent>
+    <artifactId>pom</artifactId>
+    <groupId>it.ant-tasks</groupId>
+    <version>1.0</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>project-with-parent-pom</artifactId>
+  <version>2.0-beta-4-SNAPSHOT</version>
+</project>
Index: src/main/java/org/apache/maven/artifact/ant/InstallWagonProviderTask.java
===================================================================
--- src/main/java/org/apache/maven/artifact/ant/InstallWagonProviderTask.java	(revision 550023)
+++ src/main/java/org/apache/maven/artifact/ant/InstallWagonProviderTask.java	(working copy)
@@ -23,7 +23,6 @@
 import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.artifact.factory.ArtifactFactory;
 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
-import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
 import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
@@ -34,6 +33,7 @@
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Project;
 import org.codehaus.plexus.PlexusContainerException;
+
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
@@ -45,9 +45,9 @@
  * @version $Id$
  */
 public class InstallWagonProviderTask
-    extends AbstractArtifactTask
+    extends AbstractArtifactWithRepositoryTask
 {
-	private String groupId =  "org.apache.maven.wagon";
+	private String groupId = "org.apache.maven.wagon";
 	
     private String artifactId;
 
@@ -86,12 +86,6 @@
     public void doExecute()
         throws BuildException
     {
-        MavenMetadataSource metadataSource = (MavenMetadataSource) lookup( ArtifactMetadataSource.ROLE );
-
-        ArtifactResolver resolver = (ArtifactResolver) lookup( ArtifactResolver.ROLE );
-        ArtifactRepository artifactRepository = createRemoteArtifactRepository( getDefaultRemoteRepository() );
-        List remoteRepositories = Collections.singletonList( artifactRepository );
-
         VersionRange versionRange;
         try
         {
@@ -110,6 +104,10 @@
         ArtifactResolutionResult result;
         try
         {
+            MavenMetadataSource metadataSource = (MavenMetadataSource) lookup( ArtifactMetadataSource.ROLE );
+            ArtifactResolver resolver = (ArtifactResolver) lookup( ArtifactResolver.ROLE );
+            List remoteRepositories = createRemoteArtifactRepositories();
+
             result = resolver.resolveTransitively( Collections.singleton( providerArtifact ),
                                                    createArtifact( createDummyPom() ), createLocalArtifactRepository(),
                                                    remoteRepositories, metadataSource, null );
Index: src/main/java/org/apache/maven/artifact/ant/AbstractArtifactWithRepositoryTask.java
===================================================================
--- src/main/java/org/apache/maven/artifact/ant/AbstractArtifactWithRepositoryTask.java	(revision 0)
+++ src/main/java/org/apache/maven/artifact/ant/AbstractArtifactWithRepositoryTask.java	(revision 0)
@@ -0,0 +1,109 @@
+package org.apache.maven.artifact.ant;
+
+/*
+ * 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.
+ */
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.tools.ant.Project;
+
+/**
+ * Base class for atifact tasks that are able to download artifact from repote repositories. 
+ * @version $Id:$
+ */
+public abstract class AbstractArtifactWithRepositoryTask
+    extends AbstractArtifactTask
+{
+    /**
+     * List of Ant Tasks RemoteRepository-ies
+     */
+    private List remoteRepositories = new ArrayList();
+
+    /**
+     * Get the default remote repository.
+     * @return central repository 
+     */
+    private static RemoteRepository getDefaultRemoteRepository()
+    {
+        // TODO: could we utilise the super POM for this?
+        RemoteRepository remoteRepository = new RemoteRepository();
+        remoteRepository.setId( "central" );
+        remoteRepository.setUrl( "http://repo1.maven.org/maven2" );
+        RepositoryPolicy snapshots = new RepositoryPolicy();
+        snapshots.setEnabled( false );
+        remoteRepository.addSnapshots( snapshots );
+        return remoteRepository;
+    }
+
+    private static String statusAsString( RepositoryPolicy policy )
+    {
+        return (policy == null) || policy.isEnabled() ? "enabled" : "disabled";
+    }
+
+    /**
+     * Create the list of ArtifactRepository-ies where artifacts can be downloaded. If
+     * no remote repository has been configured, adds central repository.
+     * @return the list of ArtifactRepository-ies
+     * @see #createRemoteArtifactRepository(RemoteRepository)
+     */
+    protected List createRemoteArtifactRepositories()
+    {
+        if ( getRemoteRepositories().isEmpty() )
+        {
+            addRemoteRepository( getDefaultRemoteRepository() );
+        }
+
+        log( "Using remote repositories:", Project.MSG_VERBOSE );
+        List list = new ArrayList();
+        for ( Iterator i = remoteRepositories.iterator(); i.hasNext(); )
+        {
+            RemoteRepository remoteRepository = (RemoteRepository) i.next();
+    
+            StringBuffer msg = new StringBuffer();
+            msg.append( "  - id=" + remoteRepository.getId() );
+            msg.append( ", url=" + remoteRepository.getUrl() );
+            msg.append( ", releases=" + statusAsString( remoteRepository.getReleases() ) );
+            msg.append( ", snapshots=" + statusAsString( remoteRepository.getSnapshots() ) );
+            if ( remoteRepository.getAuthentication() != null )
+            {
+                msg.append( ", authentication=" + remoteRepository.getAuthentication().getUserName() );
+            }
+            if ( remoteRepository.getProxy() != null )
+            {
+                msg.append( ", proxy=" + remoteRepository.getProxy().getHost() );
+            }
+            getProject().log( msg.toString(), Project.MSG_VERBOSE );
+    
+            list.add( createRemoteArtifactRepository( remoteRepository ) );
+        }
+        return list;
+    }
+
+    public List getRemoteRepositories()
+    {
+        return remoteRepositories;
+    }
+
+    public void addRemoteRepository( RemoteRepository remoteRepository )
+    {
+        remoteRepositories.add( remoteRepository );
+    }
+}
\ No newline at end of file
Index: src/main/java/org/apache/maven/artifact/ant/AbstractArtifactTask.java
===================================================================
--- src/main/java/org/apache/maven/artifact/ant/AbstractArtifactTask.java	(revision 550023)
+++ src/main/java/org/apache/maven/artifact/ant/AbstractArtifactTask.java	(working copy)
@@ -91,6 +91,11 @@
         return new DefaultArtifactRepository( "local", "file://" + localRepository.getPath(), repositoryLayout );
     }
 
+    /**
+     * Create a core-Maven ArtifactRepository from a Maven Ant Tasks's RemoteRepository definition.
+     * @param repository the remote repository as defined in Ant
+     * @return the corresponding ArtifactRepository
+     */
     protected ArtifactRepository createRemoteArtifactRepository( RemoteRepository repository )
     {
         ArtifactRepositoryLayout repositoryLayout =
@@ -322,18 +327,6 @@
         }
     }
 
-    protected static RemoteRepository getDefaultRemoteRepository()
-    {
-        // TODO: could we utilise the super POM for this?
-        RemoteRepository remoteRepository = new RemoteRepository();
-        remoteRepository.setId( "central" );
-        remoteRepository.setUrl( "http://repo1.maven.org/maven2" );
-        RepositoryPolicy snapshots = new RepositoryPolicy();
-        snapshots.setEnabled( false );
-        remoteRepository.addSnapshots( snapshots );
-        return remoteRepository;
-    }
-
     protected synchronized PlexusContainer getContainer()
     {
         if ( container == null )
Index: src/main/java/org/apache/maven/artifact/ant/DependenciesTask.java
===================================================================
--- src/main/java/org/apache/maven/artifact/ant/DependenciesTask.java	(revision 550023)
+++ src/main/java/org/apache/maven/artifact/ant/DependenciesTask.java	(working copy)
@@ -63,12 +63,10 @@
  * @version $Id$
  */
 public class DependenciesTask
-    extends AbstractArtifactTask
+    extends AbstractArtifactWithRepositoryTask
 {
     private List dependencies = new ArrayList();
 
-    private List remoteRepositories = new ArrayList();
-
     private String pathId;
 
     private String filesetId;
@@ -134,13 +132,8 @@
         ArtifactResolutionResult result;
         Set artifacts;
 
-        if ( getRemoteRepositories().isEmpty() )
-        {
-            addRemoteRepository( getDefaultRemoteRepository() );
-        }
+        List remoteArtifactRepositories = createRemoteArtifactRepositories();
 
-        List remoteArtifactRepositories = createRemoteArtifactRepositories( getRemoteRepositories() );
-
         try
         {
             artifacts = MavenMetadataSource.createArtifacts( artifactFactory, dependencies, null, null, null );
@@ -302,49 +295,6 @@
         }
     }
 
-    private static String statusAsString( RepositoryPolicy policy )
-    {
-        return (policy == null) || policy.isEnabled() ? "enabled" : "disabled";
-    }
-
-    private List createRemoteArtifactRepositories( List remoteRepositories )
-    {
-        log( "Using remote repositories:", Project.MSG_VERBOSE );
-        List list = new ArrayList();
-        for ( Iterator i = remoteRepositories.iterator(); i.hasNext(); )
-        {
-            RemoteRepository remoteRepository = (RemoteRepository) i.next();
-
-            StringBuffer msg = new StringBuffer();
-            msg.append( "  - id=" + remoteRepository.getId() );
-            msg.append( ", url=" + remoteRepository.getUrl() );
-            msg.append( ", releases=" + statusAsString( remoteRepository.getReleases() ) );
-            msg.append( ", snapshots=" + statusAsString( remoteRepository.getSnapshots() ) );
-            if ( remoteRepository.getAuthentication() != null )
-            {
-                msg.append( ", authentication=" + remoteRepository.getAuthentication().getUserName() );
-            }
-            if ( remoteRepository.getProxy() != null )
-            {
-                msg.append( ", proxy=" + remoteRepository.getProxy().getHost() );
-            }
-            getProject().log( msg.toString(), Project.MSG_VERBOSE );
-
-            list.add( createRemoteArtifactRepository( remoteRepository ) );
-        }
-        return list;
-    }
-
-    public List getRemoteRepositories()
-    {
-        return remoteRepositories;
-    }
-
-    public void addRemoteRepository( RemoteRepository remoteRepository )
-    {
-        remoteRepositories.add( remoteRepository );
-    }
-
     public List getDependencies()
     {
         return dependencies;
Index: src/main/java/org/apache/maven/artifact/ant/Pom.java
===================================================================
--- src/main/java/org/apache/maven/artifact/ant/Pom.java	(revision 550023)
+++ src/main/java/org/apache/maven/artifact/ant/Pom.java	(working copy)
@@ -19,24 +19,42 @@
  * under the License.
  */
 
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
 import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactResolver;
 import org.apache.maven.model.Build;
 import org.apache.maven.model.CiManagement;
 import org.apache.maven.model.DependencyManagement;
 import org.apache.maven.model.DistributionManagement;
 import org.apache.maven.model.IssueManagement;
+import org.apache.maven.model.Model;
 import org.apache.maven.model.Organization;
+import org.apache.maven.model.Parent;
 import org.apache.maven.model.Reporting;
 import org.apache.maven.model.Scm;
+import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectBuilder;
 import org.apache.maven.project.ProjectBuildingException;
+import org.apache.maven.project.artifact.MavenMetadataSource;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.PropertyHelper;
 import org.codehaus.plexus.util.introspection.ReflectionValueExtractor;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.Collections;
+import java.util.List;
 
 /**
  * A POM typedef.
@@ -53,7 +71,7 @@
  * @version $Id$
  */
 public class Pom
-    extends AbstractArtifactTask
+    extends AbstractArtifactWithRepositoryTask
 {
     private String refid;
 
@@ -123,6 +141,8 @@
         // TODO: should this be in execute() too? Would that work when it is used as a type?
         if ( file != null )
         {
+            checkParentPom();
+            
             try
             {
                 // TODO: should the profiles be constructed and passed in here? From Ant, or perhaps settings?
@@ -130,7 +150,7 @@
             }
             catch ( ProjectBuildingException e )
             {
-                throw new BuildException( "Unable to build project: " + file, e );
+                throw new BuildException( "Unable to initialize POM " + file.getName() + ": " + e.getMessage(), e );
             }
         }
         else if ( refid != null )
@@ -138,7 +158,57 @@
             getInstance().initialise( builder, localRepository );
         }
     }
+    
+    private void checkParentPom()
+    {
+        Model model = null;
+        try
+        {
+            InputStream in = new FileInputStream( file );
+            Reader reader = new InputStreamReader( in, "UTF-8" );
+            model = new MavenXpp3Reader().read( reader );
+        }
+        catch ( IOException e )
+        {
+            throw new BuildException( "IO error while reading pom: " + e.getMessage(), e );
+        }
+        catch ( XmlPullParserException e )
+        {
+            throw new BuildException( "Error parsing pom: " + e.getMessage(), e );
+        }
 
+        if ( model.getParent() != null && model.getParent().getRelativePath() != null )
+        {
+            // resolve parent pom
+            Parent parent = model.getParent();
+            String groupId = parent.getGroupId();
+            String artifactId = parent.getArtifactId();
+            String version = parent.getVersion();
+
+            ArtifactFactory factory = (ArtifactFactory) lookup( ArtifactFactory.ROLE );
+            Artifact parentArtifact = factory.createParentArtifact( groupId, artifactId, version );
+
+            try
+            {
+                MavenMetadataSource metadataSource = (MavenMetadataSource) lookup( ArtifactMetadataSource.ROLE );
+                ArtifactResolver resolver = (ArtifactResolver) lookup( ArtifactResolver.ROLE );
+                List remoteRepositories = createRemoteArtifactRepositories();
+
+                resolver.resolveTransitively( Collections.singleton( parentArtifact ),
+                                              createArtifact( createDummyPom() ), createLocalArtifactRepository(),
+                                              remoteRepositories, metadataSource, null );
+            }
+            catch ( ArtifactResolutionException e )
+            {
+                throw new BuildException( "Error downloading parent pom: " + e.getMessage(), e );
+            }
+            catch ( ArtifactNotFoundException e )
+            {
+                throw new BuildException( "Unable to download parent pom in remote repository: " + e.getMessage(), e );
+            }
+        }
+    }
+
     protected MavenProject getMavenProject()
     {
         return getInstance().mavenProject;
Index: sample.build.xml
===================================================================
--- sample.build.xml	(revision 550023)
+++ sample.build.xml	(working copy)
@@ -39,7 +39,7 @@
   </target>
   
   <target name="test-all-deps" description="All dependencies tests"
-    depends="test-pom,test-no-deps,test-pom-deps,test-deps,test-legacy-pom">
+    depends="test-pom,test-pom-with-parent,test-no-deps,test-pom-deps,test-deps,test-legacy-pom">
     <echo>test-bad-dep and test-invalid-pom-ref must be run manually, since they are intended to fail</echo>
   </target>
 
@@ -47,7 +47,7 @@
     depends="test-deploy-spaces,test-deploy,test-no-dist-mgmt,test-install-attached,test-deploy-attached"/>
 
   <target name="test-all" description="All tests"
-    depends="test-all-deps,test-all-pubs">
+    depends="test-all-deps,test-all-pubs,test-install-provider">
     <echo>test-scm not run, since it fails...</echo>
   </target>
 
@@ -266,5 +266,22 @@
       <attach file="${basedir}/target/sample-build-test.pom.asc" type="pom.asc"/>
     </artifact:install>
   </target>
+
+  <target name="test-install-provider" depends="initTaskDefs">
+    <artifact:install-provider groupId="it.ant-tasks" artifactId="wagon-foo" version="1.0-beta-2">
+      <localRepository refid="local.repository"/>
+      <remoteRepository url="file://${user.dir}/src/test/repo"/>
+    </artifact:install-provider>
+  </target>
+
+  <target name="test-pom-with-parent" depends="initTaskDefs">
+    <artifact:pom file="${user.dir}/src/test/pom-with-parent.xml" id="my.maven.project">
+      <localRepository refid="local.repository"/>
+      <remoteRepository url="file://${user.dir}/src/test/repo"/>
+    </artifact:pom>
+
+    <echo>Artifact ID = ${my.maven.project.artifactId}</echo>
+
+    <echo>Parent Artifact ID = ${my.maven.project.parent.artifactId}</echo>
+  </target>
 </project>
-

