Index: continuum-purge/src/main/java/org/apache/continuum/purge/ContinuumPurgeConstants.java
===================================================================
--- continuum-purge/src/main/java/org/apache/continuum/purge/ContinuumPurgeConstants.java	(revision 10307)
+++ continuum-purge/src/main/java/org/apache/continuum/purge/ContinuumPurgeConstants.java	(working copy)
@@ -31,4 +31,14 @@
     public static final String PURGE_DIRECTORY_RELEASES = "releases";
 
     public static final String PURGE_DIRECTORY_BUILDOUTPUT = "buildOutput";
+    
+    public static final String PURGE = "PURGE";
+    
+    public static final String PURGE_REPO_CONTENTS = "Deleted All Repository Contents";
+    
+    public static final String PURGE_DIR_CONTENTS = "Deleted All Directory Contents";
+    
+    public static final String PURGE_FILE = "Deleted File";
+    
+    public static final String PURGE_PROJECT = "Deleted Project";
 }
Index: continuum-purge/src/main/java/org/apache/continuum/purge/executor/DaysOldDirectoryPurgeExecutor.java
===================================================================
--- continuum-purge/src/main/java/org/apache/continuum/purge/executor/DaysOldDirectoryPurgeExecutor.java	(revision 10307)
+++ continuum-purge/src/main/java/org/apache/continuum/purge/executor/DaysOldDirectoryPurgeExecutor.java	(working copy)
@@ -100,6 +100,7 @@
                 try
                 {
                     FileUtils.deleteDirectory( dir );
+                    triggerAuditEvent( dir.getName(), ContinuumPurgeConstants.PURGE_DIR_CONTENTS );
                     countToPurge--;
                 }
                 catch ( IOException e )
@@ -146,10 +147,12 @@
                     try
                     {
                         FileUtils.deleteDirectory( buildDir );
+                        triggerAuditEvent( buildDir.getName(), ContinuumPurgeConstants.PURGE_DIR_CONTENTS );
                         File logFile = new File( buildDir.getAbsoluteFile() + ".log.txt" );
 
                         if ( logFile.exists() )
                         {
+                            triggerAuditEvent( logFile.getName(), ContinuumPurgeConstants.PURGE_FILE );
                             logFile.delete();
                         }
 
Index: continuum-purge/src/main/java/org/apache/continuum/purge/executor/AbstractContinuumPurgeExecutor.java
===================================================================
--- continuum-purge/src/main/java/org/apache/continuum/purge/executor/AbstractContinuumPurgeExecutor.java	(revision 10307)
+++ continuum-purge/src/main/java/org/apache/continuum/purge/executor/AbstractContinuumPurgeExecutor.java	(working copy)
@@ -19,6 +19,7 @@
  * under the License.
  */
 
+import org.apache.continuum.purge.ContinuumPurgeConstants;
 import org.apache.continuum.purge.repository.content.RepositoryManagedContent;
 import org.apache.maven.archiva.consumers.core.repository.ArtifactFilenameFilter;
 import org.apache.maven.archiva.model.ArtifactReference;
@@ -37,6 +38,10 @@
 public abstract class AbstractContinuumPurgeExecutor
     implements ContinuumPurgeExecutor
 {
+    private static final char DELIM = ' ';
+    
+    private Logger logger = LoggerFactory.getLogger( "AuditLog" );
+    
     private Logger log = LoggerFactory.getLogger( AbstractContinuumPurgeExecutor.class );
     
     public void purge( Set<ArtifactReference> references, RepositoryManagedContent repository )
@@ -87,4 +92,11 @@
             }
         }
     }
+    
+    protected void triggerAuditEvent( String resource, String action )
+    {
+        String msg = ContinuumPurgeConstants.PURGE + DELIM + "<continuum>" + DELIM + '\"' + resource + '\"' + DELIM + '\"' + action + '\"';
+        
+        logger.info( msg );
+    }
 }
\ No newline at end of file
Index: continuum-purge/src/main/java/org/apache/continuum/purge/executor/ReleasedSnapshotsRepositoryPurgeExecutor.java
===================================================================
--- continuum-purge/src/main/java/org/apache/continuum/purge/executor/ReleasedSnapshotsRepositoryPurgeExecutor.java	(revision 10307)
+++ continuum-purge/src/main/java/org/apache/continuum/purge/executor/ReleasedSnapshotsRepositoryPurgeExecutor.java	(working copy)
@@ -19,6 +19,7 @@
  * under the License.
  */
 
+import org.apache.continuum.purge.ContinuumPurgeConstants;
 import org.apache.continuum.purge.repository.content.RepositoryManagedContent;
 import org.apache.maven.archiva.common.utils.VersionComparator;
 import org.apache.maven.archiva.common.utils.VersionUtil;
@@ -106,6 +107,8 @@
                 {
                     versionRef.setVersion( version );
                     repository.deleteVersion( versionRef );
+                    
+                    triggerAuditEvent( VersionedReference.toKey( versionRef ), ContinuumPurgeConstants.PURGE_PROJECT );
 
                     removeMetadata( versionRef );
                 }
Index: continuum-purge/src/main/java/org/apache/continuum/purge/executor/CleanAllPurgeExecutor.java
===================================================================
--- continuum-purge/src/main/java/org/apache/continuum/purge/executor/CleanAllPurgeExecutor.java	(revision 10307)
+++ continuum-purge/src/main/java/org/apache/continuum/purge/executor/CleanAllPurgeExecutor.java	(working copy)
@@ -71,6 +71,7 @@
             throw new ContinuumPurgeExecutorException( "Error while purging all artifacts or directories in " + path,
                                                        e );
         }
+        triggerAuditEvent( path, ContinuumPurgeConstants.PURGE_REPO_CONTENTS );
     }
 
     private void purgeReleases( String path )
@@ -87,6 +88,7 @@
             for ( File releaseDir : releasesDir )
             {
                 FileUtils.deleteDirectory( releaseDir );
+                triggerAuditEvent( releaseDir.getName(), ContinuumPurgeConstants.PURGE_DIR_CONTENTS );
             }
         }
         catch ( IOException e )
@@ -109,6 +111,7 @@
             for ( File projectDir : projectsDir )
             {
                 FileUtils.cleanDirectory( projectDir );
+                triggerAuditEvent( projectDir.getName(), ContinuumPurgeConstants.PURGE_DIR_CONTENTS );
             }
         }
         catch ( IOException e )
Index: continuum-purge/pom.xml
===================================================================
--- continuum-purge/pom.xml	(revision 10307)
+++ continuum-purge/pom.xml	(working copy)
@@ -86,6 +86,16 @@
         </exclusion>
       </exclusions>
     </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-slf4j-logging</artifactId>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+      <scope>runtime</scope>
+    </dependency>
     
     <!-- === Testing Dependencies === -->
     <dependency>
Index: continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/CancelBuildAction.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/CancelBuildAction.java	(revision 10307)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/CancelBuildAction.java	(working copy)
@@ -33,6 +33,7 @@
 import org.apache.maven.continuum.ContinuumException;
 import org.apache.maven.continuum.model.project.Project;
 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
+import org.apache.maven.continuum.web.util.AuditLogConstants;
 import org.codehaus.plexus.taskqueue.Task;
 import org.codehaus.plexus.util.StringUtils;
 
@@ -62,6 +63,9 @@
 	        BuildsManager buildsManager = getContinuum().getBuildsManager();
 	        
 	        buildsManager.cancelBuild( projectId );
+	        
+	        Project proj = getContinuum().getProject( projectId );
+            triggerAuditEvent( getPrincipal(), AuditLogConstants.PROJECT, proj.getGroupId() + ":" + proj.getArtifactId(), AuditLogConstants.CANCEL_BUILD );
 	    }
 	    catch ( AuthorizationRequiredException e )
 	    {
@@ -98,7 +102,10 @@
 	        int index = ArrayUtils.indexOf( projectsId, getCurrentProjectIdBuilding() );
 	        if ( index > 0 )
 	        {
-	            getContinuum().getBuildsManager().cancelBuild( projectsId[index] );
+	            int projId = projectsId[index];
+                getContinuum().getBuildsManager().cancelBuild( projectsId[index] );
+                Project proj = getContinuum().getProject( projId );
+                triggerAuditEvent( getPrincipal(), AuditLogConstants.PROJECT, proj.getGroupId() + ":" + proj.getArtifactId(), AuditLogConstants.CANCEL_BUILD );
 	        }
 	        
 	    }
Index: continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/BuildDefinitionAction.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/BuildDefinitionAction.java	(revision 10307)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/BuildDefinitionAction.java	(working copy)
@@ -38,6 +38,7 @@
 import org.apache.maven.continuum.store.ContinuumStoreException;
 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
 import org.apache.maven.continuum.web.exception.ContinuumActionException;
+import org.apache.maven.continuum.web.util.AuditLogConstants;
 import org.codehaus.plexus.util.StringUtils;
 
 /**
@@ -310,6 +311,9 @@
             addActionError( authzE.getMessage() );
             return REQUIRES_AUTHORIZATION;
         }
+        
+        Project proj = getContinuum().getProject( projectId );
+        triggerAuditEvent( getPrincipal(), AuditLogConstants.BUILD_DEFINITION, proj.getGroupId() + ":" + proj.getArtifactId() + ":" + goals + " " + arguments, AuditLogConstants.ADD_GOAL );
 
         return SUCCESS;
     }
@@ -352,6 +356,7 @@
 
         if ( projectId != 0 )
         {
+            triggerAuditEvent( getPrincipal(), AuditLogConstants.BUILD_DEFINITION, getProjectGroupName() + ":" + goals + " " + arguments, AuditLogConstants.ADD_GOAL );
             return SUCCESS;
         }
         else
@@ -369,6 +374,9 @@
 
             if ( confirmed )
             {
+                Project proj = getContinuum().getProject( projectId );
+                triggerAuditEvent( getPrincipal(), AuditLogConstants.BUILD_DEFINITION, proj.getGroupId() + ":" + proj.getArtifactId() + ":" + goals + " " + arguments, AuditLogConstants.REMOVE_GOAL );
+
                 getContinuum().removeBuildDefinitionFromProject( projectId, buildDefinitionId );
 
                 return SUCCESS;
@@ -397,8 +405,10 @@
 
             if ( confirmed )
             {
+                triggerAuditEvent( getPrincipal(), AuditLogConstants.BUILD_DEFINITION, getProjectGroupName() + ":" + goals + " " + arguments, AuditLogConstants.REMOVE_GOAL );
+
                 getContinuum().removeBuildDefinitionFromProjectGroup( projectGroupId, buildDefinitionId );
-
+                
                 return SUCCESS;
             }
             else
Index: continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ProjectEditAction.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ProjectEditAction.java	(revision 10307)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ProjectEditAction.java	(working copy)
@@ -22,6 +22,7 @@
 import org.apache.maven.continuum.ContinuumException;
 import org.apache.maven.continuum.model.project.Project;
 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
+import org.apache.maven.continuum.web.util.AuditLogConstants;
 
 /**
  * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
@@ -78,6 +79,9 @@
         project.setScmTag( scmTag );
 
         getContinuum().updateProject( project );
+        
+        triggerAuditEvent( getPrincipal(), AuditLogConstants.PROJECT, project.getGroupId() + ":" +
+            project.getArtifactId(), AuditLogConstants.MODIFY_PROJECT );
 
         return SUCCESS;
     }
Index: continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/BuildProjectAction.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/BuildProjectAction.java	(revision 10307)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/BuildProjectAction.java	(working copy)
@@ -20,7 +20,9 @@
  */
 
 import org.apache.maven.continuum.ContinuumException;
+import org.apache.maven.continuum.model.project.Project;
 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
+import org.apache.maven.continuum.web.util.AuditLogConstants;
 import org.codehaus.plexus.util.StringUtils;
 
 /**
@@ -89,6 +91,9 @@
                 return "to_project_page";
             }
         }
+        
+        Project proj = getContinuum().getProject( projectId );
+        triggerAuditEvent( getPrincipal(), AuditLogConstants.PROJECT, proj.getGroupId() + ":" + proj.getArtifactId(), AuditLogConstants.FORCE_BUILD );
 
         return SUCCESS;
     }
Index: continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/DeleteProjectAction.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/DeleteProjectAction.java	(revision 10307)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/DeleteProjectAction.java	(working copy)
@@ -22,6 +22,7 @@
 import org.apache.maven.continuum.ContinuumException;
 import org.apache.maven.continuum.model.project.Project;
 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
+import org.apache.maven.continuum.web.util.AuditLogConstants;
 
 /**
  * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
@@ -50,6 +51,10 @@
         {
             return REQUIRES_AUTHORIZATION;
         }
+        
+        Project proj = getContinuum().getProject( projectId );
+        triggerAuditEvent( getPrincipal(), AuditLogConstants.PROJECT, proj.getGroupId() + ":" +
+            proj.getArtifactId(), AuditLogConstants.REMOVE_PROJECT );
 
         getContinuum().removeProject( projectId );
 
Index: continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ScheduleAction.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ScheduleAction.java	(revision 10307)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ScheduleAction.java	(working copy)
@@ -28,6 +28,7 @@
 import org.apache.maven.continuum.model.project.Schedule;
 import org.apache.maven.continuum.web.exception.AuthenticationRequiredException;
 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
+import org.apache.maven.continuum.web.util.AuditLogConstants;
 
 import com.opensymphony.xwork2.Preparable;
 
@@ -224,6 +225,7 @@
                 try
                 {
                     getContinuum().addSchedule( setFields( new Schedule() ) );
+                    triggerAuditEvent( getPrincipal(), AuditLogConstants.SCHEDULE, getName() + ":" + getCronExpression(), AuditLogConstants.ADD_SCHEDULE );
                 }
                 catch ( ContinuumException e )
                 {
@@ -237,6 +239,7 @@
                 try
                 {
                     getContinuum().updateSchedule( setFields( getContinuum().getSchedule( id ) ) );
+                    triggerAuditEvent( getPrincipal(), AuditLogConstants.SCHEDULE, getName() + ":" + getCronExpression(), AuditLogConstants.MODIFY_SCHEDULE );
                 }
                 catch ( ContinuumException e )
                 {
@@ -315,6 +318,8 @@
         {
             try
             {
+                triggerAuditEvent( getPrincipal(), AuditLogConstants.SCHEDULE, getName() + ":" + getCronExpression(), AuditLogConstants.REMOVE_SCHEDULE );
+
                 getContinuum().removeSchedule( id );
             }
             catch ( ContinuumException e )
@@ -331,7 +336,7 @@
 
             return CONFIRM;
         }
-
+        
         return SUCCESS;
     }
 
Index: continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/AddProjectGroupAction.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/AddProjectGroupAction.java	(revision 10307)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/AddProjectGroupAction.java	(working copy)
@@ -27,6 +27,7 @@
 import org.apache.maven.continuum.ContinuumException;
 import org.apache.maven.continuum.model.project.ProjectGroup;
 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
+import org.apache.maven.continuum.web.util.AuditLogConstants;
 
 import com.opensymphony.xwork2.Validateable;
 
@@ -150,6 +151,8 @@
 
             return ERROR;
         }
+        
+        triggerAuditEvent( getPrincipal(), AuditLogConstants.PROJECT, name, AuditLogConstants.ADD_PROJECT_GROUP );
 
         return SUCCESS;
     }
Index: continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/admin/BuildDefinitionTemplateAction.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/admin/BuildDefinitionTemplateAction.java	(revision 10307)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/admin/BuildDefinitionTemplateAction.java	(working copy)
@@ -36,6 +36,7 @@
 import org.apache.maven.continuum.security.ContinuumRoleConstants;
 import org.apache.maven.continuum.web.action.AbstractBuildDefinitionAction;
 import org.apache.maven.continuum.web.model.BuildDefinitionSummary;
+import org.apache.maven.continuum.web.util.AuditLogConstants;
 import org.codehaus.plexus.redback.rbac.Resource;
 import org.codehaus.redback.integration.interceptor.SecureAction;
 import org.codehaus.redback.integration.interceptor.SecureActionBundle;
@@ -139,12 +140,14 @@
         {
             buildDefinitionTemplate.setBuildDefinitions( selectedBuildDefinitions );
             this.getContinuum().getBuildDefinitionService().updateBuildDefinitionTemplate( buildDefinitionTemplate );
+            triggerAuditEvent( getPrincipal(), AuditLogConstants.TEMPLATE, buildDefinitionTemplate.getName(), AuditLogConstants.MODIFY_TEMPLATE );
         }
         else
         {
             buildDefinitionTemplate.setBuildDefinitions( selectedBuildDefinitions );
             this.buildDefinitionTemplate = this.getContinuum().getBuildDefinitionService()
                 .addBuildDefinitionTemplate( buildDefinitionTemplate );
+            triggerAuditEvent( getPrincipal(), AuditLogConstants.TEMPLATE, buildDefinitionTemplate.getName(), AuditLogConstants.ADD_TEMPLATE );
         }
 
         return SUCCESS;
@@ -156,6 +159,7 @@
         buildDefinitionTemplate = getContinuum().getBuildDefinitionService()
             .getBuildDefinitionTemplate( this.buildDefinitionTemplate.getId() );
         this.getContinuum().getBuildDefinitionService().removeBuildDefinitionTemplate( buildDefinitionTemplate );
+        triggerAuditEvent( getPrincipal(), AuditLogConstants.TEMPLATE, buildDefinitionTemplate.getName(), AuditLogConstants.REMOVE_TEMPLATE );
         return SUCCESS;
     }
     
Index: continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleasePerformAction.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleasePerformAction.java	(revision 10307)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleasePerformAction.java	(working copy)
@@ -28,6 +28,7 @@
 import org.apache.maven.continuum.release.ContinuumReleaseManagerListener;
 import org.apache.maven.continuum.release.DefaultReleaseManagerListener;
 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
+import org.apache.maven.continuum.web.util.AuditLogConstants;
 import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
 import org.apache.maven.shared.release.ReleaseResult;
 
@@ -132,6 +133,8 @@
         LocalRepository repository = project.getProjectGroup().getLocalRepository();
         
         releaseManager.perform( releaseId, performDirectory, goals, useReleaseProfile, listener, repository );
+        
+        triggerAuditEvent( getPrincipal(), AuditLogConstants.PROJECT, project.getGroupId() + ":" + project.getArtifactId() + ":" + project.getVersion(), AuditLogConstants.PERFORM_RELEASE );
 
         return SUCCESS;
     }
Index: continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ContinuumActionSupport.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ContinuumActionSupport.java	(revision 10307)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ContinuumActionSupport.java	(working copy)
@@ -34,6 +34,9 @@
 import org.codehaus.plexus.redback.system.SecuritySystemConstants;
 import org.codehaus.plexus.util.StringUtils;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 /**
  * ContinuumActionSupport
  *
@@ -67,6 +70,10 @@
     private Continuum continuum;
     
     protected SimpleDateFormat dateFormatter = new SimpleDateFormat("MMM dd, yyyy hh:mm:ss aaa z");
+    
+    private Logger logger = LoggerFactory.getLogger( "AuditLog" );
+    
+    private static final char DELIM = ' ';
 
     public void prepare()
         throws Exception
@@ -541,5 +548,39 @@
     protected ResourceBundle getResourceBundle()
     {
         return getTexts( "localization/Continuum" );
+    }
+    
+    protected String getPrincipal()
+    {
+        String principal = "guest";
+        
+        if ( getSecuritySession() != null )
+        {
+            if ( getSecuritySession().getUser() != null )
+            {
+                principal = (String) getSecuritySession().getUser().getPrincipal();
+            }
+        }
+        else
+        {
+            principal = "unknown-user";
+        }
+        return principal;
+    }
+    
+    /*
+     * resource formats:
+     * project - {groupId}:{artifactId}
+     *         - {groupId}:{artifactId}:{version} for release prepare/perform
+     * project group - {group_name}
+     * build definition - {project_group}:{goals}
+     * schedule - {name}:(cron)
+     */
+    protected void triggerAuditEvent( String user, String category, String resource, String action )
+    {
+        
+        String msg = category + DELIM + user + DELIM + '\"' + resource + '\"' + DELIM + '\"' + action + '\"';
+        
+        logger.info( msg );
     }    
 }
Index: continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ProjectGroupAction.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ProjectGroupAction.java	(revision 10307)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ProjectGroupAction.java	(working copy)
@@ -32,6 +32,7 @@
 import org.apache.maven.continuum.project.ContinuumProjectState;
 import org.apache.maven.continuum.web.bean.ProjectGroupUserBean;
 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
+import org.apache.maven.continuum.web.util.AuditLogConstants;
 import org.codehaus.plexus.redback.rbac.RBACManager;
 import org.codehaus.plexus.redback.rbac.RbacManagerException;
 import org.codehaus.plexus.redback.rbac.RbacObjectNotFoundException;
@@ -303,6 +304,8 @@
             name = getProjectGroupName();
             return CONFIRM;
         }
+        
+        triggerAuditEvent( getPrincipal(), AuditLogConstants.PROJECT, getProjectGroupName(), AuditLogConstants.REMOVE_PROJECT_GROUP );
 
         return SUCCESS;
     }
@@ -519,6 +522,8 @@
                 getContinuum().updateProject( project );
             }
         }
+        
+        triggerAuditEvent( getPrincipal(), AuditLogConstants.PROJECT, getProjectGroupName(), AuditLogConstants.MODIFY_PROJECT_GROUP );
 
         return SUCCESS;
     }
@@ -544,6 +549,8 @@
         {
             getContinuum().buildProjectGroupWithBuildDefinition( projectGroupId, buildDefinitionId );
         }
+        
+        triggerAuditEvent( getPrincipal(), AuditLogConstants.PROJECT, getProjectGroupName(), AuditLogConstants.FORCE_BUILD );
 
         if ( this.isFromSummaryPage() )
         {
Index: continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ProjectsListAction.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ProjectsListAction.java	(revision 10307)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ProjectsListAction.java	(working copy)
@@ -27,6 +27,7 @@
 import org.apache.maven.continuum.model.project.BuildDefinition;
 import org.apache.maven.continuum.model.project.Project;
 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
+import org.apache.maven.continuum.web.util.AuditLogConstants;
 import org.codehaus.plexus.util.StringUtils;
 import org.codehaus.plexus.util.dag.CycleDetectedException;
 
@@ -95,6 +96,10 @@
                 try
                 {
                     getLogger().info( "Removing Project with id=" + projectId );
+                    
+                    Project proj = getContinuum().getProject( projectId );
+                    triggerAuditEvent( getPrincipal(), AuditLogConstants.PROJECT, proj.getGroupId() + ":" +
+                        proj.getArtifactId(), AuditLogConstants.REMOVE_PROJECT );
 
                     getContinuum().removeProject( projectId );
                 }
Index: continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleaseRollbackAction.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleaseRollbackAction.java	(revision 10307)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleaseRollbackAction.java	(working copy)
@@ -26,6 +26,7 @@
 import org.apache.maven.continuum.release.ContinuumReleaseManagerListener;
 import org.apache.maven.continuum.release.DefaultReleaseManagerListener;
 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
+import org.apache.maven.continuum.web.util.AuditLogConstants;
 import org.codehaus.plexus.util.StringUtils;
 
 /**
@@ -83,6 +84,8 @@
         }
 
         releaseManager.getPreparedReleases().remove( releaseId );
+        
+        triggerAuditEvent( getPrincipal(), AuditLogConstants.PROJECT, project.getGroupId() + ":" + project.getArtifactId() + ":" + project.getVersion(), AuditLogConstants.ROLLBACK_RELEASE );
 
         return SUCCESS;
     }
Index: continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleasePrepareAction.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleasePrepareAction.java	(revision 10307)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleasePrepareAction.java	(working copy)
@@ -26,6 +26,7 @@
 import org.apache.maven.continuum.release.ContinuumReleaseManagerListener;
 import org.apache.maven.continuum.release.DefaultReleaseManagerListener;
 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
+import org.apache.maven.continuum.web.util.AuditLogConstants;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Plugin;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
@@ -232,6 +233,9 @@
 
         releaseId =
             releaseManager.prepare( project, getReleaseProperties(), getRelVersionMap(), getDevVersionMap(), listener, profile );
+            
+        triggerAuditEvent( getPrincipal(), AuditLogConstants.PROJECT, project.getGroupId() + ":" + project.getArtifactId() + ":" +
+            project.getVersion(), AuditLogConstants.PREPARE_RELEASE );
 
         return SUCCESS;
     }
Index: continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/AddMavenTwoProjectAction.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/AddMavenTwoProjectAction.java	(revision 10307)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/AddMavenTwoProjectAction.java	(working copy)
@@ -22,12 +22,17 @@
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileReader;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
 import java.io.IOException;
 import java.util.List;
+import java.net.URL;
+import java.net.MalformedURLException;
 
 import org.apache.maven.continuum.ContinuumException;
 import org.apache.maven.continuum.builddefinition.BuildDefinitionServiceException;
 import org.apache.maven.continuum.project.builder.ContinuumProjectBuildingResult;
+import org.apache.maven.continuum.web.util.AuditLogConstants;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
 import org.codehaus.plexus.util.StringUtils;
@@ -58,9 +63,15 @@
         throws ContinuumException
     {
         ContinuumProjectBuildingResult result = null;
+        
+        String groupId = "";
+        
+        String artifactId = "";
+        
+        String resource = "";
 
         // TODO: remove this part once uploading of an m2 project with modules is supported ( CONTINUUM-1098 )
-        if ( checkProtocol == false )
+        if ( ( checkProtocol == false ) || ( ( checkProtocol == true ) && ( pomUrl.startsWith( FILE_SCHEME ) ) ) )
         {
             MavenXpp3Reader m2pomReader = new MavenXpp3Reader();
 
@@ -80,10 +91,14 @@
                 }
 
                 Model model = m2pomReader.read( new FileReader( filePath ) );
+                
+                groupId = model.getGroupId();
+                artifactId = model.getArtifactId();
+                resource =  groupId + ":" + artifactId;
 
                 List modules = model.getModules();
 
-                if ( modules != null && modules.size() != 0 )
+                if ( ( checkProtocol == false ) && ( modules != null && modules.size() != 0 ) )
                 {
                     result = new ContinuumProjectBuildingResult();
                     result.addError( ERROR_UPLOADING_M2_PROJECT_WITH_MODULES );
@@ -102,12 +117,49 @@
                 throw new ContinuumException( ERROR_READING_POM_EXCEPTION_MESSAGE, e );
             }
         }
+        else
+        {
+            if ( ( pomUrl.startsWith( "http" ) ) && ( pomUrl.endsWith( "pom.xml" ) ) )
+            {
+                try
+                {
+                    URL url = new URL( pomUrl );
+                    BufferedReader in = new BufferedReader( new InputStreamReader( url.openStream() ) );
+                    StringBuilder content = new StringBuilder();
+                    String line = in.readLine();
+                    
+                    while ( line != null )
+                    {
+                        content.append( line );
+                        line = in.readLine();
+                    }
+                    in.close();
+                    
+                    if ( content.length() > 0 )
+                    {
+                        groupId = getSubString( content.toString(), "<groupId>", "</groupId>" );
+                        artifactId = getSubString( content.toString(), "<artifactId>", "</artifactId>" );
+                        resource = groupId + ":" + artifactId;
+                    }
+                }
+                catch ( MalformedURLException e )
+                {
+                    addActionError( ERROR_READING_POM_EXCEPTION_MESSAGE );
+                }
+                catch ( IOException e )
+                {
+                    throw new ContinuumException( ERROR_READING_POM_EXCEPTION_MESSAGE, e );
+                }
+            }
+        }
 
         if ( result == null )
         {
             result = getContinuum().addMavenTwoProject( pomUrl, selectedProjectGroup, checkProtocol, scmUseCache,
                                                         !this.isNonRecursiveProject(), this.getBuildDefinitionTemplateId() );
         }
+        
+        triggerAuditEvent( getPrincipal(), AuditLogConstants.PROJECT, resource, AuditLogConstants.ADD_M2_PROJECT );
 
         return result;
     }
@@ -159,5 +211,16 @@
     {
         this.nonRecursiveProject = nonRecursiveProject;
     }
+    
+    private String getSubString( String content, String tagStart, String tagEnd )
+    {
+        String subString = "";
+        
+        int start = content.indexOf( tagStart ) + tagStart.length();
+        int end = content.indexOf( tagEnd );
+        subString = content.substring( start, end );
+        
+        return subString;
+    }
 
 }
Index: continuum-webapp/src/main/java/org/apache/maven/continuum/web/util/AuditLogConstants.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/maven/continuum/web/util/AuditLogConstants.java	(revision 0)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/util/AuditLogConstants.java	(revision 0)
@@ -0,0 +1,74 @@
+package org.apache.maven.continuum.web.util;
+
+/*
+ * 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.
+ */
+
+public class AuditLogConstants
+{
+    public static final String PROJECT = "PROJECT";
+
+    public static final String SCHEDULE = "BUILD_SCHEDULE";
+
+    public static final String TEMPLATE = "BUILD_TEMPLATE";
+
+    public static final String BUILD_DEFINITION = "BUILD_DEFINITION";
+    
+    // events
+    public static final String FORCE_BUILD = "Forced Project Build";
+
+    public static final String CANCEL_BUILD = "Cancelled Project Build";
+
+    public static final String CI_BUILD = "Scheduled Project Build";
+
+    public static final String PREPARE_RELEASE = "Prepare Project Release";
+
+    public static final String PERFORM_RELEASE = "Perform Project Release";
+
+    public static final String ROLLBACK_RELEASE = "Rollback Project Release";
+
+    public static final String ADD_M2_PROJECT = "Added M2 Project";
+
+    public static final String MODIFY_PROJECT = "Modified Project";
+
+    public static final String REMOVE_PROJECT = "Removed Project";
+
+    public static final String ADD_PROJECT_GROUP = "Added Project Group";
+
+    public static final String MODIFY_PROJECT_GROUP = "Modified Project Group";
+
+    public static final String REMOVE_PROJECT_GROUP = "Removed Project Group";
+
+    public static final String MODIFY_SCHEDULE = "Modified Build Schedule";
+
+    public static final String ADD_SCHEDULE = "Added Build Schedule";
+
+    public static final String REMOVE_SCHEDULE = "Removed Build Schedule";
+
+    public static final String ADD_GOAL = "Added Build Definition";
+
+    public static final String MODIFY_GOAL = "Modified Build Definition";
+
+    public static final String REMOVE_GOAL = "Removed Build Definition";
+
+    public static final String ADD_TEMPLATE = "Added Build Definition Template";
+
+    public static final String MODIFY_TEMPLATE = "Modified Build Definition Template";
+
+    public static final String REMOVE_TEMPLATE = "Removed Build Definition Template";
+}
Index: continuum-webapp/src/main/resources/log4j.xml
===================================================================
--- continuum-webapp/src/main/resources/log4j.xml	(revision 10307)
+++ continuum-webapp/src/main/resources/log4j.xml	(working copy)
@@ -29,8 +29,22 @@
       <param name="ConversionPattern" value="%d [%t] %-5p %c %x - %m%n"/>
     </layout>
   </appender>
+  
+  <appender name="auditLog" class="org.apache.log4j.DailyRollingFileAppender">
+    <param name="file" value="${appserver.base}/logs/continuum-audit.log" />
+    <param name="append" value="true" />
+    <param name="datePattern" value="'.'yyyy-MM-dd" />
+    <layout class="org.apache.log4j.PatternLayout">
+      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %m%n"/>
+    </layout>
+  </appender>
 
   <!-- Help identify bugs during testing -->
+  <logger name="AuditLog">
+    <level value="info" />
+    <appender-ref ref="auditLog" />
+  </logger>
+  
   <logger name="org.apache.maven">
     <level value="info"/>
   </logger>
