Index: continuum-model/src/main/mdo/continuum.xml
===================================================================
--- continuum-model/src/main/mdo/continuum.xml	(revision 1161553)
+++ continuum-model/src/main/mdo/continuum.xml	(working copy)
@@ -100,6 +100,14 @@
           </association>
         </field>
         <field>
+          <name>distributedDirectoryPurgeConfigurations</name>
+          <version>1.4.1+</version>
+          <association>
+            <type>DistributedDirectoryPurgeConfiguration</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field>
           <name>projectScmRoots</name>
           <version>1.1.3+</version>
           <association java.init="field">
@@ -1611,6 +1619,31 @@
         </field>
       </fields>
     </class>
+    <class>
+      <name>DistributedDirectoryPurgeConfiguration</name>
+      <version>1.4.1+</version>
+      <superClass>AbstractPurgeConfiguration</superClass>
+      <packageName>org.apache.continuum.model.repository</packageName>
+      <fields>
+        <field>
+          <name>buildAgentUrl</name>
+          <version>1.4.1+</version>
+          <type>String</type>
+          <description>
+            BuildAgent URL
+          </description>
+          <required>true</required>
+        </field>
+        <field>
+          <name>directoryType</name>
+          <version>1.4.1+</version>
+          <type>String</type>
+          <description>
+            The type of directory. Valid values are "releases" and "working"
+          </description>
+        </field>
+      </fields>
+    </class>
        
     <class>
       <name>ContinuumReleaseResult</name>
Index: continuum-model/src/main/resources/META-INF/package.jdo
===================================================================
--- continuum-model/src/main/resources/META-INF/package.jdo	(revision 1161553)
+++ continuum-model/src/main/resources/META-INF/package.jdo	(working copy)
@@ -363,6 +363,11 @@
       </field>
       <field name="directoryType"/>
     </class>
+    <class name="DistributedDirectoryPurgeConfiguration" persistence-capable-superclass="org.apache.continuum.model.repository.AbstractPurgeConfiguration" detachable="true" table="DistributedDirectoryPurgeConfiguration">
+      <inheritance strategy="new-table"/>
+      <field name="buildAgentUrl" null-value="exception"/>
+      <field name="directoryType"/>
+    </class>
   </package>
   <package name="org.apache.maven.continuum.model.scm">
     <class name="ScmResult" detachable="true" table="ScmResult">
Index: continuum-model/src/main/resources/META-INF/package.jdorepl
===================================================================
--- continuum-model/src/main/resources/META-INF/package.jdorepl	(revision 1161553)
+++ continuum-model/src/main/resources/META-INF/package.jdorepl	(working copy)
@@ -363,6 +363,11 @@
       </field>
       <field name="directoryType"/>
     </class>
+    <class name="DistributedDirectoryPurgeConfiguration" persistence-capable-superclass="org.apache.continuum.model.repository.AbstractPurgeConfiguration" detachable="true" table="DistributedDirectoryPurgeConfiguration">
+      <inheritance strategy="new-table"/>
+      <field name="buildAgentUrl" null-value="exception"/>
+      <field name="directoryType"/>
+    </class>
   </package>
   <package name="org.apache.maven.continuum.model.scm">
     <class name="ScmResult" detachable="true" table="ScmResult">
Index: continuum-purge/src/test/java/org/apache/continuum/purge/DefaultPurgeConfigurationServiceTest.java
===================================================================
--- continuum-purge/src/test/java/org/apache/continuum/purge/DefaultPurgeConfigurationServiceTest.java	(revision 1161553)
+++ continuum-purge/src/test/java/org/apache/continuum/purge/DefaultPurgeConfigurationServiceTest.java	(working copy)
@@ -19,13 +19,14 @@
  * under the License.
  */
 
+import java.util.List;
+
 import org.apache.continuum.model.repository.DirectoryPurgeConfiguration;
+import org.apache.continuum.model.repository.DistributedDirectoryPurgeConfiguration;
 import org.apache.continuum.model.repository.RepositoryPurgeConfiguration;
 import org.apache.continuum.purge.repository.content.ManagedDefaultRepositoryContent;
 import org.apache.continuum.purge.repository.content.RepositoryManagedContent;
 
-import java.util.List;
-
 /**
  * @author Maria Catherine Tan
  */
@@ -98,6 +99,35 @@
         assertFalse( "check if dir purge configuration was removed", dirConfigs.contains( dirConfig ) );
     }
 
+    public void testDistributedDirectoryPurgeConfiguration()
+        throws Exception
+    {
+        DistributedDirectoryPurgeConfiguration dirConfig = new DistributedDirectoryPurgeConfiguration();
+
+        dirConfig.setBuildAgentUrl( TEST_BUILD_AGENT_URL );
+        dirConfig.setDirectoryType( TEST_RELEASES_DIRECTORY_TYPE );
+        dirConfig.setDaysOlder( TEST_DAYS_OLDER );
+        dirConfig.setRetentionCount( TEST_RETENTION_COUNT );
+
+        dirConfig = purgeConfigurationService.addDistributedDirectoryPurgeConfiguration( dirConfig );
+
+        assertNotNull( dirConfig );
+
+        DistributedDirectoryPurgeConfiguration retrieved =
+            distributedDirectoryPurgeConfigurationDao.getDistributedDirectoryPurgeConfiguration( dirConfig.getId() );
+        assertEquals( dirConfig, retrieved );
+
+        dirConfig.setDirectoryType( TEST_WORKING_DIRECTORY_TYPE );
+        purgeConfigurationService.updateDistributedDirectoryPurgeConfiguration( dirConfig );
+        retrieved = distributedDirectoryPurgeConfigurationDao.getDistributedDirectoryPurgeConfiguration( dirConfig.getId() );
+        assertEquals( dirConfig, retrieved );
+
+        purgeConfigurationService.removeDistributedDirectoryPurgeConfiguration( dirConfig );
+
+        List<DistributedDirectoryPurgeConfiguration> dirConfigs = purgeConfigurationService.getAllDistributedDirectoryPurgeConfigurations();
+        assertFalse( "check if dir purge configuration was removed", dirConfigs.contains( dirConfig ) );
+    }
+
     public void testRepositoryManagedContent()
         throws Exception
     {
Index: continuum-purge/src/test/java/org/apache/continuum/purge/AbstractPurgeTest.java
===================================================================
--- continuum-purge/src/test/java/org/apache/continuum/purge/AbstractPurgeTest.java	(revision 1161553)
+++ continuum-purge/src/test/java/org/apache/continuum/purge/AbstractPurgeTest.java	(working copy)
@@ -28,6 +28,7 @@
 import javax.jdo.PersistenceManagerFactory;
 
 import org.apache.continuum.dao.DirectoryPurgeConfigurationDao;
+import org.apache.continuum.dao.DistributedDirectoryPurgeConfigurationDao;
 import org.apache.continuum.dao.LocalRepositoryDao;
 import org.apache.continuum.dao.RepositoryPurgeConfigurationDao;
 import org.apache.continuum.model.repository.DirectoryPurgeConfiguration;
@@ -51,6 +52,8 @@
     private static final String TEST_DEFAULT_RELEASES_DIR = "target/working-directory";
 
     private static final String TEST_DEFAULT_BUILDOUTPUT_DIR = "target/build-output-directory";
+    
+    protected static final String TEST_BUILD_AGENT_URL = "http://localhost:8181/continuum-buildagent/xmlrpc";
 
     protected static final int TEST_DAYS_OLDER = 30;
 
@@ -59,6 +62,8 @@
     protected static final String TEST_RELEASES_DIRECTORY_TYPE = "releases";
 
     protected static final String TEST_BUILDOUTPUT_DIRECTORY_TYPE = "buildOutput";
+    
+    protected static final String TEST_WORKING_DIRECTORY_TYPE = "working";
 
     protected LocalRepositoryDao localRepositoryDao;
 
@@ -66,6 +71,8 @@
 
     protected RepositoryPurgeConfigurationDao repositoryPurgeConfigurationDao;
 
+    protected DistributedDirectoryPurgeConfigurationDao distributedDirectoryPurgeConfigurationDao;
+
     protected RepositoryPurgeConfiguration defaultRepoPurge;
 
     protected DirectoryPurgeConfiguration defaultReleasesDirPurge;
@@ -89,6 +96,9 @@
 
         directoryPurgeConfigurationDao =
             (DirectoryPurgeConfigurationDao) lookup( DirectoryPurgeConfigurationDao.class );
+        
+        distributedDirectoryPurgeConfigurationDao =
+            (DistributedDirectoryPurgeConfigurationDao) lookup( DistributedDirectoryPurgeConfigurationDao.class );
 
         if ( localRepositoryDao.getAllLocalRepositories().size() == 0 )
         {
Index: continuum-purge/src/main/java/org/apache/continuum/purge/DefaultPurgeConfigurationService.java
===================================================================
--- continuum-purge/src/main/java/org/apache/continuum/purge/DefaultPurgeConfigurationService.java	(revision 1161553)
+++ continuum-purge/src/main/java/org/apache/continuum/purge/DefaultPurgeConfigurationService.java	(working copy)
@@ -20,10 +20,12 @@
  */
 
 import org.apache.continuum.dao.DirectoryPurgeConfigurationDao;
+import org.apache.continuum.dao.DistributedDirectoryPurgeConfigurationDao;
 import org.apache.continuum.dao.LocalRepositoryDao;
 import org.apache.continuum.dao.RepositoryPurgeConfigurationDao;
 import org.apache.continuum.model.repository.AbstractPurgeConfiguration;
 import org.apache.continuum.model.repository.DirectoryPurgeConfiguration;
+import org.apache.continuum.model.repository.DistributedDirectoryPurgeConfiguration;
 import org.apache.continuum.model.repository.LocalRepository;
 import org.apache.continuum.model.repository.RepositoryPurgeConfiguration;
 import org.apache.continuum.purge.repository.content.RepositoryManagedContent;
@@ -64,6 +66,11 @@
      * @plexus.requirement
      */
     private RepositoryPurgeConfigurationDao repositoryPurgeConfigurationDao;
+    
+    /**
+     * @plexus.requirement
+     */
+    private DistributedDirectoryPurgeConfigurationDao distributedDirectoryPurgeConfigurationDao;
 
     private PlexusContainer container;
 
@@ -80,6 +87,10 @@
         {
             purgeConfiguration = addDirectoryPurgeConfiguration( (DirectoryPurgeConfiguration) purgeConfig );
         }
+        else if ( purgeConfig instanceof DistributedDirectoryPurgeConfiguration )
+        {
+            purgeConfiguration = addDistributedDirectoryPurgeConfiguration( ( DistributedDirectoryPurgeConfiguration ) purgeConfig );
+        }
 
         return purgeConfiguration;
     }
@@ -95,6 +106,10 @@
         {
             updateDirectoryPurgeConfiguration( (DirectoryPurgeConfiguration) purgeConfig );
         }
+        else if ( purgeConfig instanceof DistributedDirectoryPurgeConfiguration )
+        {
+            updateDistributedDirectoryPurgeConfiguration( ( DistributedDirectoryPurgeConfiguration ) purgeConfig );
+        }
     }
 
     public void removePurgeConfiguration( int purgeConfigId )
@@ -110,6 +125,10 @@
         {
             removeDirectoryPurgeConfiguration( (DirectoryPurgeConfiguration) purgeConfig );
         }
+        else if ( purgeConfig instanceof DistributedDirectoryPurgeConfiguration )
+        {
+            removeDistributedDirectoryPurgeConfiguration( ( DistributedDirectoryPurgeConfiguration ) purgeConfig );
+        }
     }
 
     public DirectoryPurgeConfiguration addDirectoryPurgeConfiguration( DirectoryPurgeConfiguration dirPurge )
@@ -340,6 +359,18 @@
                 // purgeConfigId is not of type directory purge configuration
             }
         }
+        
+        if ( purgeConfig == null )
+        {
+            try
+            {
+                purgeConfig = getDistributedDirectoryPurgeConfiguration( purgeConfigId );
+            }
+            catch ( PurgeConfigurationServiceException e )
+            {
+                // purgeConfigId is not of type directory purge configuration
+            }
+        }
 
         return purgeConfig;
     }
@@ -376,6 +407,77 @@
         }
     }
 
+    public List<DistributedDirectoryPurgeConfiguration> getAllDistributedDirectoryPurgeConfigurations()
+    {
+        return distributedDirectoryPurgeConfigurationDao.getAllDistributedDirectoryPurgeConfigurations();
+    }
+
+    public DistributedDirectoryPurgeConfiguration addDistributedDirectoryPurgeConfiguration( DistributedDirectoryPurgeConfiguration dirPurge )
+        throws PurgeConfigurationServiceException
+    {
+        DistributedDirectoryPurgeConfiguration dirPurgeConfig;
+        
+        try
+        {
+            dirPurgeConfig = distributedDirectoryPurgeConfigurationDao.addDistributedDirectoryPurgeConfiguration( dirPurge );
+        }
+        catch ( ContinuumStoreException e )
+        {
+            throw new PurgeConfigurationServiceException( e.getMessage(), e );
+        }
+
+        return dirPurgeConfig;
+        
+    }
+
+    public DistributedDirectoryPurgeConfiguration getDistributedDirectoryPurgeConfiguration( int dirPurgeId )
+        throws PurgeConfigurationServiceException
+    {
+        try
+        {
+            return distributedDirectoryPurgeConfigurationDao.getDistributedDirectoryPurgeConfiguration( dirPurgeId );
+        }
+        catch ( ContinuumObjectNotFoundException e )
+        {
+            throw new PurgeConfigurationServiceException( e.getMessage(), e );
+        }
+        catch ( ContinuumStoreException e )
+        {
+            throw new PurgeConfigurationServiceException( e.getMessage(), e );
+        }
+    }
+    
+    public void updateDistributedDirectoryPurgeConfiguration( DistributedDirectoryPurgeConfiguration dirPurge )
+        throws PurgeConfigurationServiceException
+    {
+        try
+        {
+            distributedDirectoryPurgeConfigurationDao.updateDistributedDirectoryPurgeConfiguration( dirPurge );
+        }
+        catch ( ContinuumStoreException e )
+        {
+            throw new PurgeConfigurationServiceException( e.getMessage(), e );
+        }
+    }
+
+    public void removeDistributedDirectoryPurgeConfiguration( DistributedDirectoryPurgeConfiguration purgeConfig )
+        throws PurgeConfigurationServiceException
+    {
+        try
+        {
+            distributedDirectoryPurgeConfigurationDao.removeDistributedDirectoryPurgeConfiguration( purgeConfig );
+        }
+        catch ( ContinuumStoreException e )
+        {
+            throw new PurgeConfigurationServiceException( e.getMessage(), e );
+        }
+    }
+    
+    public List<DistributedDirectoryPurgeConfiguration> getEnableDistributedDirectoryPurgeConfigurationsBySchedule( int scheduleId )
+    {
+            return distributedDirectoryPurgeConfigurationDao.getEnableDistributedDirectoryPurgeConfigurationsBySchedule( scheduleId );
+    }
+
     public void contextualize( Context context )
         throws ContextException
     {
Index: continuum-purge/src/main/java/org/apache/continuum/purge/task/PurgeTaskExecutor.java
===================================================================
--- continuum-purge/src/main/java/org/apache/continuum/purge/task/PurgeTaskExecutor.java	(revision 1161553)
+++ continuum-purge/src/main/java/org/apache/continuum/purge/task/PurgeTaskExecutor.java	(working copy)
@@ -21,6 +21,7 @@
 
 import org.apache.continuum.model.repository.AbstractPurgeConfiguration;
 import org.apache.continuum.model.repository.DirectoryPurgeConfiguration;
+import org.apache.continuum.model.repository.DistributedDirectoryPurgeConfiguration;
 import org.apache.continuum.model.repository.LocalRepository;
 import org.apache.continuum.model.repository.RepositoryPurgeConfiguration;
 import org.apache.continuum.purge.PurgeConfigurationService;
@@ -102,6 +103,17 @@
 
                 purgeController.doPurge( dirPurge.getLocation() );
             }
+            else if ( purgeConfig instanceof DistributedDirectoryPurgeConfiguration )
+            {
+                DistributedDirectoryPurgeConfiguration dirPurge = ( DistributedDirectoryPurgeConfiguration ) purgeConfig;
+                
+                PurgeController purgeController = 
+                    ( PurgeController ) container.lookup( PurgeController.ROLE, "purge-distributed-directory" );
+                
+                purgeController.initializeExecutors( dirPurge );
+                
+                purgeController.doPurge( dirPurge );
+            }
 
         }
         catch ( ComponentLookupException e )
Index: continuum-purge/src/main/java/org/apache/continuum/purge/controller/RepositoryPurgeController.java
===================================================================
--- continuum-purge/src/main/java/org/apache/continuum/purge/controller/RepositoryPurgeController.java	(revision 1161553)
+++ continuum-purge/src/main/java/org/apache/continuum/purge/controller/RepositoryPurgeController.java	(working copy)
@@ -95,6 +95,12 @@
         }
     }
 
+    public void doPurge( AbstractPurgeConfiguration purgeConfig )
+    {
+        RepositoryPurgeConfiguration repoPurge = (RepositoryPurgeConfiguration) purgeConfig;
+        doPurge( repoPurge.getRepository().getLocation() );
+    }
+    
     public void doPurge( String path )
     {
         try
Index: continuum-purge/src/main/java/org/apache/continuum/purge/controller/DirectoryPurgeController.java
===================================================================
--- continuum-purge/src/main/java/org/apache/continuum/purge/controller/DirectoryPurgeController.java	(revision 1161553)
+++ continuum-purge/src/main/java/org/apache/continuum/purge/controller/DirectoryPurgeController.java	(working copy)
@@ -42,6 +42,12 @@
 
     private ContinuumPurgeExecutor purgeExecutor;
 
+    public void doPurge( AbstractPurgeConfiguration purgeConfig )
+    {
+        DirectoryPurgeConfiguration dirPurge = (DirectoryPurgeConfiguration) purgeConfig;
+        doPurge( dirPurge.getLocation() );
+    }
+    
     public void doPurge( String path )
     {
         try
Index: continuum-purge/src/main/java/org/apache/continuum/purge/controller/DistributedDirectoryPurgeController.java
===================================================================
--- continuum-purge/src/main/java/org/apache/continuum/purge/controller/DistributedDirectoryPurgeController.java	(revision 0)
+++ continuum-purge/src/main/java/org/apache/continuum/purge/controller/DistributedDirectoryPurgeController.java	(revision 0)
@@ -0,0 +1,95 @@
+package org.apache.continuum.purge.controller;
+
+/*
+ * 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.net.URL;
+
+import org.apache.continuum.distributed.transport.slave.SlaveBuildAgentTransportClient;
+import org.apache.continuum.distributed.transport.slave.SlaveBuildAgentTransportService;
+import org.apache.continuum.model.repository.AbstractPurgeConfiguration;
+import org.apache.continuum.model.repository.DistributedDirectoryPurgeConfiguration;
+import org.apache.continuum.purge.executor.ContinuumPurgeExecutorException;
+import org.apache.maven.continuum.configuration.ConfigurationService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * DirectoryPurgeController
+ *
+ * @author
+ * @plexus.component role="org.apache.continuum.purge.controller.PurgeController" role-hint="purge-distributed-directory"
+ */
+public class DistributedDirectoryPurgeController
+    implements PurgeController
+{
+    private static final Logger log = LoggerFactory.getLogger( DistributedDirectoryPurgeController.class );
+
+    /**
+     * @plexus.requirement
+     */
+    private ConfigurationService configurationService;
+    
+    private SlaveBuildAgentTransportService transportClient;
+    
+    public void doPurge( String path )
+    {
+        log.warn( "doPurge( String ) is not supported for DistributedDirectoryPurgeController" );
+    }
+
+    public void doPurge( AbstractPurgeConfiguration purgeConfig )
+    {
+        DistributedDirectoryPurgeConfiguration dirPurge = (DistributedDirectoryPurgeConfiguration) purgeConfig;
+        try
+        {
+            transportClient.ping();
+
+            StringBuilder logMsg = new StringBuilder().append( "Executing directory purge with the following settings[directoryType=" ).
+                                                    append( dirPurge.getDirectoryType() ).append( ",daysOlder=" ).
+                                                    append( dirPurge.getDaysOlder() ).append( ", retentionCount=" ).
+                                                    append( dirPurge.getRetentionCount() ).append( ", deleteAll=" ).
+                                                    append( dirPurge.isDeleteAll() ).append( "]" );
+            
+            log.debug( logMsg.toString() );
+            
+            transportClient.executeDirectoryPurge( dirPurge.getDirectoryType(), dirPurge.getDaysOlder(), 
+                                                   dirPurge.getRetentionCount(), dirPurge.isDeleteAll() );
+        }
+        catch ( Exception e )
+        {
+            log.error( "Unable to execute purge: " + e.getMessage(), e );
+        }
+    }
+
+    public void initializeExecutors( AbstractPurgeConfiguration purgeConfig )
+        throws ContinuumPurgeExecutorException
+    {
+        DistributedDirectoryPurgeConfiguration dirPurge = (DistributedDirectoryPurgeConfiguration) purgeConfig;
+
+        try
+        {
+            transportClient = new SlaveBuildAgentTransportClient( new URL( dirPurge.getBuildAgentUrl() ), "", 
+                                                                  configurationService.getSharedSecretPassword() );
+        }
+        catch ( Exception e )
+        {
+            throw new ContinuumPurgeExecutorException( e.getMessage(), e );
+        }
+    }
+}
Index: continuum-purge/src/main/java/org/apache/continuum/purge/executor/RetentionCountDirectoryPurgeExecutor.java
===================================================================
--- continuum-purge/src/main/java/org/apache/continuum/purge/executor/RetentionCountDirectoryPurgeExecutor.java	(revision 1161553)
+++ continuum-purge/src/main/java/org/apache/continuum/purge/executor/RetentionCountDirectoryPurgeExecutor.java	(working copy)
@@ -81,7 +81,7 @@
 
         for ( File file : files )
         {
-            if ( countToPurge-- <= 0 )
+            if ( countToPurge <= 0 )
             {
                 break;
             }
Index: continuum-purge/pom.xml
===================================================================
--- continuum-purge/pom.xml	(revision 1161553)
+++ continuum-purge/pom.xml	(working copy)
@@ -58,6 +58,14 @@
       <artifactId>continuum-model</artifactId>
     </dependency>
     <dependency>
+      <groupId>org.apache.continuum</groupId>
+      <artifactId>continuum-distributed-slave-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.continuum</groupId>
+      <artifactId>continuum-distributed-slave-client</artifactId>
+    </dependency>
+    <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
     </dependency>
Index: continuum-distributed/continuum-distributed-tests/src/test/it/org/apache/continuum/distributed/transport/tests/SlaveBuildAgentTransportServiceTest.java
===================================================================
--- continuum-distributed/continuum-distributed-tests/src/test/it/org/apache/continuum/distributed/transport/tests/SlaveBuildAgentTransportServiceTest.java	(revision 1161553)
+++ continuum-distributed/continuum-distributed-tests/src/test/it/org/apache/continuum/distributed/transport/tests/SlaveBuildAgentTransportServiceTest.java	(working copy)
@@ -107,4 +107,16 @@
             fail( e.getMessage() );
         }
     }
+    
+    public void testExecuteDirectoryPurge()
+    {
+        try
+        {
+            slaveProxy.executeDirectoryPurge( "releases", 1, 2, false );
+        }
+        catch ( Exception e )
+        {
+            fail( e.getMessage() );
+        }
+    }
 }
Index: continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-api/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportService.java
===================================================================
--- continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-api/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportService.java	(revision 1161553)
+++ continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-api/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportService.java	(working copy)
@@ -19,12 +19,11 @@
  * under the License.
  */
 
-import com.atlassian.xmlrpc.ServiceObject;
-
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 
+import com.atlassian.xmlrpc.ServiceObject;
 /**
  * SlaveBuildAgentTransportService
  */
@@ -154,4 +153,16 @@
      */
     public String getBuildAgentPlatform()
         throws Exception;
+
+    /**
+     * Execute a directory purge on the build agent
+     * 
+     * @param directoryType valid types are <i>working</i> and <i>releases</i>
+     * @param daysOlder days older
+     * @param retentionCount retention count
+     * @param deleteAll delete all flag
+     * 
+     * @throws Exception error that will occur during the purge
+     */
+    public void executeDirectoryPurge( String directoryType, int daysOlder, int retentionCount, boolean deleteAll ) throws Exception;
 }
Index: continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-client/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportClient.java
===================================================================
--- continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-client/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportClient.java	(revision 1161553)
+++ continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-client/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportClient.java	(working copy)
@@ -19,20 +19,20 @@
  * under the License.
  */
 
-import com.atlassian.xmlrpc.ApacheBinder;
-import com.atlassian.xmlrpc.Binder;
-import com.atlassian.xmlrpc.BindingException;
-
 import java.net.URL;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.TimeZone;
 
-import com.atlassian.xmlrpc.ConnectionInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.atlassian.xmlrpc.ApacheBinder;
+import com.atlassian.xmlrpc.Binder;
+import com.atlassian.xmlrpc.BindingException;
+import com.atlassian.xmlrpc.ConnectionInfo;
+
 /**
  * SlaveBuildAgentTransportClient
  */
@@ -822,4 +822,10 @@
 
         return result;
     }
+
+    @Override
+    public void executeDirectoryPurge( String directoryType, int daysOlder, int retentionCount, boolean deleteAll ) throws Exception
+    {
+        slave.executeDirectoryPurge( directoryType, daysOlder, retentionCount, deleteAll );
+    }
 }
Index: continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-server/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportServer.java
===================================================================
--- continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-server/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportServer.java	(revision 1161553)
+++ continuum-distributed/continuum-distributed-slave/continuum-distributed-slave-server/src/main/java/org/apache/continuum/distributed/transport/slave/SlaveBuildAgentTransportServer.java	(working copy)
@@ -575,4 +575,10 @@
     {
         return continuumBuildAgentService.getBuildAgentPlatform();
     }
+    
+    @Override
+    public void executeDirectoryPurge( String directoryType, int daysOlder, int retentionCount, boolean deleteAll ) throws Exception
+    {
+        continuumBuildAgentService.executeDirectoryPurge( directoryType, daysOlder, retentionCount, deleteAll );
+    }
 }
Index: continuum-core/src/test/java/org/apache/continuum/purge/DefaultContinuumPurgeManagerTest.java
===================================================================
--- continuum-core/src/test/java/org/apache/continuum/purge/DefaultContinuumPurgeManagerTest.java	(revision 1161553)
+++ continuum-core/src/test/java/org/apache/continuum/purge/DefaultContinuumPurgeManagerTest.java	(working copy)
@@ -20,9 +20,11 @@
  */
 
 import org.apache.continuum.dao.DirectoryPurgeConfigurationDao;
+import org.apache.continuum.dao.DistributedDirectoryPurgeConfigurationDao;
 import org.apache.continuum.dao.LocalRepositoryDao;
 import org.apache.continuum.dao.RepositoryPurgeConfigurationDao;
 import org.apache.continuum.model.repository.DirectoryPurgeConfiguration;
+import org.apache.continuum.model.repository.DistributedDirectoryPurgeConfiguration;
 import org.apache.continuum.model.repository.LocalRepository;
 import org.apache.continuum.model.repository.RepositoryPurgeConfiguration;
 import org.apache.continuum.purge.task.PurgeTask;
@@ -43,6 +45,8 @@
 
     private DirectoryPurgeConfigurationDao directoryPurgeConfigurationDao;
 
+    private DistributedDirectoryPurgeConfigurationDao distributedDirectoryPurgeConfigurationDao;
+
     private RepositoryPurgeConfigurationDao repositoryPurgeConfigurationDao;
 
     private ContinuumPurgeManager purgeManager;
@@ -53,6 +57,8 @@
 
     private DirectoryPurgeConfiguration dirPurge;
 
+    private DistributedDirectoryPurgeConfiguration distDirPurge;
+
     private TaskQueueManager taskQueueManager;
 
     @Override
@@ -68,6 +74,9 @@
 
         repositoryPurgeConfigurationDao =
             (RepositoryPurgeConfigurationDao) lookup( RepositoryPurgeConfigurationDao.class.getName() );
+        
+        distributedDirectoryPurgeConfigurationDao =
+            (DistributedDirectoryPurgeConfigurationDao) lookup( DistributedDirectoryPurgeConfigurationDao.class.getName() );
 
         purgeManager = (ContinuumPurgeManager) lookup( ContinuumPurgeManager.ROLE );
 
@@ -122,9 +131,11 @@
     {
         purgeManager.purgeRepository( repoPurge );
         purgeManager.purgeDirectory( dirPurge );
+        purgeManager.purgeDistributedDirectory( distDirPurge );
 
         assertNextBuildIs( repoPurge.getId() );
         assertNextBuildIs( dirPurge.getId() );
+        assertNextBuildIs( distDirPurge.getId() );
         assertNextBuildIsNull();
 
         purgeManager.purgeRepository( repoPurge );
@@ -158,6 +169,11 @@
         dirPurge.setDirectoryType( "releases" );
         dirPurge.setLocation( getTestFile( "target/working-directory" ).getAbsolutePath() );
         dirPurge = directoryPurgeConfigurationDao.addDirectoryPurgeConfiguration( dirPurge );
+        
+        distDirPurge = new DistributedDirectoryPurgeConfiguration();
+        distDirPurge.setDirectoryType( "releases" );
+        distDirPurge.setBuildAgentUrl( "http://localhost:8186/continuum-buildagent/xmlrpc" );
+        distDirPurge = distributedDirectoryPurgeConfigurationDao.addDistributedDirectoryPurgeConfiguration( distDirPurge );
     }
 
     private void assertNextBuildIs( int expectedPurgeConfigId )
Index: continuum-core/src/test/java/org/apache/continuum/builder/distributed/stubs/SlaveBuildAgentTransportClientStub.java
===================================================================
--- continuum-core/src/test/java/org/apache/continuum/builder/distributed/stubs/SlaveBuildAgentTransportClientStub.java	(revision 1161553)
+++ continuum-core/src/test/java/org/apache/continuum/builder/distributed/stubs/SlaveBuildAgentTransportClientStub.java	(working copy)
@@ -294,4 +294,12 @@
         return null;
     }
 
+    @Override
+    public void executeDirectoryPurge( String directoryType, int daysOlder, int retentionCount, boolean deleteAll )
+        throws Exception
+    {
+        // TODO Auto-generated method stub
+        
+    }
+
 }
Index: continuum-core/src/main/java/org/apache/continuum/purge/DefaultContinuumPurgeManager.java
===================================================================
--- continuum-core/src/main/java/org/apache/continuum/purge/DefaultContinuumPurgeManager.java	(revision 1161553)
+++ continuum-core/src/main/java/org/apache/continuum/purge/DefaultContinuumPurgeManager.java	(working copy)
@@ -19,15 +19,16 @@
  * under the License.
  */
 
+import java.util.List;
+
 import org.apache.continuum.buildmanager.BuildsManager;
-import org.apache.continuum.dao.ProjectDao;
 import org.apache.continuum.model.repository.DirectoryPurgeConfiguration;
+import org.apache.continuum.model.repository.DistributedDirectoryPurgeConfiguration;
 import org.apache.continuum.model.repository.LocalRepository;
 import org.apache.continuum.model.repository.RepositoryPurgeConfiguration;
 import org.apache.continuum.purge.task.PurgeTask;
 import org.apache.continuum.taskqueue.manager.TaskQueueManager;
 import org.apache.continuum.taskqueue.manager.TaskQueueManagerException;
-import org.apache.maven.continuum.build.settings.DefaultSchedulesActivator;
 import org.apache.maven.continuum.build.settings.SchedulesActivationException;
 import org.apache.maven.continuum.build.settings.SchedulesActivator;
 import org.apache.maven.continuum.model.project.Schedule;
@@ -35,8 +36,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.List;
-
 /**
  * DefaultContinuumPurgeManager
  *
@@ -75,11 +74,17 @@
     {
         List<RepositoryPurgeConfiguration> repoPurgeList = null;
         List<DirectoryPurgeConfiguration> dirPurgeList = null;
+        List<DistributedDirectoryPurgeConfiguration> distributedDirPurgeList = null;
 
         repoPurgeList = purgeConfigurationService.getEnableRepositoryPurgeConfigurationsBySchedule( schedule.getId() );
         dirPurgeList = purgeConfigurationService.getEnableDirectoryPurgeConfigurationsBySchedule( schedule.getId() );
+        distributedDirPurgeList = purgeConfigurationService.getEnableDistributedDirectoryPurgeConfigurationsBySchedule( schedule.getId() );
 
-        if ( repoPurgeList != null && repoPurgeList.size() > 0 )
+        boolean hasRepoPurge = repoPurgeList != null && repoPurgeList.size() > 0;
+        boolean hasDirPurge = dirPurgeList != null && dirPurgeList.size() > 0;
+        boolean hasDitributedDirPurge = distributedDirPurgeList != null && distributedDirPurgeList.size() > 0;
+        
+        if ( hasRepoPurge )
         {
             for ( RepositoryPurgeConfiguration repoPurge : repoPurgeList )
             {
@@ -87,7 +92,7 @@
             }
         }
 
-        if ( dirPurgeList != null && dirPurgeList.size() > 0 )
+        if ( hasDirPurge )
         {
             for ( DirectoryPurgeConfiguration dirPurge : dirPurgeList )
             {
@@ -95,8 +100,16 @@
             }
         }
         
-        if ( ( repoPurgeList == null || repoPurgeList.isEmpty() ) && ( dirPurgeList == null || dirPurgeList.isEmpty() ) )
+        if ( hasDitributedDirPurge )
         {
+            for ( DistributedDirectoryPurgeConfiguration dirPurge : distributedDirPurgeList )
+            {
+                purgeDistributedDirectory( dirPurge );
+            }
+        }
+        
+        if ( !hasRepoPurge && !hasDirPurge && !hasDitributedDirPurge )
+        {
             // This purge is not enable for a purge process.
             try
             {
@@ -161,7 +174,7 @@
         }
         catch ( TaskQueueException e )
         {
-            throw new ContinuumPurgeManagerException( "Error while enqueuing repository", e );
+            throw new ContinuumPurgeManagerException( "Error while enqueuing directory", e );
         }
         catch ( TaskQueueManagerException e )
         {
@@ -169,4 +182,17 @@
         }
     }
 
+    public void purgeDistributedDirectory( DistributedDirectoryPurgeConfiguration dirPurge )
+        throws ContinuumPurgeManagerException
+    {
+        try
+        {
+            taskQueueManager.getPurgeQueue().put( new PurgeTask( dirPurge.getId() ) );
+        }
+        catch ( TaskQueueException e )
+        {
+            throw new ContinuumPurgeManagerException( "Error while enqueuing distributed directory", e );
+        }
+    }
+
 }
\ No newline at end of file
Index: continuum-core/src/main/java/org/apache/maven/continuum/build/settings/DefaultSchedulesActivator.java
===================================================================
--- continuum-core/src/main/java/org/apache/maven/continuum/build/settings/DefaultSchedulesActivator.java	(revision 1161553)
+++ continuum-core/src/main/java/org/apache/maven/continuum/build/settings/DefaultSchedulesActivator.java	(working copy)
@@ -26,9 +26,11 @@
 
 import org.apache.continuum.dao.BuildDefinitionDao;
 import org.apache.continuum.dao.DirectoryPurgeConfigurationDao;
+import org.apache.continuum.dao.DistributedDirectoryPurgeConfigurationDao;
 import org.apache.continuum.dao.RepositoryPurgeConfigurationDao;
 import org.apache.continuum.dao.ScheduleDao;
 import org.apache.continuum.model.repository.DirectoryPurgeConfiguration;
+import org.apache.continuum.model.repository.DistributedDirectoryPurgeConfiguration;
 import org.apache.continuum.model.repository.RepositoryPurgeConfiguration;
 import org.apache.maven.continuum.Continuum;
 import org.apache.maven.continuum.model.project.BuildDefinition;
@@ -70,6 +72,12 @@
     /**
      * @plexus.requirement
      */
+    private DistributedDirectoryPurgeConfigurationDao distributedDirectoryPurgeConfigurationDao;
+
+
+    /**
+     * @plexus.requirement
+     */
     private BuildDefinitionDao buildDefinitionDao;
 
     /**
@@ -288,8 +296,10 @@
             repositoryPurgeConfigurationDao.getEnableRepositoryPurgeConfigurationsBySchedule( schedule.getId() );
         List<DirectoryPurgeConfiguration> dirPurgeConfigs =
             directoryPurgeConfigurationDao.getEnableDirectoryPurgeConfigurationsBySchedule( schedule.getId() );
+        List<DistributedDirectoryPurgeConfiguration> distriDirPurgeConfigs = 
+            distributedDirectoryPurgeConfigurationDao.getEnableDistributedDirectoryPurgeConfigurationsBySchedule( schedule.getId() );
 
-        return repoPurgeConfigs.size() > 0 || dirPurgeConfigs.size() > 0;
+        return repoPurgeConfigs.size() > 0 || dirPurgeConfigs.size() > 0 || distriDirPurgeConfigs.size() > 0;
 
     }
 }
Index: continuum-store/src/main/java/org/apache/continuum/dao/DistributedDirectoryPurgeConfigurationDaoImpl.java
===================================================================
--- continuum-store/src/main/java/org/apache/continuum/dao/DistributedDirectoryPurgeConfigurationDaoImpl.java	(revision 0)
+++ continuum-store/src/main/java/org/apache/continuum/dao/DistributedDirectoryPurgeConfigurationDaoImpl.java	(revision 0)
@@ -0,0 +1,164 @@
+package org.apache.continuum.dao;
+
+/*
+ * 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.Collections;
+import java.util.List;
+
+import javax.jdo.Extent;
+import javax.jdo.PersistenceManager;
+import javax.jdo.Query;
+import javax.jdo.Transaction;
+
+import org.apache.continuum.model.repository.DistributedDirectoryPurgeConfiguration;
+import org.apache.maven.continuum.store.ContinuumStoreException;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author
+ * @version $Id$
+ * @plexus.component role="org.apache.continuum.dao.DistributedDirectoryPurgeConfigurationDao"
+ */
+@Repository("distributedDirectoryPurgeConfigurationDao")
+public class DistributedDirectoryPurgeConfigurationDaoImpl
+    extends AbstractDao
+    implements DistributedDirectoryPurgeConfigurationDao
+{
+    public List<DistributedDirectoryPurgeConfiguration> getAllDistributedDirectoryPurgeConfigurations()
+    {
+        return getAllObjectsDetached( DistributedDirectoryPurgeConfiguration.class );
+    }
+
+    public List<DistributedDirectoryPurgeConfiguration> getDistributedDirectoryPurgeConfigurationsBySchedule( int scheduleId )
+    {
+        PersistenceManager pm = getPersistenceManager();
+
+        Transaction tx = pm.currentTransaction();
+
+        try
+        {
+            tx.begin();
+
+            Extent extent = pm.getExtent( DistributedDirectoryPurgeConfiguration.class, true );
+
+            Query query = pm.newQuery( extent );
+
+            query.declareParameters( "int scheduleId" );
+
+            query.setFilter( "this.schedule.id == scheduleId" );
+
+            List result = (List) query.execute( scheduleId );
+
+            return result == null ? Collections.EMPTY_LIST : (List) pm.detachCopyAll( result );
+        }
+        finally
+        {
+            tx.commit();
+
+            rollback( tx );
+        }
+    }
+    
+    public List<DistributedDirectoryPurgeConfiguration> getEnableDistributedDirectoryPurgeConfigurationsBySchedule( int scheduleId )
+    {
+        PersistenceManager pm = getPersistenceManager();
+
+        Transaction tx = pm.currentTransaction();
+
+        try
+        {
+            tx.begin();
+
+            Extent extent = pm.getExtent( DistributedDirectoryPurgeConfiguration.class, true );
+
+            Query query = pm.newQuery( extent );
+
+            query.declareParameters( "int scheduleId" );
+
+            query.setFilter( "this.schedule.id == scheduleId && this.enabled == true" );
+
+            List result = (List) query.execute( scheduleId );
+
+            return result == null ? Collections.EMPTY_LIST : (List) pm.detachCopyAll( result );
+        }
+        finally
+        {
+            tx.commit();
+
+            rollback( tx );
+        }
+    }
+
+    public List<DistributedDirectoryPurgeConfiguration> getDistributedDirectoryPurgeConfigurationsByType( String type )
+    {
+        PersistenceManager pm = getPersistenceManager();
+
+        Transaction tx = pm.currentTransaction();
+
+        try
+        {
+            tx.begin();
+
+            Extent extent = pm.getExtent( DistributedDirectoryPurgeConfiguration.class, true );
+
+            Query query = pm.newQuery( extent );
+
+            query.declareImports( "import java.lang.String" );
+
+            query.declareParameters( "String type" );
+
+            query.setFilter( "this.directoryType == type" );
+
+            List result = (List) query.execute( type );
+
+            return result == null ? Collections.EMPTY_LIST : (List) pm.detachCopyAll( result );
+        }
+        finally
+        {
+            tx.commit();
+
+            rollback( tx );
+        }
+    }
+
+    public DistributedDirectoryPurgeConfiguration getDistributedDirectoryPurgeConfiguration( int configurationId )
+        throws ContinuumStoreException
+    {
+        return (DistributedDirectoryPurgeConfiguration) getObjectById( DistributedDirectoryPurgeConfiguration.class, configurationId );
+    }
+
+    public DistributedDirectoryPurgeConfiguration addDistributedDirectoryPurgeConfiguration( DistributedDirectoryPurgeConfiguration purgeConfiguration )
+        throws ContinuumStoreException
+    {
+        return (DistributedDirectoryPurgeConfiguration) addObject( purgeConfiguration );
+    }
+
+    public void updateDistributedDirectoryPurgeConfiguration( DistributedDirectoryPurgeConfiguration purgeConfiguration )
+        throws ContinuumStoreException
+    {
+        updateObject( purgeConfiguration );
+    }
+
+    public void removeDistributedDirectoryPurgeConfiguration( DistributedDirectoryPurgeConfiguration purgeConfiguration )
+        throws ContinuumStoreException
+    {
+        removeObject( purgeConfiguration );
+    }
+}
Index: continuum-api/src/main/java/org/apache/continuum/purge/ContinuumPurgeManager.java
===================================================================
--- continuum-api/src/main/java/org/apache/continuum/purge/ContinuumPurgeManager.java	(revision 1161553)
+++ continuum-api/src/main/java/org/apache/continuum/purge/ContinuumPurgeManager.java	(working copy)
@@ -20,6 +20,7 @@
  */
 
 import org.apache.continuum.model.repository.DirectoryPurgeConfiguration;
+import org.apache.continuum.model.repository.DistributedDirectoryPurgeConfiguration;
 import org.apache.continuum.model.repository.RepositoryPurgeConfiguration;
 import org.apache.maven.continuum.model.project.Schedule;
 
@@ -55,4 +56,14 @@
      */
     void purgeDirectory( DirectoryPurgeConfiguration dirPurgeConfig )
         throws ContinuumPurgeManagerException;
+    
+    /**
+     * Purge directory in distributed build mode
+     * 
+     * @param dirPurgeConfig distributed purge configuration
+     * 
+     * @throws ContinuumPurgeManagerException
+     */
+    void purgeDistributedDirectory( DistributedDirectoryPurgeConfiguration dirPurgeConfig )
+        throws ContinuumPurgeManagerException;
 }
Index: continuum-api/src/main/java/org/apache/continuum/purge/controller/PurgeController.java
===================================================================
--- continuum-api/src/main/java/org/apache/continuum/purge/controller/PurgeController.java	(revision 1161553)
+++ continuum-api/src/main/java/org/apache/continuum/purge/controller/PurgeController.java	(working copy)
@@ -34,5 +34,7 @@
     void initializeExecutors( AbstractPurgeConfiguration purgeConfig )
         throws ContinuumPurgeExecutorException;
     
+    void doPurge( AbstractPurgeConfiguration purgeConfig );
+    
     void doPurge( String path );
 }
Index: continuum-api/src/main/java/org/apache/continuum/purge/PurgeConfigurationService.java
===================================================================
--- continuum-api/src/main/java/org/apache/continuum/purge/PurgeConfigurationService.java	(revision 1161553)
+++ continuum-api/src/main/java/org/apache/continuum/purge/PurgeConfigurationService.java	(working copy)
@@ -23,6 +23,7 @@
 
 import org.apache.continuum.model.repository.AbstractPurgeConfiguration;
 import org.apache.continuum.model.repository.DirectoryPurgeConfiguration;
+import org.apache.continuum.model.repository.DistributedDirectoryPurgeConfiguration;
 import org.apache.continuum.model.repository.RepositoryPurgeConfiguration;
 import org.apache.continuum.purge.repository.content.RepositoryManagedContent;
 
@@ -90,8 +91,24 @@
     
     List<AbstractPurgeConfiguration> getAllPurgeConfigurations();
     
+    List<DistributedDirectoryPurgeConfiguration> getAllDistributedDirectoryPurgeConfigurations();
+    
+    DistributedDirectoryPurgeConfiguration getDistributedDirectoryPurgeConfiguration( int dirPurgeId )
+        throws PurgeConfigurationServiceException;
+    
+    DistributedDirectoryPurgeConfiguration addDistributedDirectoryPurgeConfiguration( DistributedDirectoryPurgeConfiguration dirPurge )
+        throws PurgeConfigurationServiceException;
+    
+    void updateDistributedDirectoryPurgeConfiguration( DistributedDirectoryPurgeConfiguration dirPurge )
+        throws PurgeConfigurationServiceException;
+    
+    void removeDistributedDirectoryPurgeConfiguration( DistributedDirectoryPurgeConfiguration dirPurge )
+        throws PurgeConfigurationServiceException;
+    
     AbstractPurgeConfiguration getPurgeConfiguration( int purgeConfigId );
     
+    List<DistributedDirectoryPurgeConfiguration> getEnableDistributedDirectoryPurgeConfigurationsBySchedule( int scheduleId );
+    
     /**
      * @param repositoryId
      * @return
Index: continuum-api/src/main/java/org/apache/continuum/dao/DistributedDirectoryPurgeConfigurationDao.java
===================================================================
--- continuum-api/src/main/java/org/apache/continuum/dao/DistributedDirectoryPurgeConfigurationDao.java	(revision 0)
+++ continuum-api/src/main/java/org/apache/continuum/dao/DistributedDirectoryPurgeConfigurationDao.java	(revision 0)
@@ -0,0 +1,110 @@
+package org.apache.continuum.dao;
+
+/*
+ * 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.List;
+
+import org.apache.continuum.model.repository.DistributedDirectoryPurgeConfiguration;
+import org.apache.maven.continuum.store.ContinuumStoreException;
+
+/**
+ * @author
+ * @version $Id$
+ */
+public interface DistributedDirectoryPurgeConfigurationDao
+{
+    /**
+     * Retrieve all DistributedDirectoryPurgeConfiguration instances.
+     * 
+     * @return list of all DistributedDirectoryPurgeConfiguration instances
+     */
+    List<DistributedDirectoryPurgeConfiguration> getAllDistributedDirectoryPurgeConfigurations();
+
+    /**
+     * Retrieve all DistributedDirectoryPurgeConfiguration instances associated with the input scheduleId.
+     * 
+     * @param scheduleId schedule id
+     * 
+     * @return list of all DistributedDirectoryPurgeConfiguration instances associated with the input scheduleId
+     */
+    List<DistributedDirectoryPurgeConfiguration> getDistributedDirectoryPurgeConfigurationsBySchedule( int scheduleId );
+
+    /**
+     * Retrieve all enabled DistributedDirectoryPurgeConfiguration instances associated with the input scheduleId.
+     * 
+     * @param scheduleId schedule id
+     * 
+     * @return list of all enabled DistributedDirectoryPurgeConfiguration instances associated with the input scheduleId
+     */
+    List<DistributedDirectoryPurgeConfiguration> getEnableDistributedDirectoryPurgeConfigurationsBySchedule( int scheduleId );
+
+    /**
+     * Retrieve all DistributedDirectoryPurgeConfiguration instances having the specified directory type.
+     * 
+     * @param type directory type
+     * 
+     * @return list of all DistributedDirectoryPurgeConfiguration instances having the specified directory type
+     */
+    List<DistributedDirectoryPurgeConfiguration> getDistributedDirectoryPurgeConfigurationsByType( String type );
+
+    /**
+     * Retrieve the DistributedDirectoryPurgeConfiguration instance associated with the input id.
+     * 
+     * @param configurationId DistributedDirectoryPurgeConfiguration instance id
+     * 
+     * @return DistributedDirectoryPurgeConfiguration instance
+     * 
+     * @throws ContinuumStoreException if unable to retrieve an instance associated with the input id
+     */
+    DistributedDirectoryPurgeConfiguration getDistributedDirectoryPurgeConfiguration( int configurationId )
+        throws ContinuumStoreException;
+
+    /**
+     * Adds a new DistributedDirectoryPurgeConfiguration instance.
+     * 
+     * @param purgeConfiguration DistributedDirectoryPurgeConfiguration instance to be added
+     * 
+     * @return DistributedDirectoryPurgeConfiguration instance that was added
+     * 
+     * @throws ContinuumStoreException if unable to add the new instance
+     */
+    DistributedDirectoryPurgeConfiguration addDistributedDirectoryPurgeConfiguration( DistributedDirectoryPurgeConfiguration purgeConfiguration )
+        throws ContinuumStoreException;
+
+    /**
+     * Updates the DistributedDirectoryPurgeConfiguration instance.
+     * 
+     * @param purgeConfiguration DistributedDirectoryPurgeConfiguration instance to be updated
+     * 
+     * @throws ContinuumStoreException if unable to update the instance
+     */
+    void updateDistributedDirectoryPurgeConfiguration( DistributedDirectoryPurgeConfiguration purgeConfiguration )
+        throws ContinuumStoreException;
+
+    /**
+     * Removes the DistributedDirectoryPurgeConfiguration instance.
+     * 
+     * @param purgeConfiguration DistributedDirectoryPurgeConfiguration instance to be removed
+     * 
+     * @throws ContinuumStoreException if unable to remove the instance
+     */
+    void removeDistributedDirectoryPurgeConfiguration( DistributedDirectoryPurgeConfiguration purgeConfiguration )
+        throws ContinuumStoreException;
+}
Index: continuum-api/src/main/java/org/apache/maven/continuum/release/ContinuumReleaseManager.java
===================================================================
--- continuum-api/src/main/java/org/apache/maven/continuum/release/ContinuumReleaseManager.java	(revision 1161553)
+++ continuum-api/src/main/java/org/apache/maven/continuum/release/ContinuumReleaseManager.java	(working copy)
@@ -21,7 +21,9 @@
 
 import org.apache.continuum.model.release.ReleaseListenerSummary;
 import org.apache.continuum.model.repository.LocalRepository;
+import org.apache.continuum.taskqueue.manager.TaskQueueManagerException;
 import org.apache.maven.continuum.model.project.Project;
+import org.codehaus.plexus.taskqueue.execution.TaskQueueExecutor;
 
 import java.io.File;
 import java.util.Map;
@@ -152,5 +154,41 @@
      * @return
      */
     ReleaseListenerSummary getListener( String releaseId );
+    
+    /**
+     * Determines if there is an ongoing release
+     * 
+     * @return true if there is an ongoing release; false otherwise
+     * 
+     * @throws Exception if unable to determine if release is ongoing
+     */
+    boolean isExecutingRelease() throws Exception;
+    
+    /**
+     * Retrieve the Release TaskQueueExecutor instance
+     * 
+     * @return Release TaskQueueExecutor instance
+     * 
+     * @throws TaskQueueManagerException if unable to retrieve the Release TaskQueueExecutor instance
+     */
+    TaskQueueExecutor getPerformReleaseTaskQueueExecutor() throws TaskQueueManagerException;
+    
+    /**
+     * Retrieve the PrepareRelease TaskQueueExecutor instance
+     * 
+     * @return PrepareRelease TaskQueueExecutor instance
+     * 
+     * @throws TaskQueueManagerException if unable to retrieve the PrepareRelease TaskQueueExecutor instance
+     */
+    TaskQueueExecutor getPrepareReleaseTaskQueueExecutor() throws TaskQueueManagerException;
+    
+    /**
+     * Retrieve the RollbackRelease TaskQueueExecutor instance
+     * 
+     * @return RollbackRelease TaskQueueExecutor instance
+     * 
+     * @throws TaskQueueManagerException if unable to retrieve the RollbackRelease TaskQueueExecutor instance
+     */
+    TaskQueueExecutor getRollbackReleaseTaskQueueExecutor() throws TaskQueueManagerException;
 
 }
Index: continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentServiceImpl.java
===================================================================
--- continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentServiceImpl.java	(revision 1161553)
+++ continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentServiceImpl.java	(working copy)
@@ -21,6 +21,7 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -33,9 +34,9 @@
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.continuum.buildagent.buildcontext.BuildContext;
 import org.apache.continuum.buildagent.buildcontext.manager.BuildContextManager;
-import org.apache.continuum.buildagent.configuration.BuildAgentConfigurationException;
 import org.apache.continuum.buildagent.configuration.BuildAgentConfigurationService;
 import org.apache.continuum.buildagent.manager.BuildAgentManager;
+import org.apache.continuum.buildagent.manager.BuildAgentPurgeManager;
 import org.apache.continuum.buildagent.manager.BuildAgentReleaseManager;
 import org.apache.continuum.buildagent.model.Installation;
 import org.apache.continuum.buildagent.taskqueue.PrepareBuildProjectsTask;
@@ -97,6 +98,11 @@
      * @plexus.requirement
      */
     private BuildAgentManager buildAgentManager;
+    
+    /**
+     * @plexus.requirement
+     */
+    private BuildAgentPurgeManager purgeManager;
 
     public void buildProjects( List<Map<String, Object>> projectsBuildContext )
         throws ContinuumBuildAgentException
@@ -1015,6 +1021,65 @@
             throw new ContinuumBuildAgentException( "Error in when trying to get build agent's platform", e );
         }
     }
+    
+    public boolean isExecutingBuild()
+    {
+        return getBuildSizeOfAgent() > 0;
+    }
+    
+    public boolean isExecutingRelease() throws ContinuumBuildAgentException
+    {
+        try
+        {
+            return buildAgentReleaseManager.getReleaseManager().isExecutingRelease();
+        }
+        catch ( Exception e )
+        {
+            throw new ContinuumBuildAgentException( e.getMessage(), e );
+        }
+    }
+    
+    public void executeDirectoryPurge( String directoryType, int daysOlder, int retentionCount, boolean deleteAll )
+        throws ContinuumBuildAgentException
+    {
+        String logMsgFormat = "Directory purge [directoryType={0}, daysOlder={1}, retentionCount={2}, deleteAll={3}] not possible; {4}";
+        if ( isExecutingBuild() )
+        {
+            log.info( MessageFormat.format( logMsgFormat, directoryType, daysOlder, retentionCount, deleteAll, "Build Agent busy" ) );
+            return;
+        } 
+        if ( "release".equals( directoryType ) )
+        {
+            try
+            {
+                if ( isExecutingRelease() )
+                {
+                    log.info( MessageFormat.format( logMsgFormat, directoryType, daysOlder, retentionCount, deleteAll, 
+                                                    "Build Agent is executing a release." ) );
+                    return;
+                }
+            }
+            catch ( ContinuumBuildAgentException e )
+            {
+                if ( isExecutingRelease() )
+                {
+                    log.info( MessageFormat.format( logMsgFormat, directoryType, daysOlder, retentionCount, deleteAll, 
+                                                    "Unable to determine if Build Agent is executing a release." ) );
+                    return;
+                }
+            }
+        }
+            
+        
+        try
+        {
+            purgeManager.executeDirectoryPurge( directoryType, daysOlder, retentionCount, deleteAll );
+        }
+        catch ( Exception e )
+        {
+            throw new ContinuumBuildAgentException( e.getMessage(), e );
+        }
+    }
 
     private List<BuildContext> initializeBuildContext( List<Map<String, Object>> projectsBuildContext )
     {
Index: continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/DefaultBuildAgentReleaseManager.java
===================================================================
--- continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/DefaultBuildAgentReleaseManager.java	(revision 1161553)
+++ continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/DefaultBuildAgentReleaseManager.java	(working copy)
@@ -324,4 +324,9 @@
     {
         this.buildAgentConfigurationService = buildAgentConfigurationService;
     }    
+    
+    public ContinuumReleaseManager getReleaseManager()
+    {
+        return releaseManager;
+    }
 }
Index: continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/DefaultBuildAgentPurgeManager.java
===================================================================
--- continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/DefaultBuildAgentPurgeManager.java	(revision 0)
+++ continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/DefaultBuildAgentPurgeManager.java	(revision 0)
@@ -0,0 +1,164 @@
+package org.apache.continuum.buildagent.manager;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.comparator.LastModifiedFileComparator;
+import org.apache.commons.io.filefilter.AgeFileFilter;
+import org.apache.commons.io.filefilter.AndFileFilter;
+import org.apache.commons.io.filefilter.DirectoryFileFilter;
+import org.apache.commons.io.filefilter.IOFileFilter;
+import org.apache.commons.io.filefilter.NotFileFilter;
+import org.apache.commons.io.filefilter.WildcardFileFilter;
+import org.apache.continuum.buildagent.configuration.BuildAgentConfigurationService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @plexus.component role="org.apache.continuum.buildagent.manager.BuildAgentPurgeManager" role-hint="default"
+ */
+public class DefaultBuildAgentPurgeManager
+    implements BuildAgentPurgeManager
+{
+    private static final Logger logger = LoggerFactory.getLogger( DefaultBuildAgentPurgeManager.class );
+
+    /**
+     * @plexus.requirement
+     */
+    private BuildAgentConfigurationService buildAgentConfigurationService;
+    
+    @Override
+    public void executeDirectoryPurge( String directoryType, int daysOlder, int retentionCount, boolean deleteAll )
+        throws Exception
+    {
+        StringBuilder log = new StringBuilder().append( "Executing directory purge with the following settings[directoryType=" ).
+                                                append( directoryType ).append( ",daysOlder=" ).
+                                                append( daysOlder ).append( ", retentionCount=" ).
+                                                append( retentionCount ).append( ", deleteAll=" ).
+                                                append( deleteAll ).append( "]" );
+        logger.info( log.toString() );
+        
+        File directory = null;
+        
+        if ( "working".equals( directoryType ) || "releases".equals( directoryType ) )
+        {
+            directory = buildAgentConfigurationService.getWorkingDirectory();
+        }
+        else
+        {
+            logger.warn( "Cannot execute purge: DirectoryType: " + directoryType + " is not valid." );
+            return;
+        }
+        if ( deleteAll )
+        {
+            purgeAll( directory, directoryType );
+        }
+        else
+        {
+            purgeFiles( directory, directoryType, daysOlder, retentionCount );
+        }
+        
+        logger.info( "Directory purge execution done" );
+    }
+    
+    private void purgeAll( File directory, String directoryType ) throws Exception
+    {
+        AndFileFilter filter = new AndFileFilter();
+        filter.addFileFilter( DirectoryFileFilter.DIRECTORY );
+        filter.addFileFilter( createFileFilterForDirectoryType( directoryType ) );
+        
+        File[] files = directory.listFiles( ( FileFilter ) filter );
+        if  ( files == null )
+        {
+            return;
+        }
+        for ( File file : files )
+        {
+            try
+            {
+                FileUtils.deleteDirectory( file );
+            }
+            catch ( IOException e )
+            {
+                logger.warn( "Unable to purge " + directoryType + " directory: " + file.getName() );
+            }
+        }
+    }
+    
+    private void purgeFiles( File directory, String directoryType, int daysOlder, int retentionCount )
+    {
+        AndFileFilter filter = new AndFileFilter();
+        filter.addFileFilter( DirectoryFileFilter.DIRECTORY );
+        filter.addFileFilter( createFileFilterForDirectoryType( directoryType ) );
+        
+        
+        File[] files = directory.listFiles( ( FileFilter ) filter );
+        
+        if ( files == null )
+        {
+            return;
+        }
+        
+        //calculate to include files not in the dayold category
+        int countToPurge = files.length - retentionCount;
+        
+        if ( daysOlder > 0 )
+        {
+            long cutoff = System.currentTimeMillis() - ( 24 * 60 * 26 * 1000 * daysOlder );
+            filter.addFileFilter( new AgeFileFilter( cutoff ) );
+        }
+        
+        files = directory.listFiles( ( FileFilter ) filter );
+        
+        if ( files == null )
+        {
+            return;
+        }
+        
+        Arrays.sort( files, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR );
+        
+        for ( File file : files )
+        {
+            if ( countToPurge - 1 < 0 )
+            {
+                break;
+            }
+            try
+            {
+                FileUtils.deleteDirectory( file );
+                countToPurge--;
+            }
+            catch ( IOException e )
+            {
+                logger.warn( "Unable to purge " + directoryType + " directory: " + file.getName() );
+            }
+        }
+        
+    }
+    
+    private IOFileFilter createFileFilterForDirectoryType( String directoryType )
+    {
+        WildcardFileFilter releasesFilter = new WildcardFileFilter( "releases-*" );
+        
+        if ( "working".equals( directoryType ) )
+        {
+            return new NotFileFilter( releasesFilter );
+        } 
+        else if ( "releases".equals( directoryType ) )
+        {
+            return releasesFilter;
+        }
+        else
+        {
+            return null;
+        }
+    }
+    
+    public void setBuildAgentConfigurationService( BuildAgentConfigurationService buildAgentConfigurationService )
+    {
+        this.buildAgentConfigurationService = buildAgentConfigurationService;
+    }
+}
Index: continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/BuildAgentReleaseManager.java
===================================================================
--- continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/BuildAgentReleaseManager.java	(revision 1161553)
+++ continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/BuildAgentReleaseManager.java	(working copy)
@@ -23,6 +23,7 @@
 import java.util.Properties;
 
 import org.apache.maven.continuum.release.ContinuumReleaseException;
+import org.apache.maven.continuum.release.ContinuumReleaseManager;
 import org.apache.maven.shared.release.ReleaseResult;
 
 public interface BuildAgentReleaseManager
@@ -54,4 +55,6 @@
 
     void releaseRollback( String releaseId, int projectId )
         throws ContinuumReleaseException;
+    
+    ContinuumReleaseManager getReleaseManager();
 }
Index: continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/BuildAgentPurgeManager.java
===================================================================
--- continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/BuildAgentPurgeManager.java	(revision 0)
+++ continuum-buildagent/continuum-buildagent-core/src/main/java/org/apache/continuum/buildagent/manager/BuildAgentPurgeManager.java	(revision 0)
@@ -0,0 +1,10 @@
+package org.apache.continuum.buildagent.manager;
+
+
+public interface BuildAgentPurgeManager
+{
+    String ROLE = BuildAgentPurgeManager.class.getName();
+    
+    void executeDirectoryPurge( String directoryType, int daysOlder, int retentionCount, boolean deleteAll )
+        throws Exception;
+}
Index: continuum-buildagent/continuum-buildagent-api/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentService.java
===================================================================
--- continuum-buildagent/continuum-buildagent-api/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentService.java	(revision 1161553)
+++ continuum-buildagent/continuum-buildagent-api/src/main/java/org/apache/continuum/buildagent/ContinuumBuildAgentService.java	(working copy)
@@ -139,4 +139,36 @@
      */
     String getBuildAgentPlatform()
         throws ContinuumBuildAgentException;
+    
+    /**
+     * Determines if build agent is currently executing a build
+     * 
+     * @return true if executing build; false otherwise
+     */
+    boolean isExecutingBuild();
+    
+    /**
+     * Determines if build agent is currently executing a release
+     * 
+     * @return true if executing release; false otherwise
+     * 
+     * @throws ContinuumBuildAgentException if unable to determine if buildagent is executing a release
+     */
+    boolean isExecutingRelease() throws ContinuumBuildAgentException;
+    
+    /**
+     * Execute a directory purge on the build agent
+     * 
+     * @param directoryType valid types are <i>working</i> and <i>releases</i>
+     * @param daysOlder days older
+     * @param retentionCount retention count
+     * @param deleteAll delete all flag
+     * 
+     * @return true if purge is successful; false otherwise
+     * 
+     * @throws ContinuumBuildAgentException error that will occur during the purge
+     */
+    void executeDirectoryPurge( String directoryType, int daysOlder, int retentionCount, boolean deleteAll )
+        throws ContinuumBuildAgentException;
+    
 }
Index: continuum-webapp/src/main/java/org/apache/continuum/web/action/admin/PurgeAction.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/continuum/web/action/admin/PurgeAction.java	(revision 0)
+++ continuum-webapp/src/main/java/org/apache/continuum/web/action/admin/PurgeAction.java	(revision 0)
@@ -0,0 +1,212 @@
+package org.apache.continuum.web.action.admin;
+
+/*
+ * 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 com.opensymphony.xwork2.Preparable;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.continuum.model.repository.AbstractPurgeConfiguration;
+import org.apache.continuum.model.repository.DirectoryPurgeConfiguration;
+import org.apache.continuum.model.repository.DistributedDirectoryPurgeConfiguration;
+import org.apache.continuum.model.repository.LocalRepository;
+import org.apache.continuum.model.repository.RepositoryPurgeConfiguration;
+import org.apache.continuum.purge.ContinuumPurgeManager;
+import org.apache.continuum.purge.PurgeConfigurationService;
+import org.apache.continuum.repository.RepositoryService;
+import org.apache.continuum.taskqueue.manager.TaskQueueManager;
+import org.apache.maven.continuum.configuration.ConfigurationService;
+import org.apache.maven.continuum.model.project.Schedule;
+import org.apache.maven.continuum.security.ContinuumRoleConstants;
+import org.apache.maven.continuum.web.action.ContinuumConfirmAction;
+import org.apache.struts2.ServletActionContext;
+import org.codehaus.plexus.redback.rbac.Resource;
+import org.codehaus.redback.integration.interceptor.SecureAction;
+import org.codehaus.redback.integration.interceptor.SecureActionBundle;
+import org.codehaus.redback.integration.interceptor.SecureActionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author
+ * @version $Id$
+ * @plexus.component role="com.opensymphony.xwork2.Action" role-hint="purge"
+ * @since
+ */
+public class PurgeAction
+    extends ContinuumConfirmAction
+    implements Preparable, SecureAction
+{
+    private static final Logger logger = LoggerFactory.getLogger( PurgeConfigurationAction.class );
+
+    private static final String DISTRIBUTED_BUILD_SUCCESS = "distributed-build-success";
+
+    private static final String PURGE_TYPE_REPOSITORY = "repository";
+
+    private static final String PURGE_TYPE_DIRECTORY = "directory";
+
+    private static final String PURGE_DIRECTORY_RELEASES = "releases";
+
+    private static final String PURGE_DIRECTORY_BUILDOUTPUT = "buildOutput";
+    
+    private static final String PURGE_DIRECTORY_WORKING = "working";
+
+    private Map<Integer, String> repositories;
+
+    private Map<Integer, String> schedules;
+
+    private List<RepositoryPurgeConfiguration> repoPurgeConfigs;
+
+    private List<DirectoryPurgeConfiguration> dirPurgeConfigs;
+    
+    private List<DistributedDirectoryPurgeConfiguration> distributedDirPurgeConfigs;
+
+    private List<String> directoryTypes;
+
+    /**
+     * @plexus.requirement
+     */
+    private PurgeConfigurationService purgeConfigService;
+
+    /**
+     * @plexus.requirement
+     */
+    private RepositoryService repositoryService;
+    
+    private Schedule sched = null;
+
+    public String display()
+        throws Exception
+    {
+        if ( schedules == null )
+        {
+            schedules = new HashMap<Integer, String>();
+
+            Collection<Schedule> allSchedules = getContinuum().getSchedules();
+
+            for ( Schedule schedule : allSchedules )
+            {
+                schedules.put( schedule.getId(), schedule.getName() );
+            }
+        }
+        if ( getContinuum().getConfiguration().isDistributedBuildEnabled() )
+        {
+            String errorMessage = ServletActionContext.getRequest().getParameter( "errorMessage" );
+
+            if ( errorMessage != null )
+            {
+                addActionError( getText( errorMessage ) );
+            }
+            distributedDirPurgeConfigs = purgeConfigService.getAllDistributedDirectoryPurgeConfigurations();
+            
+            return DISTRIBUTED_BUILD_SUCCESS;
+        }
+        else
+        {
+
+            String errorMessage = ServletActionContext.getRequest().getParameter( "errorMessage" );
+
+            if ( errorMessage != null )
+            {
+                addActionError( getText( errorMessage ) );
+            }
+
+            repoPurgeConfigs = purgeConfigService.getAllRepositoryPurgeConfigurations();
+            dirPurgeConfigs = purgeConfigService.getAllDirectoryPurgeConfigurations();
+
+            return SUCCESS;
+        }
+    }
+
+    public SecureActionBundle getSecureActionBundle()
+        throws SecureActionException
+    {
+        SecureActionBundle bundle = new SecureActionBundle();
+        bundle.setRequiresAuthentication( true );
+        bundle.addRequiredAuthorization( ContinuumRoleConstants.CONTINUUM_MANAGE_PURGING, Resource.GLOBAL );
+
+        return bundle;
+    }
+
+    public Map<Integer, String> getRepositories()
+    {
+        return repositories;
+    }
+
+    public void setRepositories( Map<Integer, String> repositories )
+    {
+        this.repositories = repositories;
+    }
+
+    public List<RepositoryPurgeConfiguration> getRepoPurgeConfigs()
+    {
+        return repoPurgeConfigs;
+    }
+
+    public void setRepoPurgeConfigs( List<RepositoryPurgeConfiguration> repoPurgeConfigs )
+    {
+        this.repoPurgeConfigs = repoPurgeConfigs;
+    }
+
+    public List<DirectoryPurgeConfiguration> getDirPurgeConfigs()
+    {
+        return dirPurgeConfigs;
+    }
+
+    public void setDirPurgeConfigs( List<DirectoryPurgeConfiguration> dirPurgeConfigs )
+    {
+        this.dirPurgeConfigs = dirPurgeConfigs;
+    }
+
+    public List<DistributedDirectoryPurgeConfiguration> getDistributedDirPurgeConfigs()
+    {
+        return distributedDirPurgeConfigs;
+    }
+
+    public void setDistributedDirPurgeConfigs( List<DistributedDirectoryPurgeConfiguration> distributedDirPurgeConfigs )
+    {
+        this.distributedDirPurgeConfigs = distributedDirPurgeConfigs;
+    }
+
+    public List<String> getDirectoryTypes()
+    {
+        return directoryTypes;
+    }
+
+    public void setDirectoryTypes( List<String> directoryTypes )
+    {
+        this.directoryTypes = directoryTypes;
+    }
+
+    public PurgeConfigurationService getPurgeConfigService()
+    {
+        return purgeConfigService;
+    }
+
+    public void setPurgeConfigService( PurgeConfigurationService purgeConfigService )
+    {
+        this.purgeConfigService = purgeConfigService;
+    }
+}
Index: continuum-webapp/src/main/java/org/apache/continuum/web/action/admin/DistributedPurgeConfigurationAction.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/continuum/web/action/admin/DistributedPurgeConfigurationAction.java	(revision 0)
+++ continuum-webapp/src/main/java/org/apache/continuum/web/action/admin/DistributedPurgeConfigurationAction.java	(revision 0)
@@ -0,0 +1,482 @@
+package org.apache.continuum.web.action.admin;
+
+/*
+ * 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.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.continuum.configuration.BuildAgentConfiguration;
+import org.apache.continuum.model.repository.AbstractPurgeConfiguration;
+import org.apache.continuum.model.repository.DirectoryPurgeConfiguration;
+import org.apache.continuum.model.repository.DistributedDirectoryPurgeConfiguration;
+import org.apache.continuum.purge.ContinuumPurgeManager;
+import org.apache.continuum.purge.PurgeConfigurationService;
+import org.apache.maven.continuum.model.project.Schedule;
+import org.apache.maven.continuum.security.ContinuumRoleConstants;
+import org.apache.maven.continuum.web.action.ContinuumConfirmAction;
+import org.codehaus.plexus.redback.rbac.Resource;
+import org.codehaus.redback.integration.interceptor.SecureAction;
+import org.codehaus.redback.integration.interceptor.SecureActionBundle;
+import org.codehaus.redback.integration.interceptor.SecureActionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.opensymphony.xwork2.Preparable;
+
+/**
+ * @author
+ * @version $Id$
+ * @plexus.component role="com.opensymphony.xwork2.Action" role-hint="distributedPurgeConfiguration"
+ * @since
+ */
+public class DistributedPurgeConfigurationAction
+    extends ContinuumConfirmAction
+    implements Preparable, SecureAction
+{
+    private static final Logger logger = LoggerFactory.getLogger( DistributedPurgeConfigurationAction.class );
+
+    private static final String PURGE_TYPE_DIRECTORY = "directory";
+
+    private static final String PURGE_DIRECTORY_RELEASES = "releases";
+    
+    private static final String PURGE_DIRECTORY_WORKING = "working";
+
+    private static final int DEFAULT_RETENTION_COUNT = 2;
+
+    private static final int DEFAULT_DAYS_OLDER = 100;
+
+    private String purgeType;
+
+    private String directoryType;
+
+    private String description;
+
+    private String message;
+
+    private boolean deleteAll;
+
+    private boolean deleteReleasedSnapshots;
+
+    private boolean enabled;
+
+    private boolean confirmed;
+
+    private boolean defaultPurgeConfiguration;
+
+    private int retentionCount;
+
+    private int daysOlder;
+
+    private int scheduleId;
+
+    private int purgeConfigId;
+    
+    private String buildAgentUrl;
+
+    private AbstractPurgeConfiguration purgeConfig;
+
+    private Map<Integer, String> schedules;
+
+    private List<String> directoryTypes;
+    
+    private List<String> buildAgentUrls;
+
+    /**
+     * @plexus.requirement
+     */
+    private PurgeConfigurationService purgeConfigService;
+    
+    @Override
+    public void prepare()
+        throws Exception
+    {
+        super.prepare();
+        
+        // build schedules
+        if ( schedules == null )
+        {
+            schedules = new HashMap<Integer, String>();
+
+            Collection<Schedule> allSchedules = getContinuum().getSchedules();
+
+            for ( Schedule schedule : allSchedules )
+            {
+                schedules.put( schedule.getId(), schedule.getName() );
+            }
+        }
+
+        // build repositories
+        if ( buildAgentUrls == null )
+        {
+            List<BuildAgentConfiguration> buildAgents = getContinuum().getConfiguration().getBuildAgents();
+            buildAgentUrls = new ArrayList<String>( buildAgents.size() );
+            for ( BuildAgentConfiguration buildAgent : buildAgents )
+            {
+                buildAgentUrls.add( buildAgent.getUrl() );
+            }
+            Collections.sort( buildAgentUrls );
+        }
+
+        directoryTypes = new ArrayList<String>();
+        directoryTypes.add( PURGE_DIRECTORY_RELEASES );
+        directoryTypes.add( PURGE_DIRECTORY_WORKING );
+    }
+
+    @Override
+    public String input()
+        throws Exception
+    {
+        if ( purgeConfigId != 0 )
+        {
+            purgeConfig = purgeConfigService.getPurgeConfiguration( purgeConfigId );
+
+            if ( purgeConfig instanceof DistributedDirectoryPurgeConfiguration )
+            {
+                DistributedDirectoryPurgeConfiguration dirPurge = (DistributedDirectoryPurgeConfiguration) purgeConfig;
+
+                this.purgeType = PURGE_TYPE_DIRECTORY;
+                this.daysOlder = dirPurge.getDaysOlder();
+                this.retentionCount = dirPurge.getRetentionCount();
+                this.directoryType = dirPurge.getDirectoryType();
+                this.deleteAll = dirPurge.isDeleteAll();
+                this.enabled = dirPurge.isEnabled();
+                this.defaultPurgeConfiguration = dirPurge.isDefaultPurge();
+                this.description = dirPurge.getDescription();
+                this.buildAgentUrl = dirPurge.getBuildAgentUrl();
+                if ( dirPurge.getSchedule() != null )
+                {
+                    this.scheduleId = dirPurge.getSchedule().getId();
+                }
+            }
+        }
+        else
+        {
+            this.retentionCount = DEFAULT_RETENTION_COUNT;
+            this.daysOlder = DEFAULT_DAYS_OLDER;
+        }
+
+        return INPUT;
+    }
+
+    public String save()
+        throws Exception
+    {
+        if ( purgeConfigId == 0 )
+        {   
+            purgeConfig = new DistributedDirectoryPurgeConfiguration();
+
+            purgeConfig = setupPurgeConfiguration( purgeConfig );
+
+            purgeConfig = purgeConfigService.addPurgeConfiguration( purgeConfig );
+        }
+        else
+        {
+            purgeConfig = purgeConfigService.getPurgeConfiguration( purgeConfigId );
+            purgeConfig = setupPurgeConfiguration( purgeConfig );
+
+            purgeConfigService.updatePurgeConfiguration( purgeConfig );
+        }
+        
+        /*if ( purgeConfig.isDefaultPurge() )
+        {
+            updateDefaultPurgeConfiguration();
+        }*/
+
+        if ( purgeConfig.isEnabled() && purgeConfig.getSchedule() != null )
+        {
+            getContinuum().activePurgeSchedule( purgeConfig.getSchedule() );
+        }
+
+        return SUCCESS;
+    }
+
+    public String remove()
+        throws Exception
+    {
+        
+        if ( confirmed )
+        {
+            purgeConfigService.removePurgeConfiguration( purgeConfigId );
+        }
+        else
+        {
+            return CONFIRM;
+        }
+
+        return SUCCESS;
+    }
+
+    public String purge()
+        throws Exception
+    {
+        
+        ContinuumPurgeManager purgeManager = getContinuum().getPurgeManager();
+
+        if ( purgeConfigId > 0 )
+        {
+            purgeConfig = purgeConfigService.getPurgeConfiguration( purgeConfigId );
+
+            DistributedDirectoryPurgeConfiguration dirPurge = ( DistributedDirectoryPurgeConfiguration ) purgeConfig;
+            purgeManager.purgeDistributedDirectory( dirPurge );
+        }
+
+        return SUCCESS;
+    }
+
+    public String getPurgeType()
+    {
+        return this.purgeType;
+    }
+
+    public void setPurgeType( String purgeType )
+    {
+        this.purgeType = purgeType;
+    }
+
+    public String getDirectoryType()
+    {
+        return this.directoryType;
+    }
+
+    public void setDirectoryType( String directoryType )
+    {
+        this.directoryType = directoryType;
+    }
+
+    public String getDescription()
+    {
+        return this.description;
+    }
+
+    public void setDescription( String description )
+    {
+        this.description = description;
+    }
+
+    public String getMessage()
+    {
+        return this.message;
+    }
+
+    public void setMessage( String message )
+    {
+        this.message = message;
+    }
+
+    public boolean isDeleteAll()
+    {
+        return this.deleteAll;
+    }
+
+    public void setDeleteAll( boolean deleteAll )
+    {
+        this.deleteAll = deleteAll;
+    }
+
+    public boolean isDeleteReleasedSnapshots()
+    {
+        return this.deleteReleasedSnapshots;
+    }
+
+    public void setDeleteReleasedSnapshots( boolean deleteReleasedSnapshots )
+    {
+        this.deleteReleasedSnapshots = deleteReleasedSnapshots;
+    }
+
+    public boolean isEnabled()
+    {
+        return this.enabled;
+    }
+
+    public void setEnabled( boolean enabled )
+    {
+        this.enabled = enabled;
+    }
+
+    @Override
+    public boolean isConfirmed()
+    {
+        return this.confirmed;
+    }
+
+    @Override
+    public void setConfirmed( boolean confirmed )
+    {
+        this.confirmed = confirmed;
+    }
+
+    public boolean isDefaultPurgeConfiguration()
+    {
+        return this.defaultPurgeConfiguration;
+    }
+
+    public void setDefaultPurgeConfiguration( boolean defaultPurgeConfiguration )
+    {
+        this.defaultPurgeConfiguration = defaultPurgeConfiguration;
+    }
+
+    public int getRetentionCount()
+    {
+        return this.retentionCount;
+    }
+
+    public void setRetentionCount( int retentionCount )
+    {
+        this.retentionCount = retentionCount;
+    }
+
+    public int getDaysOlder()
+    {
+        return this.daysOlder;
+    }
+
+    public void setDaysOlder( int daysOlder )
+    {
+        this.daysOlder = daysOlder;
+    }
+
+    public int getScheduleId()
+    {
+        return this.scheduleId;
+    }
+
+    public void setScheduleId( int scheduleId )
+    {
+        this.scheduleId = scheduleId;
+    }
+
+    public int getPurgeConfigId()
+    {
+        return purgeConfigId;
+    }
+
+    public void setPurgeConfigId( int purgeConfigId )
+    {
+        this.purgeConfigId = purgeConfigId;
+    }
+
+    public AbstractPurgeConfiguration getPurgeConfig()
+    {
+        return this.purgeConfig;
+    }
+
+    public void setPurgeConfig( AbstractPurgeConfiguration purgeConfig )
+    {
+        this.purgeConfig = purgeConfig;
+    }
+
+    public Map<Integer, String> getSchedules()
+    {
+        return this.schedules;
+    }
+
+    public void setSchedules( Map<Integer, String> schedules )
+    {
+        this.schedules = schedules;
+    }
+
+    public List<String> getDirectoryTypes()
+    {
+        return this.directoryTypes;
+    }
+
+    public void setDirectoryTypes( List<String> directoryTypes )
+    {
+        this.directoryTypes = directoryTypes;
+    }
+
+    private AbstractPurgeConfiguration setupPurgeConfiguration( AbstractPurgeConfiguration purgeConfiguration )
+        throws Exception
+    {
+        return buildDirPurgeConfiguration();
+    }
+
+    public String getBuildAgentUrl()
+    {
+        return buildAgentUrl;
+    }
+
+    public void setBuildAgentUrl( String buildAgentUrl )
+    {
+        this.buildAgentUrl = buildAgentUrl;
+    }
+
+    public List<String> getBuildAgentUrls()
+    {
+        return buildAgentUrls;
+    }
+
+    public void setBuildAgentUrls( List<String> buildAgentUrls )
+    {
+        this.buildAgentUrls = buildAgentUrls;
+    }
+
+    private DistributedDirectoryPurgeConfiguration buildDirPurgeConfiguration()
+        throws Exception
+    {
+        DistributedDirectoryPurgeConfiguration dirPurge = (DistributedDirectoryPurgeConfiguration) purgeConfig;
+        dirPurge.setDeleteAll( this.deleteAll );
+        dirPurge.setEnabled( this.enabled );
+        dirPurge.setDaysOlder( this.daysOlder );
+        dirPurge.setRetentionCount( this.retentionCount );
+        dirPurge.setDirectoryType( this.directoryType );
+        dirPurge.setDefaultPurge( this.defaultPurgeConfiguration );
+        dirPurge.setBuildAgentUrl( buildAgentUrl );
+        
+        // escape xml to prevent xss attacks
+        dirPurge.setDescription( StringEscapeUtils.escapeXml( StringEscapeUtils.unescapeXml( this.description ) ) );
+
+        if ( scheduleId > 0 )
+        {
+            Schedule schedule = getContinuum().getSchedule( scheduleId );
+            dirPurge.setSchedule( schedule );
+        }
+        
+        return dirPurge;
+    }
+
+    private void updateDefaultPurgeConfiguration()
+        throws Exception
+    {
+        DirectoryPurgeConfiguration dirPurge =
+            purgeConfigService.getDefaultPurgeConfigurationForDirectoryType( directoryType );
+
+        if ( dirPurge != null && dirPurge.getId() != purgeConfig.getId() )
+        {
+            dirPurge.setDefaultPurge( false );
+            purgeConfigService.updateDirectoryPurgeConfiguration( dirPurge );
+        }
+    }
+
+    public SecureActionBundle getSecureActionBundle()
+        throws SecureActionException
+    {
+        SecureActionBundle bundle = new SecureActionBundle();
+        bundle.setRequiresAuthentication( true );
+        bundle.addRequiredAuthorization( ContinuumRoleConstants.CONTINUUM_MANAGE_PURGING, Resource.GLOBAL );
+
+        return bundle;
+    }
+}
Index: continuum-webapp/src/main/resources/struts.xml
===================================================================
--- continuum-webapp/src/main/resources/struts.xml	(revision 1161553)
+++ continuum-webapp/src/main/resources/struts.xml	(working copy)
@@ -912,7 +912,7 @@
     </action>    
 
     <action name="removePrepareBuildEntry" class="queues" method="removePrepareBuildEntry">
-	  <result name="success" type="redirectAction">
+      <result name="success" type="redirectAction">
         <param name="actionName">displayQueues</param>
       </result>
     </action>
@@ -936,9 +936,9 @@
     </action>
 
     <action name="removeDistributedPrepareBuildEntries" class="queues" method="removeDistributedPrepareBuildEntries">
-	  <result name="success" type="redirectAction">
-	    <param name="actionName">displayQueues</param>
-	  </result>
+      <result name="success" type="redirectAction">
+        <param name="actionName">displayQueues</param>
+      </result>
     </action>
 
     <action name="removeDistributedBuildEntries" class="queues" method="removeDistributedBuildEntries">
@@ -1023,7 +1023,14 @@
     <!--
     * Purge actions
     -->
+    <action name="displayPurge" class="purge" method="display">
+        <result name="success">/WEB-INF/jsp/admin/purgeConfigurationsList.jsp</result>
+        <result name="distributed-build-success">/WEB-INF/jsp/admin/distributedPurgeConfigurationsList.jsp</result>
+    </action>
     
+    <!--
+    * Parallel Purge Actions
+    -->
     <action name="purgeConfigList" class="purgeConfiguration" method="list">
       <result name="success">/WEB-INF/jsp/admin/purgeConfigurationsList.jsp</result>
     </action>
@@ -1036,7 +1043,7 @@
     <action name="savePurgeConfig" class="purgeConfiguration" method="save">
       <result name="input">/WEB-INF/jsp/admin/editPurgeConfiguration.jsp</result>
       <result name="success" type="redirectAction">
-        <param name="actionName">purgeConfigList</param>
+        <param name="actionName">displayPurge</param>
       </result>
     </action>
     
@@ -1047,7 +1054,7 @@
       </result>
       <result name="confirm">/WEB-INF/jsp/admin/confirmDeletePurgeConfiguration.jsp</result>
       <result name="success" type="redirectAction">
-        <param name="actionName">purgeConfigList</param>
+        <param name="actionName">displayPurge</param>
       </result>
       <interceptor-ref name="configuredContinuumStack">
         <param name="tokenSession.includeMethods">remove</param>
@@ -1056,14 +1063,57 @@
     
     <action name="doPurge" class="purgeConfiguration" method="purge">
       <result name="success" type="redirectAction">
-        <param name="actionName">purgeConfigList</param>
+        <param name="actionName">displayPurge</param>
       </result>
       <result name="error" type="redirectAction">
+        <param name="actionName">displayPurge</param>
+        <param name="errorMessage">${message}</param>
+      </result>
+    </action>
+
+    <!--
+    * Distributed Purge actions
+    -->
+    <action name="editDistributedPurgeConfig" class="distributedPurgeConfiguration" method="input">
+      <result name="error">/WEB-INF/jsp/admin/editDistributedPurgeConfiguration.jsp</result>
+      <result name="input">/WEB-INF/jsp/admin/editDistributedPurgeConfiguration.jsp</result>
+    </action>
+    
+    <action name="saveDistributedPurgeConfig" class="distributedPurgeConfiguration" method="save">
+      <result name="input">/WEB-INF/jsp/admin/editDistributedPurgeConfiguration.jsp</result>
+      <result name="success" type="redirectAction">
+        <param name="actionName">displayPurge</param>
+      </result>
+    </action>
+    
+    <action name="removeDistributedPurgeConfig" class="distributedPurgeConfiguration" method="remove">
+      <result name="error" type="redirectAction">
         <param name="actionName">purgeConfigList</param>
         <param name="errorMessage">${message}</param>
       </result>
+      <result name="confirm">/WEB-INF/jsp/admin/confirmDeleteDistributedPurgeConfiguration.jsp</result>
+      <result name="success" type="redirectAction">
+        <param name="actionName">displayPurge</param>
+      </result>
+      <interceptor-ref name="configuredContinuumStack">
+        <param name="tokenSession.includeMethods">remove</param>
+      </interceptor-ref>
     </action>
     
+    <action name="doDistributedPurge" class="distributedPurgeConfiguration" method="purge">
+      <result name="success" type="redirectAction">
+        <param name="actionName">displayPurge</param>
+      </result>
+      <result name="error" type="redirectAction">
+        <param name="actionName">displayPurge</param>
+        <param name="errorMessage">${message}</param>
+      </result>
+    </action>
+
+    <!--
+    * Build Agent actions
+    -->
+    
     <action name="buildAgentList" class="buildAgent" method="list">
       <result name="success">/WEB-INF/jsp/admin/buildAgentsList.jsp</result>
     </action>
Index: continuum-webapp/src/main/resources/org/apache/continuum/web/action/admin/DistributedPurgeConfigurationAction_en.properties
===================================================================
--- continuum-webapp/src/main/resources/org/apache/continuum/web/action/admin/DistributedPurgeConfigurationAction_en.properties	(revision 0)
+++ continuum-webapp/src/main/resources/org/apache/continuum/web/action/admin/DistributedPurgeConfigurationAction_en.properties	(revision 0)
@@ -0,0 +1,20 @@
+#
+# 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.
+#
+
+
Index: continuum-webapp/src/main/resources/org/apache/continuum/web/action/admin/DistributedPurgeConfigurationAction-saveDistributedPurgeConfig-validation.xml
===================================================================
--- continuum-webapp/src/main/resources/org/apache/continuum/web/action/admin/DistributedPurgeConfigurationAction-saveDistributedPurgeConfig-validation.xml	(revision 0)
+++ continuum-webapp/src/main/resources/org/apache/continuum/web/action/admin/DistributedPurgeConfigurationAction-saveDistributedPurgeConfig-validation.xml	(revision 0)
@@ -0,0 +1,42 @@
+<!--
+  ~ 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.
+  -->
+  
+<!DOCTYPE validators PUBLIC
+    "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
+    "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
+
+<validators>
+  <field name="daysOlder">
+    <field-validator type="int">
+      <param name="min">0</param>
+      <message key="purgeConfig.daysOlder.min"/>
+    </field-validator>
+  </field>
+  <field name="retentionCount">
+    <field-validator type="int">
+      <param name="min">0</param>
+      <message key="purgeConfig.retentionCount.min"/>
+    </field-validator>
+  </field>
+  <field name="buildAgentUrl">
+    <field-validator type="requiredstring">
+      <message key="purgeConfig.buildagent.required"/>
+    </field-validator>
+  </field>
+</validators>
Index: continuum-webapp/src/main/resources/org/apache/continuum/web/action/admin/DistributedPurgeConfigurationAction.properties
===================================================================
--- continuum-webapp/src/main/resources/org/apache/continuum/web/action/admin/DistributedPurgeConfigurationAction.properties	(revision 0)
+++ continuum-webapp/src/main/resources/org/apache/continuum/web/action/admin/DistributedPurgeConfigurationAction.properties	(revision 0)
@@ -0,0 +1,23 @@
+#
+# 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.
+#
+
+purgeConfig.daysOlder.min = Days Older must be a positive number.
+purgeConfig.retentionCount.min = Retention Count must be a positive number.
+purgeConfig.description.invalid = Description contains invalid characters.
+purgeConfig.buildagent.required = Build Agent is required.
\ No newline at end of file
Index: continuum-webapp/src/main/resources/localization/Continuum_fr.properties
===================================================================
--- continuum-webapp/src/main/resources/localization/Continuum_fr.properties	(revision 1161553)
+++ continuum-webapp/src/main/resources/localization/Continuum_fr.properties	(working copy)
@@ -982,6 +982,7 @@
 purgeConfigs.table.directoryType = Type de r\u00e9pertoire
 purgeConfigs.table.default = Defaut
 purgeConfigs.table.enabled = Activ\u00e9
+purgeConfigs.table.buildAgent = Agent de construction
 purgeConfigs.table.deleteReleasedSnapshots = Suppression des snapshots "releas\u00e9"
 
 #-----------------------------------------------------------------------
@@ -1000,7 +1001,9 @@
 purgeConfig.description.label = Description
 purgeConfig.enabled.label = Activ\u00e9
 purgeConfig.no.repositories = Pas de repositories \u00e0 purger
+purgeConfig.buildAgent.label = Agent de construction
 
+
 #-----------------------------------------------------------------------
 # Page: Delete Purge Configuration
 #-----------------------------------------------------------------------
Index: continuum-webapp/src/main/resources/localization/Continuum_de.properties
===================================================================
--- continuum-webapp/src/main/resources/localization/Continuum_de.properties	(revision 1161553)
+++ continuum-webapp/src/main/resources/localization/Continuum_de.properties	(working copy)
@@ -898,6 +898,7 @@
 purgeConfigs.table.directoryType = Verzeichnistyp
 purgeConfigs.table.default = Standard
 purgeConfigs.table.enabled = Aktiviert
+purgeConfigs.table.buildAgent = Vorgangsagent
 purgeConfigs.table.deleteReleasedSnapshots = Ver\u00F6ffentlichte Snapshots l\u00F6schen
 
 #-----------------------------------------------------------------------
@@ -916,6 +917,7 @@
 purgeConfig.description.label = Beschreibung
 purgeConfig.enabled.label = Aktiviert
 purgeConfig.no.repositories = Keine zu bereinigende Repositories.
+purgeConfig.buildAgent.label = Vorgangsagent
 
 # ----------------------------------------------------------------------
 # Page: Release Results
Index: continuum-webapp/src/main/resources/localization/Continuum.properties
===================================================================
--- continuum-webapp/src/main/resources/localization/Continuum.properties	(revision 1161553)
+++ continuum-webapp/src/main/resources/localization/Continuum.properties	(working copy)
@@ -1017,6 +1017,7 @@
 purgeConfigs.table.directoryType = Directory Type
 purgeConfigs.table.default = Default
 purgeConfigs.table.enabled = Enabled
+purgeConfigs.table.buildAgent = Build Agent
 purgeConfigs.table.deleteReleasedSnapshots = Delete Released Snapshots
 
 #-----------------------------------------------------------------------
@@ -1035,6 +1036,7 @@
 purgeConfig.description.label = Description
 purgeConfig.enabled.label = Enabled Purge Configuration
 purgeConfig.no.repositories = No repositories to purge
+purgeConfig.buildAgent.label = Build Agent
 
 #-----------------------------------------------------------------------
 # Page: Delete Purge Configuration
Index: continuum-webapp/src/main/webapp/WEB-INF/jsp/navigations/Menu.jsp
===================================================================
--- continuum-webapp/src/main/webapp/WEB-INF/jsp/navigations/Menu.jsp	(revision 1161553)
+++ continuum-webapp/src/main/webapp/WEB-INF/jsp/navigations/Menu.jsp	(working copy)
@@ -98,7 +98,7 @@
           </div>
         </redback:ifAuthorized>
         <redback:ifAuthorized permission="continuum-manage-purging">
-          <s:url id="purgeConfigListUrl" action="purgeConfigList" namespace="/admin" includeParams="none"/>
+          <s:url id="purgeConfigListUrl" action="displayPurge" namespace="/admin" includeParams="none"/>
           <div class="body">
             <s:a href="%{purgeConfigListUrl}">
               <s:text name="menu.administration.purge"/>
@@ -258,4 +258,4 @@
     </div>
   </div>
 </div>
-</s:i18n>
+</s:i18n>
\ No newline at end of file
Index: continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/distributedPurgeConfigurationsList.jsp
===================================================================
--- continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/distributedPurgeConfigurationsList.jsp	(revision 0)
+++ continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/distributedPurgeConfigurationsList.jsp	(revision 0)
@@ -0,0 +1,85 @@
+<%--
+  ~ 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.
+  --%>
+
+<%@ taglib uri="/struts-tags" prefix="s" %>
+<%@ taglib uri="http://www.extremecomponents.org" prefix="ec" %>
+<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c'%>
+<%@ taglib uri="continuum" prefix="c1" %>
+<%@ taglib uri="http://plexus.codehaus.org/redback/taglib-1.0" prefix="redback" %>
+
+<html>
+  <s:i18n name="localization.Continuum">
+    <head>
+      <title><s:text name="purgeConfigs.page.title"/></title>
+    </head>
+    <body>
+      <div id="h3">
+        <h3><s:text name="purgeConfigs.dir.section.title"/></h3>
+        <s:set name="distributedDirPurgeConfigs" value="distributedDirPurgeConfigs" scope="request"/>
+        <ec:table items="distributedDirPurgeConfigs"
+                  var="dirPurge"
+                  autoIncludeParameters="false"
+                  showExports="false"
+                  showPagination="false"
+                  showStatusBar="false"
+                  sortable="false"
+                  filterable="false">
+         <ec:row>
+            <ec:column property="directoryType" title="purgeConfigs.table.directoryType"/>
+            <ec:column property="daysOlder" title="purgeConfigs.table.daysOlder"/>
+            <ec:column property="retentionCount" title="purgeConfigs.table.retentionCount"/>
+            <ec:column property="deleteAll" title="purgeConfigs.table.deleteAll"/>
+            <ec:column property="schedule.name" title="purgeConfigs.table.schedule"/>
+            <ec:column property="enabled" title="purgeConfigs.table.enabled"/>
+            <ec:column property="description" title="purgeConfigs.table.description"/>
+            <ec:column property="buildAgentUrl" title="purgeConfigs.table.buildAgent"/>
+            <ec:column property="editActions" title="&nbsp;" width="1%">
+                <s:url id="editPurgeConfigUrl" action="editDistributedPurgeConfig">
+                  <s:param name="purgeConfigId"><c:out value="${pageScope.dirPurge.id}"/></s:param>
+                </s:url>
+                <s:a href="%{editPurgeConfigUrl}"><img src="<s:url value='/images/edit.gif' includeParams="none"/>" alt="<s:text name='edit'/>" title="<s:text name='edit'/>" border="0" /></s:a>
+            </ec:column>
+            <ec:column property="purgeActions" title="&nbsp;" width="1%">
+                <s:url id="purgeUrl" action="doDistributedPurge">
+                  <s:param name="purgeConfigId"><c:out value="${pageScope.dirPurge.id}"/></s:param>
+                </s:url>
+                <s:a href="%{purgeUrl}"><img src="<s:url value='/images/purgenow.gif' includeParams="none"/>" alt="<s:text name='purge'/>" title="<s:text name='purge'/>" border="0" /></s:a>
+            </ec:column>
+            <ec:column property="deleteActions" title="&nbsp;" width="1%">
+                <s:token/>
+                <s:url id="removePurgeConfigUrl" action="removeDistributedPurgeConfig">
+                  <s:param name="purgeConfigId"><c:out value="${pageScope.dirPurge.id}"/></s:param>
+                  <s:param name="description"><c:out value="${pageScope.dirPurge.description}"/></s:param>
+                  <s:param name="struts.token.name">struts.token</s:param>
+                  <s:param name="struts.token"><s:property value="struts.token"/></s:param>
+                </s:url>
+                <s:a href="%{removePurgeConfigUrl}"><img src="<s:url value='/images/delete.gif' includeParams="none"/>" alt="<s:text name='delete'/>" title="<s:text name='delete'/>" border="0"></s:a>
+            </ec:column>
+          </ec:row>
+        </ec:table>
+      </div>
+      <div class="functnbar3">
+        <s:form name="addDirPurgeConfig" action="editDistributedPurgeConfig" method="post">
+          <s:hidden name="purgeType" value="directory"/>
+          <s:submit value="%{getText('add')}" theme="simple"/>
+        </s:form>
+      </div>
+    </body>
+  </s:i18n>
+</html>
\ No newline at end of file
Index: continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/editDistributedPurgeConfiguration.jsp
===================================================================
--- continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/editDistributedPurgeConfiguration.jsp	(revision 0)
+++ continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/editDistributedPurgeConfiguration.jsp	(revision 0)
@@ -0,0 +1,68 @@
+<%--
+  ~ 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.
+  --%>
+
+<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c'%>
+<%@ taglib uri="/struts-tags" prefix="s" %>
+<%@ taglib uri="continuum" prefix="c1" %>
+<html>
+  <s:i18n name="localization.Continuum">
+  <head>
+    <title><s:text name="purgeConfig.page.title"/></title>
+  </head>
+  <body>
+  <div class="app">
+    <div id="axial" class="h3">
+      <h3><s:text name="purgeConfig.section.title"/></h3>
+
+    <div class="axial">
+      <s:form action="saveDistributedPurgeConfig" method="post" validate="true">
+        <c:if test="${!empty actionErrors}">
+          <div class="errormessage">
+            <s:iterator value="actionErrors">
+              <p><s:property/></p>
+            </s:iterator>
+          </div>
+        </c:if>
+          <table>
+            <s:select label="%{getText('purgeConfig.directoryType.label')}" name="directoryType" list="directoryTypes"/>
+            <s:textfield label="%{getText('purgeConfig.daysOlder.label')}" name="daysOlder"/>
+            <s:textfield label="%{getText('purgeConfig.retentionCount.label')}" name="retentionCount"/>
+            <s:checkbox label="%{getText('purgeConfig.deleteAll.label')}" name="deleteAll"/>
+            <s:if test="purgeType == 'repository'">
+              <s:checkbox label="%{getText('purgeConfig.deleteReleasedSnapshots.label')}" name="deleteReleasedSnapshots"/>
+            </s:if>
+            <s:select label="%{getText('purgeConfig.buildAgent.label')}" name="buildAgentUrl" list="buildAgentUrls"/>
+            <s:select label="%{getText('purgeConfig.schedule.label')}" name="scheduleId" list="schedules"
+                       headerKey="-1" headerValue=""/>
+            <s:textfield label="%{getText('purgeConfig.description.label')}" name="description"/>
+            <s:checkbox label="%{getText('purgeConfig.enabled.label')}" name="enabled"/>
+          </table>
+          <s:hidden name="purgeConfigId"/>
+          <s:hidden name="purgeType"/>
+          <div class="functnbar3">
+            <c1:submitcancel value="%{getText('save')}" cancel="%{getText('cancel')}"/>
+          </div>
+      </s:form>
+    </div>
+  </div>
+</div>
+
+</body>
+</s:i18n>
+</html>
\ No newline at end of file
Index: continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/confirmDeleteDistributedPurgeConfiguration.jsp
===================================================================
--- continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/confirmDeleteDistributedPurgeConfiguration.jsp	(revision 0)
+++ continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/confirmDeleteDistributedPurgeConfiguration.jsp	(revision 0)
@@ -0,0 +1,56 @@
+<%--
+  ~ 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.
+  --%>
+
+<%@ taglib uri="/struts-tags" prefix="s" %>
+<%@ taglib uri="continuum" prefix="c1" %>
+<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c'%>
+<html>
+  <s:i18n name="localization.Continuum">
+    <head>
+        <title><s:text name="deletePurgeConfiguration.page.title"/></title>
+    </head>
+    <body>
+      <div id="axial" class="h3">
+        <h3><s:text name="deletePurgeConfiguration.section.title"/></h3>
+        <div class="axial">
+        <s:form action="removeDistributedPurgeConfig" method="post">
+          <s:token/>
+          <s:hidden name="purgeConfigId"/>
+          <s:hidden name="confirmed" value="true"/>
+          <s:actionerror/>
+
+          <div class="warningmessage">
+            <p>
+              <strong>
+                <s:text name="deletePurgeConfiguration.confirmation.message">
+                  <s:param><s:property value="%{description}"/></s:param>
+                </s:text>
+              </strong>
+            </p>
+          </div>
+
+          <div class="functnbar3">
+            <c1:submitcancel value="%{getText('delete')}" cancel="%{getText('cancel')}"/>
+          </div>
+        </s:form>
+        </div>
+      </div>
+    </body>
+  </s:i18n>
+</html>
\ No newline at end of file
Index: continuum-release/src/main/java/org/apache/maven/continuum/release/DefaultContinuumReleaseManager.java
===================================================================
--- continuum-release/src/main/java/org/apache/maven/continuum/release/DefaultContinuumReleaseManager.java	(revision 1161553)
+++ continuum-release/src/main/java/org/apache/maven/continuum/release/DefaultContinuumReleaseManager.java	(working copy)
@@ -32,6 +32,7 @@
 import org.apache.continuum.model.release.ReleaseListenerSummary;
 import org.apache.continuum.model.repository.LocalRepository;
 import org.apache.continuum.release.config.ContinuumReleaseDescriptor;
+import org.apache.continuum.taskqueue.manager.TaskQueueManagerException;
 import org.apache.maven.continuum.model.project.Project;
 import org.apache.maven.continuum.release.tasks.PerformReleaseProjectTask;
 import org.apache.maven.continuum.release.tasks.PrepareReleaseProjectTask;
@@ -48,9 +49,16 @@
 import org.apache.maven.shared.release.config.ReleaseDescriptorStoreException;
 import org.apache.maven.shared.release.versions.DefaultVersionInfo;
 import org.apache.maven.shared.release.versions.VersionInfo;
+import org.codehaus.plexus.PlexusConstants;
+import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.codehaus.plexus.context.Context;
+import org.codehaus.plexus.context.ContextException;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
 import org.codehaus.plexus.taskqueue.Task;
 import org.codehaus.plexus.taskqueue.TaskQueue;
 import org.codehaus.plexus.taskqueue.TaskQueueException;
+import org.codehaus.plexus.taskqueue.execution.TaskQueueExecutor;
 import org.codehaus.plexus.util.ReaderFactory;
 import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.xml.Xpp3Dom;
@@ -62,8 +70,13 @@
  * @version $Id$
  */
 public class DefaultContinuumReleaseManager
-    implements ContinuumReleaseManager
+    implements ContinuumReleaseManager, Contextualizable
 {
+    
+    private static final String PLEXUS_KEY_PERFORM_RELEASE_TASKQUEUE_EXECUTOR = "perform-release";
+    private static final String PLEXUS_KEY_PREPARE_RELEASE_TASKQUEUE_EXECUTOR = "prepare-release";
+    private static final String PLEXUS_KEY_ROLLBACK_RELEASE_TASKQUEUE_EXECUTOR = "rollback-release";
+    
     /**
      * @plexus.requirement
      */
@@ -89,6 +102,8 @@
      */
     private ScmManager scmManager;
 
+    private PlexusContainer container;
+
     private Map<String, ContinuumReleaseManagerListener> listeners;
 
     /**
@@ -389,4 +404,57 @@
 
         return null;
     }
+    
+    public boolean isExecutingRelease() throws Exception
+    {
+        return prepareReleaseQueue.getQueueSnapshot().size() > 0 || 
+            performReleaseQueue.getQueueSnapshot().size() > 0 || 
+            rollbackReleaseQueue.getQueueSnapshot().size() > 0 ||
+            getPerformReleaseTaskQueueExecutor().getCurrentTask() != null || 
+            getPrepareReleaseTaskQueueExecutor().getCurrentTask() != null ||
+            getRollbackReleaseTaskQueueExecutor().getCurrentTask() != null;
+    }
+    
+
+    public TaskQueueExecutor getPerformReleaseTaskQueueExecutor() throws TaskQueueManagerException
+    {
+        try
+        {
+            return (TaskQueueExecutor) container.lookup( TaskQueueExecutor.class, PLEXUS_KEY_PERFORM_RELEASE_TASKQUEUE_EXECUTOR );
+        }
+        catch ( ComponentLookupException e )
+        {
+            throw new TaskQueueManagerException( e.getMessage(), e );
+        }
+    }
+    
+    public TaskQueueExecutor getPrepareReleaseTaskQueueExecutor() throws TaskQueueManagerException
+    {
+        try
+        {
+            return (TaskQueueExecutor) container.lookup( TaskQueueExecutor.class, PLEXUS_KEY_PREPARE_RELEASE_TASKQUEUE_EXECUTOR );
+        }
+        catch ( ComponentLookupException e )
+        {
+            throw new TaskQueueManagerException( e.getMessage(), e );
+        }
+    }
+    
+    public TaskQueueExecutor getRollbackReleaseTaskQueueExecutor() throws TaskQueueManagerException
+    {
+        try
+        {
+            return (TaskQueueExecutor) container.lookup( TaskQueueExecutor.class, PLEXUS_KEY_ROLLBACK_RELEASE_TASKQUEUE_EXECUTOR );
+        }
+        catch ( ComponentLookupException e )
+        {
+            throw new TaskQueueManagerException( e.getMessage(), e );
+        }
+    }
+
+    public void contextualize( Context context )
+        throws ContextException
+    {
+        container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
+    }
 }
Index: continuum-data-management/data-management-jdo/src/main/java/org/apache/maven/continuum/management/JdoDataManagementTool.java
===================================================================
--- continuum-data-management/data-management-jdo/src/main/java/org/apache/maven/continuum/management/JdoDataManagementTool.java	(revision 1161553)
+++ continuum-data-management/data-management-jdo/src/main/java/org/apache/maven/continuum/management/JdoDataManagementTool.java	(working copy)
@@ -46,6 +46,7 @@
 import org.apache.continuum.dao.ContinuumReleaseResultDao;
 import org.apache.continuum.dao.DaoUtils;
 import org.apache.continuum.dao.DirectoryPurgeConfigurationDao;
+import org.apache.continuum.dao.DistributedDirectoryPurgeConfigurationDao;
 import org.apache.continuum.dao.InstallationDao;
 import org.apache.continuum.dao.LocalRepositoryDao;
 import org.apache.continuum.dao.ProfileDao;
@@ -107,6 +108,11 @@
      * @plexus.requirement
      */
     private RepositoryPurgeConfigurationDao repositoryPurgeConfigurationDao;
+    
+    /**
+     * @plexus.requirement
+     */
+    private DistributedDirectoryPurgeConfigurationDao distributedDirectoryPurgeConfigurationDao;
 
     /**
      * @plexus.requirement
@@ -201,6 +207,7 @@
         database.setRepositoryPurgeConfigurations(
             repositoryPurgeConfigurationDao.getAllRepositoryPurgeConfigurations() );
         database.setDirectoryPurgeConfigurations( directoryPurgeConfigurationDao.getAllDirectoryPurgeConfigurations() );
+        database.setDistributedDirectoryPurgeConfigurations( distributedDirectoryPurgeConfigurationDao.getAllDistributedDirectoryPurgeConfigurations() );
         database.setProjectScmRoots( projectScmRootDao.getAllProjectScmRoots() );
         database.setContinuumReleaseResults( releaseResultDao.getAllContinuumReleaseResults() );
 
