Index: /trunk/grails-app/services/AssignedGroupService.groovy
===================================================================
--- /trunk/grails-app/services/AssignedGroupService.groovy	(revision 250)
+++ /trunk/grails-app/services/AssignedGroupService.groovy	(revision 251)
@@ -1,4 +1,7 @@
 class AssignedGroupService {
+
     boolean transactional = false
+
+    def personService
 
     def list(params) {
@@ -37,24 +40,37 @@
 
     def delete(params) {
-        def result = [:]
-        def fail = { Map m ->
-            result.error = [ code: m.code, args: ["AssignedGroup", params.id] ]
-            return result
-        }
+        AssignedGroup.withTransaction { status ->
+            def result = [:]
 
-        result.assignedGroupInstance = AssignedGroup.get(params.id)
+            def fail = { Map m ->
+                status.setRollbackOnly()
+                if(result.assignedGroupInstance && m.field)
+                    result.assignedGroupInstance.errors.rejectValue(m.field, m.code)
+                result.error = [ code: m.code, args: ["AssignedGroup", params.id] ]
+                return result
+            }
 
-        if(!result.assignedGroupInstance)
-            return fail(code:"default.not.found")
+            result.assignedGroupInstance = AssignedGroup.get(params.id)
 
-        try {
-            result.assignedGroupInstance.delete(flush:true)
-            return result //Success.
-        }
-        catch(org.springframework.dao.DataIntegrityViolationException e) {
-            return fail(code:"default.delete.failure")
-        }
+            if(!result.assignedGroupInstance)
+                return fail(code:"default.not.found")
 
-    }
+            def taskModification = new TaskModification(person: personService.currentUser,
+                                                    taskModificationType: TaskModificationType.get(10),
+                                                    task: result.assignedGroupInstance.task)
+
+            if(!taskModification.save())
+                return fail(field:"taskModifications", code:"task.modifications.failedToSave")
+
+            try {
+                result.assignedGroupInstance.delete(flush:true)
+                return result //Success.
+            }
+            catch(org.springframework.dao.DataIntegrityViolationException e) {
+                return fail(code:"default.delete.failure")
+            }
+
+        } //end withTransaction
+    } // end delete()
 
     def edit(params) {
@@ -102,4 +118,11 @@
                 return fail(code:"default.update.failure")
 
+            def taskModification = new TaskModification(person: personService.currentUser,
+                                                    taskModificationType: TaskModificationType.get(10),
+                                                    task: result.assignedGroupInstance.task)
+
+            if(!taskModification.save())
+                return fail(field:"taskModifications", code:"task.modifications.failedToSave")
+
             // Success.
             return result
@@ -126,20 +149,34 @@
 
     def save(params) {
-        def result = [:]
-        def fail = { Map m ->
-            if(result.assignedGroupInstance && m.field)
-                result.assignedGroupInstance.errors.rejectValue(m.field, m.code)
-            result.error = [ code: m.code, args: ["AssignedGroup", params.id] ]
+        AssignedGroup.withTransaction { status ->
+            def result = [:]
+
+            def fail = { Map m ->
+                if(result.assignedGroupInstance && m.field)
+                    result.assignedGroupInstance.errors.rejectValue(m.field, m.code)
+                result.error = [ code: m.code, args: ["AssignedGroup", params.id] ]
+                return result
+            }
+
+            result.assignedGroupInstance = new AssignedGroup(params)
+
+            if(result.assignedGroupInstance.hasErrors() || !result.assignedGroupInstance.save())
+                return fail(code:"default.create.failure")
+
+            // Record a taskModification for every one except "system".
+            if(personService.currentUser.id != 1) {
+                def taskModification = new TaskModification(person: personService.currentUser,
+                                                        taskModificationType: TaskModificationType.get(10),
+                                                        task: result.assignedGroupInstance.task)
+
+                if(!taskModification.save())
+                    return fail(field:"taskModifications", code:"task.modifications.failedToSave")
+            }
+
+            // success
             return result
-        }
 
-        result.assignedGroupInstance = new AssignedGroup(params)
-
-        if(result.assignedGroupInstance.hasErrors() || !result.assignedGroupInstance.save(flush: true))
-            return fail(code:"default.create.failure")
-
-        // success
-        return result
-    }
+        } //end withTransaction
+    } // end save()
 
 } // end class
Index: /trunk/grails-app/services/AssignedPersonService.groovy
===================================================================
--- /trunk/grails-app/services/AssignedPersonService.groovy	(revision 250)
+++ /trunk/grails-app/services/AssignedPersonService.groovy	(revision 251)
@@ -1,4 +1,7 @@
 class AssignedPersonService {
+
     boolean transactional = false
+
+    def personService
 
     def list(params) {
@@ -37,24 +40,37 @@
 
     def delete(params) {
-        def result = [:]
-        def fail = { Map m ->
-            result.error = [ code: m.code, args: ["AssignedPerson", params.id] ]
-            return result
-        }
+        AssignedPerson.withTransaction { status ->
+            def result = [:]
 
-        result.assignedPersonInstance = AssignedPerson.get(params.id)
+            def fail = { Map m ->
+                status.setRollbackOnly()
+                if(result.assignedPersonInstance && m.field)
+                    result.assignedPersonInstance.errors.rejectValue(m.field, m.code)
+                result.error = [ code: m.code, args: ["AssignedPerson", params.id] ]
+                return result
+            }
 
-        if(!result.assignedPersonInstance)
-            return fail(code:"default.not.found")
+            result.assignedPersonInstance = AssignedPerson.get(params.id)
 
-        try {
-            result.assignedPersonInstance.delete(flush:true)
-            return result //Success.
-        }
-        catch(org.springframework.dao.DataIntegrityViolationException e) {
-            return fail(code:"default.delete.failure")
-        }
+            if(!result.assignedPersonInstance)
+                return fail(code:"default.not.found")
 
-    }
+            def taskModification = new TaskModification(person: personService.currentUser,
+                                                    taskModificationType: TaskModificationType.get(11),
+                                                    task: result.assignedPersonInstance.task)
+
+            if(!taskModification.save())
+                return fail(field:"taskModifications", code:"task.modifications.failedToSave")
+
+            try {
+                result.assignedPersonInstance.delete(flush:true)
+                return result //Success.
+            }
+            catch(org.springframework.dao.DataIntegrityViolationException e) {
+                return fail(code:"default.delete.failure")
+            }
+
+        } //end withTransaction
+    } // end delete()
 
     def edit(params) {
@@ -102,4 +118,11 @@
                 return fail(code:"default.update.failure")
 
+            def taskModification = new TaskModification(person: personService.currentUser,
+                                                    taskModificationType: TaskModificationType.get(11),
+                                                    task: result.assignedPersonInstance.task)
+
+            if(!taskModification.save())
+                return fail(field:"taskModifications", code:"task.modifications.failedToSave")
+
             // Success.
             return result
@@ -126,20 +149,34 @@
 
     def save(params) {
-        def result = [:]
-        def fail = { Map m ->
-            if(result.assignedPersonInstance && m.field)
-                result.assignedPersonInstance.errors.rejectValue(m.field, m.code)
-            result.error = [ code: m.code, args: ["AssignedPerson", params.id] ]
+        AssignedPerson.withTransaction { status ->
+            def result = [:]
+
+            def fail = { Map m ->
+                if(result.assignedPersonInstance && m.field)
+                    result.assignedPersonInstance.errors.rejectValue(m.field, m.code)
+                result.error = [ code: m.code, args: ["AssignedPerson", params.id] ]
+                return result
+            }
+
+            result.assignedPersonInstance = new AssignedPerson(params)
+
+            if(result.assignedPersonInstance.hasErrors() || !result.assignedPersonInstance.save())
+                return fail(code:"default.create.failure")
+
+            // Record a taskModification for every one except "system".
+            if(personService.currentUser.id != 1) {
+                def taskModification = new TaskModification(person: personService.currentUser,
+                                                        taskModificationType: TaskModificationType.get(11),
+                                                        task: result.assignedPersonInstance.task)
+
+                if(!taskModification.save())
+                    return fail(field:"taskModifications", code:"task.modifications.failedToSave")
+            }
+
+            // success
             return result
-        }
 
-        result.assignedPersonInstance = new AssignedPerson(params)
-
-        if(result.assignedPersonInstance.hasErrors() || !result.assignedPersonInstance.save(flush: true))
-            return fail(code:"default.create.failure")
-
-        // success
-        return result
-    }
+        } //end withTransaction
+    } // end save()
 
 } // end class
Index: /trunk/grails-app/services/CreateDataService.groovy
===================================================================
--- /trunk/grails-app/services/CreateDataService.groovy	(revision 250)
+++ /trunk/grails-app/services/CreateDataService.groovy	(revision 251)
@@ -13,4 +13,6 @@
     def dateUtilService
     def appConfigService
+    def assignedGroupService
+    def assignedPersonService
 
 /*******************************************
@@ -531,4 +533,6 @@
         taskModificationTypeInstance = new TaskModificationType(name:"Approved").save()  // #8
         taskModificationTypeInstance = new TaskModificationType(name:"Renege approval").save()  // #9
+        taskModificationTypeInstance = new TaskModificationType(name:"Modified (Assigned Groups)").save()  // #10
+        taskModificationTypeInstance = new TaskModificationType(name:"Modified (Assigned Persons)").save()  // #11
     }
 
@@ -658,40 +662,40 @@
     def createDemoAssignedGroups() {
 
-        //AssignedGroup
-        def assignedGroupInstance
+        def result
+        def p = [:]
 
         //AssignedGroup #1
-        assignedGroupInstance = new AssignedGroup(personGroup: PersonGroup.get(1),
-                                                                                        task: Task.get(1),
-                                                                                        estimatedHour: 2,
-                                                                                        estimatedMinute: 30)
-        saveAndTest(assignedGroupInstance)
+        p = [personGroup: PersonGroup.get(1),
+                task: Task.get(1),
+                estimatedHour: 2,
+                estimatedMinute: 30]
+        result = assignedGroupService.save(p)
 
         //AssignedGroup #2
-        assignedGroupInstance = new AssignedGroup(personGroup: PersonGroup.get(2),
-                                                                                        task: Task.get(1),
-                                                                                        estimatedHour: 1,
-                                                                                        estimatedMinute: 0)
-        saveAndTest(assignedGroupInstance)
+        p = [personGroup: PersonGroup.get(2),
+                task: Task.get(1),
+                estimatedHour: 1,
+                estimatedMinute: 0]
+        result = assignedGroupService.save(p)
     }
 
     def createDemoAssignedPersons() {
 
-        //AssignedPerson
-        def assignedPersonInstance
+        def result
+        def p = [:]
 
         //AssignedPerson #1
-        assignedPersonInstance = new AssignedPerson(person: Person.get(4),
-                                                                                        task: Task.get(1),
-                                                                                        estimatedHour: 1,
-                                                                                        estimatedMinute: 20)
-        saveAndTest(assignedPersonInstance)
+        p = [person: Person.get(4),
+                task: Task.get(1),
+                estimatedHour: 1,
+                estimatedMinute: 20]
+        result = assignedPersonService.save(p)
 
         //AssignedPerson #2
-        assignedPersonInstance = new AssignedPerson(person: Person.get(5),
-                                                                                        task: Task.get(1),
-                                                                                        estimatedHour: 3,
-                                                                                        estimatedMinute: 30)
-        saveAndTest(assignedPersonInstance)
+        p = [person: Person.get(5),
+                task: Task.get(1),
+                estimatedHour: 3,
+                estimatedMinute: 30]
+        result = assignedPersonService.save(p)
     }
 
Index: /trunk/grails-app/services/TaskService.groovy
===================================================================
--- /trunk/grails-app/services/TaskService.groovy	(revision 250)
+++ /trunk/grails-app/services/TaskService.groovy	(revision 251)
@@ -8,4 +8,6 @@
 
     def personService
+    def assignedGroupService
+    def assignedPersonService
 
     /**
@@ -60,12 +62,16 @@
                 //Add the assignedGroups, provided by a new ArrayList(task.assignedGroups)
                 if(params.assignedGroups) {
-                    def assignedGroupInstance
+                    def assignedGroupsResult
+                    def assignedGroupParams = [:]
                     params.assignedGroups.each() {
-                        assignedGroupInstance = new AssignedGroup(personGroup: it.personGroup,
-                                                                                                        task: taskInstance,
-                                                                                                        estimatedHour: it.estimatedHour,
-                                                                                                        estimatedMinute: it.estimatedMinute)
-
-                        if(!assignedGroupInstance.save()) {
+
+                        assignedGroupParams = [personGroup: it.personGroup,
+                                                                    task: taskInstance,
+                                                                    estimatedHour: it.estimatedHour,
+                                                                    estimatedMinute: it.estimatedMinute]
+
+                        assignedGroupsResult = assignedGroupService.save(assignedGroupParams)
+
+                        if(assignedGroupsResult.error) {
                             status.setRollbackOnly()
                             taskInstance.errors.rejectValue("assignedGroups", "task.assignedGroups.failedToSave")
@@ -73,4 +79,5 @@
                             return result
                         }
+
                     }
                 }
@@ -78,12 +85,16 @@
                 //Add the assignedPersons, provided by a new ArrayList(task.assignedPersons)
                 if(params.assignedPersons) {
-                    def assignedPersonInstance
+                    def assignedPersonsResult
+                    def assignedPersonsParams = [:]
                     params.assignedPersons.each() {
-                        assignedPersonInstance = new AssignedPerson(person: it.person,
-                                                                                                            task: taskInstance,
-                                                                                                            estimatedHour: it.estimatedHour,
-                                                                                                            estimatedMinute: it.estimatedMinute)
-
-                        if(!assignedPersonInstance.save()) {
+
+                        assignedPersonsParams = [person: it.person,
+                                                                    task: taskInstance,
+                                                                    estimatedHour: it.estimatedHour,
+                                                                    estimatedMinute: it.estimatedMinute]
+
+                        assignedPersonsResult = assignedPersonService.save(assignedPersonsParams)
+
+                        if(assignedPersonsResult.error) {
                             status.setRollbackOnly()
                             taskInstance.errors.rejectValue("assignedPersons", "task.assignedPersons.failedToSave")
@@ -91,4 +102,5 @@
                             return result
                         }
+
                     }
                 }
