Index: /trunk/grails-app/controllers/AssetSubItemDetailedController.groovy
===================================================================
--- /trunk/grails-app/controllers/AssetSubItemDetailedController.groovy	(revision 284)
+++ /trunk/grails-app/controllers/AssetSubItemDetailedController.groovy	(revision 285)
@@ -2,5 +2,7 @@
 
 class AssetSubItemDetailedController extends BaseController {
-    
+
+    def assetSubItemService
+
     def index = { redirect(controller: "assetDetailed", params:params) }
 
@@ -27,5 +29,5 @@
             }
             catch(org.springframework.dao.DataIntegrityViolationException e) {
-                flash.message = "AssetSubItem ${params.id} could not be deleted"
+                flash.errorMessage = "AssetSubItem ${params.id} could not be deleted"
                 redirect(action:show,id:params.id)
             }
@@ -110,32 +112,26 @@
 
     def create = {
-        def assetSubItemInstance = new AssetSubItem()
-        assetSubItemInstance.properties = params
-        return ['assetSubItemInstance':assetSubItemInstance]
+        def result = assetSubItemService.create(params)
+
+        if(!result.error)
+            return [assetSubItemInstance: result.assetSubItemInstance, assetInstance: result.assetInstance]
+
+        flash.message = g.message(code: result.error.code, args: result.error.args)
+        redirect(controller: 'assetDetailed', action: 'search')
     }
 
     def save = {
-        def assetSubItemInstance = new AssetSubItem(params)
+        def result = assetSubItemService.save(params)
 
-//         if(!assetSubItemInstance.asset && !assetSubItemInstance.parentItem) {
-//             flash.message = "Either an asset or parentItem is required."
-//             render(view:'create',model:[assetSubItemInstance:assetSubItemInstance])
-//             return
-//         }
-// 
-//         if(assetSubItemInstance.asset && assetSubItemInstance.parentItem) {
-//             flash.message = "Both an asset and parentItem may not be specified at the same time."
-//             render(view:'create',model:[assetSubItemInstance:assetSubItemInstance])
-//             return
-//         }
+        if(!result.error) {
+            // Success.
+            flash.message = g.message(code: "default.create.success", args: ["AssetSubItem", result.assetSubItemInstance.name])
 
-        if(!assetSubItemInstance.hasErrors() && assetSubItemInstance.save(flush: true)) {
-            flash.message = "AssetSubItem ${assetSubItemInstance.id} created"
-
-            if(assetSubItemInstance.assets)
-                redirect(controller: "assetDetailed", action:"show", id: assetSubItemInstance.assets.toArray()[0].id)
+            /// @todo: This just grabs the first parent in an unsorted list and needs improving.
+            if(result.assetSubItemInstance.assets)
+                redirect(controller: "assetDetailed", action:"show", id: result.assetSubItemInstance.assets.toArray()[0].id)
             else {
                 //Get the top parentItem.
-                def parentItem = assetSubItemInstance.parentItem
+                def parentItem = result.assetSubItemInstance.parentItem
                 def i = 0
                 while(parentItem?.parentItem) {
@@ -150,12 +146,14 @@
                     redirect(controller: "assetDetailed", action:"show", id: parentItem.assets.toArray()[0].id)
                 else
-                    redirect(action:"show", id: assetSubItemInstance.id) // End stop if all else fails.
+                    redirect(action:"show", id: result.assetSubItemInstance.id) // End stop if all else fails.
             }
+            return
+        }
 
-        }
-        else {
-            render(view:'create',model:[assetSubItemInstance:assetSubItemInstance])
-        }
-    } // end save()
+        if(result.error.code == "assetSubItem.asset.not.found")
+            flash.errorMessage = g.message(code: "default.create.success")
+
+        render(view:'create', model:[assetSubItemInstance: result.assetSubItemInstance, assetInstance: result.assetInstance])
+    }
 
 } // end class
Index: /trunk/grails-app/i18n/messages.properties
===================================================================
--- /trunk/grails-app/i18n/messages.properties	(revision 284)
+++ /trunk/grails-app/i18n/messages.properties	(revision 285)
@@ -10,4 +10,6 @@
     While copy creates a new asset and new sub items.
 asset.copy.asset.required=Please select an asset to copy.
+
+assetSubItem.asset.not.found=Could not complete operation as an asset was supplied but not found.
 
 sub.task.create.confirm=Immediately create and save a new sub task?
Index: /trunk/grails-app/services/AssetSubItemService.groovy
===================================================================
--- /trunk/grails-app/services/AssetSubItemService.groovy	(revision 285)
+++ /trunk/grails-app/services/AssetSubItemService.groovy	(revision 285)
@@ -0,0 +1,56 @@
+class AssetSubItemService {
+
+    boolean transactional = false
+
+    def create(params) {
+        def result = [:]
+        def fail = { Map m ->
+            result.error = [ code: m.code, args: ["AssetSubItem", params.id] ]
+            return result
+        }
+
+        result.assetSubItemInstance = new AssetSubItem()
+        result.assetSubItemInstance.properties = params
+
+        // pass in an asset to link to if provided.
+        if(params.asset?.id)
+            result.assetInstance = Asset.get(params.asset.id)
+
+        // success
+        return result
+    }
+
+    def save(params) {
+        Asset.withTransaction { status ->
+            def result = [:]
+
+            def fail = { Map m ->
+                status.setRollbackOnly()
+                if(result.assetSubItemInstance && m.field)
+                    result.assetSubItemInstance.errors.rejectValue(m.field, m.code)
+                result.error = [ code: m.code, args: ["AssetSubItem", params.id] ]
+                return result
+            }
+
+            result.assetSubItemInstance = new AssetSubItem(params)
+
+            if(params.asset?.id) {
+                result.assetInstance = Asset.get(params.asset.id)
+
+                if(!result.assetInstance)
+                    return fail(code:"assetSubItem.asset.not.found")
+            }
+
+            if(result.assetSubItemInstance.hasErrors() || !result.assetSubItemInstance.save(flush: true))
+                return fail(code:"default.create.failure")
+
+            if(result.assetInstance)
+                result.assetInstance.addToAssetSubItems(result.assetSubItemInstance)
+
+            // Success.
+            return result
+
+        } //end withTransaction
+    } // save()
+
+} // end class
Index: /trunk/grails-app/taglib/AssetTreeTagLib.groovy
===================================================================
--- /trunk/grails-app/taglib/AssetTreeTagLib.groovy	(revision 284)
+++ /trunk/grails-app/taglib/AssetTreeTagLib.groovy	(revision 285)
@@ -271,6 +271,6 @@
     }
 
-    def assetSubItemCreateLink(id) {
-        createLink(controller: 'assetSubItemDetailed', action: 'create', params: ['id': id] ).toString()
+    def assetSubItemCreateLink(assetId) {
+        createLink(controller: 'assetSubItemDetailed', action: 'create', params: ['asset.id': assetId] ).toString()
     }
 
Index: /trunk/grails-app/views/assetSubItemDetailed/create.gsp
===================================================================
--- /trunk/grails-app/views/assetSubItemDetailed/create.gsp	(revision 284)
+++ /trunk/grails-app/views/assetSubItemDetailed/create.gsp	(revision 285)
@@ -12,7 +12,5 @@
         </div>
         <div class="body">
-            <g:if test="${flash.message}">
-            <div class="message">${flash.message}</div>
-            </g:if>
+            <g:render template="/shared/messages" />
             <g:hasErrors bean="${assetSubItemInstance}">
             <div class="errors">
@@ -29,8 +27,20 @@
                                 <tr class="prop">
                                     <td valign="top" class="name">
-                                        <label for="asset">Parent Item:</label>
+                                        <label for="parentItem">Parent Item:</label>
                                     </td>
                                     <td valign="top" class="value">
                                         ${assetSubItemInstance.parentItem.encodeAsHTML()}
+                                    </td>
+                                </tr>
+                            </g:if>
+
+                            <g:if test="${assetInstance}" >
+                                <g:hiddenField name="asset.id" value="${assetInstance.id}" />
+                                <tr class="prop">
+                                    <td valign="top" class="name">
+                                        <label for="asset">Link with Asset:</label>
+                                    </td>
+                                    <td valign="top" class="value">
+                                        ${assetInstance.encodeAsHTML()}
                                     </td>
                                 </tr>
Index: /trunk/grails-app/views/assetSubItemDetailed/edit.gsp
===================================================================
--- /trunk/grails-app/views/assetSubItemDetailed/edit.gsp	(revision 284)
+++ /trunk/grails-app/views/assetSubItemDetailed/edit.gsp	(revision 285)
@@ -12,7 +12,5 @@
         </div>
         <div class="body">
-            <g:if test="${flash.message}">
-            <div class="message">${flash.message}</div>
-            </g:if>
+            <g:render template="/shared/messages" />
             <g:hasErrors bean="${assetSubItemInstance}">
             <div class="errors">
@@ -56,13 +54,4 @@
                             <tr class="prop">
                                 <td valign="top" class="name">
-                                    <label for="parentItem">Parent Item:</label>
-                                </td>
-                                <td valign="top" class="value ${hasErrors(bean:assetSubItemInstance,field:'parentItem','errors')}">
-                                    <g:select optionKey="id" from="${AssetSubItem.list()}" name="parentItem.id" value="${assetSubItemInstance?.parentItem?.id}" noSelection="['null':'']"></g:select>
-                                </td>
-                            </tr> 
-                        
-                            <tr class="prop">
-                                <td valign="top" class="name">
                                     <label for="assetSubItemExtendedAttributes">Asset Sub Item Extended Attributes:</label>
                                 </td>
@@ -76,13 +65,4 @@
 <g:link controller="assetSubItemExtendedAttributeDetailed" params="['assetSubItem.id':assetSubItemInstance?.id]" action="create">Add AssetSubItemExtendedAttribute</g:link>
 
-                                </td>
-                            </tr>
-
-                             <tr class="prop">
-                                 <td valign="top" class="name">
-                                    <label for="assets">Assets:</label>
-                                </td>
-                                <td valign="top" class="value ${hasErrors(bean:assetSubItemInstance,field:'assets','errors')}">
-                                    
                                 </td>
                             </tr>
@@ -104,6 +84,28 @@
 
                                 </td>
+                            </tr>
+                        
+                            <tr class="prop">
+                                <td valign="top" class="name">
+                                    <label for="parentItem">Parent Item:</label>
+                                </td>
+                                <td valign="top" class="value ${hasErrors(bean:assetSubItemInstance,field:'parentItem','errors')}">
+                                    <g:select optionKey="id" from="${AssetSubItem.list()}" name="parentItem.id" value="${assetSubItemInstance?.parentItem?.id}" noSelection="['null':'']"></g:select>
+                                </td>
                             </tr> 
-                        
+
+                            <tr class="prop">
+                                <td valign="top" class="name">Assets:</td>
+
+                                <td  valign="top" style="text-align:left;" class="value">
+                                    <ul>
+                                    <g:each var="a" in="${assetSubItemInstance.assets}">
+                                        <li><g:link controller="assetDetailed" action="show" id="${a.id}">${a?.encodeAsHTML()}</g:link></li>
+                                    </g:each>
+                                    </ul>
+                                </td>
+
+                            </tr>
+
                             <tr class="prop">
                                 <td valign="top" class="name">
@@ -117,5 +119,5 @@
 </g:each>
 </ul>
-<g:link controller="assetSubItemDetailed" params="['assetSubItem.id':assetSubItemInstance?.id]" action="create">Add AssetSubItem</g:link>
+<g:link controller="assetSubItemDetailed" params="['parentItem.id':assetSubItemInstance?.id]" action="create">Add AssetSubItem</g:link>
 
                                 </td>
Index: /trunk/grails-app/views/assetSubItemDetailed/show.gsp
===================================================================
--- /trunk/grails-app/views/assetSubItemDetailed/show.gsp	(revision 284)
+++ /trunk/grails-app/views/assetSubItemDetailed/show.gsp	(revision 285)
@@ -12,7 +12,5 @@
         </div>
         <div class="body">
-            <g:if test="${flash.message}">
-            <div class="message">${flash.message}</div>
-            </g:if>
+            <g:render template="/shared/messages" />
             <div class="dialog">
                 <table>
@@ -49,11 +47,4 @@
                     
                         <tr class="prop">
-                            <td valign="top" class="name">Parent Item:</td>
-                            
-                            <td valign="top" class="value"><g:link controller="assetSubItemDetailed" action="show" id="${assetSubItemInstance?.parentItem?.id}">${assetSubItemInstance?.parentItem?.encodeAsHTML()}</g:link></td>
-                            
-                        </tr>
-                    
-                        <tr class="prop">
                             <td valign="top" class="name">Asset Sub Item Extended Attributes:</td>
                             
@@ -65,4 +56,24 @@
                                 </ul>
                             </td>
+                            
+                        </tr>
+                    
+                        <tr class="prop">
+                            <td valign="top" class="name">Maintenance Actions:</td>
+                            
+                            <td  valign="top" style="text-align:left;" class="value">
+                                <ul>
+                                <g:each var="m" in="${assetSubItemInstance.maintenanceActions}">
+                                    <li><g:link controller="maintenanceActionDetailed" action="show" id="${m.id}">${m?.encodeAsHTML()}</g:link></li>
+                                </g:each>
+                                </ul>
+                            </td>
+                            
+                        </tr>
+                    
+                        <tr class="prop">
+                            <td valign="top" class="name">Parent Item:</td>
+                            
+                            <td valign="top" class="value"><g:link controller="assetSubItemDetailed" action="show" id="${assetSubItemInstance?.parentItem?.id}">${assetSubItemInstance?.parentItem?.encodeAsHTML()}</g:link></td>
                             
                         </tr>
@@ -79,17 +90,4 @@
                             </td>
 
-                        </tr>
-                    
-                        <tr class="prop">
-                            <td valign="top" class="name">Maintenance Actions:</td>
-                            
-                            <td  valign="top" style="text-align:left;" class="value">
-                                <ul>
-                                <g:each var="m" in="${assetSubItemInstance.maintenanceActions}">
-                                    <li><g:link controller="maintenanceActionDetailed" action="show" id="${m.id}">${m?.encodeAsHTML()}</g:link></li>
-                                </g:each>
-                                </ul>
-                            </td>
-                            
                         </tr>
                     
