Index: /trunk/grails-app/controllers/EntryDetailedController.groovy
===================================================================
--- /trunk/grails-app/controllers/EntryDetailedController.groovy	(revision 872)
+++ /trunk/grails-app/controllers/EntryDetailedController.groovy	(revision 873)
@@ -113,21 +113,17 @@
         def taskInstance = Task.read(params.taskId)
 
-        if(!taskInstance) {
-            params.errorMessage = g.message(code:"default.not.found", args:['Task',params.taskId])
-            render(contentType:"text/json", status: 403, template: "/shared/messages")
-            return
-        }
-
-        // Check for Complete task.
-        if(taskInstance.taskStatus.id == 3) {
-            params.errorMessage = g.message(code:"task.operationNotPermittedOnCompleteTask")
-            render(contentType:"text/json", status: 403, template: "/shared/messages")
-            return
-        }
-
-        // Success.
         def entryInstance = new Entry()
         entryInstance.task = taskInstance
         entryInstance.entryType = EntryType.read(params.entryTypeId)
+
+        // Check if we should create this entry.
+        def checkResult = taskService.checkCreateEntry(entryInstance)
+        if(checkResult.error) {
+            params.errorMessage = g.message(code: checkResult.error.code)
+            render(contentType:"text/json", status: 403, template: "/shared/messages")
+            return
+        }
+
+        // Success.
         def model = ['entryInstance': entryInstance]
 
Index: /trunk/grails-app/i18n/messages.properties
===================================================================
--- /trunk/grails-app/i18n/messages.properties	(revision 872)
+++ /trunk/grails-app/i18n/messages.properties	(revision 873)
@@ -156,4 +156,6 @@
 task.operationNotPermittedOnCompleteTask=This operation is not permitted on a complete task.
 task.operationNotPermittedOnTaskInTrash=This operation is not permitted on a task that is in the trash.
+task.operationNotPermittedOnRecurringTask=This operation is not permitted \
+    on a recurring task, please see the Sub Tasks.
 task.operationNotPermittedOnRecurringTaskWithoutAuth=This operation is not permitted \
     on a recurring task without authorisation.
@@ -164,4 +166,6 @@
 task.operationNotPermittedOnParentPmTask=This operation is not permitted \
     on a Parent PM task.
+task.createEntryNotPermittedOnTaskWithProcedure=This operation is not permitted \
+    on a task with a procedure, please create entries on the procedure tab.
 task.failedToSave=Could not complete operation, task failed to save.
 task.modifications.failedToSave=Could not complete operation, as task modification record failed to save.
Index: /trunk/grails-app/services/TaskService.groovy
===================================================================
--- /trunk/grails-app/services/TaskService.groovy	(revision 872)
+++ /trunk/grails-app/services/TaskService.groovy	(revision 873)
@@ -338,15 +338,8 @@
             }
 
-            if(!taskInstance)
-                return fail(field:"task", code:"task.notFound")
-
-            if(taskInstance.taskStatus.id == 3)
-                return fail(field:"task", code:"task.operationNotPermittedOnCompleteTask")
-
-            // Check for authorisation on recurring tasks.
-            if(taskInstance.taskRecurringSchedule) {
-                if(!authenticateService.ifAnyGranted('ROLE_AppAdmin,ROLE_Manager,ROLE_TaskManager'))
-                    return fail(field:"task", code:"task.operationNotPermittedOnRecurringTaskWithoutAuth")
-            }
+            // Check if we should create this entry.
+            def checkResult = checkCreateEntry(result.entryInstance)
+            if(checkResult.error)
+                return fail(field:"task", code: checkResult.error.code)
 
             if(result.entryInstance.hasErrors() || !result.entryInstance.save())
@@ -1065,3 +1058,41 @@
     } // end saveImmediateCallout()
 
+    /**
+    * Check if we should create an entry.
+    * @param entryInstance The entry to check.
+    * @returns A map containing result.error (if any error) and result.taskInstance.
+    */
+    def checkCreateEntry(entryInstance) {
+        def result = [:]
+
+        def fail = { Map m ->
+            result.error = [ code: m.code, args: [] ]
+            return result
+        }
+
+        def taskInstance = entryInstance.task
+        if(!taskInstance)
+            return fail(code:"task.notFound")
+
+        // Check for tashed task.
+        if(taskInstance.trash)
+            return fail(code:"task.operationNotPermittedOnTaskInTrash")
+
+        // Check for Complete task.
+        if(taskInstance.taskStatus.id == 3)
+            return fail(code: "task.operationNotPermittedOnCompleteTask")
+
+        // Check for recurring schedule.
+        if(taskInstance.taskRecurringSchedule)
+            return fail(code:"task.operationNotPermittedOnRecurringTask")
+
+        // Check for procedure and ensure we are creating a PM Entry.
+        if(taskInstance.taskProcedureRevision && (entryInstance.entryType.id != 6) )
+            return fail(code:"task.createEntryNotPermittedOnTaskWithProcedure")
+
+        // Success.
+        return result
+
+    } // checkCreateEntry()
+
 } // end TaskService
