diff --git a/code/nel/tools/build_gamedata/generators/generate_simple_max_exporters.py b/code/nel/tools/build_gamedata/generators/generate_simple_max_exporters.py
index 46dbe5d0a..4e421b9ee 100644
--- a/code/nel/tools/build_gamedata/generators/generate_simple_max_exporters.py
+++ b/code/nel/tools/build_gamedata/generators/generate_simple_max_exporters.py
@@ -90,8 +90,6 @@ def generateSimpleMaxExporter(processName, fileExtension, sourceDirectoriesVaria
 
 generateSimpleMaxExporter("pacs_prim", "pacs_prim", "PacsPrimSourceDirectories", "PacsPrimExportDirectory", "PacsPrimInstallDirectory")
 
-generateSimpleMaxExporter("anim", "anim", "AnimSourceDirectories", "AnimExportDirectory", "AnimInstallDirectory")
-
 generateSimpleMaxExporter("skel", "skel", "SkelSourceDirectories", "SkelExportDirectory", "SkelInstallDirectory")
 
 generateSimpleMaxExporter("swt", "swt", "SwtSourceDirectories", "SwtExportDirectory", "SwtInstallDirectory")
diff --git a/code/nel/tools/build_gamedata/generators/generate_tagged_max_exporters.py b/code/nel/tools/build_gamedata/generators/generate_tagged_max_exporters.py
index a7b1d8ac1..a031fbe61 100644
--- a/code/nel/tools/build_gamedata/generators/generate_tagged_max_exporters.py
+++ b/code/nel/tools/build_gamedata/generators/generate_tagged_max_exporters.py
@@ -108,6 +108,10 @@ generateTaggedMaxExporter("rbank", "cmb", "RBankCmbSourceDirectories", "RBankCmb
 
 generateTaggedMaxExporter("veget", "veget", "VegetSourceDirectories", "VegetExportDirectory", "VegetTagExportDirectory", "VegetInstallDirectory")
 
+generateTaggedMaxScript("shape", "shape")
+
+generateTaggedMaxExporter("anim", "anim", "AnimSourceDirectories", "AnimExportDirectory", "AnimTagExportDirectory", "AnimInstallDirectory")
+
 
 
 printLog(log, "")
diff --git a/code/nel/tools/build_gamedata/generators/max_exporter_scripts/anim.ms b/code/nel/tools/build_gamedata/generators/max_exporter_scripts/anim.ms
index c189e71f8..6dad71979 100644
--- a/code/nel/tools/build_gamedata/generators/max_exporter_scripts/anim.ms
+++ b/code/nel/tools/build_gamedata/generators/max_exporter_scripts/anim.ms
@@ -5,7 +5,7 @@ NEL3D_APPDATA_EXPORT_NODE_ANIMATION = 1423062800
 fn runNelMaxExport inputMaxFile = 
 (
 	outputNelFile = ("%OutputDirectory%/" + (getFilenameFile inputMaxFile) + ".%PreGenFileExtension%")
-	tagThisFile = false
+	tagThisFile = true
 	
 	-- Unhide category
 	unhidecategory()
@@ -55,13 +55,12 @@ fn runNelMaxExport inputMaxFile =
 		else
 		(
 			nlerror("OK " + outputNelFile)
-			tagThisFile = true
 		)
 	)
 	else
 	(
 		-- Error
-		nlerror("ERROR exporting animation: no node animated to export in file " + inputMaxFile)
+		nlerror("WARNING exporting animation: no node animated to export in file " + inputMaxFile)
 	)
 	
 	return tagThisFile
diff --git a/code/nel/tools/build_gamedata/generators/max_exporter_scripts/shape.ms b/code/nel/tools/build_gamedata/generators/max_exporter_scripts/shape.ms
new file mode 100644
index 000000000..0f8af5276
--- /dev/null
+++ b/code/nel/tools/build_gamedata/generators/max_exporter_scripts/shape.ms
@@ -0,0 +1,361 @@
+
+
+-- Some globals
+
+NEL3D_APPDATA_ACCEL = 1423062561			-- type of accelerator :	"32" = is not an accelerator and IS clusterized 
+											--							 "0" = is not an accelerator and IS NOT clusterized (always visible)
+											--							 "1" = is an accelerator type PORTAL
+											--							 "2" = is an accelerator type CLUSTER
+											--							 "6" = is an accelerator type CLUSTER FATHER-VISIBLE
+											--							"10" = is an accelerator type CLUSTER VISIBLE-FROM-FATHER
+											--							"14" = is an accelerator type CLUSTER FATHER-VISIBLE and VISIBLE-FROM-FATHER
+											--							"17" = is an accelerator type PORTAL DYNAMIC
+																			 
+NEL3D_APPDATA_DONOTEXPORT = 1423062565		-- do not export me : "undefined" = export me
+											--							  "0" = export me
+											--							  "1" = DONT export me
+
+NEL3D_APPDATA_LOD_NAME_COUNT_MAX	= 10
+NEL3D_APPDATA_LOD					= 1423062537
+NEL3D_APPDATA_LOD_NAME_COUNT		= NEL3D_APPDATA_LOD
+NEL3D_APPDATA_LOD_NAME				= NEL3D_APPDATA_LOD_NAME_COUNT+1
+NEL3D_APPDATA_LOD_BLEND_IN			= NEL3D_APPDATA_LOD_NAME+NEL3D_APPDATA_LOD_NAME_COUNT_MAX
+NEL3D_APPDATA_LOD_BLEND_OUT			= NEL3D_APPDATA_LOD_BLEND_IN+1
+NEL3D_APPDATA_LOD_COARSE_MESH		= NEL3D_APPDATA_LOD_BLEND_OUT+1
+NEL3D_APPDATA_COLLISION				= 1423062613
+NEL3D_APPDATA_COLLISION_EXTERIOR	= 1423062614
+NEL3D_APPDATA_AUTOMATIC_ANIMATION	= 1423062617
+
+-- This node is n accelerator ?
+fn isAccelerator node =
+(
+	accel = getappdata node NEL3D_APPDATA_ACCEL
+	if (accel != undefined) then
+	(
+		if (accel == "0") or (accel == "32") then
+			return false
+		else
+			return true
+	)
+	return false
+)
+
+-- Must export this node ?
+fn isToBeExported node =
+(
+	if (isAccelerator node) == true then
+		return false
+	
+	if ((classof node) == RklPatch) then
+		return false
+	
+	if ((classof node) == nel_ps) then
+		return false
+	
+	if ((classof node) == nel_pacs_cylinder) then
+		return false
+	
+	if ((classof node) == nel_pacs_box) then
+		return false
+	
+	doNotExport = getappdata node NEL3D_APPDATA_DONOTEXPORT
+	if (doNotExport != undefined) then
+	(
+		if (doNotExport == "1") then
+			return false
+	)
+	
+	doNotExport = getappdata node NEL3D_APPDATA_COLLISION
+	if (doNotExport != undefined) then
+	(
+		if (doNotExport == "1") then
+			return false
+	)
+	
+	doNotExport = getappdata node NEL3D_APPDATA_COLLISION_EXTERIOR
+	if (doNotExport != undefined) then
+	(
+		if (doNotExport == "1") then
+			return false
+	)
+	
+	return true
+)
+
+-- Must export this node ?
+fn isAnimToBeExported node =
+(
+	automaticAnimation = getappdata node NEL3D_APPDATA_AUTOMATIC_ANIMATION
+	if (automaticAnimation == undefined) then
+		return false
+	if (automaticAnimation == "0") then
+		return false
+	
+	if (isAccelerator node) == true then
+		return false
+	
+	if ((classof node) == nel_pacs_cylinder) then
+		return false
+	
+	if ((classof node) == nel_pacs_box) then
+		return false
+	
+	doNotExport = getappdata node NEL3D_APPDATA_DONOTEXPORT
+	if (doNotExport != undefined) then
+	(
+		if (doNotExport == "1") then
+			return false
+	)
+
+	doNotExport = getappdata node NEL3D_APPDATA_COLLISION
+	if (doNotExport != undefined) then
+	(
+		if (doNotExport == "1") then
+			return false
+	)
+
+	doNotExport = getappdata node NEL3D_APPDATA_COLLISION_EXTERIOR
+	if (doNotExport != undefined) then
+	(
+		if (doNotExport == "1") then
+			return false
+	)
+
+	return true
+)
+
+-- Cast shadow ?
+fn isCastShadow node = 
+(
+	if (classof node == nel_ps) then
+		return false
+
+	if (isAccelerator node) == true then
+	(
+		return false
+	)
+	else
+	(
+		return true
+	)
+)
+
+-- List the lod
+lod_array = #()
+
+-- is a lod ?
+fn isLod node = 
+(
+	for i = 1 to lod_array.count do
+	(
+		if (lod_array[i] == node) then
+			return true
+	)
+	return false
+)
+
+-- have a coarse mesh ?
+fn haveCoarseMesh node = 
+(
+	-- Get lod count
+	nodeCount = getappdata node NEL3D_APPDATA_LOD_NAME_COUNT
+	if (nodeCount != undefined) then
+	(
+		-- For each lod
+		nodeCountNum = nodeCount as Integer
+		for lod = 1 to nodeCountNum do
+		(
+			-- Get the lod
+			lod = getappdata node (NEL3D_APPDATA_LOD_NAME+lod-1)
+			
+			-- Exist ?
+			if (lod != undefined) then
+			(
+				-- Select a node
+				nd = execute ("$'"+lod+"'")
+				
+				-- Node exist ?
+				if (nd != undefined) then
+				(
+					-- Is a coarse mesh ?
+					if (getappdata nd NEL3D_APPDATA_LOD_COARSE_MESH == "1") then
+						return true
+				)
+			)
+		)
+	)
+	return false
+)
+
+fn runNelMaxExport inputMaxFile = 
+(
+	tagThisFile = false
+	
+	-- Unhide category
+	unhidecategory()
+	
+	-- Unhide
+	max unhide all
+	
+	-- unselect
+	max select none
+	
+	-- Exported object count
+	exported = 0
+	
+	-- Add the lod
+	for node in geometry do
+	(
+		-- Get lod count
+		nodeCount = getappdata node NEL3D_APPDATA_LOD_NAME_COUNT
+		if (nodeCount != undefined) then
+		(
+			-- For each lod
+			nodeCountNum = nodeCount as Integer
+			for lod = 1 to nodeCountNum do
+			(
+				-- Get the lod
+				lod = getappdata node (NEL3D_APPDATA_LOD_NAME+lod-1)
+				
+				-- Exist ?
+				if (lod != undefined) then
+				(
+					-- Select a node
+					try
+					(
+						nd = execute("$'"+lod+"'")
+					)
+					catch
+					(
+						nlerror("Error in Execute $'"+lod+"' from node "+node.name)
+						nd = undefined
+					)
+					
+					-- Node exist ?
+					if (nd != undefined) then 
+					(
+						append lod_array nd
+					)
+				)
+			)
+		)
+	)
+	
+	-- Select objects for shadows
+	for node in geometry do
+	(
+		if (node.parent == undefined) then
+		(
+			-- Cast shadow ?
+			if (isCastShadow node == true) then
+			(
+				-- Select this node
+				selectmore node
+			)
+		)
+	)
+	
+	-- Tag this file ?
+	tagThisFile = true
+	
+	-- Array of node to export
+	array_node = #()
+	
+	-- Add geometry
+	for node in geometry do
+		append array_node node
+	
+	-- Add shapes
+	for node in shapes do
+		append array_node node
+	
+	-- For each node
+	for node in array_node do
+	(
+		-- It is root ?
+		if (node.parent == undefined) then
+		(
+			-- Is not a skeleton ?
+			if (node.name != "Bip01") then
+			(
+				-- Can be exported ?
+				if (isToBeExported node == true) then
+				(
+					-- Not a lod ?
+					if ((isLod node) == false) then
+					(
+						-- Output directory
+						if (haveCoarseMesh node) == true then
+							output = ("%OutputDirectoryWithCoarseMesh%/" + (node.name) + ".shape")
+						else
+							output = ("%OutputDirectoryWithoutCoarseMesh%/" + (node.name) + ".shape")
+						
+						-- Compare file date
+						if (NeLTestFileDate output inputMaxFile) == true then
+						(
+							try
+							(
+								-- Export the shape
+								if (NelExportShapeEx node output %ShapeExportOptShadow% %ShapeExportOptExportLighting% "%OutputDirectoryLightmap%" %ShapeExportOptLightingLimit% %ShapeExportOptLumelSize% %ShapeExportOptOversampling% true false %ShapeExportOptLightmapLog%) == true then
+								(
+									nlerror("OK "+output)
+									exported = exported +1 
+								)
+								else
+								(
+									-- Error
+									nlerror("ERROR exporting shape " + node.name + " in file " + inputMaxFile)
+									tagThisFile = false
+								)
+							)
+							catch 
+							(
+								-- Error
+								nlerror("ERROR fatal error exporting shape " + node.name + " in file " + inputMaxFile)
+								tagThisFile = false
+							)
+						)
+						else
+						(
+							nlerror("SKIPPED " + output)
+							exported = exported + 1
+						)
+					)
+				)
+			)
+		)
+	)
+	
+	-- Export default animations
+	
+	for node in objects do
+	(
+		-- Can export it ?
+		if (isAnimToBeExported node) == true then
+		(
+			-- Anim output directory
+			output = ("%OutputDirectoryAnim%/" + (node.name) + ".anim")
+			
+			-- Export the animation
+			if (NelExportAnimation #(node) output false) == false then
+			(
+				nlerror ("ERROR exporting animation " + output)
+				tagThisFile = false
+			)
+			else
+			(
+				nlerror("OK " + output)
+			)
+		)
+	)
+	
+	-- Something exported
+	if exported == 0 then
+	(
+		-- Error
+		nlerror("WARNING no shape exported from the file " + inputMaxFile)
+	)
+	
+	return tagThisFile
+)
+
diff --git a/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/1_export_footer.py b/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/1_export_footer.py
index f4d6f4950..1c5d530f1 100644
--- a/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/1_export_footer.py
+++ b/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/1_export_footer.py
@@ -1,7 +1,9 @@
 
 
-printLog(log, "")
 log.close()
+if os.path.isfile("log.log"):
+	os.remove("log.log")
+shutil.move("temp_log.log", "log.log")
 
 
 # end of file
diff --git a/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/1_export_header.py b/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/1_export_header.py
index e48b44648..38501ec0b 100644
--- a/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/1_export_header.py
+++ b/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/1_export_header.py
@@ -33,7 +33,9 @@ sys.path.append("../../configuration")
 
 if os.path.isfile("log.log"):
 	os.remove("log.log")
-log = open("log.log", "w")
+if os.path.isfile("temp_log.log"):
+	os.remove("temp_log.log")
+log = open("temp_log.log", "w")
 from scripts import *
 from buildsite import *
 from process import *
@@ -69,6 +71,7 @@ if MaxAvailable:
 			outputDirectory =  ExportBuildDirectory + "/" + %PreGenExportDirectoryVariable%
 			tagDirectory =  ExportBuildDirectory + "/" + %PreGenTagExportDirectoryVariable%
 			maxSourceDir = DatabaseDirectory + "/" + dir
+			maxRunningTagFile = tagDirectory + "/max_running.tag"
 			tagList = findFiles(log, tagDirectory, "", ".max.tag")
 			tagLen = len(tagList)
 			if os.path.isfile(scriptDst):
@@ -84,13 +87,44 @@ if MaxAvailable:
 				sDst.write(newline)
 			sSrc.close()
 			sDst.close()
+			zeroRetryLimit = 3
 			while tagDiff > 0:
+				mrt = open(maxRunningTagFile, "w")
+				mrt.write("moe-moe-kyun")
+				mrt.close()
 				printLog(log, "MAXSCRIPT " + scriptDst)
 				subprocess.call([ Max, "-U", "MAXScript", "%PreGenFileExtension%_export.ms", "-q", "-mi", "-vn" ])
+				if os.path.exists(outputLogfile):
+					try:
+						lSrc = open(outputLogfile, "r")
+						for line in lSrc:
+							lineStrip = line.strip()
+							if (len(lineStrip) > 0):
+								printLog(log, lineStrip)
+						lSrc.close()
+						os.remove(outputLogfile)
+					except Exception:
+						printLog(log, "ERROR Failed to read 3dsmax log")
+				else:
+					printLog(log, "WARNING No 3dsmax log")
 				tagList = findFiles(log, tagDirectory, "", ".max.tag")
 				newTagLen = len(tagList)
 				tagDiff = newTagLen - tagLen
 				tagLen = newTagLen
+				addTagDiff = 0
+				if os.path.exists(maxRunningTagFile):
+					printLog(log, "FAIL 3ds Max crashed and/or file export failed!")
+					if tagDiff == 0:
+						if zeroRetryLimit > 0:
+							zeroRetryLimit = zeroRetryLimit - 1
+							addTagDiff = 1
+						else:
+							printLog(log, "FAIL Retry limit reached!")
+					else:
+						addTagDiff = 1
+					os.remove(maxRunningTagFile)
 				printLog(log, "Exported " + str(tagDiff) + " .max files!")
+				tagDiff += addTagDiff
 			os.remove(scriptDst)
+	printLog(log, "")
 
diff --git a/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/export_footer.ms b/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/export_footer.ms
index 42f9a51fa..5facf07e7 100644
--- a/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/export_footer.ms
+++ b/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/export_footer.ms
@@ -1,89 +1,125 @@
 
 
+removeRunningTag = true
+
 try
 (
-	-- Get files in the %MaxSourceDirectory% directory
-	files = getFiles "%MaxSourceDirectory%/*.max" 
-	gc()
-	
-	-- Sort files
-	sort files
-	gc()
-	
-	-- No file ?
-	if files.count != 0 then
+	undo off
 	(
-		-- For each files
-		for i = 1 to files.count do
+		-- Get files in the %MaxSourceDirectory% directory
+		files = getFiles "%MaxSourceDirectory%/*.max" 
+		gc()
+		
+		-- Sort files
+		sort files
+		gc()
+		
+		-- No file ?
+		if files.count != 0 then
 		(
-			inputMaxFile = files[i]
-			outputTagFile = ("%TagDirectory%/" + (getFilenameFile inputMaxFile) + (getFilenameType inputMaxFile) + ".tag")
-			
-			try
+			-- For each files
+			for i = 1 to files.count do
 			(
-				-- Compare file date
-				if (NeLTestFileDate outputTagFile inputMaxFile) == true then
-				(
-					-- Free memory and file handles
-					gc()
-					heapfree
-					
-					-- Reset 3dsmax
-					resetMAXFile #noprompt
-					
-					-- Open the max project
-					nlerror("Scanning file " + inputMaxFile + " ...")
-					if (loadMaxFile inputMaxFile quiet:true) == true then
+				inputMaxFile = files[i]
+				outputTagFile = ("%TagDirectory%/" + (getFilenameFile inputMaxFile) + (getFilenameType inputMaxFile) + ".tag")
+				
+				--try
+				--(
+					-- Compare file date
+					if (NeLTestFileDate outputTagFile inputMaxFile) == true then
 					(
-						tagThisFile = runNelMaxExport(inputMaxFile)
+						-- Free memory and file handles
+						gc()
+						heapfree
 						
-						-- Write a tag file
-						if tagThisFile == true then
+						-- Reset 3dsmax
+						resetMAXFile #noprompt
+						
+						-- Open the max project
+						nlerror("Scanning file " + inputMaxFile + " ...")
+						if (loadMaxFile inputMaxFile quiet:true) == true then
 						(
-							tagFile = createFile outputTagFile
-							if tagFile == undefined then
+							tagThisFile = runNelMaxExport(inputMaxFile)
+							
+							-- Write a tag file
+							if tagThisFile == true then
 							(
-								nlerror("WARNING can't create tag file " + outputTagFile)
+								tagFile = createFile outputTagFile
+								if tagFile == undefined then
+								(
+									nlerror("WARNING can't create tag file " + outputTagFile)
+									removeRunningTag = false
+								)
+								else
+								(
+									print "mukyu" to: tagFile
+									close tagFile
+								)
 							)
 							else
 							(
-								print "mukyu" to: tagFile
-								close tagFile
+								removeRunningTag = false
 							)
 						)
+						else
+						(
+							-- Error
+							nlerror("ERROR exporting '%PreGenFileExtension%': can't open the file " + inputMaxFile)
+							removeRunningTag = false
+						)
 					)
 					else
 					(
-						-- Error
-						nlerror("ERROR exporting '%PreGenFileExtension%': can't open the file " + inputMaxFile)
+						nlerror("SKIPPED BY TAG " + inputMaxFile)
 					)
-				)
-				else
-				(
-					nlerror("SKIPPED BY TAG " + inputMaxFile)
-				)
-			)
-			catch 
-			(
-				-- Error
-				nlerror("ERROR error exporting '%PreGenFileExtension%' in files " + inputMaxFile)
+				--)
+				--catch 
+				--(
+				--	-- Error
+				--	nlerror("ERROR error exporting '%PreGenFileExtension%' in file " + inputMaxFile)
+				--	removeRunningTag = false
+				--)
 			)
 		)
-	)
-	else
-	(
-		nlerror("WARNING no *.max file in folder %MaxSourceDirectory%")
+		else
+		(
+			nlerror("WARNING no *.max file in folder %MaxSourceDirectory%")
+		)
 	)
 )
 catch 
 (
 	-- Error
 	nlerror("ERROR fatal error exporting '%PreGenFileExtension%' in folder %MaxSourceDirectory%")
+	removeRunningTag = false
+)
+
+try
+(
+	if (removeRunningTag) then
+	(
+		resetMAXFile #noPrompt
+	)
+)
+catch 
+(
+	nlerror("FAIL Last reset fails")
+	removeRunningTag = false
+)
+
+if (removeRunningTag) then
+(
+	nlerror("SUCCESS All .max files have been successfully exported")
+	deleteFile("%TagDirectory%/max_running.tag")
+)
+else
+(
+	nlerror("FAIL One or more issues occured")
+	NelForceQuitRightNow()
 )
 
 -- Bye
-
-resetMAXFile #noprompt
+nlerror("BYE")
 quitMAX #noPrompt
 quitMAX() #noPrompt
 
diff --git a/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/export_header.ms b/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/export_header.ms
index 2d5e5434f..03bfea443 100644
--- a/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/export_header.ms
+++ b/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/export_header.ms
@@ -8,6 +8,9 @@
 -- Allocate 20 Me for the script
 heapSize += 15000000
 
+-- In case of error just abort the app and don't show nel report window
+NelForceQuitOnMsgDisplayer()
+
 nlErrorFilename = "%OutputLogfile%"
 nlErrorStream = openFile nlErrorFilename mode:"a"
 if nlErrorStream == undefined then
diff --git a/code/nel/tools/build_gamedata/processes/anim/1_export.py b/code/nel/tools/build_gamedata/processes/anim/1_export.py
index 2ab46263a..3bdd5e028 100644
--- a/code/nel/tools/build_gamedata/processes/anim/1_export.py
+++ b/code/nel/tools/build_gamedata/processes/anim/1_export.py
@@ -6,7 +6,7 @@
 # 
 # \file 1_export.py
 # \brief Export anim
-# \date 2010-09-19-14-19-GMT
+# \date 2010-09-26-08-38-GMT
 # \author Jan Boon (Kaetemi)
 # Python port of game data build pipeline.
 # Export anim
@@ -33,7 +33,9 @@ sys.path.append("../../configuration")
 
 if os.path.isfile("log.log"):
 	os.remove("log.log")
-log = open("log.log", "w")
+if os.path.isfile("temp_log.log"):
+	os.remove("temp_log.log")
+log = open("temp_log.log", "w")
 from scripts import *
 from buildsite import *
 from process import *
@@ -47,6 +49,7 @@ printLog(log, "-------")
 printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time())))
 printLog(log, "")
 
+
 # Find tools
 # ...
 
@@ -58,15 +61,18 @@ if MaxAvailable:
 	
 	printLog(log, ">>> Export anim 3dsmax <<<")
 	mkPath(log, ExportBuildDirectory + "/" + AnimExportDirectory)
+	mkPath(log, ExportBuildDirectory + "/" + AnimTagExportDirectory)
 	for dir in AnimSourceDirectories:
 		mkPath(log, DatabaseDirectory + "/" + dir)
-		if (needUpdateDirByTagLog(log, DatabaseDirectory + "/" + dir, ".max", ExportBuildDirectory + "/" + AnimExportDirectory, ".anim")):
+		if (needUpdateDirByTagLog(log, DatabaseDirectory + "/" + dir, ".max", ExportBuildDirectory + "/" + AnimTagExportDirectory, ".max.tag")):
 			scriptSrc = "maxscript/anim_export.ms"
 			scriptDst = MaxUserDirectory + "/scripts/anim_export.ms"
 			outputLogfile = ScriptDirectory + "/processes/anim/log.log"
 			outputDirectory =  ExportBuildDirectory + "/" + AnimExportDirectory
+			tagDirectory =  ExportBuildDirectory + "/" + AnimTagExportDirectory
 			maxSourceDir = DatabaseDirectory + "/" + dir
-			tagList = findFiles(log, outputDirectory, "", ".anim")
+			maxRunningTagFile = tagDirectory + "/max_running.tag"
+			tagList = findFiles(log, tagDirectory, "", ".max.tag")
 			tagLen = len(tagList)
 			if os.path.isfile(scriptDst):
 				os.remove(scriptDst)
@@ -77,23 +83,57 @@ if MaxAvailable:
 				newline = line.replace("%OutputLogfile%", outputLogfile)
 				newline = newline.replace("%MaxSourceDirectory%", maxSourceDir)
 				newline = newline.replace("%OutputDirectory%", outputDirectory)
+				newline = newline.replace("%TagDirectory%", tagDirectory)
 				sDst.write(newline)
 			sSrc.close()
 			sDst.close()
+			zeroRetryLimit = 3
 			while tagDiff > 0:
+				mrt = open(maxRunningTagFile, "w")
+				mrt.write("moe-moe-kyun")
+				mrt.close()
 				printLog(log, "MAXSCRIPT " + scriptDst)
 				subprocess.call([ Max, "-U", "MAXScript", "anim_export.ms", "-q", "-mi", "-vn" ])
-				tagList = findFiles(log, outputDirectory, "", ".anim")
+				if os.path.exists(outputLogfile):
+					try:
+						lSrc = open(outputLogfile, "r")
+						for line in lSrc:
+							lineStrip = line.strip()
+							if (len(lineStrip) > 0):
+								printLog(log, lineStrip)
+						lSrc.close()
+						os.remove(outputLogfile)
+					except Exception:
+						printLog(log, "ERROR Failed to read 3dsmax log")
+				else:
+					printLog(log, "WARNING No 3dsmax log")
+				tagList = findFiles(log, tagDirectory, "", ".max.tag")
 				newTagLen = len(tagList)
 				tagDiff = newTagLen - tagLen
 				tagLen = newTagLen
-				printLog(log, "Exported " + str(tagDiff) + " .anim files!")
+				addTagDiff = 0
+				if os.path.exists(maxRunningTagFile):
+					printLog(log, "FAIL 3ds Max crashed and/or file export failed!")
+					if tagDiff == 0:
+						if zeroRetryLimit > 0:
+							zeroRetryLimit = zeroRetryLimit - 1
+							addTagDiff = 1
+						else:
+							printLog(log, "FAIL Retry limit reached!")
+					else:
+						addTagDiff = 1
+					os.remove(maxRunningTagFile)
+				printLog(log, "Exported " + str(tagDiff) + " .max files!")
+				tagDiff += addTagDiff
 			os.remove(scriptDst)
+	printLog(log, "")
 
 
 
-printLog(log, "")
 log.close()
+if os.path.isfile("log.log"):
+	os.remove("log.log")
+shutil.move("temp_log.log", "log.log")
 
 
 # end of file
diff --git a/code/nel/tools/build_gamedata/processes/anim/maxscript/anim_export.ms b/code/nel/tools/build_gamedata/processes/anim/maxscript/anim_export.ms
index 05878c1cd..86d02fd15 100644
--- a/code/nel/tools/build_gamedata/processes/anim/maxscript/anim_export.ms
+++ b/code/nel/tools/build_gamedata/processes/anim/maxscript/anim_export.ms
@@ -8,6 +8,9 @@
 -- Allocate 20 Me for the script
 heapSize += 15000000
 
+-- In case of error just abort the app and don't show nel report window
+NelForceQuitOnMsgDisplayer()
+
 nlErrorFilename = "%OutputLogfile%"
 nlErrorStream = openFile nlErrorFilename mode:"a"
 if nlErrorStream == undefined then
@@ -68,7 +71,7 @@ NEL3D_APPDATA_EXPORT_NODE_ANIMATION = 1423062800
 fn runNelMaxExport inputMaxFile = 
 (
 	outputNelFile = ("%OutputDirectory%/" + (getFilenameFile inputMaxFile) + ".anim")
-	tagThisFile = false
+	tagThisFile = true
 	
 	-- Unhide category
 	unhidecategory()
@@ -118,13 +121,12 @@ fn runNelMaxExport inputMaxFile =
 		else
 		(
 			nlerror("OK " + outputNelFile)
-			tagThisFile = true
 		)
 	)
 	else
 	(
 		-- Error
-		nlerror("ERROR exporting animation: no node animated to export in file " + inputMaxFile)
+		nlerror("WARNING exporting animation: no node animated to export in file " + inputMaxFile)
 	)
 	
 	return tagThisFile
@@ -132,75 +134,126 @@ fn runNelMaxExport inputMaxFile =
 
 
 
+removeRunningTag = true
+
 try
 (
-	-- Get files in the %MaxSourceDirectory% directory
-	files = getFiles "%MaxSourceDirectory%/*.max" 
-	gc()
-	
-	-- Sort files
-	sort files
-	gc()
-	
-	-- No file ?
-	if files.count != 0 then
+	undo off
 	(
-		-- For each files
-		for i = 1 to files.count do
+		-- Get files in the %MaxSourceDirectory% directory
+		files = getFiles "%MaxSourceDirectory%/*.max" 
+		gc()
+		
+		-- Sort files
+		sort files
+		gc()
+		
+		-- No file ?
+		if files.count != 0 then
 		(
-			inputMaxFile = files[i]
-			outputNelFile = ("%OutputDirectory%/" + (getFilenameFile inputMaxFile) + ".anim")
-			
-			try
+			-- For each files
+			for i = 1 to files.count do
 			(
-				-- Compare file date
-				if (NeLTestFileDate outputNelFile inputMaxFile) == true then
-				(
-					-- Free memory and file handles
-					gc()
-					heapfree
-					
-					-- Reset 3dsmax
-					resetMAXFile #noprompt
-					
-					-- Open the max project
-					nlerror("Scanning file " + inputMaxFile + " ...")
-					if (loadMaxFile inputMaxFile quiet:true) == true then
+				inputMaxFile = files[i]
+				outputTagFile = ("%TagDirectory%/" + (getFilenameFile inputMaxFile) + (getFilenameType inputMaxFile) + ".tag")
+				
+				--try
+				--(
+					-- Compare file date
+					if (NeLTestFileDate outputTagFile inputMaxFile) == true then
 					(
-						runNelMaxExport(inputMaxFile)
+						-- Free memory and file handles
+						gc()
+						heapfree
+						
+						-- Reset 3dsmax
+						resetMAXFile #noprompt
+						
+						-- Open the max project
+						nlerror("Scanning file " + inputMaxFile + " ...")
+						if (loadMaxFile inputMaxFile quiet:true) == true then
+						(
+							tagThisFile = runNelMaxExport(inputMaxFile)
+							
+							-- Write a tag file
+							if tagThisFile == true then
+							(
+								tagFile = createFile outputTagFile
+								if tagFile == undefined then
+								(
+									nlerror("WARNING can't create tag file " + outputTagFile)
+									removeRunningTag = false
+								)
+								else
+								(
+									print "mukyu" to: tagFile
+									close tagFile
+								)
+							)
+							else
+							(
+								removeRunningTag = false
+							)
+						)
+						else
+						(
+							-- Error
+							nlerror("ERROR exporting 'anim': can't open the file " + inputMaxFile)
+							removeRunningTag = false
+						)
 					)
 					else
 					(
-						-- Error
-						nlerror("ERROR exporting 'anim': can't open the file " + inputMaxFile)
+						nlerror("SKIPPED BY TAG " + inputMaxFile)
 					)
-				)
-				else
-				(
-					nlerror("SKIPPED " + inputMaxFile)
-				)
-			)
-			catch 
-			(
-				-- Error
-				nlerror("ERROR error exporting 'anim' in files " + inputMaxFile)
+				--)
+				--catch 
+				--(
+				--	-- Error
+				--	nlerror("ERROR error exporting 'anim' in file " + inputMaxFile)
+				--	removeRunningTag = false
+				--)
 			)
 		)
-	)
-	else
-	(
-		nlerror("WARNING no *.max file in folder %MaxSourceDirectory%")
+		else
+		(
+			nlerror("WARNING no *.max file in folder %MaxSourceDirectory%")
+		)
 	)
 )
 catch 
 (
 	-- Error
 	nlerror("ERROR fatal error exporting 'anim' in folder %MaxSourceDirectory%")
+	removeRunningTag = false
+)
+
+try
+(
+	if (removeRunningTag) then
+	(
+		resetMAXFile #noPrompt
+	)
+)
+catch 
+(
+	nlerror("FAIL Last reset fails")
+	removeRunningTag = false
+)
+
+if (removeRunningTag) then
+(
+	nlerror("SUCCESS All .max files have been successfully exported")
+	deleteFile("%TagDirectory%/max_running.tag")
+)
+else
+(
+	nlerror("FAIL One or more issues occured")
+	NelForceQuitRightNow()
 )
 
 -- Bye
-
-resetMAXFile #noprompt
+nlerror("BYE")
 quitMAX #noPrompt
 quitMAX() #noPrompt
 
diff --git a/code/nel/tools/build_gamedata/processes/clodbank/1_export.py b/code/nel/tools/build_gamedata/processes/clodbank/1_export.py
index 99e9f85ea..a9f6cf7c1 100644
--- a/code/nel/tools/build_gamedata/processes/clodbank/1_export.py
+++ b/code/nel/tools/build_gamedata/processes/clodbank/1_export.py
@@ -6,7 +6,7 @@
 # 
 # \file 1_export.py
 # \brief Export clodbank
-# \date 2010-09-19-14-19-GMT
+# \date 2010-09-26-08-38-GMT
 # \author Jan Boon (Kaetemi)
 # Python port of game data build pipeline.
 # Export clodbank
@@ -33,7 +33,9 @@ sys.path.append("../../configuration")
 
 if os.path.isfile("log.log"):
 	os.remove("log.log")
-log = open("log.log", "w")
+if os.path.isfile("temp_log.log"):
+	os.remove("temp_log.log")
+log = open("temp_log.log", "w")
 from scripts import *
 from buildsite import *
 from process import *
@@ -69,6 +71,7 @@ if MaxAvailable:
 			outputDirectory =  ExportBuildDirectory + "/" + ClodExportDirectory
 			tagDirectory =  ExportBuildDirectory + "/" + ClodTagExportDirectory
 			maxSourceDir = DatabaseDirectory + "/" + dir
+			maxRunningTagFile = tagDirectory + "/max_running.tag"
 			tagList = findFiles(log, tagDirectory, "", ".max.tag")
 			tagLen = len(tagList)
 			if os.path.isfile(scriptDst):
@@ -84,20 +87,53 @@ if MaxAvailable:
 				sDst.write(newline)
 			sSrc.close()
 			sDst.close()
+			zeroRetryLimit = 3
 			while tagDiff > 0:
+				mrt = open(maxRunningTagFile, "w")
+				mrt.write("moe-moe-kyun")
+				mrt.close()
 				printLog(log, "MAXSCRIPT " + scriptDst)
 				subprocess.call([ Max, "-U", "MAXScript", "clod_export.ms", "-q", "-mi", "-vn" ])
+				if os.path.exists(outputLogfile):
+					try:
+						lSrc = open(outputLogfile, "r")
+						for line in lSrc:
+							lineStrip = line.strip()
+							if (len(lineStrip) > 0):
+								printLog(log, lineStrip)
+						lSrc.close()
+						os.remove(outputLogfile)
+					except Exception:
+						printLog(log, "ERROR Failed to read 3dsmax log")
+				else:
+					printLog(log, "WARNING No 3dsmax log")
 				tagList = findFiles(log, tagDirectory, "", ".max.tag")
 				newTagLen = len(tagList)
 				tagDiff = newTagLen - tagLen
 				tagLen = newTagLen
+				addTagDiff = 0
+				if os.path.exists(maxRunningTagFile):
+					printLog(log, "FAIL 3ds Max crashed and/or file export failed!")
+					if tagDiff == 0:
+						if zeroRetryLimit > 0:
+							zeroRetryLimit = zeroRetryLimit - 1
+							addTagDiff = 1
+						else:
+							printLog(log, "FAIL Retry limit reached!")
+					else:
+						addTagDiff = 1
+					os.remove(maxRunningTagFile)
 				printLog(log, "Exported " + str(tagDiff) + " .max files!")
+				tagDiff += addTagDiff
 			os.remove(scriptDst)
+	printLog(log, "")
 
 
 
-printLog(log, "")
 log.close()
+if os.path.isfile("log.log"):
+	os.remove("log.log")
+shutil.move("temp_log.log", "log.log")
 
 
 # end of file
diff --git a/code/nel/tools/build_gamedata/processes/clodbank/maxscript/clod_export.ms b/code/nel/tools/build_gamedata/processes/clodbank/maxscript/clod_export.ms
index 0c0d78fe0..1ab3ce7e2 100644
--- a/code/nel/tools/build_gamedata/processes/clodbank/maxscript/clod_export.ms
+++ b/code/nel/tools/build_gamedata/processes/clodbank/maxscript/clod_export.ms
@@ -8,6 +8,9 @@
 -- Allocate 20 Me for the script
 heapSize += 15000000
 
+-- In case of error just abort the app and don't show nel report window
+NelForceQuitOnMsgDisplayer()
+
 nlErrorFilename = "%OutputLogfile%"
 nlErrorStream = openFile nlErrorFilename mode:"a"
 if nlErrorStream == undefined then
@@ -186,90 +189,126 @@ fn runNelMaxExport inputMaxFile =
 
 
 
+removeRunningTag = true
+
 try
 (
-	-- Get files in the %MaxSourceDirectory% directory
-	files = getFiles "%MaxSourceDirectory%/*.max" 
-	gc()
-	
-	-- Sort files
-	sort files
-	gc()
-	
-	-- No file ?
-	if files.count != 0 then
+	undo off
 	(
-		-- For each files
-		for i = 1 to files.count do
+		-- Get files in the %MaxSourceDirectory% directory
+		files = getFiles "%MaxSourceDirectory%/*.max" 
+		gc()
+		
+		-- Sort files
+		sort files
+		gc()
+		
+		-- No file ?
+		if files.count != 0 then
 		(
-			inputMaxFile = files[i]
-			outputTagFile = ("%TagDirectory%/" + (getFilenameFile inputMaxFile) + (getFilenameType inputMaxFile) + ".tag")
-			
-			try
+			-- For each files
+			for i = 1 to files.count do
 			(
-				-- Compare file date
-				if (NeLTestFileDate outputTagFile inputMaxFile) == true then
-				(
-					-- Free memory and file handles
-					gc()
-					heapfree
-					
-					-- Reset 3dsmax
-					resetMAXFile #noprompt
-					
-					-- Open the max project
-					nlerror("Scanning file " + inputMaxFile + " ...")
-					if (loadMaxFile inputMaxFile quiet:true) == true then
+				inputMaxFile = files[i]
+				outputTagFile = ("%TagDirectory%/" + (getFilenameFile inputMaxFile) + (getFilenameType inputMaxFile) + ".tag")
+				
+				--try
+				--(
+					-- Compare file date
+					if (NeLTestFileDate outputTagFile inputMaxFile) == true then
 					(
-						tagThisFile = runNelMaxExport(inputMaxFile)
+						-- Free memory and file handles
+						gc()
+						heapfree
 						
-						-- Write a tag file
-						if tagThisFile == true then
+						-- Reset 3dsmax
+						resetMAXFile #noprompt
+						
+						-- Open the max project
+						nlerror("Scanning file " + inputMaxFile + " ...")
+						if (loadMaxFile inputMaxFile quiet:true) == true then
 						(
-							tagFile = createFile outputTagFile
-							if tagFile == undefined then
+							tagThisFile = runNelMaxExport(inputMaxFile)
+							
+							-- Write a tag file
+							if tagThisFile == true then
 							(
-								nlerror("WARNING can't create tag file " + outputTagFile)
+								tagFile = createFile outputTagFile
+								if tagFile == undefined then
+								(
+									nlerror("WARNING can't create tag file " + outputTagFile)
+									removeRunningTag = false
+								)
+								else
+								(
+									print "mukyu" to: tagFile
+									close tagFile
+								)
 							)
 							else
 							(
-								print "mukyu" to: tagFile
-								close tagFile
+								removeRunningTag = false
 							)
 						)
+						else
+						(
+							-- Error
+							nlerror("ERROR exporting 'clod': can't open the file " + inputMaxFile)
+							removeRunningTag = false
+						)
 					)
 					else
 					(
-						-- Error
-						nlerror("ERROR exporting 'clod': can't open the file " + inputMaxFile)
+						nlerror("SKIPPED BY TAG " + inputMaxFile)
 					)
-				)
-				else
-				(
-					nlerror("SKIPPED BY TAG " + inputMaxFile)
-				)
-			)
-			catch 
-			(
-				-- Error
-				nlerror("ERROR error exporting 'clod' in files " + inputMaxFile)
+				--)
+				--catch 
+				--(
+				--	-- Error
+				--	nlerror("ERROR error exporting 'clod' in file " + inputMaxFile)
+				--	removeRunningTag = false
+				--)
 			)
 		)
-	)
-	else
-	(
-		nlerror("WARNING no *.max file in folder %MaxSourceDirectory%")
+		else
+		(
+			nlerror("WARNING no *.max file in folder %MaxSourceDirectory%")
+		)
 	)
 )
 catch 
 (
 	-- Error
 	nlerror("ERROR fatal error exporting 'clod' in folder %MaxSourceDirectory%")
+	removeRunningTag = false
+)
+
+try
+(
+	if (removeRunningTag) then
+	(
+		resetMAXFile #noPrompt
+	)
+)
+catch 
+(
+	nlerror("FAIL Last reset fails")
+	removeRunningTag = false
+)
+
+if (removeRunningTag) then
+(
+	nlerror("SUCCESS All .max files have been successfully exported")
+	deleteFile("%TagDirectory%/max_running.tag")
+)
+else
+(
+	nlerror("FAIL One or more issues occured")
+	NelForceQuitRightNow()
 )
 
 -- Bye
-
-resetMAXFile #noprompt
+nlerror("BYE")
 quitMAX #noPrompt
 quitMAX() #noPrompt
 
diff --git a/code/nel/tools/build_gamedata/processes/ig/1_export.py b/code/nel/tools/build_gamedata/processes/ig/1_export.py
index 06fe7050d..28fe124bb 100644
--- a/code/nel/tools/build_gamedata/processes/ig/1_export.py
+++ b/code/nel/tools/build_gamedata/processes/ig/1_export.py
@@ -29,7 +29,9 @@ sys.path.append("../../configuration")
 
 if os.path.isfile("log.log"):
 	os.remove("log.log")
-log = open("log.log", "w")
+if os.path.isfile("temp_log.log"):
+	os.remove("temp_log.log")
+log = open("temp_log.log", "w")
 from scripts import *
 from buildsite import *
 from process import *
@@ -53,6 +55,7 @@ def igExport(sourceDir, targetDir):
 	tagDirectory = ExportBuildDirectory + "/" + IgStaticTagExportDirectory
 	outputDirectory =  ExportBuildDirectory + "/" + targetDir
 	maxSourceDir = DatabaseDirectory + "/" + sourceDir
+	maxRunningTagFile = tagDirectory + "/max_running.tag"
 	if (needUpdateDirByTagLog(log, maxSourceDir, ".max", tagDirectory, ".max.tag")):
 		tagList = findFiles(log, tagDirectory, "", ".tag")
 		tagLen = len(tagList)
@@ -69,14 +72,44 @@ def igExport(sourceDir, targetDir):
 			sDst.write(newline)
 		sSrc.close()
 		sDst.close()
+		zeroRetryLimit = 3
 		while tagDiff > 0:
+			mrt = open(maxRunningTagFile, "w")
+			mrt.write("moe-moe-kyun")
+			mrt.close()
 			printLog(log, "MAXSCRIPT " + scriptDst)
 			subprocess.call([ Max, "-U", "MAXScript", "ig_export.ms", "-q", "-mi", "-vn" ])
+			if os.path.exists(outputLogfile):
+				try:
+					lSrc = open(outputLogfile, "r")
+					for line in lSrc:
+						lineStrip = line.strip()
+						if (len(lineStrip) > 0):
+							printLog(log, lineStrip)
+					lSrc.close()
+					os.remove(outputLogfile)
+				except Exception:
+					printLog(log, "ERROR Failed to read 3dsmax log")
+			else:
+				printLog(log, "WARNING No 3dsmax log")
 			tagList = findFiles(log, tagDirectory, "", ".tag")
 			newTagLen = len(tagList)
 			tagDiff = newTagLen - tagLen
 			tagLen = newTagLen
+			addTagDiff = 0
+			if os.path.exists(maxRunningTagFile):
+				printLog(log, "FAIL 3ds Max crashed and/or file export failed!")
+				if tagDiff == 0:
+					if zeroRetryLimit > 0:
+						zeroRetryLimit = zeroRetryLimit - 1
+						addTagDiff = 1
+					else:
+						printLog(log, "FAIL Retry limit reached!")
+				else:
+					addTagDiff = 1
+				os.remove(maxRunningTagFile)
 			printLog(log, "Exported " + str(tagDiff) + " .max files!")
+			tagDiff += addTagDiff
 		os.remove(scriptDst)
 		return
 
@@ -95,6 +128,7 @@ if MaxAvailable:
 	for dir in IgLandSourceDirectories:
 		mkPath(log, DatabaseDirectory + "/" + dir)
 		igExport(dir, IgStaticLandExportDirectory)
+	printLog(log, "")
 	
 	# Export ig other 3dsmax
 	printLog(log, ">>> Export ig other 3dsmax <<<")
@@ -102,11 +136,13 @@ if MaxAvailable:
 	for dir in IgOtherSourceDirectories:
 		mkPath(log, DatabaseDirectory + "/" + dir)
 		igExport(dir, IgStaticOtherExportDirectory)
+	printLog(log, "")
 
 
-printLog(log, "")
-
 log.close()
+if os.path.isfile("log.log"):
+	os.remove("log.log")
+shutil.move("temp_log.log", "log.log")
 
 
 # end of file
diff --git a/code/nel/tools/build_gamedata/processes/ig/maxscript/ig_export.ms b/code/nel/tools/build_gamedata/processes/ig/maxscript/ig_export.ms
index d7be706a8..5618a68d9 100644
--- a/code/nel/tools/build_gamedata/processes/ig/maxscript/ig_export.ms
+++ b/code/nel/tools/build_gamedata/processes/ig/maxscript/ig_export.ms
@@ -8,6 +8,9 @@
 -- Allocate 20 Me for the script
 heapSize += 15000000
 
+-- In case of error just abort the app and don't show nel report window
+NelForceQuitOnMsgDisplayer()
+
 nlErrorFilename = "%OutputLogfile%"
 nlErrorStream = openFile nlErrorFilename mode:"a"
 if nlErrorStream == undefined then
@@ -235,90 +238,126 @@ fn runNelMaxExport inputMaxFile =
 
 
 
+removeRunningTag = true
+
 try
 (
-	-- Get files in the %MaxSourceDirectory% directory
-	files = getFiles "%MaxSourceDirectory%/*.max" 
-	gc()
-	
-	-- Sort files
-	sort files
-	gc()
-	
-	-- No file ?
-	if files.count != 0 then
+	undo off
 	(
-		-- For each files
-		for i = 1 to files.count do
+		-- Get files in the %MaxSourceDirectory% directory
+		files = getFiles "%MaxSourceDirectory%/*.max" 
+		gc()
+		
+		-- Sort files
+		sort files
+		gc()
+		
+		-- No file ?
+		if files.count != 0 then
 		(
-			inputMaxFile = files[i]
-			outputTagFile = ("%TagDirectory%/" + (getFilenameFile inputMaxFile) + (getFilenameType inputMaxFile) + ".tag")
-			
-			try
+			-- For each files
+			for i = 1 to files.count do
 			(
-				-- Compare file date
-				if (NeLTestFileDate outputTagFile inputMaxFile) == true then
-				(
-					-- Free memory and file handles
-					gc()
-					heapfree
-					
-					-- Reset 3dsmax
-					resetMAXFile #noprompt
-					
-					-- Open the max project
-					nlerror("Scanning file " + inputMaxFile + " ...")
-					if (loadMaxFile inputMaxFile quiet:true) == true then
+				inputMaxFile = files[i]
+				outputTagFile = ("%TagDirectory%/" + (getFilenameFile inputMaxFile) + (getFilenameType inputMaxFile) + ".tag")
+				
+				--try
+				--(
+					-- Compare file date
+					if (NeLTestFileDate outputTagFile inputMaxFile) == true then
 					(
-						tagThisFile = runNelMaxExport(inputMaxFile)
+						-- Free memory and file handles
+						gc()
+						heapfree
 						
-						-- Write a tag file
-						if tagThisFile == true then
+						-- Reset 3dsmax
+						resetMAXFile #noprompt
+						
+						-- Open the max project
+						nlerror("Scanning file " + inputMaxFile + " ...")
+						if (loadMaxFile inputMaxFile quiet:true) == true then
 						(
-							tagFile = createFile outputTagFile
-							if tagFile == undefined then
+							tagThisFile = runNelMaxExport(inputMaxFile)
+							
+							-- Write a tag file
+							if tagThisFile == true then
 							(
-								nlerror("WARNING can't create tag file " + outputTagFile)
+								tagFile = createFile outputTagFile
+								if tagFile == undefined then
+								(
+									nlerror("WARNING can't create tag file " + outputTagFile)
+									removeRunningTag = false
+								)
+								else
+								(
+									print "mukyu" to: tagFile
+									close tagFile
+								)
 							)
 							else
 							(
-								print "mukyu" to: tagFile
-								close tagFile
+								removeRunningTag = false
 							)
 						)
+						else
+						(
+							-- Error
+							nlerror("ERROR exporting 'ig': can't open the file " + inputMaxFile)
+							removeRunningTag = false
+						)
 					)
 					else
 					(
-						-- Error
-						nlerror("ERROR exporting 'ig': can't open the file " + inputMaxFile)
+						nlerror("SKIPPED BY TAG " + inputMaxFile)
 					)
-				)
-				else
-				(
-					nlerror("SKIPPED BY TAG " + inputMaxFile)
-				)
-			)
-			catch 
-			(
-				-- Error
-				nlerror("ERROR error exporting 'ig' in files " + inputMaxFile)
+				--)
+				--catch 
+				--(
+				--	-- Error
+				--	nlerror("ERROR error exporting 'ig' in file " + inputMaxFile)
+				--	removeRunningTag = false
+				--)
 			)
 		)
-	)
-	else
-	(
-		nlerror("WARNING no *.max file in folder %MaxSourceDirectory%")
+		else
+		(
+			nlerror("WARNING no *.max file in folder %MaxSourceDirectory%")
+		)
 	)
 )
 catch 
 (
 	-- Error
 	nlerror("ERROR fatal error exporting 'ig' in folder %MaxSourceDirectory%")
+	removeRunningTag = false
+)
+
+try
+(
+	if (removeRunningTag) then
+	(
+		resetMAXFile #noPrompt
+	)
+)
+catch 
+(
+	nlerror("FAIL Last reset fails")
+	removeRunningTag = false
+)
+
+if (removeRunningTag) then
+(
+	nlerror("SUCCESS All .max files have been successfully exported")
+	deleteFile("%TagDirectory%/max_running.tag")
+)
+else
+(
+	nlerror("FAIL One or more issues occured")
+	NelForceQuitRightNow()
 )
 
 -- Bye
-
-resetMAXFile #noprompt
+nlerror("BYE")
 quitMAX #noPrompt
 quitMAX() #noPrompt
 
diff --git a/code/nel/tools/build_gamedata/processes/rbank/1_export.py b/code/nel/tools/build_gamedata/processes/rbank/1_export.py
index 54679a28a..de32ae841 100644
--- a/code/nel/tools/build_gamedata/processes/rbank/1_export.py
+++ b/code/nel/tools/build_gamedata/processes/rbank/1_export.py
@@ -6,7 +6,7 @@
 # 
 # \file 1_export.py
 # \brief Export rbank
-# \date 2010-09-19-14-19-GMT
+# \date 2010-09-26-08-38-GMT
 # \author Jan Boon (Kaetemi)
 # Python port of game data build pipeline.
 # Export rbank
@@ -33,7 +33,9 @@ sys.path.append("../../configuration")
 
 if os.path.isfile("log.log"):
 	os.remove("log.log")
-log = open("log.log", "w")
+if os.path.isfile("temp_log.log"):
+	os.remove("temp_log.log")
+log = open("temp_log.log", "w")
 from scripts import *
 from buildsite import *
 from process import *
@@ -69,6 +71,7 @@ if MaxAvailable:
 			outputDirectory =  ExportBuildDirectory + "/" + RBankCmbExportDirectory
 			tagDirectory =  ExportBuildDirectory + "/" + RBankCmbTagExportDirectory
 			maxSourceDir = DatabaseDirectory + "/" + dir
+			maxRunningTagFile = tagDirectory + "/max_running.tag"
 			tagList = findFiles(log, tagDirectory, "", ".max.tag")
 			tagLen = len(tagList)
 			if os.path.isfile(scriptDst):
@@ -84,20 +87,53 @@ if MaxAvailable:
 				sDst.write(newline)
 			sSrc.close()
 			sDst.close()
+			zeroRetryLimit = 3
 			while tagDiff > 0:
+				mrt = open(maxRunningTagFile, "w")
+				mrt.write("moe-moe-kyun")
+				mrt.close()
 				printLog(log, "MAXSCRIPT " + scriptDst)
 				subprocess.call([ Max, "-U", "MAXScript", "cmb_export.ms", "-q", "-mi", "-vn" ])
+				if os.path.exists(outputLogfile):
+					try:
+						lSrc = open(outputLogfile, "r")
+						for line in lSrc:
+							lineStrip = line.strip()
+							if (len(lineStrip) > 0):
+								printLog(log, lineStrip)
+						lSrc.close()
+						os.remove(outputLogfile)
+					except Exception:
+						printLog(log, "ERROR Failed to read 3dsmax log")
+				else:
+					printLog(log, "WARNING No 3dsmax log")
 				tagList = findFiles(log, tagDirectory, "", ".max.tag")
 				newTagLen = len(tagList)
 				tagDiff = newTagLen - tagLen
 				tagLen = newTagLen
+				addTagDiff = 0
+				if os.path.exists(maxRunningTagFile):
+					printLog(log, "FAIL 3ds Max crashed and/or file export failed!")
+					if tagDiff == 0:
+						if zeroRetryLimit > 0:
+							zeroRetryLimit = zeroRetryLimit - 1
+							addTagDiff = 1
+						else:
+							printLog(log, "FAIL Retry limit reached!")
+					else:
+						addTagDiff = 1
+					os.remove(maxRunningTagFile)
 				printLog(log, "Exported " + str(tagDiff) + " .max files!")
+				tagDiff += addTagDiff
 			os.remove(scriptDst)
+	printLog(log, "")
 
 
 
-printLog(log, "")
 log.close()
+if os.path.isfile("log.log"):
+	os.remove("log.log")
+shutil.move("temp_log.log", "log.log")
 
 
 # end of file
diff --git a/code/nel/tools/build_gamedata/processes/rbank/maxscript/cmb_export.ms b/code/nel/tools/build_gamedata/processes/rbank/maxscript/cmb_export.ms
index 73f1605f9..c60a675d0 100644
--- a/code/nel/tools/build_gamedata/processes/rbank/maxscript/cmb_export.ms
+++ b/code/nel/tools/build_gamedata/processes/rbank/maxscript/cmb_export.ms
@@ -8,6 +8,9 @@
 -- Allocate 20 Me for the script
 heapSize += 15000000
 
+-- In case of error just abort the app and don't show nel report window
+NelForceQuitOnMsgDisplayer()
+
 nlErrorFilename = "%OutputLogfile%"
 nlErrorStream = openFile nlErrorFilename mode:"a"
 if nlErrorStream == undefined then
@@ -122,90 +125,126 @@ fn runNelMaxExport inputMaxFile =
 
 
 
+removeRunningTag = true
+
 try
 (
-	-- Get files in the %MaxSourceDirectory% directory
-	files = getFiles "%MaxSourceDirectory%/*.max" 
-	gc()
-	
-	-- Sort files
-	sort files
-	gc()
-	
-	-- No file ?
-	if files.count != 0 then
+	undo off
 	(
-		-- For each files
-		for i = 1 to files.count do
+		-- Get files in the %MaxSourceDirectory% directory
+		files = getFiles "%MaxSourceDirectory%/*.max" 
+		gc()
+		
+		-- Sort files
+		sort files
+		gc()
+		
+		-- No file ?
+		if files.count != 0 then
 		(
-			inputMaxFile = files[i]
-			outputTagFile = ("%TagDirectory%/" + (getFilenameFile inputMaxFile) + (getFilenameType inputMaxFile) + ".tag")
-			
-			try
+			-- For each files
+			for i = 1 to files.count do
 			(
-				-- Compare file date
-				if (NeLTestFileDate outputTagFile inputMaxFile) == true then
-				(
-					-- Free memory and file handles
-					gc()
-					heapfree
-					
-					-- Reset 3dsmax
-					resetMAXFile #noprompt
-					
-					-- Open the max project
-					nlerror("Scanning file " + inputMaxFile + " ...")
-					if (loadMaxFile inputMaxFile quiet:true) == true then
+				inputMaxFile = files[i]
+				outputTagFile = ("%TagDirectory%/" + (getFilenameFile inputMaxFile) + (getFilenameType inputMaxFile) + ".tag")
+				
+				--try
+				--(
+					-- Compare file date
+					if (NeLTestFileDate outputTagFile inputMaxFile) == true then
 					(
-						tagThisFile = runNelMaxExport(inputMaxFile)
+						-- Free memory and file handles
+						gc()
+						heapfree
 						
-						-- Write a tag file
-						if tagThisFile == true then
+						-- Reset 3dsmax
+						resetMAXFile #noprompt
+						
+						-- Open the max project
+						nlerror("Scanning file " + inputMaxFile + " ...")
+						if (loadMaxFile inputMaxFile quiet:true) == true then
 						(
-							tagFile = createFile outputTagFile
-							if tagFile == undefined then
+							tagThisFile = runNelMaxExport(inputMaxFile)
+							
+							-- Write a tag file
+							if tagThisFile == true then
 							(
-								nlerror("WARNING can't create tag file " + outputTagFile)
+								tagFile = createFile outputTagFile
+								if tagFile == undefined then
+								(
+									nlerror("WARNING can't create tag file " + outputTagFile)
+									removeRunningTag = false
+								)
+								else
+								(
+									print "mukyu" to: tagFile
+									close tagFile
+								)
 							)
 							else
 							(
-								print "mukyu" to: tagFile
-								close tagFile
+								removeRunningTag = false
 							)
 						)
+						else
+						(
+							-- Error
+							nlerror("ERROR exporting 'cmb': can't open the file " + inputMaxFile)
+							removeRunningTag = false
+						)
 					)
 					else
 					(
-						-- Error
-						nlerror("ERROR exporting 'cmb': can't open the file " + inputMaxFile)
+						nlerror("SKIPPED BY TAG " + inputMaxFile)
 					)
-				)
-				else
-				(
-					nlerror("SKIPPED BY TAG " + inputMaxFile)
-				)
-			)
-			catch 
-			(
-				-- Error
-				nlerror("ERROR error exporting 'cmb' in files " + inputMaxFile)
+				--)
+				--catch 
+				--(
+				--	-- Error
+				--	nlerror("ERROR error exporting 'cmb' in file " + inputMaxFile)
+				--	removeRunningTag = false
+				--)
 			)
 		)
-	)
-	else
-	(
-		nlerror("WARNING no *.max file in folder %MaxSourceDirectory%")
+		else
+		(
+			nlerror("WARNING no *.max file in folder %MaxSourceDirectory%")
+		)
 	)
 )
 catch 
 (
 	-- Error
 	nlerror("ERROR fatal error exporting 'cmb' in folder %MaxSourceDirectory%")
+	removeRunningTag = false
+)
+
+try
+(
+	if (removeRunningTag) then
+	(
+		resetMAXFile #noPrompt
+	)
+)
+catch 
+(
+	nlerror("FAIL Last reset fails")
+	removeRunningTag = false
+)
+
+if (removeRunningTag) then
+(
+	nlerror("SUCCESS All .max files have been successfully exported")
+	deleteFile("%TagDirectory%/max_running.tag")
+)
+else
+(
+	nlerror("FAIL One or more issues occured")
+	NelForceQuitRightNow()
 )
 
 -- Bye
-
-resetMAXFile #noprompt
+nlerror("BYE")
 quitMAX #noPrompt
 quitMAX() #noPrompt
 
diff --git a/code/nel/tools/build_gamedata/processes/shape/1_export.py b/code/nel/tools/build_gamedata/processes/shape/1_export.py
index 3207b122f..eec5324af 100644
--- a/code/nel/tools/build_gamedata/processes/shape/1_export.py
+++ b/code/nel/tools/build_gamedata/processes/shape/1_export.py
@@ -2,7 +2,7 @@
 # 
 # \file 1_export.py
 # \brief Export shape
-# \date 2010-05-24 13:42GMT
+# \date 2010-09-20-18-35-GMT
 # \author Jan Boon (Kaetemi)
 # Python port of game data build pipeline.
 # Export shape
@@ -38,9 +38,6 @@ from process import *
 from tools import *
 from directories import *
 
-def getTagFileName(filePath):
-	return os.path.split(filePath)[1] + ".tag"
-
 printLog(log, "")
 printLog(log, "-------")
 printLog(log, "--- Export shape")
@@ -56,22 +53,19 @@ if BuildQuality == 0:
 	ShapeExportOptLumelSize = "0.25"
 	ShapeExportOptOversampling = 1
 
+
+# Find tools
+# ...
+
+# Export shape 3dsmax
 if MaxAvailable:
 	# Find tools
 	Max = findMax(log, MaxDirectory, MaxExecutable)
-	ExecTimeout = findTool(log, ToolDirectories, ExecTimeoutTool, ToolSuffix)
 	printLog(log, "")
 	
-	# Export shape 3dsmax
 	printLog(log, ">>> Export shape 3dsmax <<<")
-	
-	# Build paths
-	scriptSrc = "maxscript/shape_export.ms"
-	# scriptDst = MaxDirectory + "/scripts/shape_export.ms"
-	scriptDst = MaxUserDirectory + "/scripts/shape_export.ms"
-	logFile = ScriptDirectory + "/processes/shape/log.log"
-	outDirTag = ExportBuildDirectory + "/" + ShapeTagExportDirectory
-	mkPath(log, outDirTag)
+	tagDirectory = ExportBuildDirectory + "/" + ShapeTagExportDirectory
+	mkPath(log, tagDirectory)
 	outDirWithoutCoarse = ExportBuildDirectory + "/" + ShapeNotOptimizedExportDirectory
 	mkPath(log, outDirWithoutCoarse)
 	outDirWithCoarse = ExportBuildDirectory + "/" + ShapeWithCoarseMeshExportDirectory
@@ -80,89 +74,83 @@ if MaxAvailable:
 	mkPath(log, outDirLightmap)
 	outDirAnim = ExportBuildDirectory + "/" + ShapeAnimExportDirectory
 	mkPath(log, outDirAnim)
-	
-	tagList = findFiles(log, outDirTag, "", ".tag")
-	tagLen = len(tagList)
-	
-	# For each directoy
-	if os.path.isfile(scriptDst):
-		os.remove(scriptDst)
 	for dir in ShapeSourceDirectories:
-		tagDiff = 1
-		secondTry = 1
-		shapeSourceDir = DatabaseDirectory + "/" + dir
-		mkPath(log, shapeSourceDir)
-		maxFiles = findFilesNoSubdir(log, shapeSourceDir, ".max")
-		for maxFile in maxFiles:
-			maxFilePath = shapeSourceDir + "/" + maxFile
-			tagFilePath = outDirTag + "/" + getTagFileName(maxFilePath)
-			if (needUpdate(log, maxFilePath, tagFilePath)):
-				sSrc = open(scriptSrc, "r")
-				sDst = open(scriptDst, "w")
-				for line in sSrc:
-					newline = line.replace("output_logfile", logFile)
-					# newline = newline.replace("shape_source_directory", shapeSourceDir)
-					newline = newline.replace("shape_max_file_path", maxFilePath)
-					newline = newline.replace("output_directory_tag", outDirTag)
-					newline = newline.replace("output_directory_without_coarse_mesh", outDirWithoutCoarse)
-					newline = newline.replace("output_directory_with_coarse_mesh", outDirWithCoarse)
-					newline = newline.replace("shape_export_opt_export_lighting", ShapeExportOptExportLighting)
-					newline = newline.replace("shape_export_opt_shadow", ShapeExportOptShadow)
-					newline = newline.replace("shape_export_opt_lighting_limit", str(ShapeExportOptLightingLimit))
-					newline = newline.replace("shape_export_opt_lumel_size", ShapeExportOptLumelSize)
-					newline = newline.replace("shape_export_opt_oversampling", str(ShapeExportOptOversampling))
-					newline = newline.replace("shape_export_opt_lightmap_log", ShapeExportOptLightmapLog)
-					newline = newline.replace("shape_lightmap_path", outDirLightmap)
-					newline = newline.replace("output_directory_anim", outDirAnim)
-					sDst.write(newline)
-				sSrc.close()
-				sDst.close()
-				retriesLeft = 5
-				while retriesLeft > 0:
-					printLog(log, "MAXSCRIPT " + scriptDst + "; " + maxFilePath)
-					subprocess.call([ ExecTimeout, str(MaxShapeExportTimeout), Max, "-U", "MAXScript", "shape_export.ms", "-q", "-mi", "-vn" ])
-					if os.path.exists(logFile):
-						try:
-							lSrc = open(logFile, "r")
-							for line in lSrc:
-								lineStrip = line.strip()
-								if (len(lineStrip) > 0):
-									printLog(log, lineStrip)
-							lSrc.close()
-							os.remove(logFile)
-						except Exception:
-							printLog(log, "ERROR Failed to read 3dsmax log")
-					else:
-						printLog(log, "WARNING No 3dsmax log")
-					if (not needUpdate(log, maxFilePath, tagFilePath)):
-						printLog(log, "OK " + maxFilePath)
-						retriesLeft = 0
-					else:
-						printLog(log, "FAIL " + maxFilePath)
-					retriesLeft = retriesLeft - 1
+		mkPath(log, DatabaseDirectory + "/" + dir)
+		if (needUpdateDirByTagLog(log, DatabaseDirectory + "/" + dir, ".max", ExportBuildDirectory + "/" + ShapeTagExportDirectory, ".max.tag")):
+			scriptSrc = "maxscript/shape_export.ms"
+			scriptDst = MaxUserDirectory + "/scripts/shape_export.ms"
+			outputLogfile = ScriptDirectory + "/processes/shape/log.log"
+			maxRunningTagFile = tagDirectory + "/max_running.tag"
+			maxSourceDir = DatabaseDirectory + "/" + dir
+			tagList = findFiles(log, tagDirectory, "", ".max.tag")
+			tagLen = len(tagList)
+			if os.path.isfile(scriptDst):
 				os.remove(scriptDst)
-			else:
-				printLog(log, "SKIP " + maxFilePath)
-	
-	# Export clod 3dsmax
-	# this is historical garbage, just use the clodbank process.. :-)
-	#printLog(log, ">>> Export character lod shape files (.clod) from Max <<<")
-	#printLog(log, "********************************")
-	#printLog(log, "********      TODO      ********")
-	#printLog(log, "********************************")
-	
-	# cat ../clodbank/maxscript/clod_export.ms 
-	#| sed -e "s&shape_source_directory&$database_directory/$i&g" 
-	#| sed -e "s&output_directory_clod&$build_gamedata_directory/processes/shape/clod&g" 
-	#| sed -e "s&output_directory_tag&$build_gamedata_directory/processes/shape/tag&g" 
-	# > $max_directory/scripts/clod_export.ms
-
-
-printLog(log, "")
+			tagDiff = 1
+			sSrc = open(scriptSrc, "r")
+			sDst = open(scriptDst, "w")
+			for line in sSrc:
+				newline = line.replace("%OutputLogfile%", outputLogfile)
+				newline = newline.replace("%MaxSourceDirectory%", maxSourceDir)
+				newline = newline.replace("%TagDirectory%", tagDirectory)
+				newline = newline.replace("%OutputDirectoryWithoutCoarseMesh%", outDirWithoutCoarse)
+				newline = newline.replace("%OutputDirectoryWithCoarseMesh%", outDirWithCoarse)
+				newline = newline.replace("%OutputDirectoryLightmap%", outDirLightmap)
+				newline = newline.replace("%OutputDirectoryAnim%", outDirAnim)
+				newline = newline.replace("%ShapeExportOptExportLighting%", ShapeExportOptExportLighting)
+				newline = newline.replace("%ShapeExportOptShadow%", ShapeExportOptShadow)
+				newline = newline.replace("%ShapeExportOptLightingLimit%", str(ShapeExportOptLightingLimit))
+				newline = newline.replace("%ShapeExportOptLumelSize%", ShapeExportOptLumelSize)
+				newline = newline.replace("%ShapeExportOptOversampling%", str(ShapeExportOptOversampling))
+				newline = newline.replace("%ShapeExportOptLightmapLog%", ShapeExportOptLightmapLog)
+				sDst.write(newline)
+			sSrc.close()
+			sDst.close()
+			zeroRetryLimit = 3
+			while tagDiff > 0:
+				mrt = open(maxRunningTagFile, "w")
+				mrt.write("moe-moe-kyun")
+				mrt.close()
+				printLog(log, "MAXSCRIPT " + scriptDst)
+				subprocess.call([ Max, "-U", "MAXScript", "shape_export.ms", "-q", "-mi", "-vn" ])
+				if os.path.exists(outputLogfile):
+					try:
+						lSrc = open(outputLogfile, "r")
+						for line in lSrc:
+							lineStrip = line.strip()
+							if (len(lineStrip) > 0):
+								printLog(log, lineStrip)
+						lSrc.close()
+						os.remove(outputLogfile)
+					except Exception:
+						printLog(log, "ERROR Failed to read 3dsmax log")
+				else:
+					printLog(log, "WARNING No 3dsmax log")
+				tagList = findFiles(log, tagDirectory, "", ".max.tag")
+				newTagLen = len(tagList)
+				tagDiff = newTagLen - tagLen
+				tagLen = newTagLen
+				addTagDiff = 0
+				if os.path.exists(maxRunningTagFile):
+					printLog(log, "FAIL 3ds Max crashed and/or file export failed!")
+					if tagDiff == 0:
+						if zeroRetryLimit > 0:
+							zeroRetryLimit = zeroRetryLimit - 1
+							addTagDiff = 1
+						else:
+							printLog(log, "FAIL Retry limit reached!")
+					else:
+						addTagDiff = 1
+					os.remove(maxRunningTagFile)
+				printLog(log, "Exported " + str(tagDiff) + " .max files!")
+				tagDiff += addTagDiff
+			os.remove(scriptDst)
+	printLog(log, "")
 
 log.close()
 if os.path.isfile("log.log"):
 	os.remove("log.log")
 shutil.move("temp_log.log", "log.log")
 
+
 # end of file
diff --git a/code/nel/tools/build_gamedata/processes/shape/maxscript/shape_export.ms b/code/nel/tools/build_gamedata/processes/shape/maxscript/shape_export.ms
index 84a35f0e7..06a02bcbb 100644
--- a/code/nel/tools/build_gamedata/processes/shape/maxscript/shape_export.ms
+++ b/code/nel/tools/build_gamedata/processes/shape/maxscript/shape_export.ms
@@ -1,33 +1,17 @@
--- Some globals
 
-NEL3D_APPDATA_ACCEL = 1423062561			-- type of accelerator :	"32" = is not an accelerator and IS clusterized 
-											--							 "0" = is not an accelerator and IS NOT clusterized (always visible)
-											--							 "1" = is an accelerator type PORTAL
-											--							 "2" = is an accelerator type CLUSTER
-											--							 "6" = is an accelerator type CLUSTER FATHER-VISIBLE
-											--							"10" = is an accelerator type CLUSTER VISIBLE-FROM-FATHER
-											--							"14" = is an accelerator type CLUSTER FATHER-VISIBLE and VISIBLE-FROM-FATHER
-											--							"17" = is an accelerator type PORTAL DYNAMIC
-																			 
-NEL3D_APPDATA_DONOTEXPORT = 1423062565		-- do not export me : "undefined" = export me
-											--							  "0" = export me
-											--							  "1" = DONT export me
 
-NEL3D_APPDATA_LOD_NAME_COUNT_MAX	= 10
-NEL3D_APPDATA_LOD					= 1423062537
-NEL3D_APPDATA_LOD_NAME_COUNT		= NEL3D_APPDATA_LOD
-NEL3D_APPDATA_LOD_NAME				= NEL3D_APPDATA_LOD_NAME_COUNT+1
-NEL3D_APPDATA_LOD_BLEND_IN			= NEL3D_APPDATA_LOD_NAME+NEL3D_APPDATA_LOD_NAME_COUNT_MAX
-NEL3D_APPDATA_LOD_BLEND_OUT			= NEL3D_APPDATA_LOD_BLEND_IN+1
-NEL3D_APPDATA_LOD_COARSE_MESH		= NEL3D_APPDATA_LOD_BLEND_OUT+1
-NEL3D_APPDATA_COLLISION				= 1423062613
-NEL3D_APPDATA_COLLISION_EXTERIOR	= 1423062614
-NEL3D_APPDATA_AUTOMATIC_ANIMATION	= 1423062617
+-- #################################################################
+-- ## WARNING : this is a generated file, don't change it !
+-- #################################################################
+
 
 -- Allocate 20 Me for the script
 heapSize += 15000000
 
-nlErrorFilename = "output_logfile"
+-- In case of error just abort the app and don't show nel report window
+NelForceQuitOnMsgDisplayer()
+
+nlErrorFilename = "%OutputLogfile%"
 nlErrorStream = openFile nlErrorFilename mode:"a"
 if nlErrorStream == undefined then
 	nlErrorStream = createFile nlErrorFilename
@@ -80,6 +64,34 @@ fn nlerror message =
 	print message
 )
 
+
+
+-- Some globals
+
+NEL3D_APPDATA_ACCEL = 1423062561			-- type of accelerator :	"32" = is not an accelerator and IS clusterized 
+											--							 "0" = is not an accelerator and IS NOT clusterized (always visible)
+											--							 "1" = is an accelerator type PORTAL
+											--							 "2" = is an accelerator type CLUSTER
+											--							 "6" = is an accelerator type CLUSTER FATHER-VISIBLE
+											--							"10" = is an accelerator type CLUSTER VISIBLE-FROM-FATHER
+											--							"14" = is an accelerator type CLUSTER FATHER-VISIBLE and VISIBLE-FROM-FATHER
+											--							"17" = is an accelerator type PORTAL DYNAMIC
+																			 
+NEL3D_APPDATA_DONOTEXPORT = 1423062565		-- do not export me : "undefined" = export me
+											--							  "0" = export me
+											--							  "1" = DONT export me
+
+NEL3D_APPDATA_LOD_NAME_COUNT_MAX	= 10
+NEL3D_APPDATA_LOD					= 1423062537
+NEL3D_APPDATA_LOD_NAME_COUNT		= NEL3D_APPDATA_LOD
+NEL3D_APPDATA_LOD_NAME				= NEL3D_APPDATA_LOD_NAME_COUNT+1
+NEL3D_APPDATA_LOD_BLEND_IN			= NEL3D_APPDATA_LOD_NAME+NEL3D_APPDATA_LOD_NAME_COUNT_MAX
+NEL3D_APPDATA_LOD_BLEND_OUT			= NEL3D_APPDATA_LOD_BLEND_IN+1
+NEL3D_APPDATA_LOD_COARSE_MESH		= NEL3D_APPDATA_LOD_BLEND_OUT+1
+NEL3D_APPDATA_COLLISION				= 1423062613
+NEL3D_APPDATA_COLLISION_EXTERIOR	= 1423062614
+NEL3D_APPDATA_AUTOMATIC_ANIMATION	= 1423062617
+
 -- This node is n accelerator ?
 fn isAccelerator node =
 (
@@ -241,275 +253,300 @@ fn haveCoarseMesh node =
 	return false
 )
 
-fn goShapeExport =
+fn runNelMaxExport inputMaxFile = 
 (
-	try
+	tagThisFile = false
+	
+	-- Unhide category
+	unhidecategory()
+	
+	-- Unhide
+	max unhide all
+	
+	-- unselect
+	max select none
+	
+	-- Exported object count
+	exported = 0
+	
+	-- Add the lod
+	for node in geometry do
 	(
-		-- Get filepath
-		filePath = "shape_max_file_path"
-		
-		try
+		-- Get lod count
+		nodeCount = getappdata node NEL3D_APPDATA_LOD_NAME_COUNT
+		if (nodeCount != undefined) then
 		(
-			-- Delete lod files
-			lod_array = #()
-			
-			-- Ok ?
-			ok = false
-			
-			-- Free memory and file handles
-			gc ()
-			
-			-- Reset 3dsmax
-			resetMAXFile #noprompt
-			
-			-- Get the tag file name
-			tag = ("output_directory_tag/" + (getFilenameFile filePath) + (getFilenameType filePath) + ".tag")
-			
-			-- Open the max project
-			nlerror ("Scanning file " + filePath + " ...")
-			if loadMaxFile filePath quiet:true == true then
+			-- For each lod
+			nodeCountNum = nodeCount as Integer
+			for lod = 1 to nodeCountNum do
 			(
-				-- Unhide category
-				unhidecategory()
+				-- Get the lod
+				lod = getappdata node (NEL3D_APPDATA_LOD_NAME+lod-1)
 				
-				-- Unhide
-				max unhide all
-				
-				-- unselect
-				max select none
-				
-				-- Exported object count
-				exported = 0
-				
-				-- Add the lod
-				for node in geometry do
+				-- Exist ?
+				if (lod != undefined) then
 				(
-					-- Get lod count
-					nodeCount = getappdata node NEL3D_APPDATA_LOD_NAME_COUNT
-					if (nodeCount != undefined) then
+					-- Select a node
+					try
 					(
-						-- For each lod
-						nodeCountNum = nodeCount as Integer
-						for lod = 1 to nodeCountNum do
-						(
-							-- Get the lod
-							lod = getappdata node (NEL3D_APPDATA_LOD_NAME+lod-1)
-							
-							-- Exist ?
-							if (lod != undefined) then
-							(
-								-- Select a node
-								try
-								(
-									nd = execute ("$'"+lod+"'")
-								)
-								catch
-								(
-									nlerror ("Error in Execute $'"+lod+"' from node "+node.name)
-									nd = undefined
-								)
-								
-								-- Node exist ?
-								if (nd != undefined) then 
-								(
-									append lod_array nd
-								)
-							)
-						)
+						nd = execute("$'"+lod+"'")
+					)
+					catch
+					(
+						nlerror("Error in Execute $'"+lod+"' from node "+node.name)
+						nd = undefined
+					)
+					
+					-- Node exist ?
+					if (nd != undefined) then 
+					(
+						append lod_array nd
 					)
 				)
-				
-				-- Select objects for shadows
-				for node in geometry do
+			)
+		)
+	)
+	
+	-- Select objects for shadows
+	for node in geometry do
+	(
+		if (node.parent == undefined) then
+		(
+			-- Cast shadow ?
+			if (isCastShadow node == true) then
+			(
+				-- Select this node
+				selectmore node
+			)
+		)
+	)
+	
+	-- Tag this file ?
+	tagThisFile = true
+	
+	-- Array of node to export
+	array_node = #()
+	
+	-- Add geometry
+	for node in geometry do
+		append array_node node
+	
+	-- Add shapes
+	for node in shapes do
+		append array_node node
+	
+	-- For each node
+	for node in array_node do
+	(
+		-- It is root ?
+		if (node.parent == undefined) then
+		(
+			-- Is not a skeleton ?
+			if (node.name != "Bip01") then
+			(
+				-- Can be exported ?
+				if (isToBeExported node == true) then
 				(
-					if (node.parent == undefined) then
+					-- Not a lod ?
+					if ((isLod node) == false) then
 					(
-						-- Cast shadow ?
-						if (isCastShadow node == true) then
-						(
-							-- Select this node
-							selectmore node
-						)
-					)
-				)
-				
-				-- Tag this file ?
-				tagThisFile = true
-				
-				-- Array of node to export
-				array_node = #()
-				
-				-- Add geometry
-				for node in geometry do
-					append array_node node
-				
-				-- Add shapes
-				for node in shapes do
-					append array_node node
-				
-				-- For each node
-				for node in array_node do
-				(
-					-- It is root ?
-					if (node.parent == undefined) then
-					(
-						-- Is not a skeleton ?
-						if (node.name != "Bip01") then
-						(
-							-- Can be exported ?
-							if (isToBeExported node == true) then
-							(
-								-- Not a lod ?
-								if ((isLod node) == false) then
-								(
-									-- Output directory
-									if (haveCoarseMesh node) == true then
-										output = ("output_directory_with_coarse_mesh/"+(node.name)+".shape")
-									else
-										output = ("output_directory_without_coarse_mesh/"+(node.name)+".shape")
-									
-									-- Compare file date
-									if (NeLTestFileDate output filePath) == true then
-									(
-										try
-										(
-											-- Export the shape
-											if (NelExportShapeEx node output shape_export_opt_shadow shape_export_opt_export_lighting "shape_lightmap_path" shape_export_opt_lighting_limit shape_export_opt_lumel_size shape_export_opt_oversampling true false shape_export_opt_lightmap_log) == true then
-											(
-												nlerror ("OK "+output)
-												exported = exported+1
-											)
-											else
-											(
-												-- Error
-												nlerror ("ERROR exporting shape "+node.name+" in file "+filePath)
-												tagThisFile = false
-												return 0
-											)
-										)
-										catch 
-										(
-											-- Error
-											nlerror ("ERROR fatal error exporting shape "+node.name+" in file "+filePath)
-											tagThisFile = false
-											return 0
-										)
-									)
-									else
-									(
-										-- Error
-										nlerror ("SKIPPED "+output)
-										exported = exported+1
-									)
-								)
-							)
-						)
-					)
-				)
-				
-				-- Export default animations
-				
-				for node in objects do
-				(
-					-- Can export it ?
-					if (isAnimToBeExported node) == true then
-					(
-						-- Anim output directory
-						output = ("output_directory_anim/"+(node.name)+".anim")
+						-- Output directory
+						if (haveCoarseMesh node) == true then
+							output = ("%OutputDirectoryWithCoarseMesh%/" + (node.name) + ".shape")
+						else
+							output = ("%OutputDirectoryWithoutCoarseMesh%/" + (node.name) + ".shape")
 						
-						-- Export the animation
-						if (NelExportAnimation #(node) output false) == false then
+						-- Compare file date
+						if (NeLTestFileDate output inputMaxFile) == true then
 						(
-							nlerror ("ERROR exporting animation "+output)
-							return 0
+							try
+							(
+								-- Export the shape
+								if (NelExportShapeEx node output %ShapeExportOptShadow% %ShapeExportOptExportLighting% "%OutputDirectoryLightmap%" %ShapeExportOptLightingLimit% %ShapeExportOptLumelSize% %ShapeExportOptOversampling% true false %ShapeExportOptLightmapLog%) == true then
+								(
+									nlerror("OK "+output)
+									exported = exported +1 
+								)
+								else
+								(
+									-- Error
+									nlerror("ERROR exporting shape " + node.name + " in file " + inputMaxFile)
+									tagThisFile = false
+								)
+							)
+							catch 
+							(
+								-- Error
+								nlerror("ERROR fatal error exporting shape " + node.name + " in file " + inputMaxFile)
+								tagThisFile = false
+							)
 						)
 						else
 						(
-							nlerror ("OK "+output)
+							nlerror("SKIPPED " + output)
+							exported = exported + 1
 						)
 					)
 				)
-				
-				-- Write a tag file
-				if tagThisFile == true then
-				(
-					tagFile = createFile tag
-					if tagFile == undefined then
-					(
-						nlerror ("WARNING can't create tag file "+tag)
-					)
-					else
-					(
-						print "toto" to: tagFile
-						close tagFile
-					)
-				)
-				
-				-- Something exported
-				if exported == 0 then
-				(
-					-- Error
-					nlerror ("WARNING no shape exported from the file "+filePath)
-				)
+			)
+		)
+	)
+	
+	-- Export default animations
+	
+	for node in objects do
+	(
+		-- Can export it ?
+		if (isAnimToBeExported node) == true then
+		(
+			-- Anim output directory
+			output = ("%OutputDirectoryAnim%/" + (node.name) + ".anim")
+			
+			-- Export the animation
+			if (NelExportAnimation #(node) output false) == false then
+			(
+				nlerror ("ERROR exporting animation " + output)
+				tagThisFile = false
 			)
 			else
 			(
-				-- Error
-				nlerror ("ERROR exporting shape: can't open the file "+filePath)
+				nlerror("OK " + output)
 			)
-			
-			try
-			(
-				gc ()
-			)
-			catch
-			(
-				nlerror ("ERROR gc " + getCurrentException())
-			)
-			
-			try
-			(
-				-- Reset 3dsmax
-				resetMAXFile #noprompt
-			)
-			catch
-			(
-				nlerror ("ERROR resetMAXFile " + getCurrentException())
-			)
-			
-			try
-			(
-				gc ()
-			)
-			catch
-			(
-				nlerror ("ERROR gc " + getCurrentException())
-			)
-		)
-		catch 
-		(
-			-- Error
-			nlerror ("ERROR fatal error exporting shape in file " + filePath)
-			return 0
 		)
 	)
-	catch 
+	
+	-- Something exported
+	if exported == 0 then
 	(
 		-- Error
-		nlerror ("ERROR fatal error exporting shape in file")
-		return 0
+		nlerror("WARNING no shape exported from the file " + inputMaxFile)
+	)
+	
+	return tagThisFile
+)
+
+
+
+removeRunningTag = true
+
+try
+(
+	undo off
+	(
+		-- Get files in the %MaxSourceDirectory% directory
+		files = getFiles "%MaxSourceDirectory%/*.max" 
+		gc()
+		
+		-- Sort files
+		sort files
+		gc()
+		
+		-- No file ?
+		if files.count != 0 then
+		(
+			-- For each files
+			for i = 1 to files.count do
+			(
+				inputMaxFile = files[i]
+				outputTagFile = ("%TagDirectory%/" + (getFilenameFile inputMaxFile) + (getFilenameType inputMaxFile) + ".tag")
+				
+				--try
+				--(
+					-- Compare file date
+					if (NeLTestFileDate outputTagFile inputMaxFile) == true then
+					(
+						-- Free memory and file handles
+						gc()
+						heapfree
+						
+						-- Reset 3dsmax
+						resetMAXFile #noprompt
+						
+						-- Open the max project
+						nlerror("Scanning file " + inputMaxFile + " ...")
+						if (loadMaxFile inputMaxFile quiet:true) == true then
+						(
+							tagThisFile = runNelMaxExport(inputMaxFile)
+							
+							-- Write a tag file
+							if tagThisFile == true then
+							(
+								tagFile = createFile outputTagFile
+								if tagFile == undefined then
+								(
+									nlerror("WARNING can't create tag file " + outputTagFile)
+									removeRunningTag = false
+								)
+								else
+								(
+									print "mukyu" to: tagFile
+									close tagFile
+								)
+							)
+							else
+							(
+								removeRunningTag = false
+							)
+						)
+						else
+						(
+							-- Error
+							nlerror("ERROR exporting 'shape': can't open the file " + inputMaxFile)
+							removeRunningTag = false
+						)
+					)
+					else
+					(
+						nlerror("SKIPPED BY TAG " + inputMaxFile)
+					)
+				--)
+				--catch 
+				--(
+				--	-- Error
+				--	nlerror("ERROR error exporting 'shape' in file " + inputMaxFile)
+				--	removeRunningTag = false
+				--)
+			)
+		)
+		else
+		(
+			nlerror("WARNING no *.max file in folder %MaxSourceDirectory%")
+		)
 	)
 )
-
-undo off
+catch 
 (
-	goShapeExport()
+	-- Error
+	nlerror("ERROR fatal error exporting 'shape' in folder %MaxSourceDirectory%")
+	removeRunningTag = false
 )
 
-nlerror ("BYE")
+try
+(
+	if (removeRunningTag) then
+	(
+		resetMAXFile #noPrompt
+	)
+)
+catch 
+(
+	nlerror("FAIL Last reset fails")
+	removeRunningTag = false
+)
 
-quitMAX #noPrompt
-quitMAX () #noPrompt
+if (removeRunningTag) then
+(
+	nlerror("SUCCESS All .max files have been successfully exported")
+	deleteFile("%TagDirectory%/max_running.tag")
+)
+else
+(
+	nlerror("FAIL One or more issues occured")
+	NelForceQuitRightNow()
+)
 
+-- Bye
+nlerror("BYE")
 quitMAX #noPrompt
-quitMAX () #noPrompt
+quitMAX() #noPrompt
+
diff --git a/code/nel/tools/build_gamedata/processes/veget/1_export.py b/code/nel/tools/build_gamedata/processes/veget/1_export.py
index 86a9d770b..61e33ea74 100644
--- a/code/nel/tools/build_gamedata/processes/veget/1_export.py
+++ b/code/nel/tools/build_gamedata/processes/veget/1_export.py
@@ -6,7 +6,7 @@
 # 
 # \file 1_export.py
 # \brief Export veget
-# \date 2010-09-19-14-19-GMT
+# \date 2010-09-26-08-38-GMT
 # \author Jan Boon (Kaetemi)
 # Python port of game data build pipeline.
 # Export veget
@@ -33,7 +33,9 @@ sys.path.append("../../configuration")
 
 if os.path.isfile("log.log"):
 	os.remove("log.log")
-log = open("log.log", "w")
+if os.path.isfile("temp_log.log"):
+	os.remove("temp_log.log")
+log = open("temp_log.log", "w")
 from scripts import *
 from buildsite import *
 from process import *
@@ -69,6 +71,7 @@ if MaxAvailable:
 			outputDirectory =  ExportBuildDirectory + "/" + VegetExportDirectory
 			tagDirectory =  ExportBuildDirectory + "/" + VegetTagExportDirectory
 			maxSourceDir = DatabaseDirectory + "/" + dir
+			maxRunningTagFile = tagDirectory + "/max_running.tag"
 			tagList = findFiles(log, tagDirectory, "", ".max.tag")
 			tagLen = len(tagList)
 			if os.path.isfile(scriptDst):
@@ -84,20 +87,53 @@ if MaxAvailable:
 				sDst.write(newline)
 			sSrc.close()
 			sDst.close()
+			zeroRetryLimit = 3
 			while tagDiff > 0:
+				mrt = open(maxRunningTagFile, "w")
+				mrt.write("moe-moe-kyun")
+				mrt.close()
 				printLog(log, "MAXSCRIPT " + scriptDst)
 				subprocess.call([ Max, "-U", "MAXScript", "veget_export.ms", "-q", "-mi", "-vn" ])
+				if os.path.exists(outputLogfile):
+					try:
+						lSrc = open(outputLogfile, "r")
+						for line in lSrc:
+							lineStrip = line.strip()
+							if (len(lineStrip) > 0):
+								printLog(log, lineStrip)
+						lSrc.close()
+						os.remove(outputLogfile)
+					except Exception:
+						printLog(log, "ERROR Failed to read 3dsmax log")
+				else:
+					printLog(log, "WARNING No 3dsmax log")
 				tagList = findFiles(log, tagDirectory, "", ".max.tag")
 				newTagLen = len(tagList)
 				tagDiff = newTagLen - tagLen
 				tagLen = newTagLen
+				addTagDiff = 0
+				if os.path.exists(maxRunningTagFile):
+					printLog(log, "FAIL 3ds Max crashed and/or file export failed!")
+					if tagDiff == 0:
+						if zeroRetryLimit > 0:
+							zeroRetryLimit = zeroRetryLimit - 1
+							addTagDiff = 1
+						else:
+							printLog(log, "FAIL Retry limit reached!")
+					else:
+						addTagDiff = 1
+					os.remove(maxRunningTagFile)
 				printLog(log, "Exported " + str(tagDiff) + " .max files!")
+				tagDiff += addTagDiff
 			os.remove(scriptDst)
+	printLog(log, "")
 
 
 
-printLog(log, "")
 log.close()
+if os.path.isfile("log.log"):
+	os.remove("log.log")
+shutil.move("temp_log.log", "log.log")
 
 
 # end of file
diff --git a/code/nel/tools/build_gamedata/processes/veget/maxscript/veget_export.ms b/code/nel/tools/build_gamedata/processes/veget/maxscript/veget_export.ms
index 097a37609..4390e5cca 100644
--- a/code/nel/tools/build_gamedata/processes/veget/maxscript/veget_export.ms
+++ b/code/nel/tools/build_gamedata/processes/veget/maxscript/veget_export.ms
@@ -8,6 +8,9 @@
 -- Allocate 20 Me for the script
 heapSize += 15000000
 
+-- In case of error just abort the app and don't show nel report window
+NelForceQuitOnMsgDisplayer()
+
 nlErrorFilename = "%OutputLogfile%"
 nlErrorStream = openFile nlErrorFilename mode:"a"
 if nlErrorStream == undefined then
@@ -176,90 +179,126 @@ fn runNelMaxExport inputMaxFile =
 
 
 
+removeRunningTag = true
+
 try
 (
-	-- Get files in the %MaxSourceDirectory% directory
-	files = getFiles "%MaxSourceDirectory%/*.max" 
-	gc()
-	
-	-- Sort files
-	sort files
-	gc()
-	
-	-- No file ?
-	if files.count != 0 then
+	undo off
 	(
-		-- For each files
-		for i = 1 to files.count do
+		-- Get files in the %MaxSourceDirectory% directory
+		files = getFiles "%MaxSourceDirectory%/*.max" 
+		gc()
+		
+		-- Sort files
+		sort files
+		gc()
+		
+		-- No file ?
+		if files.count != 0 then
 		(
-			inputMaxFile = files[i]
-			outputTagFile = ("%TagDirectory%/" + (getFilenameFile inputMaxFile) + (getFilenameType inputMaxFile) + ".tag")
-			
-			try
+			-- For each files
+			for i = 1 to files.count do
 			(
-				-- Compare file date
-				if (NeLTestFileDate outputTagFile inputMaxFile) == true then
-				(
-					-- Free memory and file handles
-					gc()
-					heapfree
-					
-					-- Reset 3dsmax
-					resetMAXFile #noprompt
-					
-					-- Open the max project
-					nlerror("Scanning file " + inputMaxFile + " ...")
-					if (loadMaxFile inputMaxFile quiet:true) == true then
+				inputMaxFile = files[i]
+				outputTagFile = ("%TagDirectory%/" + (getFilenameFile inputMaxFile) + (getFilenameType inputMaxFile) + ".tag")
+				
+				--try
+				--(
+					-- Compare file date
+					if (NeLTestFileDate outputTagFile inputMaxFile) == true then
 					(
-						tagThisFile = runNelMaxExport(inputMaxFile)
+						-- Free memory and file handles
+						gc()
+						heapfree
 						
-						-- Write a tag file
-						if tagThisFile == true then
+						-- Reset 3dsmax
+						resetMAXFile #noprompt
+						
+						-- Open the max project
+						nlerror("Scanning file " + inputMaxFile + " ...")
+						if (loadMaxFile inputMaxFile quiet:true) == true then
 						(
-							tagFile = createFile outputTagFile
-							if tagFile == undefined then
+							tagThisFile = runNelMaxExport(inputMaxFile)
+							
+							-- Write a tag file
+							if tagThisFile == true then
 							(
-								nlerror("WARNING can't create tag file " + outputTagFile)
+								tagFile = createFile outputTagFile
+								if tagFile == undefined then
+								(
+									nlerror("WARNING can't create tag file " + outputTagFile)
+									removeRunningTag = false
+								)
+								else
+								(
+									print "mukyu" to: tagFile
+									close tagFile
+								)
 							)
 							else
 							(
-								print "mukyu" to: tagFile
-								close tagFile
+								removeRunningTag = false
 							)
 						)
+						else
+						(
+							-- Error
+							nlerror("ERROR exporting 'veget': can't open the file " + inputMaxFile)
+							removeRunningTag = false
+						)
 					)
 					else
 					(
-						-- Error
-						nlerror("ERROR exporting 'veget': can't open the file " + inputMaxFile)
+						nlerror("SKIPPED BY TAG " + inputMaxFile)
 					)
-				)
-				else
-				(
-					nlerror("SKIPPED BY TAG " + inputMaxFile)
-				)
-			)
-			catch 
-			(
-				-- Error
-				nlerror("ERROR error exporting 'veget' in files " + inputMaxFile)
+				--)
+				--catch 
+				--(
+				--	-- Error
+				--	nlerror("ERROR error exporting 'veget' in file " + inputMaxFile)
+				--	removeRunningTag = false
+				--)
 			)
 		)
-	)
-	else
-	(
-		nlerror("WARNING no *.max file in folder %MaxSourceDirectory%")
+		else
+		(
+			nlerror("WARNING no *.max file in folder %MaxSourceDirectory%")
+		)
 	)
 )
 catch 
 (
 	-- Error
 	nlerror("ERROR fatal error exporting 'veget' in folder %MaxSourceDirectory%")
+	removeRunningTag = false
+)
+
+try
+(
+	if (removeRunningTag) then
+	(
+		resetMAXFile #noPrompt
+	)
+)
+catch 
+(
+	nlerror("FAIL Last reset fails")
+	removeRunningTag = false
+)
+
+if (removeRunningTag) then
+(
+	nlerror("SUCCESS All .max files have been successfully exported")
+	deleteFile("%TagDirectory%/max_running.tag")
+)
+else
+(
+	nlerror("FAIL One or more issues occured")
+	NelForceQuitRightNow()
 )
 
 -- Bye
-
-resetMAXFile #noprompt
+nlerror("BYE")
 quitMAX #noPrompt
 quitMAX() #noPrompt
 
diff --git a/code/ryzom/tools/build_gamedata/workspace/common/characters/directories.py b/code/ryzom/tools/build_gamedata/workspace/common/characters/directories.py
index b2a63d5fb..cd97ef675 100644
--- a/code/ryzom/tools/build_gamedata/workspace/common/characters/directories.py
+++ b/code/ryzom/tools/build_gamedata/workspace/common/characters/directories.py
@@ -143,6 +143,7 @@ ShapeAnimExportDirectory = CommonPath + "/shape_anim"
 
 # Animation directories
 AnimExportDirectory = CommonPath + "/anim_export"
+AnimTagExportDirectory = CommonPath + "/anim_tag"
 
 # cLoD directories
 ClodExportDirectory = CommonPath + "/clod_export"
diff --git a/code/ryzom/tools/build_gamedata/workspace/common/fauna/directories.py b/code/ryzom/tools/build_gamedata/workspace/common/fauna/directories.py
index 5730a76a2..dc4d5c568 100644
--- a/code/ryzom/tools/build_gamedata/workspace/common/fauna/directories.py
+++ b/code/ryzom/tools/build_gamedata/workspace/common/fauna/directories.py
@@ -253,6 +253,7 @@ ShapeAnimExportDirectory = CommonPath + "/shape_anim"
 
 # Animation directories
 AnimExportDirectory = CommonPath + "/anim_export"
+AnimTagExportDirectory = CommonPath + "/anim_tag"
 
 # cLoD directories
 ClodExportDirectory = CommonPath + "/clod_export"
diff --git a/code/ryzom/tools/build_gamedata/workspace/common/sky/directories.py b/code/ryzom/tools/build_gamedata/workspace/common/sky/directories.py
index b1c52fefe..f6babc6bc 100644
--- a/code/ryzom/tools/build_gamedata/workspace/common/sky/directories.py
+++ b/code/ryzom/tools/build_gamedata/workspace/common/sky/directories.py
@@ -128,6 +128,7 @@ ZoneLightIgLandBuildDirectory = CommonPath + "/zone_lighted_ig_land" #fixme
 
 # Animation directories
 AnimExportDirectory = CommonPath + "/anim_export"
+AnimTagExportDirectory = CommonPath + "/anim_tag"
 
 
 # *** BUILD DIRECTORIES FOR THE BUILD PIPELINE ***