Index: continuum-model/src/main/mdo/continuum.xml
===================================================================
--- continuum-model/src/main/mdo/continuum.xml	(revision 574298)
+++ continuum-model/src/main/mdo/continuum.xml	(working copy)
@@ -167,6 +167,12 @@
           <version>1.0.9+</version>
           <type>String</type>
         </field>
+        <field>
+          <name>derived</name>
+          <version>1.0.0+</version>
+          <defaultValue>false</defaultValue>
+          <type>boolean</type>
+        </field>
         <field stash.maxSize="256">
           <name>url</name>
           <version>1.0.9+</version>
@@ -452,8 +458,41 @@
           <version>1.0.9+</version>
           <type>String</type>
         </field>
+        <field>
+          <name>derived</name>
+          <version>1.0.0+</version>
+          <defaultValue>false</defaultValue>
+          <type>boolean</type>
+        </field>
       </fields>
     </class>
+      <class>
+          <name>DependencyGroup</name>
+          <version>1.0.9+</version>
+          <description>
+              Simplifies working with groups of dependencies
+          </description>
+          <fields>
+              <field jpox.fetch-groups="project-all-details project-dependencies">
+                  <name>dependencies</name>
+                  <version>1.0.9+</version>
+                  <association jpox.join="false">
+                      <type>ProjectDependency</type>
+                      <multiplicity>*</multiplicity>
+                  </association>
+              </field>
+              <field>
+                  <name>groupId</name>
+                  <version>1.0.9+</version>
+                  <type>String</type>
+              </field>
+              <field>
+                  <name>artifactId</name>
+                  <version>1.0.9+</version>
+                  <type>String</type>
+              </field>
+          </fields>
+      </class>
 
     <class>
       <name>BuildResult</name>
Index: continuum-api/src/main/java/org/apache/maven/continuum/DerivedProjectManager.java
===================================================================
--- continuum-api/src/main/java/org/apache/maven/continuum/DerivedProjectManager.java	(revision 0)
+++ continuum-api/src/main/java/org/apache/maven/continuum/DerivedProjectManager.java	(revision 0)
@@ -0,0 +1,40 @@
+package org.apache.maven.continuum;
+
+import org.apache.maven.continuum.model.project.*;
+import org.apache.maven.continuum.store.ContinuumStore;
+import org.codehaus.plexus.logging.Logger;
+
+import java.util.List;
+
+/**
+ * User: drolsham
+ */
+public interface DerivedProjectManager {
+    String ROLE = DerivedProjectManager.class.getName();
+
+    List<Project> createDerivedProjects(Project originalProject,
+                                               List<ProjectDependency> newDependencies, ContinuumStore store);
+
+    List<Project> updateDerivedProjects(Project originalProject, 
+                                        List<ProjectDependency> newDependencies,
+                                        List<Project> derivedProjects, ContinuumStore store);
+
+    void copyAttributesFromOriginalProject( Project originalProject, Project project );
+
+    boolean projectExist(Project project, ContinuumStore store);
+
+    boolean projectSame(Project project1, Project project2);
+    
+    ProjectDeveloper cloneDeveloper (ProjectDeveloper developer);
+
+    ProjectNotifier cloneNotifier (ProjectNotifier notifier);
+    
+    BuildDefinition cloneBuildDefinition (BuildDefinition buildDefinition);
+
+    void printInfoForAllProjects(final Logger logger, ContinuumStore store);
+    void printProjectInfo(final Logger logger, final Project project);
+
+    //TODO delete
+    DependencyHelper getDependencyHelper();
+    //ContinuumStore getStore();
+}
Index: continuum-api/src/main/java/org/apache/maven/continuum/DependencyHelper.java
===================================================================
--- continuum-api/src/main/java/org/apache/maven/continuum/DependencyHelper.java	(revision 0)
+++ continuum-api/src/main/java/org/apache/maven/continuum/DependencyHelper.java	(revision 0)
@@ -0,0 +1,26 @@
+package org.apache.maven.continuum;
+
+import org.apache.maven.continuum.model.project.ProjectDependency;
+
+import java.util.List;
+
+/**
+ * User: drolsham
+ */
+public interface DependencyHelper {
+
+    String ROLE = DependencyHelper.class.getName();
+
+    List<List<ProjectDependency>> getAllDependencyCombinations(
+            List<ProjectDependency> originalDependencies,
+            List<ProjectDependency> newDependencies);
+
+    List<ProjectDependency> findSimilarDependenciesInList(final ProjectDependency dependency,
+                                final List<ProjectDependency> list);
+
+    boolean dependenciesEqual(ProjectDependency dependency1, ProjectDependency dependency2);
+
+    List<ProjectDependency> cloneDependencyList(List<ProjectDependency> dependencies);
+
+    ProjectDependency cloneDependency (ProjectDependency dependency);
+}
Index: continuum-webapp/src/main/mdo/view-models.mdo
===================================================================
--- continuum-webapp/src/main/mdo/view-models.mdo	(revision 574298)
+++ continuum-webapp/src/main/mdo/view-models.mdo	(working copy)
@@ -80,6 +80,14 @@
           <description>version of the project</description>
           <type>String</type>
         </field>
+	<field>			<!--erik-->
+          <name>derived</name>
+          <version>1.0.0</version>
+          <required>true</required>
+          <description>derived status of the project</description>
+          <type>boolean</type>
+          <defaultValue>true</defaultValue>
+        </field>
         <field>
           <name>projectGroupId</name>
           <version>1.0.0</version>
Index: continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/GroupSummaryAction.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/GroupSummaryAction.java	(revision 574298)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/GroupSummaryAction.java	(working copy)
@@ -48,6 +48,8 @@
     public String execute()
         throws ContinuumException
     {
+        System.out.println( "GroupSummaryAction is called" );
+        getLogger().debug( "GroupSummaryAction is called" );
         groups = new ArrayList();
 
         Collection projectGroups = getContinuum().getAllProjectGroupsWithProjects();
@@ -84,6 +86,8 @@
                 {
                     Project project = (Project) i.next();
 
+                    System.out.println( "GroupSummaryAction, project.derived " + project.isDerived() );
+
                     if ( groupModel.getProjectType() == null )
                     {
                         groupModel.setProjectType( project.getExecutorId() );
@@ -91,7 +95,7 @@
 
                     ProjectSummary model = new ProjectSummary();
 
-                    getLogger().debug( "GroupSummaryAction: building project model " + project.getName() );
+                    getLogger().error( "GroupSummaryAction: building project model " + project.getName() );
 
                     model.setId( project.getId() );
 
@@ -99,6 +103,11 @@
 
                     model.setVersion( project.getVersion() );
 
+                    model.setDerived( project.isDerived() );  //erik
+                    getLogger().error( "GroupSummaryAction - model.derived: " + model.isDerived() );
+                    System.out.println( "GroupSummaryAction, project.derived " + project.isDerived() );
+                    System.out.println( "GroupSummaryAction, model.derived " + model.isDerived() );
+
                     model.setProjectGroupId( project.getProjectGroup().getId() );
 
                     model.setProjectGroupName( project.getProjectGroup().getName() );
Index: continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/SummaryAction.java
===================================================================
--- continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/SummaryAction.java	(revision 574298)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/SummaryAction.java	(working copy)
@@ -94,6 +94,8 @@
 
             model.setVersion( project.getVersion() );
 
+            model.setDerived( project.isDerived() );   //erik
+
             model.setProjectGroupId( project.getProjectGroup().getId() );
 
             model.setProjectGroupName( project.getProjectGroup().getName() );
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 574298)
+++ continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ProjectGroupAction.java	(working copy)
@@ -27,8 +27,6 @@
 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.model.BuildDefinitionSummary;
-import org.apache.maven.continuum.xmlrpc.project.ProjectGroupSummary;
 import org.codehaus.plexus.redback.rbac.RBACManager;
 import org.codehaus.plexus.redback.rbac.RbacManagerException;
 import org.codehaus.plexus.redback.rbac.RbacObjectNotFoundException;
@@ -111,9 +109,9 @@
     private Collection groupProjects;
 
     private int releaseProjectId;
-    
+
     private Map<String, Integer> buildDefinitions;
-    
+
     private int buildDefinitionId;
 
     public String summary()
@@ -128,17 +126,20 @@
             addActionError( authzE.getMessage() );
             return REQUIRES_AUTHORIZATION;
         }
-        
+
         projectGroup = getProjectGroup( projectGroupId );
 
-        List<BuildDefinition> projectGroupBuildDefs = getContinuum().getBuildDefinitionsForProjectGroup( projectGroupId );
-        
-        if (projectGroupBuildDefs != null)
+        List<BuildDefinition> projectGroupBuildDefs =
+            getContinuum().getBuildDefinitionsForProjectGroup( projectGroupId );
+
+        if ( projectGroupBuildDefs != null )
         {
-            this.buildDefinitions = new LinkedHashMap<String, Integer>(projectGroupBuildDefs.size());
-            for(BuildDefinition buildDefinition : projectGroupBuildDefs)
+            this.buildDefinitions = new LinkedHashMap<String, Integer>( projectGroupBuildDefs.size() );
+            for ( BuildDefinition buildDefinition : projectGroupBuildDefs )
             {
-                String key = StringUtils.isEmpty( buildDefinition.getDescription() ) ? buildDefinition.getGoals() : buildDefinition.getDescription();
+                String key = StringUtils.isEmpty( buildDefinition.getDescription() )
+                    ? buildDefinition.getGoals()
+                    : buildDefinition.getDescription();
                 buildDefinitions.put( key, Integer.valueOf( buildDefinition.getId() ) );
             }
         }
@@ -146,7 +147,7 @@
         {
             this.buildDefinitions = Collections.EMPTY_MAP;
         }
-        
+
         return SUCCESS;
     }
 
@@ -331,7 +332,8 @@
                 }
             }
 
-            ProjectGroup newProjectGroup = getContinuum().getProjectGroupWithProjects( new Integer( id[0] ).intValue() );
+            ProjectGroup newProjectGroup =
+                getContinuum().getProjectGroupWithProjects( new Integer( id[0] ).intValue() );
 
             if ( newProjectGroup.getId() != projectGroup.getId() )
             {
Index: continuum-webapp/src/main/resources/localization/Continuum.properties
===================================================================
--- continuum-webapp/src/main/resources/localization/Continuum.properties	(revision 574298)
+++ continuum-webapp/src/main/resources/localization/Continuum.properties	(working copy)
@@ -116,6 +116,7 @@
 summary.section.title = Continuum Projects
 summary.projectTable.name = Project Name
 summary.projectTable.version = Version
+summary.projectTable.derived = Derived
 summary.projectTable.build = Build
 summary.projectTable.group = Group
 summary.buildAll = Build All
@@ -334,6 +335,7 @@
 projectView.dependency.groupId = Group Id
 projectView.dependency.artifactId = Artifact Id
 projectView.dependency.version = Version
+projectView.dependency.derived = Derived
 projectView.usedBy= Used By
 projectView.developers = Developers
 projectView.developer.name = Name
Index: continuum-webapp/src/main/webapp/WEB-INF/jsp/components/projectSummaryComponent.jsp
===================================================================
--- continuum-webapp/src/main/webapp/WEB-INF/jsp/components/projectSummaryComponent.jsp	(revision 574298)
+++ continuum-webapp/src/main/webapp/WEB-INF/jsp/components/projectSummaryComponent.jsp	(working copy)
@@ -73,6 +73,7 @@
         <ww:a href="%{projectUrl}">${pageScope.project.name}</ww:a>
       </ec:column>
       <ec:column property="version" title="summary.projectTable.version" width="12%"/>
+      <ec:column property="derived" title="summary.projectTable.derived" width="4%"/> <%-- erik --%>
       <ec:column property="buildNumber" title="summary.projectTable.build" width="2%" style="text-align: center">
         <c:choose>
           <c:when test="${project.buildNumber gt 0}">
Index: continuum-webapp/src/main/webapp/WEB-INF/jsp/projectGroupSummary.jsp
===================================================================
--- continuum-webapp/src/main/webapp/WEB-INF/jsp/projectGroupSummary.jsp	(revision 574298)
+++ continuum-webapp/src/main/webapp/WEB-INF/jsp/projectGroupSummary.jsp	(working copy)
@@ -26,144 +26,154 @@
 <html>
 
 <ww:i18n name="localization.Continuum">
-  <head>
-    <title>
-      <ww:text name="projectGroup.page.title"/>
-    </title>
-    <meta http-equiv="refresh" content="300"/>
-    <script type="text/javascript">
-      function goToAddProject()
+<head>
+  <title>
+    <ww:text name="projectGroup.page.title"/>
+  </title>
+  <meta http-equiv="refresh" content="300"/>
+  <script type="text/javascript">
+    function goToAddProject()
+    {
+      var urls = document.getElementById("projectTypes");
+      var index = urls.selectedIndex;
+
+      if ( index > 0 )
       {
-        var urls = document.getElementById( "projectTypes" );
-        var index = urls.selectedIndex;
+        var form = document.forms[ "addNewProject" ];
+        form.action = urls[ index ].value;
 
-        if ( index > 0 )
+        if ( index == 3 )
         {
-          var form = document.forms[ "addNewProject" ];
-          form.action = urls[ index ].value;
-
-          if ( index == 3 )
-          {
-            form.projectType.value = "ant";
-          }
-          else if ( index == 4 )
-          {
-            form.projectType.value = "shell";
-          }
-          else
-          {
-            form.projectType.value = "";
-          }
-
-          form.submit();
+          form.projectType.value = "ant";
         }
+        else if ( index == 4 )
+        {
+          form.projectType.value = "shell";
+        }
         else
         {
-          alert( "Please choose a project type to add from the dropdown list." );
+          form.projectType.value = "";
         }
+
+        form.submit();
       }
-    </script>
-  </head>
-  <body>
-  <div id="h3">
-    <ww:action name="projectGroupTab" executeResult="true">
-      <ww:param name="tabName" value="'Summary'"/>
-    </ww:action>
+      else
+      {
+        alert("Please choose a project type to add from the dropdown list.");
+      }
+    }
+  </script>
+</head>
+<body>
+<div id="h3">
+  <ww:action name="projectGroupTab" executeResult="true">
+    <ww:param name="tabName" value="'Summary'"/>
+  </ww:action>
 
-    <h3><ww:text name="projectGroup.informations.title"/></h3>
-    <div class="axial">
-      <table border="1" cellspacing="2" cellpadding="3" width="100%">
-        <c1:data label="%{getText('projectGroup.name.label')}" name="projectGroup.name"/>
-        <c1:data label="%{getText('projectGroup.groupId.label')}" name="projectGroup.groupId"/>
-        <c1:data label="%{getText('projectGroup.description.label')}" name="projectGroup.description"/>
-      </table>
-    </div>
+  <h3>
+    <ww:text name="projectGroup.informations.title"/>
+  </h3>
 
-    <redback:ifAnyAuthorized permissions="continuum-build-group,continuum-remove-group" resource="${projectGroup.name}">
-      <h3><ww:text name="projectGroup.actions.title"/></h3>
+  <div class="axial">
+    <table border="1" cellspacing="2" cellpadding="3" width="100%">
+      <c1:data label="%{getText('projectGroup.name.label')}" name="projectGroup.name"/>
+      <c1:data label="%{getText('projectGroup.groupId.label')}" name="projectGroup.groupId"/>
+      <c1:data label="%{getText('projectGroup.description.label')}" name="projectGroup.description"/>
+    </table>
+  </div>
 
-      <c:if test="${!empty actionErrors}">
-        <div class="errormessage">
-          <c:forEach items="${actionErrors}" var="actionError">
-            <p><ww:text name="${actionError}"/></p>
-          </c:forEach>
-        </div>
-      </c:if>
+  <redback:ifAnyAuthorized permissions="continuum-build-group,continuum-remove-group" resource="${projectGroup.name}">
+    <h3>
+      <ww:text name="projectGroup.actions.title"/>
+    </h3>
 
-      <div class="functnbar3">
-        <table>
-          <tr>
-            <td>
-              <table>
-                <redback:ifAuthorized permission="continuum-build-group" resource="${projectGroup.name}">
-                  <form action="buildProjectGroup.action" method="post">
-                    <input type="hidden" name="projectGroupId" value="<ww:property value="projectGroupId"/>"/>
-                    <ww:select theme="simple" name="buildDefinitionId" list="buildDefinitions" 
-                               listKey="value" listValue="key" headerKey="-1" headerValue="%{getText('projectGroup.buildDefinition.label')}" />                    
-                    <input type="submit" name="build" value="<ww:text name="projectGroup.buildGroup"/>"/>
-                  </form>
-                </redback:ifAuthorized>
-              </table>
-            </td>
-            <td>
-              <redback:ifAuthorized permission="continuum-modify-group" resource="${projectGroup.name}">
-                <form action="editProjectGroup.action" method="post">
-                  <input type="hidden" name="projectGroupId" value="<ww:property value="projectGroupId"/>"/>
-                  <input type="submit" name="edit" value="<ww:text name="edit"/>"/>
-                </form>
-              </redback:ifAuthorized>
-            </td>
-            <td>
-              <redback:ifAuthorized permission="continuum-remove-group" resource="${projectGroup.name}">
-                <form action="removeProjectGroup.action" method="post">
-                  <input type="hidden" name="projectGroupId" value="<ww:property value="projectGroupId"/>"/>
-                  <input type="submit" name="remove" value="<ww:text name="projectGroup.deleteGroup"/>"/>
-                </form>
-              </redback:ifAuthorized>
-            </td>
-            <td>
+    <c:if test="${!empty actionErrors}">
+      <div class="errormessage">
+        <c:forEach items="${actionErrors}" var="actionError">
+          <p>
+            <ww:text name="${actionError}"/>
+          </p>
+        </c:forEach>
+      </div>
+    </c:if>
+
+    <div class="functnbar3">
+      <table>
+        <tr>
+          <td>
+            <table>
               <redback:ifAuthorized permission="continuum-build-group" resource="${projectGroup.name}">
-                <form action="releaseProjectGroup.action" method="post">
+                <form action="buildProjectGroup.action" method="post">
                   <input type="hidden" name="projectGroupId" value="<ww:property value="projectGroupId"/>"/>
-                  <input type="submit" name="release" value="<ww:text name="release"/>"/>
+                  <ww:select theme="simple" name="buildDefinitionId" list="buildDefinitions"
+                             listKey="value" listValue="key" headerKey="-1"
+                             headerValue="%{getText('projectGroup.buildDefinition.label')}"/>
+                  <input type="submit" name="build" value="<ww:text name="projectGroup.buildGroup"/>"/>
                 </form>
               </redback:ifAuthorized>
-            </td>
-            <td>
-              <redback:ifAnyAuthorized permissions="continuum-add-project-to-group" resource="${projectGroup.name}">
-                <ww:form name="addNewProject">
-                  <ww:hidden name="disableGroupSelection" value="true"/>
-                  <ww:hidden name="selectedProjectGroup" value="${projectGroup.id}"/>
-                  <ww:hidden name="projectGroupName" value="${projectGroup.name}"/>
-                  <ww:hidden name="projectType" value=""/>
-                </ww:form>
+            </table>
+          </td>
+          <td>
+            <redback:ifAuthorized permission="continuum-modify-group" resource="${projectGroup.name}">
+              <form action="editProjectGroup.action" method="post">
+                <input type="hidden" name="projectGroupId" value="<ww:property value="projectGroupId"/>"/>
+                <input type="submit" name="edit" value="<ww:text name="edit"/>"/>
+              </form>
+            </redback:ifAuthorized>
+          </td>
+          <td>
+            <redback:ifAuthorized permission="continuum-remove-group" resource="${projectGroup.name}">
+              <form action="removeProjectGroup.action" method="post">
+                <input type="hidden" name="projectGroupId" value="<ww:property value="projectGroupId"/>"/>
+                <input type="submit" name="remove" value="<ww:text name="projectGroup.deleteGroup"/>"/>
+              </form>
+            </redback:ifAuthorized>
+          </td>
+          <td>
+            <redback:ifAuthorized permission="continuum-build-group" resource="${projectGroup.name}">
+              <form action="releaseProjectGroup.action" method="post">
+                <input type="hidden" name="projectGroupId" value="<ww:property value="projectGroupId"/>"/>
+                <input type="submit" name="release" value="<ww:text name="release"/>"/>
+              </form>
+            </redback:ifAuthorized>
+          </td>
+          <td>
+            <redback:ifAnyAuthorized permissions="continuum-add-project-to-group" resource="${projectGroup.name}">
+              <ww:form name="addNewProject">
+                <ww:hidden name="disableGroupSelection" value="true"/>
+                <ww:hidden name="selectedProjectGroup" value="${projectGroup.id}"/>
+                <ww:hidden name="projectGroupName" value="${projectGroup.name}"/>
+                <ww:hidden name="projectType" value=""/>
+              </ww:form>
 
-                <c:url var="addM2ProjectUrl" value="/addMavenTwoProject!input.action" />
-                <c:url var="addM1ProjectUrl" value="/addMavenOneProject!input.action" />
-                <c:url var="addProjectUrl" value="/addProjectInput.action" />
+              <c:url var="addM2ProjectUrl" value="/addMavenTwoProject!input.action"/>
+              <c:url var="addM1ProjectUrl" value="/addMavenOneProject!input.action"/>
+              <c:url var="addProjectUrl" value="/addProjectInput.action"/>
 
-                <select id="projectTypes">
-                  <option value=""><ww:text name="projectGroup.addProject.label" /></option>
-                  <option value="${addM2ProjectUrl}">Add M2 Project</option>
-                  <option value="${addM1ProjectUrl}">Add M1 Project</option>
-                  <option value="${addProjectUrl}">Add Ant Project</option>
-                  <option value="${addProjectUrl}">Add Shell Project</option>
-                </select>
+              <select id="projectTypes">
+                <option value="">
+                  <ww:text name="projectGroup.addProject.label"/>
+                </option>
+                <option value="${addM2ProjectUrl}">Add M2 Project</option>
+                <option value="${addM1ProjectUrl}">Add M1 Project</option>
+                <option value="${addProjectUrl}">Add Ant Project</option>
+                <option value="${addProjectUrl}">Add Shell Project</option>
+              </select>
 
-                <input type="button" value="Add" onclick="goToAddProject()"/>
-              </redback:ifAnyAuthorized>
-            </td>
-          </tr>
-        </table>
-      </div>
-    </redback:ifAnyAuthorized>
+              <input type="button" value="Add" onclick="goToAddProject()"/>
+            </redback:ifAnyAuthorized>
+          </td>
+        </tr>
+      </table>
+    </div>
+  </redback:ifAnyAuthorized>
 
-    <ww:action name="projectSummary" executeResult="true" namespace="component">
-      <ww:param name="projectGroupId" value="%{projectGroupId}"/>
-      <ww:param name="projectGroupName" value="%{projectGroup.name}"/>
-    </ww:action>
+  <ww:action name="projectSummary" executeResult="true" namespace="component">
+    <ww:param name="projectGroupId" value="%{projectGroupId}"/>
+    <ww:param name="projectGroupName" value="%{projectGroup.name}"/>
+  </ww:action>
 
-  </div>
-  </body>
+</div>
+</body>
 </ww:i18n>
 </html>
Index: continuum-webapp/src/main/webapp/WEB-INF/jsp/projectView.jsp
===================================================================
--- continuum-webapp/src/main/webapp/WEB-INF/jsp/projectView.jsp	(revision 574298)
+++ continuum-webapp/src/main/webapp/WEB-INF/jsp/projectView.jsp	(working copy)
@@ -173,6 +173,7 @@
             <ec:column property="groupId" title="projectView.dependency.groupId"/>
             <ec:column property="artifactId" title="projectView.dependency.artifactId"/>
             <ec:column property="version" title="projectView.dependency.version"/>
+            <ec:column property="derived" title="projectView.dependency.derived"/>
           </ec:row>
         </ec:table>
 
Index: continuum-webapp/pom.xml
===================================================================
--- continuum-webapp/pom.xml	(revision 574298)
+++ continuum-webapp/pom.xml	(working copy)
@@ -1,4 +1,5 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <parent>
     <artifactId>continuum-parent</artifactId>
     <groupId>org.apache.maven.continuum</groupId>
@@ -8,7 +9,7 @@
   <artifactId>continuum-webapp</artifactId>
   <name>Continuum Web APP</name>
   <packaging>war</packaging>
-  <build> 
+  <build>
     <resources>
       <resource>
         <filtering>true</filtering>
@@ -89,7 +90,7 @@
         <version>2.0.1</version>
         <configuration>
           <!-- Some versions of maven-war-plugin (snapshots) have this incorrectly defaulted to true.
-               Specifically setting this to false to avoid accidental jar file creation. -->
+Specifically setting this to false to avoid accidental jar file creation. -->
           <archiveClasses>false</archiveClasses>
           <dependentWarExcludes>META-INF/**,WEB-INF/web.xml,WEB-INF/classes/xwork.xml,WEB-INF/lib/**
           </dependentWarExcludes>
@@ -166,13 +167,13 @@
         <configuration>
           <warSourceDirectory>${project.build.directory}/${project.build.finalName}/</warSourceDirectory>
           <injectString><![CDATA[<!-- [jspc-maven-plugin:post-compiled-jsps-as-servlets] -->]]></injectString>
-          <!-- 
-            Uncomment outputWebXml if you want the generated web.xml to
-            be placed in the working directory that the war:war mojo uses.
-            -->
-          <!-- 
-          <outputWebXml>${project.build.directory}/${project.build.finalName}/WEB-INF/web.xml</outputWebXml> 
+          <!--
+          Uncomment outputWebXml if you want the generated web.xml to
+          be placed in the working directory that the war:war mojo uses.
           -->
+          <!--
+          <outputWebXml>${project.build.directory}/${project.build.finalName}/WEB-INF/web.xml</outputWebXml>
+          -->
         </configuration>
       </plugin>
       <plugin>
@@ -231,10 +232,10 @@
             <configuration>
               <tasks>
                 <copy todir="${project.build.directory}/appserver-base">
-                  <fileset dir="src/appserver-base" />
+                  <fileset dir="src/appserver-base"/>
                 </copy>
                 <copy todir="src/main/webapp/template">
-                  <fileset file="src/main/resources/template/default/validation.js" />
+                  <fileset file="src/main/resources/template/default/validation.js"/>
                 </copy>
               </tasks>
             </configuration>
@@ -313,7 +314,7 @@
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-log4j-logging</artifactId>
-    </dependency>  
+    </dependency>
     <dependency>
       <groupId>org.apache.derby</groupId>
       <artifactId>derby</artifactId>
@@ -429,13 +430,13 @@
       <scope>runtime</scope>
     </dependency>
     <!--
-      Plexus Security Dependencies
-      -->
+    Plexus Security Dependencies
+    -->
     <dependency>
       <groupId>org.codehaus.plexus.redback</groupId>
       <artifactId>redback-xwork-content</artifactId>
       <type>war</type>
-      <scope>runtime</scope> 
+      <scope>runtime</scope>
     </dependency>
     <dependency>
       <groupId>org.codehaus.plexus.redback</groupId>
@@ -464,7 +465,7 @@
       <artifactId>geronimo-spec-jta</artifactId>
       <version>1.0.1B-rc2</version>
       <scope>provided</scope>
-    </dependency>   
+    </dependency>
     <dependency>
       <groupId>jpox</groupId>
       <artifactId>jpox</artifactId>
@@ -504,7 +505,7 @@
       <scope>provided</scope>
     </dependency>
   </dependencies>
-      <profiles>
+  <profiles>
     <profile>
       <id>postgres</id>
       <dependencies>
@@ -524,7 +525,7 @@
             </configuration>
           </plugin>
         </plugins>
-      </build>      
+      </build>
     </profile>
     <profile>
       <id>mysql</id>
Index: continuum-core/src/test/java/org/apache/maven/continuum/DerivedProjectManagerTest.java
===================================================================
--- continuum-core/src/test/java/org/apache/maven/continuum/DerivedProjectManagerTest.java	(revision 0)
+++ continuum-core/src/test/java/org/apache/maven/continuum/DerivedProjectManagerTest.java	(revision 0)
@@ -0,0 +1,309 @@
+package org.apache.maven.continuum;
+
+import org.apache.maven.continuum.model.project.Project;
+import org.apache.maven.continuum.model.project.ProjectDependency;
+import org.apache.maven.continuum.model.project.ProjectDeveloper;
+import org.apache.maven.continuum.model.project.ProjectGroup;
+import org.apache.maven.continuum.model.project.ProjectNotifier;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * User: drolsham
+ */
+
+public class DerivedProjectManagerTest
+    extends AbstractContinuumTest
+{
+    private DependencyHelper dependencyHelper;
+
+    private DerivedProjectManager derivedProjectManager;
+
+    private ProjectDependency testDependency10;
+
+    private ProjectDependency testDependency11;
+
+    private ProjectDependency testDependency20;
+
+    private ProjectDependency testDependency21;
+
+    private ProjectDependency testDependency30;
+
+    private ProjectDependency testDependency40;
+
+    private ProjectDependency testDependency41;
+
+    private ProjectDependency testDependency50;
+
+    private ProjectDependency testDependency51;
+
+    private ProjectDependency testDependency60;
+
+    private Project testProject1;
+
+    private Project testProject1b;
+
+    private Project testProject2;
+
+    private Project testProject3;
+
+    //private ContinuumStore store;
+
+    private List<ProjectDependency> newDependencies = new ArrayList<ProjectDependency>();
+
+
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+        derivedProjectManager = (DefaultDerivedProjectManager) lookup( DerivedProjectManager.ROLE );
+        dependencyHelper = (DefaultDependencyHelper) lookup( DependencyHelper.ROLE );
+        //dependentProject = DependentProject.createDependentProject();
+        //store = new SimpleContinuumStore();
+        //store = (SimpleContinuumStore) lookup( SimpleContinuumStore.ROLE, "simple");
+        //defaultDerivedProjectManager = new DefaultDerivedProjectManager(store);
+
+        ProjectGroup defaultProjectGroup = SupportUtils.createTestProjectGroup( "Default Group", "The Default Group",
+                                                                                "org.apache.maven.test.default" );
+
+        testProject1 = SupportUtils.createTestProject( "artifactId1", 1, "description1",
+                                                       defaultProjectGroup.getGroupId(), "name1", "scmUrl1", 1, "url1",
+                                                       "version1", "workingDirectory1" );
+
+        testProject1b = SupportUtils.createTestProject( "artifactId1", 1, "description1",
+                                                        defaultProjectGroup.getGroupId(), "name1", "scmUrl1", 1, "url1",
+                                                        "version1", "workingDirectory1" );
+
+        testProject2 = SupportUtils.createTestProject( "artifactId2", 2, "description2",
+                                                       defaultProjectGroup.getGroupId(), "name2", "scmUrl2", 1, "url2",
+                                                       "version2", "workingDirectory2" );
+
+        testProject3 = SupportUtils.createTestProject( "artifactId3", 3, "description3",
+                                                       defaultProjectGroup.getGroupId(), "name3", "scmUrl3", 1, "url3",
+                                                       "version3", "workingDirectory3" );
+
+        testDependency10 = SupportUtils.createTestDependency( "groupId_A", "artifactId_A", "version1.0" );
+        testDependency11 = SupportUtils.createTestDependency( "groupId_A", "artifactId_A", "version1.1" );
+        testDependency20 = SupportUtils.createTestDependency( "groupId_B", "artifactId_B", "version2.0" );
+        testDependency21 = SupportUtils.createTestDependency( "groupId_B", "artifactId_B", "version2.1" );
+        testDependency30 = SupportUtils.createTestDependency( "groupId_C", "artifactId_C", "version3.0" );
+        testDependency40 = SupportUtils.createTestDependency( "groupId_D", "artifactId_D", "version4.0" );
+        testDependency41 = SupportUtils.createTestDependency( "groupId_D", "artifactId_D", "version4.1" );
+        testDependency50 = SupportUtils.createTestDependency( "groupId_E", "artifactId_E", "version5.0" );
+        testDependency51 = SupportUtils.createTestDependency( "groupId_E", "artifactId_E", "version5.1" );
+        testDependency60 = SupportUtils.createTestDependency( "groupId_F", "artifactId_F", "version6.0" );
+
+        testDependency11.setDerived( true );
+        testDependency21.setDerived( true );
+        testDependency41.setDerived( true );
+        testDependency51.setDerived( true );
+
+        testProject1.addDependency( testDependency10 );
+        testProject1.addDependency( testDependency20 );
+        testProject1.addDependency( testDependency30 );
+        testProject1.addDependency( testDependency40 );
+        testProject1.addDependency( testDependency50 );
+        testProject1.addDependency( testDependency60 );
+
+        defaultProjectGroup.addProject( testProject1 );
+        //store.addProjectGroup(defaultProjectGroup);
+    }
+
+
+    public void testProjectSameWithDifferentDependencies()
+    {
+        testProject1b.addDependency( dependencyHelper.cloneDependency( testDependency10 ) );
+        testProject1b.addDependency( dependencyHelper.cloneDependency( testDependency20 ) );
+        testProject1b.addDependency( dependencyHelper.cloneDependency( testDependency30 ) );
+
+        assertFalse( derivedProjectManager.projectSame( testProject1, testProject1b ) );
+    }
+
+    public void testProjectSameWithAlmostIdenticalProjects()
+    {
+        testProject1b.addDependency( dependencyHelper.cloneDependency( testDependency10 ) );
+        testProject1b.addDependency( dependencyHelper.cloneDependency( testDependency20 ) );
+        testProject1b.addDependency( dependencyHelper.cloneDependency( testDependency30 ) );
+        testProject1b.addDependency( dependencyHelper.cloneDependency( testDependency40 ) );
+        testProject1b.addDependency( dependencyHelper.cloneDependency( testDependency50 ) );
+        testProject1b.addDependency( dependencyHelper.cloneDependency( testDependency60 ) );
+
+        assertTrue( derivedProjectManager.projectSame( testProject1, testProject1b ) );
+    }
+
+    public void testProjectSameWithOneModifiedDependency()
+    {
+        testProject1b.addDependency( dependencyHelper.cloneDependency( testDependency10 ) );
+        testProject1b.addDependency( dependencyHelper.cloneDependency( testDependency20 ) );
+        testProject1b.addDependency( dependencyHelper.cloneDependency( testDependency30 ) );
+        testProject1b.addDependency( dependencyHelper.cloneDependency( testDependency40 ) );
+        testProject1b.addDependency( dependencyHelper.cloneDependency( testDependency50 ) );
+
+        ProjectDependency tmp = dependencyHelper.cloneDependency( testDependency60 );
+        testProject1b.addDependency( tmp );
+
+        assertTrue( derivedProjectManager.projectSame( testProject1, testProject1b ) );
+
+        tmp.setVersion( "differentVersion" );
+        assertFalse( derivedProjectManager.projectSame( testProject1, testProject1b ) );
+    }
+
+    /*
+    public void testCreateListOfDependentProjects() throws Exception {
+        defaultDerivedProjectManager.createListOfProjects(store, testDependency11);
+        SupportUtils.assertProjectEquals(defaultDerivedProjectManager.getProjects().get(0).getOriginalProject(), testProject1);
+
+        defaultDerivedProjectManager.createListOfProjects(store, testDependency30);
+        SupportUtils.assertProjectEquals(defaultDerivedProjectManager.getProjects().get(0).getOriginalProject(), testProject1);
+
+        defaultDerivedProjectManager.createListOfProjects(store, testDependency20);
+        //System.out.println("Size: " + defaultDerivedProjectManager.getDependentProjects().size());
+        assertTrue(defaultDerivedProjectManager.getProjects().isEmpty());
+
+    }
+    */
+    /*
+    public void testProjectSameSimple() {
+        assertTrue(derivedProjectManager.projectSame(testProject1, testProject1));
+        assertFalse(derivedProjectManager.projectSame(testProject1, testProject2));
+    }
+
+    public void testProjectSameUnequalNumberOfDependencies() {
+        testProject1b.removeDependency(testDependency30);
+        assertFalse(derivedProjectManager.projectSame(testProject1, testProject1b));
+    }
+
+    public void testProjectSameWithOneModifiedDependency() {
+        List<ProjectDependency> list = new ArrayList<ProjectDependency>();
+        list.add(testDependency41);
+        Project testProject3 = defaultDerivedProjectManager.createProject(testProject1, list);
+        assertFalse(defaultDerivedProjectManager.projectSame(testProject1, testProject3));
+    }
+
+
+    public void testCreateDerivedProject() {
+        Project testDerivedProject;
+
+        List<ProjectDependency> list = new ArrayList<ProjectDependency>();
+        list.add(testDependency41);
+        testProject1.removeDependency(testDependency40);
+        testDerivedProject = derivedProjectManager.createProject(testProject1, list);
+        assertNull(testDerivedProject);
+
+        list = new ArrayList<ProjectDependency>();
+        list.add(testDependency11);
+        testDerivedProject = derivedProjectManager.createProject(testProject1, list);
+        assertNotNull(testDerivedProject);
+
+        //TODO Reference to originalProject is not available
+        //SupportUtils.assertProjectSame(testDerivedProject.getOriginalProject(), testProject1);
+    }
+    */
+
+    public void testCreateDerivedProjectsWithOneNewDependency()
+    {
+        newDependencies.add( testDependency11 );
+        DependencyHelper dependencyHelper = derivedProjectManager.getDependencyHelper();
+        assertNotNull( dependencyHelper );
+
+        List<Project> testProjects = derivedProjectManager.createDerivedProjects( testProject1, newDependencies, null );
+        assertEquals( 1, testProjects.size() );
+
+        Project derivedProject = testProjects.get( 0 );
+        ProjectDependency pd;
+        for ( Object object : derivedProject.getDependencies() )
+        {
+            pd = (ProjectDependency) object;
+            if ( dependencyHelper.dependenciesEqual( pd, testDependency11 ) )
+            {
+                assertTrue( pd.isDerived() );
+            }
+        }
+    }
+
+    public void testCreateDerivedProjectsWithTwoNewDependencies()
+    {
+        newDependencies.add( testDependency11 );
+        newDependencies.add( testDependency21 );
+
+        List<Project> testProjects = derivedProjectManager.createDerivedProjects( testProject1, newDependencies, null );
+        assertEquals( 3, testProjects.size() );
+
+        //assertDerivedPropertyOnDependencies(testProjects);
+    }
+
+    public void testCreateDerivedProjectsWithFourNewDependencies()
+    {
+        newDependencies.add( testDependency11 );
+        newDependencies.add( testDependency21 );
+        newDependencies.add( testDependency41 );
+        newDependencies.add( testDependency51 );
+
+        assertNotNull( derivedProjectManager.getDependencyHelper() );
+        List<Project> testProjects = derivedProjectManager.createDerivedProjects( testProject1, newDependencies, null );
+        assertEquals( 15, testProjects.size() );
+
+        //assertDerivedPropertyOnDependencies(testProjects);
+    }
+
+    public void testCreateDerivedProjectsWithMultipleProjectsAndMultipleNewDependencies()
+    {
+        newDependencies.add( testDependency11 );
+        newDependencies.add( testDependency21 );
+        newDependencies.add( testDependency51 );
+
+        testProject2.addDependency( testDependency10 );
+        testProject2.addDependency( testDependency30 );
+        testProject2.addDependency( testDependency40 );
+        testProject2.addDependency( testDependency50 );
+
+        testProject3.addDependency( testDependency10 );
+        testProject3.addDependency( testDependency20 );
+        testProject3.addDependency( testDependency30 );
+
+        List<Project> testProjects = derivedProjectManager.createDerivedProjects( testProject1, newDependencies, null );
+        assertEquals( 7, testProjects.size() );
+        testProjects.addAll( derivedProjectManager.createDerivedProjects( testProject2, newDependencies, null ) );
+        assertEquals( 10, testProjects.size() );
+        testProjects.addAll( derivedProjectManager.createDerivedProjects( testProject3, newDependencies, null ) );
+        assertEquals( 13, testProjects.size() );
+    }
+
+
+    public void testCloneDeveloper()
+    {
+        ProjectDeveloper testDeveloper1 = SupportUtils.createTestDeveloper( 1, "email1", "name1", "scmId1" );
+        ProjectDeveloper developer = derivedProjectManager.cloneDeveloper( testDeveloper1 );
+        SupportUtils.assertDeveloperEquals( developer, testDeveloper1 );
+    }
+
+    public void testCloneNotifier()
+    {
+        ProjectNotifier testNotifier1 = SupportUtils.createTestNotifier( 11, true, true, false, "type11" );
+        ProjectNotifier notifier = derivedProjectManager.cloneNotifier( testNotifier1 );
+        SupportUtils.assertNotifierEquals( notifier, testNotifier1 );
+    }
+
+
+    protected void tearDown()
+    {
+        testDependency10 = null;
+        testDependency11 = null;
+        testDependency20 = null;
+        testDependency21 = null;
+        testDependency30 = null;
+        testDependency40 = null;
+        testDependency41 = null;
+        testDependency50 = null;
+        testDependency51 = null;
+        testDependency60 = null;
+
+        newDependencies.clear();
+
+        testProject1 = null;
+        testProject1b = null;
+        testProject2 = null;
+    }
+
+}
Index: continuum-core/src/test/java/org/apache/maven/continuum/DependencyHelperTest.java
===================================================================
--- continuum-core/src/test/java/org/apache/maven/continuum/DependencyHelperTest.java	(revision 0)
+++ continuum-core/src/test/java/org/apache/maven/continuum/DependencyHelperTest.java	(revision 0)
@@ -0,0 +1,297 @@
+package org.apache.maven.continuum;
+/**
+ * User: drolsham
+ */
+
+import org.apache.maven.continuum.model.project.DependencyGroup;
+import org.apache.maven.continuum.model.project.ProjectDependency;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DependencyHelperTest
+    extends AbstractContinuumTest
+{
+
+    private DefaultDependencyHelper dependencyHelper;
+
+    private ProjectDependency testDependency10;
+
+    private ProjectDependency testDependency11;
+
+    private ProjectDependency testDependency12;
+
+    private ProjectDependency testDependency20;
+
+    private ProjectDependency testDependency21;
+
+    private ProjectDependency testDependency30;
+
+    private ProjectDependency testDependency40;
+
+    private ProjectDependency testDependency41;
+
+    private ProjectDependency testDependency50;
+
+    private ProjectDependency testDependency51;
+
+    private ProjectDependency testDependency60;
+
+    private ProjectDependency testDependency70;
+
+    private ProjectDependency testDependency71;
+
+    private ProjectDependency testDependency80;
+
+    private ProjectDependency testDependency81;
+
+
+    private List<ProjectDependency> originalDependencies = new ArrayList<ProjectDependency>();
+
+    ;
+
+    private List<ProjectDependency> newDependencies = new ArrayList<ProjectDependency>();
+
+    ;
+
+
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+        dependencyHelper = (DefaultDependencyHelper) lookup( DependencyHelper.ROLE );
+
+        testDependency10 = SupportUtils.createTestDependency( "groupId_A", "artifactId_A", "version1.0" );
+        testDependency11 = SupportUtils.createTestDependency( "groupId_A", "artifactId_A", "version1.1" );
+        testDependency12 = SupportUtils.createTestDependency( "groupId_A", "artifactId_A", "version1.2" );
+        testDependency20 = SupportUtils.createTestDependency( "groupId_B", "artifactId_B", "version2.0" );
+        testDependency21 = SupportUtils.createTestDependency( "groupId_B", "artifactId_B", "version2.1" );
+        testDependency30 = SupportUtils.createTestDependency( "groupId_C", "artifactId_C", "version3.0" );
+        testDependency40 = SupportUtils.createTestDependency( "groupId_D", "artifactId_D", "version4.0" );
+        testDependency41 = SupportUtils.createTestDependency( "groupId_D", "artifactId_D", "version4.1" );
+        testDependency50 = SupportUtils.createTestDependency( "groupId_E", "artifactId_E", "version5.0" );
+        testDependency51 = SupportUtils.createTestDependency( "groupId_E", "artifactId_E", "version5.1" );
+        testDependency60 = SupportUtils.createTestDependency( "groupId_F", "artifactId_F", "version6.0" );
+        testDependency70 = SupportUtils.createTestDependency( "javax.activation", "activation", "1.1" );
+        testDependency71 = SupportUtils.createTestDependency( "javax.activation", "activation", "1.1_derived" );
+        testDependency80 = SupportUtils.createTestDependency( "org.springframework", "spring-web", "2.0.2" );
+        testDependency81 = SupportUtils.createTestDependency( "org.springframework", "spring-web", "2.0.2_derived" );
+
+        originalDependencies.add( testDependency10 );
+        originalDependencies.add( testDependency20 );
+        originalDependencies.add( testDependency30 );
+        originalDependencies.add( testDependency40 );
+        originalDependencies.add( testDependency50 );
+        originalDependencies.add( testDependency60 );
+        originalDependencies.add( testDependency70 );
+        originalDependencies.add( testDependency80 );
+
+    }
+
+    public void testAssertTrue()
+    {
+        assertTrue( true );
+    }
+
+
+    public void testCleanDependencies()
+    {
+        newDependencies.add( testDependency11 );
+        List<ProjectDependency> relevantDependencies =
+            dependencyHelper.findRelevantDependencies( originalDependencies, newDependencies );
+        assertEquals( 2, relevantDependencies.size() );
+
+        dependencyHelper.findSimilarDependenciesInList( testDependency11, relevantDependencies );
+    }
+
+
+    public void testMakeDependencyGroupsWithNoDependencies()
+    {
+        List<DependencyGroup> groups = dependencyHelper.makeDependencyGroups( newDependencies );
+
+        assertEquals( 0, groups.size() );
+    }
+
+    public void testMakeDependencyGroupsWithOneDependency()
+    {
+        newDependencies.add( testDependency11 );
+        List<DependencyGroup> groups = dependencyHelper.makeDependencyGroups( newDependencies );
+
+        assertEquals( 1, groups.size() );
+        assertTrue( groups.get( 0 ).getDependencies().contains( testDependency11 ) );
+        //assertTrue(groups.get(0).contains(testDependency11));
+    }
+
+    public void testMakeDependencyGroupsWithTwoDifferentDependencies()
+    {
+        newDependencies.add( testDependency11 );
+        newDependencies.add( testDependency21 );
+        List<DependencyGroup> groups = dependencyHelper.makeDependencyGroups( newDependencies );
+
+        assertEquals( 2, groups.size() );
+    }
+
+    public void testMakeDependencyGroupsAddTwoDependenciesToSameGroup()
+    {
+        newDependencies.add( testDependency20 );
+        newDependencies.add( testDependency21 );
+        List<DependencyGroup> groups = dependencyHelper.makeDependencyGroups( newDependencies );
+
+        assertEquals( 1, groups.size() );
+
+        //assertTrue(groups.get(0).contains(testDependency20));
+        //assertTrue(groups.get(0).contains(testDependency21));
+        assertTrue( groups.get( 0 ).getDependencies().contains( testDependency20 ) );
+        assertTrue( groups.get( 0 ).getDependencies().contains( testDependency21 ) );
+    }
+
+    public void testMakeDependencyGroupsWithManyDifferentDependencies()
+    {
+        newDependencies.add( testDependency10 );
+        newDependencies.add( testDependency20 );
+        newDependencies.add( testDependency30 );
+        newDependencies.add( testDependency40 );
+        newDependencies.add( testDependency50 );
+        List<DependencyGroup> groups = dependencyHelper.makeDependencyGroups( newDependencies );
+        assertEquals( 5, groups.size() );
+
+        newDependencies.add( testDependency11 );
+        newDependencies.add( testDependency21 );
+        groups = dependencyHelper.makeDependencyGroups( newDependencies );
+        assertEquals( 5, groups.size() );
+    }
+
+
+    public void testExtractUnaffectedDependencies()
+    {
+        newDependencies.add( testDependency10 );
+        newDependencies.add( testDependency20 );
+        newDependencies.add( testDependency30 );
+
+        List<ProjectDependency> unaffectedDependencies =
+            dependencyHelper.extractUnaffectedDependencies( originalDependencies, newDependencies );
+
+        assertEquals( 5, unaffectedDependencies.size() );
+    }
+
+    public void testFindSimilarDependenciesInList()
+    {
+
+        List<ProjectDependency> similarDependencies =
+            dependencyHelper.findSimilarDependenciesInList( testDependency11, originalDependencies );
+
+        assertEquals( 2, similarDependencies.size() );
+    }
+
+
+    public void testCreateDependencyListsWithNoNewDependencies()
+    {
+        List<List<ProjectDependency>> combinations = dependencyHelper.
+            getAllDependencyCombinations( originalDependencies, newDependencies );
+
+        assertEquals( 1, combinations.size() );
+    }
+
+    public void testCreateDependencyListsWithOneNewDependency()
+    {
+        newDependencies.add( testDependency11 );
+        List<List<ProjectDependency>> combinations = dependencyHelper.
+            getAllDependencyCombinations( originalDependencies, newDependencies );
+
+        assertEquals( 2, combinations.size() );
+    }
+
+
+    public void testCreateDependencyListsWithTwoNewDependencies()
+    {
+        assertTrue( newDependencies.isEmpty() );
+        newDependencies.add( testDependency11 );
+        newDependencies.add( testDependency21 );
+        List<List<ProjectDependency>> combinations = dependencyHelper.
+            getAllDependencyCombinations( originalDependencies, newDependencies );
+
+        assertEquals( 4, combinations.size() );
+    }
+
+
+    public void testCreateDependencyListsWithTwoNewDependencies2()
+    {
+        assertTrue( newDependencies.isEmpty() );
+
+        newDependencies.add( testDependency71 );
+        newDependencies.add( testDependency81 );
+        List<List<ProjectDependency>> combinations = dependencyHelper.
+            getAllDependencyCombinations( originalDependencies, newDependencies );
+
+        assertEquals( 4, combinations.size() );
+    }
+
+
+    public void testCreateDependencyListsWithFourNewDependencies()
+    {
+        assertTrue( newDependencies.isEmpty() );
+        newDependencies.add( testDependency11 );
+        newDependencies.add( testDependency21 );
+        newDependencies.add( testDependency41 );
+        newDependencies.add( testDependency51 );
+        List<List<ProjectDependency>> combinations = dependencyHelper.
+            getAllDependencyCombinations( originalDependencies, newDependencies );
+
+        assertEquals( 16, combinations.size() );
+    }
+
+
+    public void testCreateDependencyListsWithThreeDifferentVersions()
+    {
+        assertTrue( newDependencies.isEmpty() );
+        //newDependencies.add(testDependency10);
+        newDependencies.add( testDependency11 );
+        newDependencies.add( testDependency12 );
+        newDependencies.add( testDependency21 );
+        List<List<ProjectDependency>> combinations = dependencyHelper.
+            getAllDependencyCombinations( originalDependencies, newDependencies );
+
+        assertEquals( 6, combinations.size() );   //dependency1 with version 1.0, 1.1 and 1.2 can be combined with
+        //dependency2 with version 2.0 and 2.1 => 6 combinations
+    }
+
+
+    public void testCreateNewDependencyList()
+    {
+        List<ProjectDependency> oldDependencies = new ArrayList<ProjectDependency>();
+        oldDependencies.add( testDependency10 );
+        oldDependencies.add( testDependency20 );
+
+        newDependencies = dependencyHelper.createNewDependencyList( oldDependencies, testDependency30 );
+        assertNull( newDependencies );
+
+        newDependencies = dependencyHelper.createNewDependencyList( oldDependencies, testDependency11 );
+        assertEquals( 2, newDependencies.size() );
+        assertEquals( newDependencies.get( 0 ).getVersion(), testDependency11.getVersion() );
+    }
+
+
+    public void testCloneDependency()
+    {
+        ProjectDependency dependency = dependencyHelper.cloneDependency( testDependency10 );
+        SupportUtils.assertDependencyEquals( dependency, testDependency10 );
+    }
+
+    protected void tearDown()
+        throws Exception
+    {
+        super.tearDown();
+        testDependency10 = null;
+        testDependency11 = null;
+        testDependency20 = null;
+        testDependency21 = null;
+        testDependency30 = null;
+
+        originalDependencies.clear();
+        newDependencies.clear();
+
+        dependencyHelper = null;
+
+    }
+
+}
\ No newline at end of file
Index: continuum-core/src/test/java/org/apache/maven/continuum/SupportUtils.java
===================================================================
--- continuum-core/src/test/java/org/apache/maven/continuum/SupportUtils.java	(revision 0)
+++ continuum-core/src/test/java/org/apache/maven/continuum/SupportUtils.java	(revision 0)
@@ -0,0 +1,652 @@
+package org.apache.maven.continuum;
+
+import junit.framework.TestCase;
+import org.apache.maven.continuum.model.project.BuildDefinition;
+import org.apache.maven.continuum.model.project.BuildResult;
+import org.apache.maven.continuum.model.project.Project;
+import org.apache.maven.continuum.model.project.ProjectDependency;
+import org.apache.maven.continuum.model.project.ProjectDeveloper;
+import org.apache.maven.continuum.model.project.ProjectGroup;
+import org.apache.maven.continuum.model.project.ProjectNotifier;
+import org.apache.maven.continuum.model.project.Schedule;
+import org.apache.maven.continuum.model.scm.ChangeFile;
+import org.apache.maven.continuum.model.scm.ChangeSet;
+import org.apache.maven.continuum.model.scm.ScmResult;
+import org.apache.maven.continuum.model.system.Installation;
+import org.apache.maven.continuum.model.system.Profile;
+
+import javax.jdo.JDODetachedFieldAccessException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: drolsham
+ * Date: Feb 15, 2007
+ * Time: 7:21:05 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class SupportUtils
+    extends TestCase
+{
+
+    public static BuildDefinition createTestBuildDefinition( BuildDefinition buildDefinition )
+    {
+        return createTestBuildDefinition( buildDefinition.getArguments(), buildDefinition.getBuildFile(),
+                                          buildDefinition.getGoals(), buildDefinition.getProfile(),
+                                          buildDefinition.getSchedule() );
+    }
+
+    public static BuildDefinition createTestBuildDefinition( String arguments, String buildFile, String goals,
+                                                             Profile profile, Schedule schedule )
+    {
+        BuildDefinition definition = new BuildDefinition();
+        definition.setArguments( arguments );
+        definition.setBuildFile( buildFile );
+        definition.setGoals( goals );
+        definition.setProfile( profile );
+        definition.setSchedule( schedule );
+        return definition;
+    }
+
+    public static ProjectNotifier createTestNotifier( ProjectNotifier notifier )
+    {
+        return createTestNotifier( notifier.getRecipientType(), notifier.isSendOnError(), notifier.isSendOnFailure(),
+                                   notifier.isSendOnSuccess(), notifier.getType() );
+    }
+
+    public static ProjectNotifier createTestNotifier( int recipientType, boolean sendOnError, boolean sendOnFailure,
+                                                      boolean sendOnSuccess, String type )
+    {
+        Map configuration = new HashMap();
+        configuration.put( "key1", "value1" );
+        configuration.put( "key2", "value2" );
+
+        ProjectNotifier notifier = new ProjectNotifier();
+        notifier.setConfiguration( configuration );
+        notifier.setRecipientType( recipientType );
+        notifier.setSendOnError( sendOnError );
+        notifier.setSendOnFailure( sendOnFailure );
+        notifier.setSendOnSuccess( sendOnSuccess );
+        notifier.setType( type );
+
+        return notifier;
+    }
+
+    public static ScmResult createTestScmResult( ScmResult scmResult, String base )
+    {
+        return createTestScmResult( scmResult.getCommandOutput(), scmResult.getProviderMessage(), scmResult.isSuccess(),
+                                    base );
+    }
+
+    public static ScmResult createTestScmResult( String commandOutput, String providerMessage, boolean success,
+                                                 String base )
+    {
+        ScmResult scmResult = new ScmResult();
+        scmResult.setCommandOutput( commandOutput );
+        scmResult.setProviderMessage( providerMessage );
+        scmResult.setSuccess( success );
+
+        List changes = new ArrayList();
+        changes.add( createTestChangeSet( "author" + base + ".1", "comment" + base + ".1", base + ".1" ) );
+        changes.add( createTestChangeSet( "author" + base + ".2", "comment" + base + ".2", base + ".2" ) );
+        scmResult.setChanges( changes );
+        return scmResult;
+    }
+
+    public static ChangeSet createTestChangeSet( String author, String comment, String base )
+    {
+        ChangeSet changeSet = new ChangeSet();
+        changeSet.setAuthor( author );
+        changeSet.setComment( comment );
+        changeSet.setDate( System.currentTimeMillis() );
+        List files = new ArrayList();
+        files.add( createTestChangeFile( "name" + base + ".1", "rev" + base + ".1" ) );
+        files.add( createTestChangeFile( "name" + base + ".2", "rev" + base + ".2" ) );
+        files.add( createTestChangeFile( "name" + base + ".3", "rev" + base + ".3" ) );
+        changeSet.setFiles( files );
+        return changeSet;
+    }
+
+    public static ChangeFile createTestChangeFile( String name, String revision )
+    {
+        ChangeFile changeFile = new ChangeFile();
+        changeFile.setName( name );
+        changeFile.setRevision( revision );
+        return changeFile;
+    }
+
+    public static BuildResult createTestBuildResult( BuildResult buildResult )
+    {
+        return createTestBuildResult( buildResult.getTrigger(), buildResult.isSuccess(), buildResult.getState(),
+                                      buildResult.getExitCode(), buildResult.getError(), buildResult.getBuildNumber(),
+                                      buildResult.getStartTime(), buildResult.getEndTime() );
+    }
+
+    public static BuildResult createTestBuildResult( int trigger, boolean success, int state, int exitCode,
+                                                     String error, int buildNumber, long startTime, long endTime )
+    {
+        BuildResult result = new BuildResult();
+        result.setBuildNumber( buildNumber );
+        result.setStartTime( startTime );
+        result.setEndTime( endTime );
+        result.setError( error );
+        result.setExitCode( exitCode );
+        result.setState( state );
+        result.setSuccess( success );
+        result.setTrigger( trigger );
+        return result;
+    }
+
+    /*
+    public static Installation createTestInstallation( String name, String path, String version )
+    {
+        Installation installation = new Installation();
+        installation.setName( name );
+        installation.setPath( path );
+        installation.setVersion( version );
+        return installation;
+    }
+
+    public static Installation createTestInstallation( Installation installation )
+    {
+        return createTestInstallation( installation.getName(), installation.getPath(), installation.getVersion() );
+    }
+    */
+    public static Schedule createTestSchedule( Schedule schedule )
+    {
+        return createTestSchedule( schedule.getName(), schedule.getDescription(), schedule.getDelay(),
+                                   schedule.getCronExpression(), schedule.isActive() );
+    }
+
+    public static Schedule createTestSchedule( String name, String description, int delay, String cronExpression,
+                                               boolean active )
+    {
+        Schedule schedule = new Schedule();
+        schedule.setActive( active );
+        schedule.setCronExpression( cronExpression );
+        schedule.setDelay( delay );
+        schedule.setDescription( description );
+        schedule.setName( name );
+        return schedule;
+    }
+
+    public static Profile createTestProfile( Profile profile )
+    {
+        return createTestProfile( profile.getName(), profile.getDescription(), profile.getScmMode(),
+                                  profile.isBuildWithoutChanges(), profile.isActive(), profile.getJdk(),
+                                  profile.getBuilder() );
+//                                  createTestInstallation( profile.getJdk() ),
+//                                  createTestInstallation( profile.getBuilder() ) );
+    }
+
+    public static Profile createTestProfile( String name, String description, int scmMode, boolean buildWithoutChanges,
+                                             boolean active, Installation jdk, Installation builder )
+    {
+        Profile profile = new Profile();
+        profile.setActive( active );
+        profile.setBuildWithoutChanges( buildWithoutChanges );
+        profile.setScmMode( scmMode );
+        profile.setDescription( description );
+        profile.setName( name );
+        profile.setBuilder( builder );
+        profile.setJdk( jdk );
+        return profile;
+    }
+
+    public static ProjectGroup createTestProjectGroup( ProjectGroup group )
+    {
+        return createTestProjectGroup( group.getName(), group.getDescription(), group.getGroupId() );
+    }
+
+    public static ProjectGroup createTestProjectGroup( String name, String description, String groupId )
+    {
+        ProjectGroup group = new ProjectGroup();
+        group.setName( name );
+        group.setDescription( description );
+        group.setGroupId( groupId );
+        return group;
+    }
+
+    public static Project createTestProject( Project project )
+    {
+        return createTestProject( project.getArtifactId(), project.getBuildNumber(), project.getDescription(),
+                                  project.getGroupId(), project.getName(), project.getScmUrl(), project.getState(),
+                                  project.getUrl(), project.getVersion(), project.getWorkingDirectory() );
+    }
+
+    public static Project createTestProject( String artifactId, int buildNumber, String description, String groupId,
+                                             String name, String scmUrl, int state, String url, String version,
+                                             String workingDirectory )
+    {
+        Project project = new Project();
+        project.setArtifactId( artifactId );
+        project.setBuildNumber( buildNumber );
+        project.setDescription( description );
+        project.setGroupId( groupId );
+        project.setName( name );
+        project.setScmUrl( scmUrl );
+        project.setState( state );
+        project.setUrl( url );
+        project.setVersion( version );
+        project.setWorkingDirectory( workingDirectory );
+        return project;
+    }
+
+    public static void assertProjectEquals( Project retrievedProject, Project project )
+    {
+        assertNotSame( project, retrievedProject );
+        assertProjectSame( retrievedProject, project );
+    }
+
+    //Erik lagt til
+    public static void assertProjectSame( Project retrievedProject, Project project )
+    {
+        assertEquals( "compare projects", retrievedProject, project );
+        //assertNotSame( project, retrievedProject );
+        // aggressive compare, as equals is using the identity
+        assertEquals( "compare project - name", project.getName(), retrievedProject.getName() );
+        assertEquals( "compare project - desc", project.getDescription(), retrievedProject.getDescription() );
+        assertEquals( "compare project - groupId", project.getGroupId(), retrievedProject.getGroupId() );
+        assertEquals( "compare project - artifactId", project.getArtifactId(), retrievedProject.getArtifactId() );
+        assertEquals( "compare project - buildNumber", project.getBuildNumber(), retrievedProject.getBuildNumber() );
+        assertEquals( "compare project - scmUrl", project.getScmUrl(), retrievedProject.getScmUrl() );
+        assertEquals( "compare project - state", project.getState(), retrievedProject.getState() );
+        assertEquals( "compare project - url", project.getUrl(), retrievedProject.getUrl() );
+        assertEquals( "compare project - version", project.getVersion(), retrievedProject.getVersion() );
+        assertEquals( "compare project - workingDirectory", project.getWorkingDirectory(),
+                      retrievedProject.getWorkingDirectory() );
+    }
+
+
+    public static void assertProjectGroupEquals( ProjectGroup retrievedGroup, ProjectGroup group )
+    {
+        assertEquals( "compare project groups", retrievedGroup, group );
+        assertNotSame( group, retrievedGroup );
+        // aggressive compare, as equals is using the identity
+        assertEquals( "compare project groups - name", group.getName(), retrievedGroup.getName() );
+        assertEquals( "compare project groups - desc", group.getDescription(), retrievedGroup.getDescription() );
+        assertEquals( "compare project groups - groupId", group.getGroupId(), retrievedGroup.getGroupId() );
+    }
+
+    public static void checkProjectGroupDefaultFetchGroup( ProjectGroup retrievedGroup )
+    {
+        try
+        {
+            retrievedGroup.getBuildDefinitions();
+            fail( "buildDefinitions should not be in the default fetch group" );
+        }
+        catch ( JDODetachedFieldAccessException expected )
+        {
+            assertTrue( true );
+        }
+
+        try
+        {
+            retrievedGroup.getNotifiers();
+            fail( "notifiers should not be in the default fetch group" );
+        }
+        catch ( JDODetachedFieldAccessException expected )
+        {
+            assertTrue( true );
+        }
+    }
+
+    public static void checkProjectDefaultFetchGroup( Project project )
+    {
+        checkProjectFetchGroup( project, false, false, false, false );
+    }
+
+    public static void checkProjectFetchGroup( Project project, boolean checkoutFetchGroup,
+                                               boolean buildResultsFetchGroup, boolean detailsFetchGroup,
+                                               boolean fineDetailsFetchGroup )
+    {
+        if ( !fineDetailsFetchGroup )
+        {
+            try
+            {
+                project.getDevelopers();
+
+                fail( "developers should not be in the default fetch group" );
+            }
+            catch ( JDODetachedFieldAccessException expected )
+            {
+                assertTrue( true );
+            }
+
+            try
+            {
+                project.getDependencies();
+
+                fail( "dependencies should be in the default fetch group" );
+            }
+            catch ( JDODetachedFieldAccessException expected )
+            {
+            }
+        }
+
+        if ( !detailsFetchGroup )
+        {
+            try
+            {
+                project.getNotifiers();
+
+                fail( "notifiers should not be in the default fetch group" );
+            }
+            catch ( JDODetachedFieldAccessException expected )
+            {
+                assertTrue( true );
+            }
+
+            try
+            {
+                project.getBuildDefinitions();
+
+                fail( "buildDefinitions should not be in the default fetch group" );
+            }
+            catch ( JDODetachedFieldAccessException expected )
+            {
+                assertTrue( true );
+            }
+        }
+
+        if ( !checkoutFetchGroup )
+        {
+            try
+            {
+                project.getCheckoutResult();
+
+                fail( "checkoutResult should not be in the fetch group" );
+            }
+            catch ( JDODetachedFieldAccessException expected )
+            {
+                assertTrue( true );
+            }
+        }
+
+        if ( !buildResultsFetchGroup )
+        {
+            try
+            {
+                project.getBuildResults();
+
+                fail( "buildResults should not be in the default fetch group" );
+            }
+            catch ( JDODetachedFieldAccessException expected )
+            {
+                assertTrue( true );
+            }
+        }
+    }
+
+    public static void checkBuildResultDefaultFetchGroup( BuildResult buildResult )
+    {
+        try
+        {
+            buildResult.getScmResult();
+
+            fail( "scmResult should not be in the default fetch group" );
+        }
+        catch ( JDODetachedFieldAccessException expected )
+        {
+            assertTrue( true );
+        }
+        // TODO: artifacts
+        // TODO: report
+        // TODO: long error data
+    }
+
+    public static void assertScheduleEquals( Schedule retrievedSchedule, Schedule schedule )
+    {
+        assertNotSame( schedule, retrievedSchedule );
+        assertEquals( "compare schedule - id", schedule.getId(), retrievedSchedule.getId() );
+        assertEquals( "compare schedule - name", schedule.getName(), retrievedSchedule.getName() );
+        assertEquals( "compare schedule - desc", schedule.getDescription(), retrievedSchedule.getDescription() );
+        assertEquals( "compare schedule - delay", schedule.getDelay(), retrievedSchedule.getDelay() );
+        assertEquals( "compare schedule - cron", schedule.getCronExpression(), retrievedSchedule.getCronExpression() );
+        assertEquals( "compare schedule - active", schedule.isActive(), retrievedSchedule.isActive() );
+    }
+
+    public static void assertProfileEquals( Profile retrievedProfile, Profile profile )
+    {
+        assertNotSame( profile, retrievedProfile );
+        assertEquals( "compare profile - name", profile.getName(), retrievedProfile.getName() );
+        assertEquals( "compare profile - desc", profile.getDescription(), retrievedProfile.getDescription() );
+        assertEquals( "compare profile - scmMode", profile.getScmMode(), retrievedProfile.getScmMode() );
+        assertEquals( "compare profile - build w/o changes", profile.isBuildWithoutChanges(),
+                      retrievedProfile.isBuildWithoutChanges() );
+        assertEquals( "compare profile - active", profile.isActive(), retrievedProfile.isActive() );
+    }
+
+    /*
+    public static void assertInstallationEquals( Installation retrievedInstallation, Installation installation )
+    {
+        assertEquals( "compare installation - name", installation.getName(), retrievedInstallation.getName() );
+        assertEquals( "compare installation - path", installation.getPath(), retrievedInstallation.getPath() );
+        assertEquals( "compare installation - version", installation.getVersion(), retrievedInstallation.getVersion() );
+    }
+    */
+    public static void assertBuildResultEquals( BuildResult retrievedBuildResult, BuildResult buildResult )
+    {
+        assertEquals( "compare build result - build #", buildResult.getBuildNumber(),
+                      retrievedBuildResult.getBuildNumber() );
+        assertEquals( "compare build result - end time", buildResult.getEndTime(), retrievedBuildResult.getEndTime() );
+        assertEquals( "compare build result - error", buildResult.getError(), retrievedBuildResult.getError() );
+        assertEquals( "compare build result - exit code", buildResult.getExitCode(),
+                      retrievedBuildResult.getExitCode() );
+        assertEquals( "compare build result - start time", buildResult.getStartTime(),
+                      retrievedBuildResult.getStartTime() );
+        assertEquals( "compare build result - state", buildResult.getState(), retrievedBuildResult.getState() );
+        assertEquals( "compare build result - trigger", buildResult.getTrigger(), retrievedBuildResult.getTrigger() );
+    }
+
+    public static void assertScmResultEquals( ScmResult retrievedScmResult, ScmResult scmResult )
+    {
+        assertEquals( "compare SCM result - output", scmResult.getCommandOutput(),
+                      retrievedScmResult.getCommandOutput() );
+        assertEquals( "compare SCM result - message", scmResult.getProviderMessage(),
+                      retrievedScmResult.getProviderMessage() );
+        assertEquals( "compare SCM result - success", scmResult.isSuccess(), retrievedScmResult.isSuccess() );
+        assertEquals( "compare SCM result - changes size", retrievedScmResult.getChanges().size(),
+                      scmResult.getChanges().size() );
+        for ( int i = 0; i < retrievedScmResult.getChanges().size(); i++ )
+        {
+            assertChangeSetEquals( (ChangeSet) retrievedScmResult.getChanges().get( i ),
+                                   (ChangeSet) scmResult.getChanges().get( i ) );
+        }
+    }
+
+    public static void assertChangeSetEquals( ChangeSet retrievedChangeSet, ChangeSet changeSet )
+    {
+        assertEquals( "compare change set result - author", changeSet.getAuthor(), retrievedChangeSet.getAuthor() );
+        assertEquals( "compare change set result - comment", changeSet.getComment(), retrievedChangeSet.getComment() );
+        //Remove this test, in some case we have a 1ms difference between two dates
+        //assertEquals( "compare change set result - date", changeSet.getDate(), retrievedChangeSet.getDate() );
+        assertEquals( "compare change set result - files size", retrievedChangeSet.getFiles().size(),
+                      changeSet.getFiles().size() );
+        for ( int i = 0; i < retrievedChangeSet.getFiles().size(); i++ )
+        {
+            assertChangeFileEquals( (ChangeFile) retrievedChangeSet.getFiles().get( i ),
+                                    (ChangeFile) changeSet.getFiles().get( i ) );
+        }
+    }
+
+    public static void assertChangeFileEquals( ChangeFile retrievedChangeFile, ChangeFile changeFile )
+    {
+        assertEquals( "compare change file result - name", retrievedChangeFile.getName(), changeFile.getName() );
+        assertEquals( "compare change file result - revision", retrievedChangeFile.getRevision(),
+                      changeFile.getRevision() );
+    }
+
+    public static void assertNotifiersEqual( List retrievedNotifiers, List notifiers )
+    {
+        for ( int i = 0; i < retrievedNotifiers.size(); i++ )
+        {
+            assertNotifierEquals( (ProjectNotifier) retrievedNotifiers.get( i ), (ProjectNotifier) notifiers.get( i ) );
+        }
+    }
+
+    public static void assertNotifierEquals( ProjectNotifier retrievedNotifier, ProjectNotifier notifier )
+    {
+        assertEquals( "compare notifier - recipient type", notifier.getRecipientType(),
+                      retrievedNotifier.getRecipientType() );
+        assertEquals( "compare notifier - type", notifier.getType(), retrievedNotifier.getType() );
+        assertEquals( "compare notifier - configuration", notifier.getConfiguration(),
+                      retrievedNotifier.getConfiguration() );
+        assertEquals( "compare notifier - send on success", notifier.isSendOnSuccess(),
+                      retrievedNotifier.isSendOnSuccess() );
+        assertEquals( "compare notifier - send on failure", notifier.isSendOnFailure(),
+                      retrievedNotifier.isSendOnFailure() );
+        assertEquals( "compare notifier - send on error", notifier.isSendOnError(), retrievedNotifier.isSendOnError() );
+    }
+
+    public static void assertBuildDefinitionsEqual( List retrievedBuildDefinitions, List buildDefinitions )
+    {
+        for ( int i = 0; i < retrievedBuildDefinitions.size(); i++ )
+        {
+            BuildDefinition retrievedBuildDefinition = (BuildDefinition) retrievedBuildDefinitions.get( i );
+            BuildDefinition buildDefinition = (BuildDefinition) buildDefinitions.get( i );
+            assertBuildDefinitionEquals( retrievedBuildDefinition, buildDefinition );
+            assertScheduleEquals( retrievedBuildDefinition.getSchedule(), buildDefinition.getSchedule() );
+            assertProfileEquals( retrievedBuildDefinition.getProfile(), buildDefinition.getProfile() );
+        }
+    }
+
+    public static void assertBuildDefinitionEquals( BuildDefinition retrievedBuildDefinition,
+                                                    BuildDefinition buildDefinition )
+    {
+        assertEquals( "compare build definition - arguments", buildDefinition.getArguments(),
+                      retrievedBuildDefinition.getArguments() );
+        assertEquals( "compare build definition - build file", buildDefinition.getBuildFile(),
+                      retrievedBuildDefinition.getBuildFile() );
+        assertEquals( "compare build definition - goals", buildDefinition.getGoals(),
+                      retrievedBuildDefinition.getGoals() );
+    }
+
+    public static void assertDevelopersEqual( List retrievedDevelopers, List developers )
+    {
+        for ( int i = 0; i < retrievedDevelopers.size(); i++ )
+        {
+            assertDeveloperEquals( (ProjectDeveloper) retrievedDevelopers.get( i ),
+                                   (ProjectDeveloper) developers.get( i ) );
+        }
+    }
+
+    public static void assertDeveloperEquals( ProjectDeveloper retrievedDeveloper, ProjectDeveloper developer )
+    {
+        assertEquals( "compare developer - name", developer.getName(), retrievedDeveloper.getName() );
+        assertEquals( "compare developer - email", developer.getEmail(), retrievedDeveloper.getEmail() );
+        assertEquals( "compare developer - scmId", developer.getScmId(), retrievedDeveloper.getScmId() );
+        assertEquals( "compare developer - continuumId", developer.getContinuumId(),
+                      retrievedDeveloper.getContinuumId() );
+    }
+
+    public static void assertDependenciesEqual( List retrievedDependencies, List dependencies )
+    {
+        for ( int i = 0; i < retrievedDependencies.size(); i++ )
+        {
+            assertDependencyEquals( (ProjectDependency) retrievedDependencies.get( i ),
+                                    (ProjectDependency) dependencies.get( i ) );
+        }
+    }
+
+    public static void assertDependencyEquals( ProjectDependency retrievedDependency, ProjectDependency dependency )
+    {
+        assertEquals( "compare dependency - groupId", dependency.getGroupId(), retrievedDependency.getGroupId() );
+        assertEquals( "compare dependency - artifactId", dependency.getArtifactId(),
+                      retrievedDependency.getArtifactId() );
+        assertEquals( "compare dependency - version", dependency.getVersion(), retrievedDependency.getVersion() );
+    }
+
+    public static ProjectDependency createTestDependency( ProjectDependency dependency )
+    {
+        return createTestDependency( dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion() );
+    }
+
+    public static ProjectDeveloper createTestDeveloper( ProjectDeveloper developer )
+    {
+        return createTestDeveloper( developer.getContinuumId(), developer.getEmail(), developer.getName(),
+                                    developer.getScmId() );
+    }
+
+    public static ProjectDependency createTestDependency( String groupId, String artifactId, String version )
+    {
+        ProjectDependency dependency = new ProjectDependency();
+        dependency.setArtifactId( artifactId );
+        dependency.setGroupId( groupId );
+        dependency.setVersion( version );
+        return dependency;
+    }
+
+    public static ProjectDeveloper createTestDeveloper( int continuumId, String email, String name, String scmId )
+    {
+        ProjectDeveloper developer = new ProjectDeveloper();
+        developer.setContinuumId( continuumId );
+        developer.setEmail( email );
+        developer.setName( name );
+        developer.setScmId( scmId );
+        return developer;
+    }
+
+    /**
+     * Setup JDO Factory
+     *
+     * @todo push down to a Jdo specific test
+     */
+    /*
+        public ContinuumStore createStore()
+            throws Exception
+        {
+            ConfigurableJdoFactory jdoFactory = (ConfigurableJdoFactory) lookup( JdoFactory.ROLE );
+            assertEquals( DefaultConfigurableJdoFactory.class.getName(), jdoFactory.getClass().getName() );
+
+            jdoFactory.setPersistenceManagerFactoryClass( "org.jpox.PersistenceManagerFactoryImpl" );
+
+            // TODO: add ability to test with various
+            jdoFactory.setDriverName( "org.hsqldb.jdbcDriver" );
+
+            jdoFactory.setUrl( "jdbc:hsqldb:mem:" + getName() );
+
+            jdoFactory.setUserName( "sa" );
+
+            jdoFactory.setPassword( "" );
+
+            jdoFactory.setProperty( "org.jpox.transactionIsolation", "READ_UNCOMMITTED" );
+
+            jdoFactory.setProperty( "org.jpox.poid.transactionIsolation", "READ_UNCOMMITTED" );
+
+            jdoFactory.setProperty( "org.jpox.autoCreateSchema", "true" );
+
+            Properties properties = jdoFactory.getProperties();
+
+            for ( Iterator it = properties.entrySet().iterator(); it.hasNext(); )
+            {
+                Map.Entry entry = (Map.Entry) it.next();
+
+                System.setProperty( (String) entry.getKey(), (String) entry.getValue() );
+            }
+
+            //  /home/drolsham/dev/continuum/ed/continuum-model/target/classes/org/apache/maven/continuum/model
+            //URL[] classFiles = new URL[]{getClass().getResource( "/org/apache/maven/continuum/model/project" )};
+
+            URL[] jdoFiles = new URL[]{getClass().getResource( "/META-INF/package.jdo" )};
+            URL[] classFiles = new URL[] {};
+            SchemaTool.createSchemaTables(jdoFiles, classFiles, null, false, null );
+            //SchemaTool.createSchemaTables( new URL[]{getClass().getResource( "/META-INF/package.jdo" )}, new URL[] {}, null, false, null );
+
+            PersistenceManagerFactory pmf = jdoFactory.getPersistenceManagerFactory();
+
+            assertNotNull( pmf );
+
+            PersistenceManager pm = pmf.getPersistenceManager();
+
+            pm.close();
+
+            return (ContinuumStore) lookup( ContinuumStore.ROLE );
+        }
+    }
+    */
+
+}
Index: continuum-core/src/main/java/org/apache/maven/continuum/core/action/ExecuteBuilderContinuumAction.java
===================================================================
--- continuum-core/src/main/java/org/apache/maven/continuum/core/action/ExecuteBuilderContinuumAction.java	(revision 574298)
+++ continuum-core/src/main/java/org/apache/maven/continuum/core/action/ExecuteBuilderContinuumAction.java	(working copy)
@@ -76,6 +76,9 @@
 
         Project project = getProject( context );
 
+        //erik - hack to fetch all dependencies before buildExecutor is called.
+        project = store.getProjectWithAllDetails( project.getId() );
+
         BuildDefinition buildDefinition = getBuildDefinition( context );
 
         int trigger = getTrigger( context );
@@ -162,7 +165,7 @@
 
             project.setLatestBuildId( buildResult.getId() );
 
-            buildResult.setBuildDefinition( buildDefinition);
+            buildResult.setBuildDefinition( buildDefinition );
 
             buildResult.setBuildNumber( project.getBuildNumber() );
 
Index: continuum-core/src/main/java/org/apache/maven/continuum/DefaultDerivedProjectManager.java
===================================================================
--- continuum-core/src/main/java/org/apache/maven/continuum/DefaultDerivedProjectManager.java	(revision 0)
+++ continuum-core/src/main/java/org/apache/maven/continuum/DefaultDerivedProjectManager.java	(revision 0)
@@ -0,0 +1,371 @@
+package org.apache.maven.continuum;
+
+import org.apache.maven.continuum.model.project.BuildDefinition;
+import org.apache.maven.continuum.model.project.Project;
+import org.apache.maven.continuum.model.project.ProjectDependency;
+import org.apache.maven.continuum.model.project.ProjectDeveloper;
+import org.apache.maven.continuum.model.project.ProjectNotifier;
+import org.apache.maven.continuum.store.ContinuumStore;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+import org.codehaus.plexus.logging.Logger;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * @author Erik Drolshammer
+ * @plexus.component role="org.apache.maven.continuum.DerivedProjectManager"
+ */
+public class DefaultDerivedProjectManager
+    extends AbstractLogEnabled
+    implements DerivedProjectManager
+{
+
+    /**
+     * @plexus.requirement role="org.apache.maven.continuum.DependencyHelper"
+     */
+    private DependencyHelper dependencyHelper;
+
+    /*
+     * @plexus.requirement
+     */
+    //private ContinuumStore store;
+
+    /*
+    public DefaultDerivedProjectManager(ContinuumStore store) {
+        this.store = store;
+        //this.dependencyHelper = new DefaultDependencyHelper();
+    }
+    */
+
+    public boolean projectExist( Project project, ContinuumStore store )
+    {
+        List<Project> projects = store.getAllProjectsWithAllDetails();
+        for ( Project element : projects )
+        {
+            if ( projectSame( project, element ) )
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    //http://svn.apache.org/repos/asf/maven/components/trunk/maven-model/src/main/mdo/maven.mdo
+    public List<Project> createDerivedProjects( final Project originalProject, List<ProjectDependency> newDependencies,
+                                                ContinuumStore store )
+    {
+
+        return updateDerivedProjects( originalProject, newDependencies, null, store );
+    }
+
+    public List<Project> updateDerivedProjects( final Project originalProject, List<ProjectDependency> newDependencies,
+                                                List<Project> derivedProjects, ContinuumStore store )
+    {
+
+        List<Project> result = new ArrayList<Project>();
+
+        List<List<ProjectDependency>> allCombinations = dependencyHelper.
+            getAllDependencyCombinations( originalProject.getDependencies(), newDependencies );
+
+        Project derivedProject;
+        for ( int i = 0; i < allCombinations.size(); i++ )
+        {
+            List<ProjectDependency> aCombination = allCombinations.get( i );
+
+            derivedProject = findProjectWithSameDependencies( derivedProjects, aCombination );
+            if ( derivedProject == null )
+            {
+                derivedProject = new Project();
+                //TODO need the reference to the originalProject
+                //derivedProject.setOriginalProject(originalProject);
+                //getLogger().info("a new derivedProject was created");
+                copyAttributesFromOriginalProject( originalProject, derivedProject );
+                derivedProject.setDependencies( aCombination );
+
+                printProjectInfo( getLogger(), derivedProject );
+
+                if ( !projectSame( originalProject, derivedProject ) )
+                {
+                    getLogger().debug( "version before: " + derivedProject.getVersion() );
+                    derivedProject.setVersion( derivedProject.getVersion() + "-" + i );
+                    getLogger().debug( "version after: " + derivedProject.getVersion() );
+                    derivedProject.setDerived( true );
+                    result.add( derivedProject );
+                    getLogger().info( "Derived project added." );
+                    printProjectInfo( getLogger(), derivedProject );
+                }
+                else
+                {
+                    getLogger().info(
+                        "The original project has this combination of dependencies. No new project added." );
+                    derivedProject = null;
+                    //derivedProject.setDerived(false); //a project with the same dependencies already exists. 
+                }
+            }
+            else
+            {
+                getLogger().info( "Derived project with same dependencies already exist" );
+            }
+        }
+        return result;
+    }
+
+
+    protected Project findProjectWithSameDependencies( List<Project> projects, List<ProjectDependency> dependencies )
+    {
+
+        if ( projects != null )
+        {
+            for ( Project project : projects )
+            {
+                if ( project.getDependencies().contains( dependencies ) &&
+                    dependencies.contains( project.getDependencies() ) )
+                {
+
+                    return project;
+                }
+            }
+        }
+        return null;
+    }
+
+    public void copyAttributesFromOriginalProject( Project originalProject, Project project )
+    {
+        project.setGroupId( originalProject.getGroupId() );
+        project.setArtifactId( originalProject.getArtifactId() );
+        project.setExecutorId( originalProject.getExecutorId() );
+        project.setName( originalProject.getName() );
+        project.setDescription( originalProject.getDescription() );
+        project.setVersion( originalProject.getVersion() );
+
+        project.setWorkingDirectory( originalProject.getWorkingDirectory() );
+        project.setUrl( originalProject.getUrl() );
+        project.setScmUrl( originalProject.getScmUrl() );
+        project.setScmTag( originalProject.getScmTag() );
+        project.setScmUsername( originalProject.getScmUsername() );
+        project.setScmPassword( originalProject.getScmPassword() );
+
+        List<ProjectDeveloper> developers = new ArrayList<ProjectDeveloper>();
+        List originalDevelopers = originalProject.getDevelopers();
+        ProjectDeveloper developer;
+        for ( int i = 0; i < originalDevelopers.size(); i++ )
+        {
+            developer = (ProjectDeveloper) originalDevelopers.get( i );
+            developers.add( cloneDeveloper( developer ) );
+        }
+        project.setDevelopers( developers );
+
+        List<ProjectNotifier> notifiers = new ArrayList<ProjectNotifier>();
+        List<ProjectNotifier> originalNotifiers = originalProject.getNotifiers();
+        for ( ProjectNotifier element : originalNotifiers )
+        {
+            notifiers.add( cloneNotifier( element ) );
+        }
+        project.setNotifiers( notifiers );
+
+        List<BuildDefinition> buildDefinitions = new ArrayList<BuildDefinition>();
+        List<BuildDefinition> originalBuildDefinitions = originalProject.getBuildDefinitions();
+        for ( BuildDefinition element : originalBuildDefinitions )
+        {
+            buildDefinitions.add( cloneBuildDefinition( element ) );
+        }
+        project.setBuildDefinitions( buildDefinitions );
+
+        ProjectDependency parent = originalProject.getParent();
+        if ( parent != null )
+        {
+            project.setParent( dependencyHelper.cloneDependency( parent ) );
+        }
+
+        // TODO are these relevant to copy? 
+//        project.setCheckoutResult(originalProject.getCheckoutResult());
+//        project.setProjectGroup(originalProject.getProjectGroup());
+
+        //Not applicable
+        //project.setBuildResults(originalProject.getBuildResults());
+        //project.setState(originalProject.getState());
+        //project.setOldState(originalProject.getOldState());
+        //project.setLatestBuildId(originalProject.getLatestBuildId());
+        //project.setBuildNumber(originalProject.getBuildNumber());
+        //project.setId(id);
+        //project.setDependencies(originalProject.getDependencies());
+    }
+
+
+    public boolean projectSame( Project project1, Project project2 )
+    {
+        boolean result = true;
+
+        if ( !( project1.getGroupId().equals( project2.getGroupId() ) ) )
+        {
+            return false;
+        }
+        if ( !( project1.getArtifactId().equals( project2.getArtifactId() ) ) )
+        {
+            return false;
+        }
+        if ( !( project1.getVersion().equals( project2.getVersion() ) ) )
+        {
+            return false;
+        }
+        if ( !( project1.getScmUrl().equals( project2.getScmUrl() ) ) )
+        {
+            return false;
+        }
+        //getLogger().info("So far the two projects seem the same.");
+
+        List<ProjectDependency> dependencies1 = project1.getDependencies();
+        List<ProjectDependency> dependencies2 = project2.getDependencies();
+        if ( dependencies1.size() != dependencies2.size() )
+        {
+            getLogger().info( "The dependencylists are not equally long." );
+            return false;
+        }
+
+        ProjectDependency projectDependency1;
+        ProjectDependency projectDependency2;
+        boolean equal = false;
+        for ( Object element1 : dependencies1 )
+        {
+            projectDependency1 = (ProjectDependency) element1;
+
+            for ( Object element2 : dependencies2 )
+            {
+                projectDependency2 = (ProjectDependency) element2;
+
+                if ( projectDependency1.getGroupId().equals( projectDependency2.getGroupId() ) &&
+                    projectDependency1.getArtifactId().equals( projectDependency2.getArtifactId() ) &&
+                    projectDependency1.getVersion().equals( projectDependency2.getVersion() ) )
+                {
+
+                    equal = true;
+                }
+            }
+            if ( !equal )
+            {
+                return false;
+            }
+            equal = false;
+        }
+        return result;
+    }
+
+
+    public ProjectDeveloper cloneDeveloper( ProjectDeveloper developer )
+    {
+        ProjectDeveloper result = new ProjectDeveloper();
+        result.setContinuumId( developer.getContinuumId() );
+        result.setEmail( developer.getEmail() );
+        result.setModelEncoding( developer.getModelEncoding() );
+        result.setName( developer.getName() );
+        result.setScmId( developer.getScmId() );
+        return result;
+    }
+
+    public ProjectNotifier cloneNotifier( ProjectNotifier notifier )
+    {
+        ProjectNotifier result = new ProjectNotifier();
+        result.setConfiguration( notifier.getConfiguration() );
+        result.setFrom( notifier.getFrom() );
+        result.setModelEncoding( notifier.getModelEncoding() );
+        result.setRecipientType( notifier.getRecipientType() );
+        result.setType( notifier.getType() );
+        result.setSendOnSuccess( notifier.isSendOnSuccess() );
+        result.setSendOnFailure( notifier.isSendOnFailure() );
+        result.setSendOnWarning( notifier.isSendOnWarning() );
+        result.setSendOnError( notifier.isSendOnError() );
+        return result;
+    }
+
+    public BuildDefinition cloneBuildDefinition( BuildDefinition buildDefinition )
+    {
+        BuildDefinition result = new BuildDefinition();
+        result.setArguments( buildDefinition.getArguments() );
+        result.setBuildFile( buildDefinition.getBuildFile() );
+        result.setGoals( buildDefinition.getGoals() );
+        //todo erik
+        //result.setLatestBuildId(buildDefinition.getLatestBuildId());
+        result.setModelEncoding( buildDefinition.getModelEncoding() );
+        result.setProfile( buildDefinition.getProfile() );
+        result.setSchedule( buildDefinition.getSchedule() );
+        result.setDefaultForProject( buildDefinition.isDefaultForProject() );
+        return result;
+    }
+
+    public void printProjectInfo( Logger logger, final Project project )
+    {
+        if ( project == null )
+        {
+            System.out.println( "project was null..." );
+            return;
+        }
+        if ( logger == null )
+        {
+            logger = getLogger();
+        }
+
+        logger.debug( "projectId: " + project.getId() );
+        logger.debug( "projectName: " + project.getName() );
+        logger.debug( "groupId: " + project.getGroupId() );
+        logger.debug( "ArtifactId: " + project.getArtifactId() );
+        logger.info( "Version: " + project.getVersion() );
+        logger.info( "Derived: " + project.isDerived() );
+        //logger.debug("Description: " + project.getDescription());
+
+        List<ProjectDependency> dependencies = project.getDependencies();
+        if ( dependencies.size() > 0 )
+        {
+            logger.debug( "=== #" + dependencies.size() + " dependencies ===" );
+            //logger.info("");
+            /*
+            for (ProjectDependency dependency : dependencies) {
+                logger.debug(dependency.getGroupId() + ":"
+                        + dependency.getArtifactId()
+                        + ":" + dependency.getVersion()
+                        + " - derived=" + dependency.isDerived());
+                                
+            }
+            */
+        }
+        else
+        {
+            logger.debug( "No dependencies was set" );
+        }
+        logger.debug( "" );
+
+        List<BuildDefinition> buildDefinitions = project.getBuildDefinitions();
+        logger.debug( "# of buildDefinitions: " + buildDefinitions.size() );
+        //logger.debug("===BuildDefinitions=== ");
+        for ( BuildDefinition element : buildDefinitions )
+        {
+            logger.debug( "ID: " + element.getId() + " isDefault: " + element.isDefaultForProject() + " goals: " +
+                element.getGoals() + " buildFile: " + element.getBuildFile() );
+        }
+    }
+
+    public void printInfoForAllProjects( Logger logger, ContinuumStore store )
+    {
+        if ( logger == null )
+        {
+            logger = getLogger();
+        }
+        List<Project> projects = store.getAllProjectsWithAllDetails();
+        Project element;
+        logger.debug( "" );
+        logger.debug( "Looping through all projects in store. Size=" + projects.size() );
+        logger.debug( "" );
+        for ( int i = 0; i < projects.size(); i++ )
+        {
+            //getLogger().info("Project nr " + i);
+            element = (Project) projects.get( i );
+            printProjectInfo( logger, element );
+        }
+    }
+
+    public DependencyHelper getDependencyHelper()
+    {
+        return dependencyHelper;
+    }
+}
Index: continuum-core/src/main/java/org/apache/maven/continuum/utils/shell/FileIO.java
===================================================================
--- continuum-core/src/main/java/org/apache/maven/continuum/utils/shell/FileIO.java	(revision 0)
+++ continuum-core/src/main/java/org/apache/maven/continuum/utils/shell/FileIO.java	(revision 0)
@@ -0,0 +1,154 @@
+package org.apache.maven.continuum.utils.shell;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+/**
+ * User: drolsham
+ */
+public class FileIO
+{
+
+
+    public static void copy( String fromFileName, String toFileName )
+        throws IOException
+    {
+        File fromFile = new File( fromFileName );
+        File toFile = new File( toFileName );
+
+        //System.out.println("fromFile_absoluteFile: " + fromFile.getAbsoluteFile());
+        //System.out.println("fromFile_absolutePath: " + fromFile.getAbsolutePath());
+
+        if ( !fromFile.exists() )
+        {
+            throw new IOException( "FileCopy: " + "no such source file: " + fromFileName );
+        }
+        if ( !fromFile.isFile() )
+        {
+            throw new IOException( "FileCopy: " + "can't copy directory: " + fromFileName );
+        }
+        if ( !fromFile.canRead() )
+        {
+            throw new IOException( "FileCopy: " + "source file is unreadable: " + fromFileName );
+        }
+
+        if ( toFile.isDirectory() )
+        {
+            toFile = new File( toFile, fromFile.getName() );
+        }
+
+        if ( toFile.exists() )
+        {
+            if ( !toFile.canWrite() )
+            {
+                throw new IOException( "FileCopy: " + "destination file is unwriteable: " + toFileName );
+            }
+        }
+        else
+        {
+            String parent = toFile.getParent();
+            if ( parent == null )
+            {
+                parent = System.getProperty( "user.dir" );
+            }
+            File dir = new File( parent );
+            if ( !dir.exists() )
+            {
+                throw new IOException( "FileCopy: " + "destination directory doesn't exist: " + parent );
+            }
+            if ( dir.isFile() )
+            {
+                throw new IOException( "FileCopy: " + "destination is not a directory: " + parent );
+            }
+            if ( !dir.canWrite() )
+            {
+                throw new IOException( "FileCopy: " + "destination directory is unwriteable: " + parent );
+            }
+        }
+
+        FileInputStream from = null;
+        FileOutputStream to = null;
+        try
+        {
+            from = new FileInputStream( fromFile );
+            to = new FileOutputStream( toFile );
+            byte[] buffer = new byte[4096];
+            int bytesRead;
+
+            while ( ( bytesRead = from.read( buffer ) ) != -1 )
+            {
+                to.write( buffer, 0, bytesRead ); // write
+            }
+        }
+        finally
+        {
+            if ( from != null )
+            {
+                try
+                {
+                    from.close();
+                }
+                catch ( IOException e )
+                {
+                    ;
+                }
+            }
+            if ( to != null )
+            {
+                try
+                {
+                    to.close();
+                }
+                catch ( IOException e )
+                {
+                    ;
+                }
+            }
+        }
+    }
+
+
+    public static void delete( String fileName )
+        throws IOException
+    {
+        File file = new File( fileName );
+
+        if ( !file.exists() )
+        {
+            throw new IllegalArgumentException( "Delete: no such file or directory: " + fileName );
+        }
+        if ( !file.canWrite() )
+        {
+            throw new IllegalArgumentException( "Delete: write protected: " + fileName );
+        }
+        if ( file.isDirectory() )
+        {
+            String[] files = file.list();
+            if ( files.length > 0 )
+            {
+                throw new IllegalArgumentException( "Delete: directory not empty: " + fileName );
+            }
+        }
+
+        boolean success = file.delete();
+        if ( success )
+        {
+            System.out.println( "File " + file.getAbsolutePath() + " was deleted" );
+        }
+        else
+        {
+            throw new IllegalArgumentException( "Delete: deletion failed" );
+        }
+    }
+
+    public static void move( String fromFileName, String toFileName )
+        throws IOException
+    {
+        copy( fromFileName, toFileName );
+        delete( fromFileName );
+    }
+
+
+}
Index: continuum-core/src/main/java/org/apache/maven/continuum/execution/maven/m2/MavenTwoBuildExecutor.java
===================================================================
--- continuum-core/src/main/java/org/apache/maven/continuum/execution/maven/m2/MavenTwoBuildExecutor.java	(revision 574298)
+++ continuum-core/src/main/java/org/apache/maven/continuum/execution/maven/m2/MavenTwoBuildExecutor.java	(working copy)
@@ -36,6 +36,8 @@
 import org.apache.maven.continuum.model.system.Installation;
 import org.apache.maven.continuum.model.system.Profile;
 import org.apache.maven.continuum.project.builder.ContinuumProjectBuildingResult;
+import org.apache.maven.continuum.utils.shell.FileIO;
+import org.apache.maven.model.Dependency;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectHelper;
 import org.apache.maven.project.artifact.ProjectArtifactMetadata;
@@ -46,10 +48,13 @@
 import org.codehaus.plexus.util.xml.pull.XmlPullParser;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 
+import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileReader;
+import java.io.FileWriter;
 import java.io.IOException;
+import java.io.PrintWriter;
 import java.text.NumberFormat;
 import java.text.ParseException;
 import java.util.ArrayList;
@@ -91,10 +96,10 @@
      * @plexus.requirement
      */
     private MavenProjectHelper projectHelper;
-    
+
     /**
      * @plexus.requirement
-     */    
+     */
     private ConfigurationService configurationService;
 
     // ----------------------------------------------------------------------
@@ -145,12 +150,137 @@
             setResolveExecutable( false );
         }
 
-        return executeShellCommand( project, executable, arguments.toString(), buildOutput, environments );
+        //Erik
+        ContinuumBuildExecutionResult result = null;
+        try
+        {
+            if ( project.isDerived() )
+            {
+                result = buildDerivedMavenProject( project, executable, arguments, buildOutput, environments );
+            }
+            else
+            {
+                getLogger().info( "This is not a derived project, so no copying is performed" );
+                //result = executeShellCommand( project, executable, arguments, buildOutput );
+                return executeShellCommand( project, executable, arguments.toString(), buildOutput, environments );
+            }
+        }
+        catch ( IOException e )
+        {
+            e.printStackTrace();
+            //getLogger().error("FileIO failed, so no derived project was built.");
+        }
+        catch ( MavenBuilderHelperException e )
+        {
+            e.printStackTrace();
+            getLogger().error( "builderHelper failed to create MavenProject" );
+        }
+        return result;
     }
 
+    //Erik
+    private ContinuumBuildExecutionResult buildDerivedMavenProject( Project project, String executable,
+                                                                    StringBuffer arguments, File buildOutput,
+                                                                    Map<String, String> environments )
+        throws IOException, MavenBuilderHelperException, ContinuumBuildExecutorException
+    {
+        //Erik
+        PrintWriter out;
+        ContinuumBuildExecutionResult result;
+        File workingDirectory = getWorkingDirectory( project );
+        String pomPath = workingDirectory + File.separator + "pom.xml";
+        String pomBackupPath = workingDirectory + File.separator + "pom.xml.bak";
+
+        //getLogger().info("pomPath: "+ pomPath);
+        //getLogger().info("pomBackupPath: " + pomBackupPath);
+        getLogger().info( "Making av copy of " + pomPath + " to " + pomBackupPath );
+
+        //TODO Decide how to handle IOException
+        FileIO.copy( pomPath, pomBackupPath );
+
+        //getLogger().debug("File backup done");
+
+        //getLogger().info("pomPath: " + pomPath);
+        MavenProject mavenProject =
+            builderHelper.getMavenProject( new ContinuumProjectBuildingResult(), new File( pomPath ) );
+
+        List<Dependency> dependencies;
+        if ( mavenProject != null )
+        {
+            out = new PrintWriter( new BufferedWriter( new FileWriter( pomPath + ".original" ) ) );
+            mavenProject.writeModel( out );
+
+            getLogger().debug( "Name: " + mavenProject.getName() );
+            getLogger().debug(
+                mavenProject.getArtifactId() + ":" + mavenProject.getGroupId() + ":" + mavenProject.getVersion() );
+
+            dependencies = mavenProject.getDependencies();
+
+            if ( dependencies != null )
+            {
+                getLogger().debug( "" );
+                getLogger().debug( "===Dependencies BEFORE change===" );
+                dependencies = mavenProject.getDependencies();
+                for ( Dependency element : dependencies )
+                {
+                    getLogger().debug(
+                        element.getGroupId() + ":" + element.getArtifactId() + ":" + element.getVersion() );
+                }
+            }
+            else
+            {
+                getLogger().info( "dependencies was null" );
+            }
+        }
+        else
+        {
+            getLogger().info( "mavenProject was null" );
+        }
+
+        List<Dependency> updatedDependencyList =
+            builderHelper.createNewDependencyList( mavenProject.getDependencies(), project.getDependencies() );
+
+        mavenProject.setDependencies( updatedDependencyList );
+
+        getLogger().debug( "" );
+        getLogger().debug( "===Dependencies AFTER change===" );
+        dependencies = mavenProject.getDependencies();
+        getLogger().debug( "dependencies.size: " + dependencies.size() );
+        for ( Dependency element : dependencies )
+        {
+            getLogger().debug( element.getGroupId() + ":" + element.getArtifactId() + ":" + element.getVersion() );
+        }
+
+        out = new PrintWriter( new BufferedWriter( new FileWriter( pomPath ) ) );
+        mavenProject.writeModel( out );
+
+        //if (getLogger().isDebugEnabled()) {
+        getLogger().info( "Making a copy of the modified pom.xml" );
+        FileIO.copy( pomPath, pomPath + ".lastBuild" );
+        //}
+        //executeShellCommand( project, executable, arguments.toString(), buildOutput, environments );
+        result = executeShellCommand( project, executable, arguments.toString(), buildOutput, environments );
+
+        //FileIO.copy(pomBackupPath, pomPath);
+        //FileIO.delete(pomBackupPath);
+        FileIO.move( pomBackupPath, pomPath );
+        if ( getLogger().isDebugEnabled() )
+        {
+            getLogger().debug( "Original pom.xml was rolled back" );
+        }
+        return result;
+    }
+
+
     public void updateProjectFromCheckOut( File workingDirectory, Project project, BuildDefinition buildDefinition )
         throws ContinuumBuildExecutorException
     {
+        getLogger().info( "workingDirectory: " + workingDirectory.getAbsolutePath() );
+        getLogger().info( "buildDefinition.getBuildFile: " + buildDefinition.getBuildFile() );
+        getLogger().info( "buildDefinition.getArguments: " + buildDefinition.getArguments() );
+        getLogger().info( "buildDefinition.getGoals: " + buildDefinition.getGoals() );
+        getLogger().info( "buildDefinition.getId: " + buildDefinition.getId() );
+
         File f = getPomFile( buildDefinition, workingDirectory );
 
         if ( !f.exists() )
@@ -339,11 +469,12 @@
             File xmlFile = new File( workingDir, testResultFiles[i] );
             try
             {
-            if (backupDirectory != null)
-            {
-                FileUtils.copyFileToDirectory( xmlFile, backupDirectory );
+                if ( backupDirectory != null )
+                {
+                    FileUtils.copyFileToDirectory( xmlFile, backupDirectory );
+                }
             }
-            } catch (IOException e)
+            catch ( IOException e )
             {
                 getLogger().info( "failed to backup unit report file " + xmlFile.getPath() );
             }
Index: continuum-core/src/main/java/org/apache/maven/continuum/execution/maven/m2/DefaultMavenBuilderHelper.java
===================================================================
--- continuum-core/src/main/java/org/apache/maven/continuum/execution/maven/m2/DefaultMavenBuilderHelper.java	(revision 574298)
+++ continuum-core/src/main/java/org/apache/maven/continuum/execution/maven/m2/DefaultMavenBuilderHelper.java	(working copy)
@@ -163,11 +163,24 @@
             }
         }
 
+        //erik: ensuring that my postfix-counter are not removed
+        // when updating from scm and the version has not changed
+        String continuumVersion = continuumProject.getVersion();
+        String scmVersion = getVersion( mavenProject );
+        String version = scmVersion;
+        if ( continuumVersion != null )
+        {
+            if ( continuumVersion.startsWith( scmVersion ) )
+            {
+                version += continuumVersion.substring( scmVersion.length() );
+            }
+        }
+
         // ----------------------------------------------------------------------
         // Version
         // ----------------------------------------------------------------------
 
-        continuumProject.setVersion( getVersion( mavenProject ) );
+        continuumProject.setVersion( version );
 
         // ----------------------------------------------------------------------
         // GroupId
@@ -255,21 +268,55 @@
         // Dependencies
         // ----------------------------------------------------------------------
 
+        //erik keep derived dependencies where original dependencies are unchanged.
         List dependencies = new ArrayList();
+        List<ProjectDependency> oldDependencies = continuumProject.getDependencies();
+        /*
+        getLogger().info("continuumProject.oldDependencies contains: ");
+        for (ProjectDependency aDependency : oldDependencies) {
+            getLogger().info(aDependency.getGroupId() + ":" + aDependency.getArtifactId()
+                    + ":" + aDependency.getVersion());
+        }
+        getLogger().info("mavenProject.getDependencies() contains: ");
+        for (Object obj : mavenProject.getDependencies()) {
+            ProjectDependency aDependency = (ProjectDependency) obj;            
+            getLogger().info(aDependency.getGroupId() + ":" + aDependency.getArtifactId()
+                    + ":" + aDependency.getVersion());
+        }
+        */
+        List<ProjectDependency> similarDependencies;
 
         for ( Iterator i = mavenProject.getDependencies().iterator(); i.hasNext(); )
         {
             Dependency dependency = (Dependency) i.next();
 
-            ProjectDependency cd = new ProjectDependency();
+            similarDependencies = findSimilarDependenciesInList( dependency, oldDependencies );
+            /*
+            getLogger().info("# similarDeps: " + similarDependencies.size());
+            for (ProjectDependency aDependency : similarDependencies) {
+                getLogger().info(aDependency.getGroupId() + ":" + aDependency.getArtifactId()
+                        + ":" + aDependency.getVersion());
+            }
+            */
+            if ( similarDependencies.isEmpty() )
+            {
+                ProjectDependency cd = new ProjectDependency();
+                cd.setGroupId( dependency.getGroupId() );
+                cd.setArtifactId( dependency.getArtifactId() );
+                cd.setVersion( dependency.getVersion() );
+                dependencies.add( cd );
+            }
+            else if ( similarDependencies.size() == 1 )
+            {
+                //TODO Sjekke mot original versjon?
+                dependencies.add( similarDependencies.get( 0 ) );
+            }
+            else
+            {
+                getLogger().error(
+                    "There should never be more than one dependency with the same groupId and artifactId." );
 
-            cd.setGroupId( dependency.getGroupId() );
-
-            cd.setArtifactId( dependency.getArtifactId() );
-
-            cd.setVersion( dependency.getVersion() );
-
-            dependencies.add( cd );
+            }
         }
 
         continuumProject.setDependencies( dependencies );
@@ -327,6 +374,65 @@
         }
     }
 
+    //Erik
+    protected List<ProjectDependency> findSimilarDependenciesInList( final Dependency dependency,
+                                                                     final List<ProjectDependency> list )
+    {
+
+        List<ProjectDependency> result = new ArrayList<ProjectDependency>();
+        for ( ProjectDependency element : list )
+        {
+            if ( element.getArtifactId().equals( dependency.getArtifactId() ) &&
+                element.getGroupId().equals( dependency.getGroupId() ) )
+            {
+
+                if ( !result.contains( element ) )
+                {
+                    result.add( element );
+                }
+            }
+        }
+        return result;
+    }
+
+    //Erik
+    /**
+     * Creates an updated dependencylist with the new versions.
+     * Operates on Maven's <code>Dependency</code>
+     *
+     * @param originalDependencies
+     * @param newDependencies
+     * @return
+     */
+    public List<Dependency> createNewDependencyList( List<Dependency> originalDependencies,
+                                                     final List<ProjectDependency> newDependencies )
+    {
+
+        List<Dependency> result = new ArrayList<Dependency>();
+        boolean modified = false;
+        for ( Dependency oldDependency : originalDependencies )
+        {
+            for ( ProjectDependency newDependency : newDependencies )
+            {
+                if ( ( oldDependency.getArtifactId().equals( newDependency.getArtifactId() ) ) &&
+                    ( oldDependency.getGroupId().equals( newDependency.getGroupId() ) ) )
+                {
+
+                    oldDependency.setArtifactId( newDependency.getArtifactId() );
+                    oldDependency.setGroupId( newDependency.getGroupId() );
+                    oldDependency.setVersion( newDependency.getVersion() );
+                    modified = true;
+                }
+            }
+            result.add( oldDependency );
+        }
+        if ( !modified )
+        {
+            result = null;
+        }
+        return result;
+    }
+
     public MavenProject getMavenProject( ContinuumProjectBuildingResult result, File file )
     {
         MavenProject project;
Index: continuum-core/src/main/java/org/apache/maven/continuum/execution/maven/m2/MavenBuilderHelper.java
===================================================================
--- continuum-core/src/main/java/org/apache/maven/continuum/execution/maven/m2/MavenBuilderHelper.java	(revision 574298)
+++ continuum-core/src/main/java/org/apache/maven/continuum/execution/maven/m2/MavenBuilderHelper.java	(working copy)
@@ -21,10 +21,13 @@
 
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.continuum.model.project.Project;
+import org.apache.maven.continuum.model.project.ProjectDependency;
 import org.apache.maven.continuum.project.builder.ContinuumProjectBuildingResult;
+import org.apache.maven.model.Dependency;
 import org.apache.maven.project.MavenProject;
 
 import java.io.File;
+import java.util.List;
 
 /**
  * @author <a href="mailto:jason@maven.org">Jason van Zyl</a>
@@ -49,4 +52,7 @@
 
     ArtifactRepository getLocalRepository()
         throws SettingsConfigurationException;
+
+    List<Dependency> createNewDependencyList( List<Dependency> originalDependencies,
+                                              final List<ProjectDependency> newDependencies );
 }
Index: continuum-core/src/main/java/org/apache/maven/continuum/DefaultDependencyHelper.java
===================================================================
--- continuum-core/src/main/java/org/apache/maven/continuum/DefaultDependencyHelper.java	(revision 0)
+++ continuum-core/src/main/java/org/apache/maven/continuum/DefaultDependencyHelper.java	(revision 0)
@@ -0,0 +1,432 @@
+package org.apache.maven.continuum;
+
+import org.apache.maven.continuum.model.project.DependencyGroup;
+import org.apache.maven.continuum.model.project.ProjectDependency;
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Vector;
+
+/**
+ * @author Erik Drolshammer
+ * @plexus.component role="org.apache.maven.continuum.DependencyHelper"
+ */
+
+public class DefaultDependencyHelper
+    extends AbstractLogEnabled
+    implements DependencyHelper
+{
+
+    /**
+     * This method finds all possible ways of creating a valid set of dependencies.
+     * I.e., all sets that have identical <code>artifactId</code> and <code>groupId</code>
+     * as the dependencies from <code>originalDependencies</code>.
+     *
+     * @param originalDependencies the base set of dependencies
+     * @param newDependencies      the set to choose replacements from
+     * @return a list of lists containing the valid combinations
+     */
+    public List<List<ProjectDependency>> getAllDependencyCombinations(
+        final List<ProjectDependency> originalDependencies, List<ProjectDependency> newDependencies )
+    {
+
+        //getLogger().info("Starting getAllDependencyCombinations");
+        List<ProjectDependency> cleanedDependencies = findRelevantDependencies( originalDependencies, newDependencies );
+
+        List<ProjectDependency> unaffectedDependencies =
+            extractUnaffectedDependencies( originalDependencies, cleanedDependencies );
+
+        //originalDependencies =  cleanedDependencies +  extractUnaffectedDependencies       
+
+        List<DependencyGroup> groups = makeDependencyGroups( cleanedDependencies );
+
+        List<List<ProjectDependency>> combinations = new ArrayList<List<ProjectDependency>>();
+        Vector<ProjectDependency> selection = new Vector<ProjectDependency>( groups.size() );
+        selection.setSize(
+            groups.size() );  //Must ensure that totalt _size_ is equal or greater than number of buckets.
+        dependencyCombinations( 0, groups, selection, combinations );
+
+        if ( getLogger().isInfoEnabled() )
+        {
+            for ( List<ProjectDependency> list : combinations )
+            {
+                if ( list.isEmpty() )
+                {
+                    getLogger().info( "The list was empty" );
+                }
+                else
+                {
+                    getLogger().info( "" );
+                    getLogger().info( "A new combination" );
+                    for ( ProjectDependency dependencyElement : list )
+                    {
+
+                        getLogger().info( dependencyElement.getGroupId() + ":" + dependencyElement.getArtifactId() +
+                            ":" + dependencyElement.getVersion() );
+                    }
+                }
+
+            }
+            getLogger().info( combinations.size() + " combination(s) was found." );
+        }
+
+        //Append the rest of the originalDependencies to the results.
+        List<List<ProjectDependency>> result = new ArrayList<List<ProjectDependency>>();
+        for ( List<ProjectDependency> list : combinations )
+        {
+            list.addAll( cloneDependencyList( unaffectedDependencies ) );
+            result.add( list );
+
+            if ( getLogger().isDebugEnabled() )
+            {
+                getLogger().debug( list.size() + " dependencies was added to the result. " +
+                    unaffectedDependencies.size() + " was not unaffected." );
+
+            }
+        }
+        return result;
+    }
+
+    protected List<ProjectDependency> findRelevantDependencies( final List<ProjectDependency> originalDependencies,
+                                                                final List<ProjectDependency> newDependencies )
+    {
+
+        List<ProjectDependency> result = new ArrayList<ProjectDependency>();
+
+        if ( newDependencies == null )
+        {
+            return result;
+        }
+        getLogger().info( "Size before cleaning: " + newDependencies.size() );
+        //cleaning newDependencies for non-relevant dependencies
+        boolean relevant = false;
+        for ( ProjectDependency dependencyElement : newDependencies )
+        {
+            //dependencyElement.setDerived(true);
+            getLogger().info( "dependencyElement: " + dependencyElement.getGroupId() + ":" +
+                dependencyElement.getArtifactId() + ":" + dependencyElement.getVersion() + " derived: " +
+                dependencyElement.isDerived() );
+
+            List<ProjectDependency> existing =
+                findSimilarDependenciesInList( cloneDependency( dependencyElement ), originalDependencies );
+
+            //getLogger().info("Number of similar dependencies " + existing.size());
+            if ( existing != null && !existing.isEmpty() )
+            {
+                for ( ProjectDependency element : existing )
+                {
+                    if ( !result.contains( element ) )
+                    {
+                        result.add( element );
+                    }
+                }
+                /*else {
+                    //TODO throw programmingerrorexception
+                    getLogger().error("ProgrammingError: " +
+                            "This code assumes that the default set only have ONE dependency of each type.");
+                }*/
+
+            }
+        }
+        getLogger().info( "Number of relevant dependencies: " + result.size() );
+        return result;
+    }
+
+
+    public List<ProjectDependency> findSimilarDependenciesInList( final ProjectDependency dependency,
+                                                                  final List<ProjectDependency> list )
+    {
+
+        List<ProjectDependency> result = new ArrayList<ProjectDependency>();
+        for ( ProjectDependency element : list )
+        {
+            if ( element.getArtifactId().equals( dependency.getArtifactId() ) &&
+                element.getGroupId().equals( dependency.getGroupId() ) )
+            {
+
+                if ( !result.contains( dependency ) )
+                {
+                    result.add( dependency );
+                }
+                result.add( element );
+            }
+        }
+        return result;
+    }
+
+    public List<ProjectDependency> findEqualDependenciesInList( final ProjectDependency dependency,
+                                                                final List<ProjectDependency> list )
+    {
+
+        List<ProjectDependency> result = new ArrayList<ProjectDependency>();
+        for ( ProjectDependency element : list )
+        {
+            if ( element.getArtifactId().equals( dependency.getArtifactId() ) &&
+                element.getGroupId().equals( dependency.getGroupId() ) )
+            {
+                result.add( element );
+                result.add( dependency );
+            }
+        }
+        return result;
+    }
+
+    protected List<DependencyGroup> makeDependencyGroups( List<ProjectDependency> newDependencies )
+    {
+        //getLogger().info("Starting makeDependencyGroups");
+        getLogger().info( newDependencies.size() + " dependencies to put into groups." );
+        List<DependencyGroup> groups = new ArrayList<DependencyGroup>();
+        for ( ProjectDependency dependencyElement : newDependencies )
+        {
+            if ( dependencyElement != null )
+            {
+
+                //dependencyElement.setDerived(true);
+            }
+            else
+            {
+                getLogger().info( "dependencyElement is NULL " );
+            }
+            ListIterator<DependencyGroup> groupsIterator = groups.listIterator();
+            if ( !groupsIterator.hasNext() )
+            {
+                //getLogger().info("No groups exist.");
+                addToGroupList( dependencyElement, groupsIterator );
+            }
+            else
+            {
+                boolean exist = false;
+                DependencyGroup groupElement;
+                while ( groupsIterator.hasNext() )
+                {
+                    groupElement = groupsIterator.next();
+                    if ( dependencyElement.getArtifactId().equals( groupElement.getArtifactId() ) &&
+                        dependencyElement.getGroupId().equals( groupElement.getGroupId() ) )
+                    {
+
+                        groupElement.addDependency( dependencyElement );
+
+                        if ( groupElement.getDependencies().size() == 1 )
+                        {
+                            groupElement.setGroupId( dependencyElement.getGroupId() );
+                            groupElement.setArtifactId( dependencyElement.getArtifactId() );
+                        }
+                        groupsIterator.set( groupElement );
+                        exist = true;
+                    }
+                }
+                if ( !exist )
+                {
+                    addToGroupList( dependencyElement, groupsIterator );
+                }
+            }
+        }
+        getLogger().info( "groups.size(): " + groups.size() );
+        return groups;
+    }
+
+
+    /**
+     * This method combines one element from each <code>group</code>
+     * with all combinations of elements from the other groups.
+     * <p/>
+     * <code>dependencyCombinations</code> is a recursive algorithm which will
+     * generate all possible ways of completing the <code>selection</code>, given
+     * <code>currentGroup</code> and a <code>selection</code>
+     * populated up to index < <code>currentGroup</code> -1.
+     *
+     * @param currentGroup       the index of the bucket we are currently operating on
+     * @param groups             the <code>DependencyGroups</code> to choose dependencies from
+     * @param selection          list of elements chosen so far. Note! The size must be equal to the size of groups.
+     * @param uniqueCombinations the list of lists containing valid combinations
+     */
+    private void dependencyCombinations( int currentGroup, final List<DependencyGroup> groups,
+                                         List<ProjectDependency> selection,
+                                         List<List<ProjectDependency>> uniqueCombinations )
+    {
+
+        if ( currentGroup == groups.size() )
+        {
+            uniqueCombinations.add( cloneDependencyList( selection ) );
+            //We've been through all groups and have a new uniqueCombination            
+        }
+        else
+        {
+            ProjectDependency projectDependency;
+            DependencyGroup group = groups.get( currentGroup );
+
+            for ( int i = 0; i < group.getDependencies().size(); i++ )
+            {
+                projectDependency = (ProjectDependency) group.getDependencies().get( i );
+                selection.set( currentGroup, projectDependency );
+                dependencyCombinations( currentGroup + 1, groups, selection, uniqueCombinations );
+            }
+        }
+    }
+
+    protected List<ProjectDependency> extractUnaffectedDependencies( final List<ProjectDependency> originalDependencies,
+                                                                     final List<ProjectDependency> cleanedDependencies )
+    {
+
+        getLogger().info( "Extracting unaffectedDependencies - " + "originalDependencies.size: " +
+            originalDependencies.size() + " cleanedDependencies.size: " + cleanedDependencies.size() );
+
+        List<ProjectDependency> result = new ArrayList<ProjectDependency>();
+        for ( ProjectDependency element : originalDependencies )
+        {
+
+            List<ProjectDependency> similarDependencies = findSimilarDependenciesInList( element, cleanedDependencies );
+
+            if ( similarDependencies == null || similarDependencies.isEmpty() )
+            {
+                result.add( element );
+                //getLogger().info("added");
+            }
+            else
+            {
+                getLogger().info( element.getGroupId() + ":" + element.getArtifactId() + ":" + element.getVersion() +
+                    " was affected (i.e. not added to the not-affected-list)" );
+            }
+
+        }
+        getLogger().info( result.size() + " unaffectedDependencies" );
+        return result;
+    }
+
+
+    private void addToGroupList( ProjectDependency newDependency, ListIterator<DependencyGroup> listIterator )
+    {
+        DependencyGroup group = new DependencyGroup();
+        group.addDependency( newDependency );
+        group.setArtifactId( newDependency.getArtifactId() );
+        group.setGroupId( newDependency.getGroupId() );
+        listIterator.add( group );
+        /*getLogger().info("Creating new dependencyGroup and adding dependency : "
+                + newDependency.getGroupId() + ":"
+                + newDependency.getArtifactId() + ":"
+                + newDependency.getVersion());*/
+    }
+
+
+    /**
+     * Convenience method when only one dependency is changed
+     *
+     * @param originalDependencies
+     * @param newDependency
+     * @return
+     * @deprecated
+     */
+    public List<ProjectDependency> createNewDependencyList( final List<ProjectDependency> originalDependencies,
+                                                            ProjectDependency newDependency )
+    {
+
+        List<ProjectDependency> updatedDependencies = new ArrayList<ProjectDependency>();
+        String artifactId = newDependency.getArtifactId();
+        String groupId = newDependency.getGroupId();
+        boolean modified = false;
+
+        for ( ProjectDependency oldDependency : originalDependencies )
+        {
+            if ( ( oldDependency.getArtifactId().equals( artifactId ) ) &&
+                ( oldDependency.getGroupId().equals( groupId ) ) )
+            {
+                //System.out.println("++++ Modifying a dependency ++++");
+                newDependency.setDerived( true );
+                updatedDependencies.add( cloneDependency( newDependency ) );
+                modified = true;
+//                System.out.println("A dependency was modified  and its " +
+//                        "artifactId is " + newDependency.getArtifactId());
+                if ( newDependency.isDerived() )
+                {
+                    System.out.println( "derived: " + newDependency.isDerived() );
+                }
+            }
+            else
+            {
+                updatedDependencies.add( cloneDependency( oldDependency ) );
+            }
+        }
+        if ( !modified )
+        {
+            updatedDependencies = null;
+        }
+        return updatedDependencies;
+    }
+
+    /**
+     * Creates an updated dependencylist with the new versions.
+     * Operates on Continuum's <code>ProjectDependency</code>
+     *
+     * @param originalDependencies
+     * @param newDependencies
+     * @return
+     * @deprecated
+     */
+    public List<ProjectDependency> createNewDependencyList( List<ProjectDependency> originalDependencies,
+                                                            final List<ProjectDependency> newDependencies )
+    {
+
+        List<ProjectDependency> result = new ArrayList<ProjectDependency>();
+        boolean modified = false;
+        for ( ProjectDependency oldDependency : originalDependencies )
+        {
+            for ( ProjectDependency newDependency : newDependencies )
+            {
+                if ( ( oldDependency.getArtifactId().equals( newDependency.getArtifactId() ) ) &&
+                    ( oldDependency.getGroupId().equals( newDependency.getGroupId() ) ) )
+                {
+
+                    newDependency.setDerived( true );
+                    result.add( newDependency );
+                    modified = true;
+                }
+                else
+                {
+                    result.add( oldDependency );
+                }
+            }
+        }
+        if ( !modified )
+        {
+            result = null;
+        }
+        return result;
+    }
+
+    public boolean dependenciesEqual( ProjectDependency dependency1, ProjectDependency dependency2 )
+    {
+        if ( dependency1.getArtifactId().equals( dependency2.getArtifactId() ) &&
+            dependency1.getGroupId().equals( dependency2.getGroupId() ) &&
+            dependency1.getVersion().equals( dependency2.getVersion() ) )
+        {
+            return true;
+        }
+        else
+        {
+            return false;
+        }
+    }
+
+    public List<ProjectDependency> cloneDependencyList( List<ProjectDependency> dependencies )
+    {
+        List<ProjectDependency> result = new ArrayList<ProjectDependency>();
+        for ( ProjectDependency element : dependencies )
+        {
+            result.add( cloneDependency( element ) );
+        }
+        return result;
+    }
+
+    public ProjectDependency cloneDependency( ProjectDependency dependency )
+    {
+        ProjectDependency result = new ProjectDependency();
+        result.setArtifactId( dependency.getArtifactId() );
+        result.setGroupId( dependency.getGroupId() );
+        result.setVersion( dependency.getVersion() );
+        result.setModelEncoding( dependency.getModelEncoding() );
+        result.setDerived( dependency.isDerived() );
+        return result;
+    }
+}
Index: continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java
===================================================================
--- continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java	(revision 574298)
+++ continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java	(working copy)
@@ -37,6 +37,7 @@
 import org.apache.maven.continuum.model.project.BuildDefinition;
 import org.apache.maven.continuum.model.project.BuildResult;
 import org.apache.maven.continuum.model.project.Project;
+import org.apache.maven.continuum.model.project.ProjectDependency;
 import org.apache.maven.continuum.model.project.ProjectGroup;
 import org.apache.maven.continuum.model.project.ProjectNotifier;
 import org.apache.maven.continuum.model.project.Schedule;
@@ -100,7 +101,14 @@
     extends AbstractLogEnabled
     implements Continuum, Contextualizable, Initializable, Startable
 {
+    private boolean pocEnabled = true;
+
     /**
+     * @plexus.requirement role="org.apache.maven.continuum.DerivedProjectManager"
+     */
+    private DerivedProjectManager derivedProjectManager;
+
+    /**
      * @plexus.requirement
      */
     private ActionManager actionManager;
@@ -1625,6 +1633,22 @@
         {
             store.updateProjectGroup( projectGroup );
 
+            //erik
+            if ( pocEnabled )
+            {
+                getLogger().info( "Running poc after new projects have been created" );
+                Project tempProject;
+                for ( Object element : projects )
+                {
+                    tempProject = (Project) element;
+                    doPoc( tempProject.getId(), store );
+                }
+            }
+            else
+            {
+                getLogger().warn( "ERIK LEKER - POC DISABLED" );
+            }
+
             for ( Iterator i = projects.iterator(); i.hasNext(); )
             {
                 Project project = (Project) i.next();
@@ -2992,6 +3016,84 @@
         }
     }
 
+    //erik
+    /**
+     * Proof-of-concept, just playing around
+     *
+     * @param projectId
+     * @param store
+     * @throws ContinuumStoreException
+     */
+    private void doPoc( int projectId, ContinuumStore store )
+        throws ContinuumStoreException
+    {
+        getLogger().debug( "doPoC start" );
+
+        Project originalProject = store.getProjectWithAllDetails( projectId );
+        if ( originalProject.getDependencies().size() < 1 )
+        {
+            getLogger().warn( "No dependencies found, skipping doPoc" );
+            return;
+        }
+
+        //TODO move the dependency declaration to an xml-file.
+        List<ProjectDependency> newDependencies = new ArrayList<ProjectDependency>();
+        ProjectDependency dependency4 = new ProjectDependency();
+        dependency4.setGroupId( "org.acegisecurity" );
+        dependency4.setArtifactId( "acegi-security" );
+        dependency4.setVersion( "1.0.1" );
+        dependency4.setDerived( true );
+        newDependencies.add( dependency4 );
+
+        ProjectDependency dependency5 = new ProjectDependency();
+        dependency5.setGroupId( "commons-logging" );
+        dependency5.setArtifactId( "commons-logging" );
+        dependency5.setVersion( "1.1" );
+        dependency5.setDerived( true );
+        newDependencies.add( dependency5 );
+
+        ProjectDependency dependency6 = new ProjectDependency();
+        dependency6.setGroupId( "jmock" );
+        dependency6.setArtifactId( "jmock" );
+        dependency6.setVersion( "1.1.0" );
+        dependency6.setDerived( true );
+        newDependencies.add( dependency6 );
+
+        List<Project> projects = derivedProjectManager.createDerivedProjects( originalProject, newDependencies, store );
+
+        getLogger().debug( projects.size() + " derived originalProject(s) was created" );
+
+        String projectGroupId = originalProject.getProjectGroup().getGroupId();
+        ProjectGroup projectGroup = store.getProjectGroupByGroupIdWithProjects( projectGroupId );
+        for ( Project derivedProject : projects )
+        {
+
+            if ( derivedProject != null )
+            {
+                derivedProjectManager.printProjectInfo( getLogger(), derivedProject );
+
+                if ( derivedProjectManager.projectExist( derivedProject, store ) )
+                {
+                    getLogger().debug( "This originalProject already exists" );
+                }
+
+                projectGroup.addProject( derivedProject );
+                getLogger().debug( "added originalProject to group, id: " + derivedProject.getId() );
+            }
+            else
+            {
+                getLogger().info( "derivedProject was null or already exists -> no originalProject was persisted." );
+            }
+
+        }
+        store.updateProjectGroup( projectGroup );
+        getLogger().debug( "projectGroup was stored" );
+        derivedProjectManager.printInfoForAllProjects( getLogger(), store );
+
+        getLogger().debug( "doPoC end" );
+    }
+
+
     public InstallationService getInstallationService()
     {
         return installationService;
Index: continuum-core/src/main/resources/META-INF/plexus/components.xml
===================================================================
--- continuum-core/src/main/resources/META-INF/plexus/components.xml	(revision 574298)
+++ continuum-core/src/main/resources/META-INF/plexus/components.xml	(working copy)
@@ -71,12 +71,12 @@
 
 
     <!--
-     |
-     | Executors
-     |
-     | not using plexus-maven-plugin because configuraton can't be configured with default-value
-     | todo refactor the defaultExecutable local maybe?
-     |-->
+    |
+    | Executors
+    |
+    | not using plexus-maven-plugin because configuraton can't be configured with default-value
+    | todo refactor the defaultExecutable local maybe?
+    |-->
     <component>
       <role>org.apache.maven.continuum.execution.ContinuumBuildExecutor</role>
       <role-hint>maven2</role-hint>
@@ -182,10 +182,10 @@
 
 
     <!--
-     |
-     | Build Project Task Queue
-     |
-     |-->
+    |
+    | Build Project Task Queue
+    |
+    |-->
 
     <component>
       <role>org.codehaus.plexus.taskqueue.TaskQueue</role>
@@ -207,7 +207,8 @@
       <role>org.codehaus.plexus.taskqueue.TaskViabilityEvaluator</role>
       <role-hint>build-project</role-hint>
       <implementation>
-        org.apache.maven.continuum.buildqueue.evaluator.BuildProjectTaskViabilityEvaluator</implementation>
+        org.apache.maven.continuum.buildqueue.evaluator.BuildProjectTaskViabilityEvaluator
+      </implementation>
       <configuration>
         <required-buildInterval>1000</required-buildInterval>
       </configuration>
@@ -245,10 +246,10 @@
     </component>
 
     <!--
-     |
-     | Check Out Task Queue
-     |
-     |-->
+    |
+    | Check Out Task Queue
+    |
+    |-->
 
     <component>
       <role>org.codehaus.plexus.taskqueue.TaskQueue</role>
@@ -278,6 +279,26 @@
       </configuration>
     </component>
 
+    <component>
+      <role>org.apache.maven.continuum.DependencyHelper</role>
+      <implementation>org.apache.maven.continuum.DefaultDependencyHelper</implementation>
+    </component>
 
+    <component>
+      <role>org.apache.maven.continuum.DerivedProjectManager</role>
+      <implementation>org.apache.maven.continuum.DefaultDerivedProjectManager</implementation>
+      <requirements>
+        <!--
+          <requirement>
+          <role>org.apache.maven.continuum.store.ContinuumStore</role>
+          <role-hint>jdo</role-hint>
+        </requirement>
+        -->
+        <requirement>
+          <role>org.apache.maven.continuum.DependencyHelper</role>
+        </requirement>
+      </requirements>
+    </component>
+
   </components>
 </component-set>
Index: continuum-core/pom.xml
===================================================================
--- continuum-core/pom.xml	(revision 574298)
+++ continuum-core/pom.xml	(working copy)
@@ -1,5 +1,6 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-  <parent>  
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <parent>
     <artifactId>continuum-parent</artifactId>
     <groupId>org.apache.maven.continuum</groupId>
     <version>1.1-beta-3-SNAPSHOT</version>
@@ -39,7 +40,7 @@
     <dependency>
       <groupId>org.apache.maven.shared</groupId>
       <artifactId>file-management</artifactId>
-    </dependency>    
+    </dependency>
     <dependency>
       <groupId>org.apache.maven.scm</groupId>
       <artifactId>maven-scm-provider-svnexe</artifactId>
@@ -71,7 +72,7 @@
     </dependency>
     <dependency>
       <groupId>org.apache.maven</groupId>
-      <artifactId>maven-project</artifactId> 
+      <artifactId>maven-project</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.maven</groupId>
@@ -238,12 +239,12 @@
               <systemProperties>
                 <property>
                   <name>JAVA_HOME</name>
-                  <value>${JAVA_HOME}</value>    
+                  <value>${JAVA_HOME}</value>
                 </property>
                 <property>
                   <name>M2_HOME</name>
-                  <value>${M2_HOME}</value>    
-                </property>                      
+                  <value>${M2_HOME}</value>
+                </property>
               </systemProperties>
             </configuration>
           </plugin>

