Index: trunk/grails-app/services/AssetSubItemService.groovy
===================================================================
--- trunk/grails-app/services/AssetSubItemService.groovy	(revision 287)
+++ trunk/grails-app/services/AssetSubItemService.groovy	(revision 290)
@@ -22,5 +22,5 @@
 
     def save(params) {
-        Asset.withTransaction { status ->
+        AssetSubItem.withTransaction { status ->
             def result = [:]
 
Index: trunk/grails-app/services/CreateDataService.groovy
===================================================================
--- trunk/grails-app/services/CreateDataService.groovy	(revision 287)
+++ trunk/grails-app/services/CreateDataService.groovy	(revision 290)
@@ -156,4 +156,5 @@
         saveAndTest(authInstance)
 
+        // #3
         authInstance = new Authority(description:"Application User, all application users need this base role to allow login.",
                                         authority:"ROLE_AppUser")
Index: trunk/grails-app/services/CsvService.groovy
===================================================================
--- trunk/grails-app/services/CsvService.groovy	(revision 287)
+++ trunk/grails-app/services/CsvService.groovy	(revision 290)
@@ -16,58 +16,85 @@
     */
     def importAssetTree(request) {
-        def result = [:]
-
-        def megaByteMultiplier = 1000 * 1000
-        def fileMaxSize = 10 * megaByteMultiplier //Mb
-
-        def multiPartFile = request.getFile('file')
-
-        InputStreamReader sr = new InputStreamReader(multiPartFile.inputStream)
-        CSVReader reader = new CSVReader(sr)
-
-        def fail = { Map m ->
-            //status.setRollbackOnly()
-            reader.close()
-            result.error = [ code: m.code, args: m.args ]
-            return result
-        }
-
-        if(!multiPartFile || multiPartFile.isEmpty())
-            return fail(code: "asset.tree.import.file.not.supplied")
-
-        if (multiPartFile.getSize() > fileMaxSize)
-            return fail(code: "asset.tree.import.file.over.max.size", args: [fileMaxSize/megaByteMultiplier])
-
-        def line = reader.readNext()
-        def lineNumber = 1
-
-        def header = ["Site", "Section", "Asset", "Sub Asset", "Functional Assembly", "Sub Assembly Group"]
-
-        if(line != header)
-            return fail(code: "asset.tree.import.no.header")
-
-        log.info "Import checks passed, start processing asset file."
-
-        // Prepare the first body line.
-        line = reader.readNext()
-        lineNumber ++
-
-        while(line) {
-            def lineSize = line.size()
-//             log.info lineNumber+ "(" + lineSize + ")" + " : " + line
-
-            if(line[0]) {
-                    if( !Site.findByName(line[0]) )
-                        new Site(name: line[0]).save()
-            }
-
+        Asset.withTransaction { status ->
+            def result = [:]
+
+            def megaByteMultiplier = 1000 * 1000
+            def fileMaxSize = 10 * megaByteMultiplier //Mb
+
+            def multiPartFile = request.getFile('file')
+
+            InputStreamReader sr = new InputStreamReader(multiPartFile.inputStream)
+            CSVReader reader = new CSVReader(sr)
+
+            def fail = { Map m ->
+                status.setRollbackOnly()
+                reader.close()
+                result.error = [ code: m.code, args: m.args ]
+                return result
+            }
+
+            if(!multiPartFile || multiPartFile.isEmpty())
+                return fail(code: "asset.tree.import.file.not.supplied")
+
+            if (multiPartFile.getSize() > fileMaxSize)
+                return fail(code: "asset.tree.import.file.over.max.size", args: [fileMaxSize/megaByteMultiplier])
+
+            def line = reader.readNext()
+            def lineNumber = 1
+
+            def header = ["Site", "Section", "Asset", "Sub Asset", "Functional Assembly", "Sub Assembly Group"]
+
+            if(line != header)
+                return fail(code: "asset.tree.import.no.header")
+
+            log.info "Import checks passed, start processing asset file."
+
+            // Prepare the first body line.
             line = reader.readNext()
             lineNumber ++
-        } //while(line)
-
-        // Success.
-        reader.close()
-        return result
-
+
+            def siteInstance
+            def sectionInstance
+            def assetInstance
+
+            while(line) {
+                def lineSize = line.size()
+    //             log.info lineNumber+ "(" + lineSize + ")" + " : " + line
+
+                if(line[0]) {
+                        if( !Site.findByName(line[0]) )
+                            siteInstance = new Site(name: line[0])
+                            if(!siteInstance.save())
+                                return fail(code: "asset.tree.import.failure", args: [lineNumber])
+                }
+                else continue
+
+                if(line[1]) {
+                        if( !Section.findByName(line[1]) )
+                           sectionInstance =  new Section(name: line[1],
+                                                                                site: siteInstance)
+                            if(!sectionInstance.save())
+                                return fail(code: "asset.tree.import.failure", args: [lineNumber])
+                }
+                else continue
+
+                if(line[2]) {
+                        if( !Asset.findByName(line[2]) )
+                            assetInstance = new Asset(name: line[2],
+                                                                        section: sectionInstance)
+                            if(!sectionInstance.save())
+                                return fail(code: "asset.tree.import.failure", args: [lineNumber])
+                }
+                else continue
+
+                line = reader.readNext()
+                lineNumber ++
+            } //while(line)
+
+            // Success.
+            reader.close()
+            return result
+
+        } //end withTransaction
     } // end importAssetTree()
 
