Index: /trunk/grails-app/services/AssignedGroupService.groovy
===================================================================
--- /trunk/grails-app/services/AssignedGroupService.groovy	(revision 513)
+++ /trunk/grails-app/services/AssignedGroupService.groovy	(revision 514)
@@ -146,5 +146,5 @@
                 return fail(code:"personGroup.not.found")
 
-            result.personsInGroup = result.personGroup.persons.sort { p1, p2 -> p1.firstName.compareToIgnoreCase(p2.firstName) }
+            result.personsInGroup = result.personGroup.persons?.sort { p1, p2 -> p1.firstName.compareToIgnoreCase(p2.firstName) }
 
             result.assignedGroupInstance = new AssignedGroup()
Index: /trunk/grails-app/services/AssignedPersonService.groovy
===================================================================
--- /trunk/grails-app/services/AssignedPersonService.groovy	(revision 513)
+++ /trunk/grails-app/services/AssignedPersonService.groovy	(revision 514)
@@ -146,5 +146,5 @@
                 return fail(code:"person.not.found")
 
-            result.groupsForPerson = result.person.personGroups.sort { p1, p2 -> p1.name.compareToIgnoreCase(p2.name) }
+            result.groupsForPerson = result.person.personGroups?.sort { p1, p2 -> p1.name.compareToIgnoreCase(p2.name) }
 
             result.assignedPersonInstance = new AssignedPerson()
Index: /trunk/grails-app/services/TaskService.groovy
===================================================================
--- /trunk/grails-app/services/TaskService.groovy	(revision 513)
+++ /trunk/grails-app/services/TaskService.groovy	(revision 514)
@@ -254,4 +254,18 @@
             }
 
+            // Handle assignedPersons.
+            def taskAssignedPersons = AssignedPerson.findAllByTask(result.taskInstance)
+            taskAssignedPersons.each() {
+                result.taskInstance.removeFromAssignedPersons(it)
+                it.delete()
+            }
+
+            // Handle assignedGroups.
+            def taskAssignedGroups = AssignedGroup.findAllByTask(result.taskInstance)
+            taskAssignedGroups.each() {
+                result.taskInstance.removeFromAssignedGroups(it)
+                it.delete()
+            }
+
             if(result.error)
                 return result
Index: /trunk/test/integration/TaskSearchServiceTests.groovy
===================================================================
--- /trunk/test/integration/TaskSearchServiceTests.groovy	(revision 513)
+++ /trunk/test/integration/TaskSearchServiceTests.groovy	(revision 514)
@@ -13,4 +13,6 @@
     def dateUtilService
     def taskSearchService
+    def assignedGroupService
+    def assignedPersonService
 
     def taskA
@@ -64,6 +66,10 @@
     }
 
+
+    /**
+    * Test GetTasks.
+    */
     void testGetTasks() {
-        // Todays tasks should be returned
+        // Todays tasks should be returned.
         def tasks = taskSearchService.getTasks([:])
         assert tasks.totalCount == taskCount
@@ -110,3 +116,103 @@
     } // testGetTasks()
 
+    /**
+    * Test GetPersonsTasks.
+    */
+    void testGetPersonsTasks() {
+
+        def result
+        def p = [:]
+
+        // Todays tasks should be returned, since Person #1 is lead and created the tasks.
+        def tasks = taskSearchService.getPersonsTasks([:])
+        assert tasks.totalCount == taskCount
+
+        // Tasks in the trash should not be returned.
+        taskA.trash = true
+        taskA.save(flush:true)
+        assert taskSearchService.getPersonsTasks([:]).totalCount == taskCount - 1
+        taskB.trash = true
+        taskB.save(flush:true)
+        assert taskSearchService.getPersonsTasks([:]).totalCount == taskCount - 2
+
+        // Restored tasks should be returned.
+        taskA.trash = false
+        taskA.save(flush:true)
+        assert taskSearchService.getPersonsTasks([:]).totalCount == taskCount - 1
+        taskB.trash = false
+        taskB.save(flush:true)
+        assert taskSearchService.getPersonsTasks([:]).totalCount == taskCount
+
+        // Tomorrows tasks should not be returned.
+        taskA.targetStartDate = dateUtilService.tomorrow
+        taskA.targetCompletionDate = dateUtilService.tomorrow
+        taskA.save(flush:true)
+        assert taskSearchService.getPersonsTasks([:]).totalCount == taskCount - 1
+
+        // Tomorrows tasks should be returned, if we ask for them.
+        assert taskSearchService.getPersonsTasks([:], null, dateUtilService.today, dateUtilService.tomorrow+1).totalCount == taskCount
+
+        // Yesterdays tasks should not be returned.
+        taskA.targetStartDate = dateUtilService.yesterday
+        taskA.targetCompletionDate = dateUtilService.yesterday
+        taskA.save(flush:true)
+        assert taskSearchService.getPersonsTasks([:]).totalCount == taskCount - 1
+
+        // Yesterdays tasks should be returned, if we ask for them.
+        assert taskSearchService.getPersonsTasks([:], null, dateUtilService.yesterday, dateUtilService.tomorrow).totalCount == taskCount
+
+        // Tasks that span today should be returned.
+        taskA.targetStartDate = dateUtilService.yesterday
+        taskA.targetCompletionDate = dateUtilService.tomorrow
+        taskA.save(flush:true)
+        assert taskSearchService.getPersonsTasks([:]).totalCount == taskCount
+
+        // Tasks for a different person should not be returned.
+        taskA.leadPerson = Person.get(2)
+        taskA.save(flush:true)
+        assert taskSearchService.getPersonsTasks([:]).totalCount == taskCount - 1
+
+        // Tasks for a specified leadPerson should be returned.
+        // But only if approved since this person did not create the tasks.
+        taskA.leadPerson = Person.get(2)
+        taskA.save(flush:true)
+        assert taskSearchService.getPersonsTasks([:], Person.get(2)).totalCount == 0
+        taskA.approved = true
+        taskA.save(flush:true)
+        assert taskSearchService.getPersonsTasks([:], Person.get(2)).totalCount == 1
+        // Moving the task to the trash, stops it being returned.
+        taskA.trash = true
+        taskA.save(flush:true)
+        assert taskSearchService.getPersonsTasks([:], Person.get(2)).totalCount == 0
+
+        // Tasks assigned to a person should be returned.
+        // But only if approved.
+        p = [person: Person.get(2),
+                task: taskB,
+                estimatedHour: 1,
+                estimatedMinute: 20]
+        assert assignedPersonService.save(p).error == null
+        assert taskSearchService.getPersonsTasks([:], Person.get(2)).totalCount == 0
+        taskB.approved = true
+        taskB.save(flush:true)
+        assert taskSearchService.getPersonsTasks([:], Person.get(2)).totalCount == 1
+
+        // Tasks assigned to a person via a group should be returned.
+        // But only if approved.
+        Person.get(2).addToPersonGroups(PersonGroup.read(1)).save(flush:true)
+        taskA.trash = false
+        taskA.approved = false
+        taskA.save(flush:true)
+        p = [personGroup: PersonGroup.read(1),
+                task: taskA,
+                estimatedHour: 2,
+                estimatedMinute: 30]
+        assert assignedGroupService.save(p).error == null
+        assert taskSearchService.getPersonsTasks([:], Person.get(2)).totalCount == 1 // Only taskB from above.
+        taskA.approved = true
+        taskA.save(flush:true)
+        assert taskSearchService.getPersonsTasks([:], Person.get(2)).totalCount == 2 // taskA and taskB.
+
+    } // testGetTasks()
+
 } // end class
