Index: trunk/grails-app/controllers/MaintenanceActionDetailedController.groovy
===================================================================
--- trunk/grails-app/controllers/MaintenanceActionDetailedController.groovy	(revision 132)
+++ trunk/grails-app/controllers/MaintenanceActionDetailedController.groovy	(revision 133)
@@ -1,5 +1,5 @@
 import org.codehaus.groovy.grails.plugins.springsecurity.Secured
 
-class MaintenanceActionDetailedController extends BaseAppAdminController {
+class MaintenanceActionDetailedController extends BaseController {
     
     def index = { redirect(action:list,params:params) }
Index: trunk/grails-app/controllers/TaskDetailedController.groovy
===================================================================
--- trunk/grails-app/controllers/TaskDetailedController.groovy	(revision 132)
+++ trunk/grails-app/controllers/TaskDetailedController.groovy	(revision 133)
@@ -20,4 +20,18 @@
     }
 
+//     def show = {
+//         def taskInstance = Task.get( params.id )
+// 
+//         if(!taskInstance) {
+//             flash.message = "Task not found with id ${params.id}"
+//             redirect(action:list)
+//         }
+//         else { 
+//             def taskProcedureInstance = TaskProcedure.get(taskInstance?.taskProcedure?.id)
+//             return [ taskInstance : taskInstance,  taskProcedureInstance: taskProcedureInstance] 
+// 
+//         }
+//     }
+
     def show = {
         def taskInstance = Task.get( params.id )
@@ -27,8 +41,16 @@
             redirect(action:list)
         }
-        else { 
-            def taskProcedureInstance = TaskProcedure.get(taskInstance?.taskProcedure?.id)
-            return [ taskInstance : taskInstance,  taskProcedureInstance: taskProcedureInstance] 
+        else {
+            def taskProcedureInstance = TaskProcedure.get(taskInstance.taskProcedure?.id)
+            def taskProcedureExits = new Boolean("true")
+            def showTaskTab = new String("true")
 
+            if(!taskProcedureInstance) {
+                taskProcedureExits = false
+            }
+            return [ taskInstance : taskInstance,
+                            taskProcedureInstance: taskProcedureInstance,
+                            taskProcedureExits: taskProcedureExits,
+                            showTaskTab: showTaskTab] 
         }
     }
@@ -114,3 +136,32 @@
         }
     }
+
+    //Generate a new TaskProcedure for a taskInstance.
+    def generateProcedure = {
+        def taskProcedureInstance = new TaskProcedure()
+        taskProcedureInstance.properties = params
+
+        def taskInstance = Task.get(params.taskInstance.id)
+        def taskProcedureExits = new Boolean("true")
+        def showProcedureTab = new String("true")
+
+        if(!taskProcedureInstance.hasErrors() && taskProcedureInstance.save()) {
+            taskProcedureInstance.addToTasks(taskInstance)
+            flash.message = "Procedure created, you can now add steps to the procedure"
+//             redirect(action:show, id:params.taskInstance.id)
+        }
+        else {
+            taskProcedureExits = false
+        }
+
+        render(view:'show',model:[ taskInstance : taskInstance,  
+                                                        taskProcedureInstance: taskProcedureInstance, 
+                                                        taskProcedureExits: taskProcedureExits,
+                                                        showProcedureTab: showProcedureTab])
+    }
+
+    def findProcedure = {
+        redirect(controller:"taskProcedureDetailed", action:"list", id:params.taskInstance.id) 
+    }
+        
 }
Index: trunk/grails-app/controllers/TaskProcedureDetailedController.groovy
===================================================================
--- trunk/grails-app/controllers/TaskProcedureDetailedController.groovy	(revision 133)
+++ trunk/grails-app/controllers/TaskProcedureDetailedController.groovy	(revision 133)
@@ -0,0 +1,99 @@
+import org.codehaus.groovy.grails.plugins.springsecurity.Secured
+
+class TaskProcedureDetailedController extends BaseController {
+    
+    def index = { redirect(action:list,params:params) }
+
+    // the delete, save and update actions only accept POST requests
+    static allowedMethods = [delete:'POST', save:'POST', update:'POST']
+
+    def list = {
+        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)
+        [ taskProcedureInstanceList: TaskProcedure.list( params ), taskProcedureInstanceTotal: TaskProcedure.count() ]
+    }
+
+    def show = {
+        def taskProcedureInstance = TaskProcedure.get( params.id )
+
+        if(!taskProcedureInstance) {
+            flash.message = "TaskProcedure not found with id ${params.id}"
+            redirect(action:list)
+        }
+        else { return [ taskProcedureInstance : taskProcedureInstance ] }
+    }
+
+    def delete = {
+        def taskProcedureInstance = TaskProcedure.get( params.id )
+        if(taskProcedureInstance) {
+            try {
+                taskProcedureInstance.delete()
+                flash.message = "TaskProcedure ${params.id} deleted"
+                redirect(action:list)
+            }
+            catch(org.springframework.dao.DataIntegrityViolationException e) {
+                flash.message = "TaskProcedure ${params.id} could not be deleted"
+                redirect(action:show,id:params.id)
+            }
+        }
+        else {
+            flash.message = "TaskProcedure not found with id ${params.id}"
+            redirect(action:list)
+        }
+    }
+
+    def edit = {
+        def taskProcedureInstance = TaskProcedure.get( params.id )
+
+        if(!taskProcedureInstance) {
+            flash.message = "TaskProcedure not found with id ${params.id}"
+            redirect(action:list)
+        }
+        else {
+            return [ taskProcedureInstance : taskProcedureInstance ]
+        }
+    }
+
+    def update = {
+        def taskProcedureInstance = TaskProcedure.get( params.id )
+        if(taskProcedureInstance) {
+            if(params.version) {
+                def version = params.version.toLong()
+                if(taskProcedureInstance.version > version) {
+                    
+                    taskProcedureInstance.errors.rejectValue("version", "taskProcedure.optimistic.locking.failure", "Another user has updated this TaskProcedure while you were editing.")
+                    render(view:'edit',model:[taskProcedureInstance:taskProcedureInstance])
+                    return
+                }
+            }
+            taskProcedureInstance.properties = params
+            if(!taskProcedureInstance.hasErrors() && taskProcedureInstance.save()) {
+                flash.message = "TaskProcedure ${params.id} updated"
+                redirect(action:show,id:taskProcedureInstance.id)
+            }
+            else {
+                render(view:'edit',model:[taskProcedureInstance:taskProcedureInstance])
+            }
+        }
+        else {
+            flash.message = "TaskProcedure not found with id ${params.id}"
+            redirect(action:edit,id:params.id)
+        }
+    }
+
+    def create = {
+        def taskProcedureInstance = new TaskProcedure()
+        taskProcedureInstance.properties = params
+        return ['taskProcedureInstance':taskProcedureInstance]
+    }
+
+    def save = {
+        def taskProcedureInstance = new TaskProcedure(params)
+        if(!taskProcedureInstance.hasErrors() && taskProcedureInstance.save()) {
+            flash.message = "TaskProcedure ${taskProcedureInstance.id} created"
+            redirect(action:show,id:taskProcedureInstance.id)
+        }
+        else {
+            render(view:'create',model:[taskProcedureInstance:taskProcedureInstance])
+        }
+    }
+}
