diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index 0177f48bf5d08a722abb8de1f72c34bb9a3714fc..393f6d7a8c1534ef0c796079c04f7136d8fb1bcd 100755
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -1394,6 +1394,7 @@ BOOL LLStringUtilBase<T>::containsNonprintable(const string_type& string)
 	return rv;
 }
 
+// *TODO: reimplement in terms of algorithm 
 //static
 template<class T> 
 void LLStringUtilBase<T>::stripNonprintable(string_type& string)
@@ -1427,6 +1428,7 @@ void LLStringUtilBase<T>::stripNonprintable(string_type& string)
 	delete []c_string;
 }
 
+// *TODO: reimplement in terms of algorithm 
 template<class T>
 std::basic_string<T> LLStringUtilBase<T>::quote(const string_type& str,
 												const string_type& triggers,
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 9b3324700acc176fd3f77e0d68e07f9cffe60ea4..e2ee32d1e7e1e96089d17d078e4777af8477af43 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -603,6 +603,7 @@ set(viewer_SOURCE_FILES
     llviewerassetstats.cpp
     llviewerassetstorage.cpp
     llviewerassettype.cpp
+    llviewerassetupload.cpp
     llviewerattachmenu.cpp
     llvieweraudio.cpp
     llviewercamera.cpp
@@ -1197,6 +1198,7 @@ set(viewer_HEADER_FILES
     llviewerassetstats.h
     llviewerassetstorage.h
     llviewerassettype.h
+    llviewerassetupload.h
     llviewerattachmenu.h
     llvieweraudio.h
     llviewercamera.h
diff --git a/indra/newview/llcoproceduremanager.h b/indra/newview/llcoproceduremanager.h
index e84eba2db979ebd3ace1057a142cbe2567f54fb0..4e971d42e398e09d53748b2113a9d29525403871 100644
--- a/indra/newview/llcoproceduremanager.h
+++ b/indra/newview/llcoproceduremanager.h
@@ -25,8 +25,8 @@
 * $/LicenseInfo$
 */
 
-#ifndef LL_UPLOAD_MANAGER_H
-#define LL_UPLOAD_MANAGER_H
+#ifndef LL_COPROCEDURE_MANAGER_H
+#define LL_COPROCEDURE_MANAGER_H
 
 #include "lleventcoro.h"
 #include "llcoros.h"
@@ -38,6 +38,7 @@ class LLCoprocedureManager : public LLSingleton < LLCoprocedureManager >
 public:
     typedef boost::function<void(LLCoros::self &, LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &, const LLUUID &id)> CoProcedure_t;
 
+    LLCoprocedureManager();
     virtual ~LLCoprocedureManager();
 
     /// Places the coprocedure on the queue for processing. 
@@ -78,9 +79,6 @@ class LLCoprocedureManager : public LLSingleton < LLCoprocedureManager >
         return countPending() + countActive();
     }
 
-protected:
-    LLCoprocedureManager();
-
 private:
     struct QueuedCoproc
     {
diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp
index 669ffa7c599814253c6324b38128463aa9a5b55f..edc1421588ca14f614cb8666e9116d1af52bf5ca 100755
--- a/indra/newview/llfloaterbvhpreview.cpp
+++ b/indra/newview/llfloaterbvhpreview.cpp
@@ -992,10 +992,20 @@ void LLFloaterBvhPreview::onBtnOK(void* userdata)
 			{
 				std::string name = floaterp->getChild<LLUICtrl>("name_form")->getValue().asString();
 				std::string desc = floaterp->getChild<LLUICtrl>("description_form")->getValue().asString();
-				LLAssetStorage::LLStoreAssetCallback callback = NULL;
 				S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
-				void *userdata = NULL;
-				upload_new_resource(floaterp->mTransactionID, // tid
+#if 1
+                NewResourceUploadInfo::ptr_t assetUpdloadInfo(new NewResourceUploadInfo(name, desc, 0,
+                    LLFolderType::FT_NONE, LLInventoryType::IT_ANIMATION,
+                    LLFloaterPerms::getNextOwnerPerms("Uploads"), LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"),
+                    name, expected_upload_cost));
+
+                upload_new_resource(floaterp->mTransactionID, LLAssetType::AT_ANIMATION, 
+                        assetUpdloadInfo);
+#else
+                LLAssetStorage::LLStoreAssetCallback callback = NULL;
+                void *userdata = NULL;
+
+                upload_new_resource(floaterp->mTransactionID, // tid
 						    LLAssetType::AT_ANIMATION,
 						    name,
 						    desc,
@@ -1005,7 +1015,7 @@ void LLFloaterBvhPreview::onBtnOK(void* userdata)
 						    LLFloaterPerms::getNextOwnerPerms("Uploads"), LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"),
 						    name,
 						    callback, expected_upload_cost, userdata);
-
+#endif
 			}
 			else
 			{
diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp
index 0ae8a338e08f5c3f1ad4f219bf475f53ee1dede9..bbf560f3fa1f9466a041ddbfb8d3178ef7ec4787 100644
--- a/indra/newview/llsnapshotlivepreview.cpp
+++ b/indra/newview/llsnapshotlivepreview.cpp
@@ -1004,9 +1004,22 @@ void LLSnapshotLivePreview::saveTexture()
 		LLAgentUI::buildLocationString(pos_string, LLAgentUI::LOCATION_FORMAT_FULL);
 		std::string who_took_it;
 		LLAgentUI::buildFullname(who_took_it);
-		LLAssetStorage::LLStoreAssetCallback callback = NULL;
 		S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
-		void *userdata = NULL;
+#if 1
+        std::string name = "Snapshot: " + pos_string;
+        std::string desc = "Taken by " + who_took_it + " at " + pos_string;
+
+        NewResourceUploadInfo::ptr_t assetUploadInfo(new NewResourceUploadInfo(name, desc, 0,
+            LLFolderType::FT_SNAPSHOT_CATEGORY, LLInventoryType::IT_SNAPSHOT,
+            PERM_ALL, LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"),
+            name, expected_upload_cost));
+
+        upload_new_resource(tid, LLAssetType::AT_TEXTURE, assetUploadInfo);
+
+#else
+        LLAssetStorage::LLStoreAssetCallback callback = NULL;
+        void *userdata = NULL;
+
 		upload_new_resource(tid,	// tid
 			LLAssetType::AT_TEXTURE,
 			"Snapshot : " + pos_string,
@@ -1019,6 +1032,7 @@ void LLSnapshotLivePreview::saveTexture()
 			LLFloaterPerms::getEveryonePerms("Uploads"),
 			"Snapshot : " + pos_string,
 			callback, expected_upload_cost, userdata);
+#endif
 		gViewerWindow->playSnapshotAnimAndSound();
 	}
 	else
diff --git a/indra/newview/llviewerassetupload.cpp b/indra/newview/llviewerassetupload.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3f21cf2b7ee64ea75da08be3576fac66d55a6276
--- /dev/null
+++ b/indra/newview/llviewerassetupload.cpp
@@ -0,0 +1,138 @@
+/**
+* @file llviewerassetupload.cpp
+* @author optional
+* @brief brief description of the file
+*
+* $LicenseInfo:firstyear=2011&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2011, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "linden_common.h"
+#include "llviewerassetupload.h"
+#include "llviewertexturelist.h"
+#include "llimage.h"
+#include "lltrans.h"
+#include "lluuid.h"
+#include "llvorbisencode.h"
+#include "lluploaddialog.h"
+#include "lleconomy.h"
+
+//=========================================================================
+/*static*/
+void LLViewerAssetUpload::AssetInventoryUploadCoproc(LLCoros::self &self, LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter, const LLUUID &id,
+    std::string url, NewResourceUploadInfo::ptr_t uploadInfo)
+{
+    LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest);
+
+    uploadInfo->prepareUpload();
+    uploadInfo->logPreparedUpload();
+
+    std::string uploadMessage = "Uploading...\n\n";
+    uploadMessage.append(uploadInfo->getDisplayName());
+    LLUploadDialog::modalUploadDialog(uploadMessage);
+
+    LLSD body = uploadInfo->generatePostBody();
+
+    LLSD result = httpAdapter->postAndYield(self, httpRequest, url, body);
+
+    LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
+    LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+
+    if (!status)
+    {
+
+    }
+
+    std::string uploader = result["uploader"].asString();
+
+    result = httpAdapter->postFileAndYield(self, httpRequest, uploader, uploadInfo->getAssetId(), uploadInfo->getAssetType());
+
+    if (!status)
+    {
+
+    }
+
+    S32 expected_upload_cost = 0;
+
+    // Update L$ and ownership credit information
+    // since it probably changed on the server
+    if (uploadInfo->getAssetType() == LLAssetType::AT_TEXTURE ||
+        uploadInfo->getAssetType() == LLAssetType::AT_SOUND ||
+        uploadInfo->getAssetType() == LLAssetType::AT_ANIMATION ||
+        uploadInfo->getAssetType() == LLAssetType::AT_MESH)
+    {
+        expected_upload_cost = 
+            LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+    }
+
+    on_new_single_inventory_upload_complete(
+        uploadInfo->getAssetType(),
+        uploadInfo->getInventoryType(),
+        uploadInfo->getAssetTypeString(), // note the paramert calls for inv_type string...
+        uploadInfo->getFolderId(),
+        uploadInfo->getName(),
+        uploadInfo->getDescription(),
+        result,
+        expected_upload_cost);
+
+#if 0
+
+    LLSD initalBody = generate_new_resource_upload_capability_body();
+
+
+
+    LLSD result = httpAdapter->postAndYield(self, httpRequest, url, initalBody);
+
+    LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
+    LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+
+    if (!status)
+    {
+
+    }
+
+    std::string state = result["state"].asString();
+
+    if (state == "upload")
+    {
+//        Upload the file...
+        result = httpAdapter->postFileAndYield(self, httpRequest, url, initalBody);
+
+        httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
+        status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
+
+        state = result["state"].asString();
+    }
+
+    if (state == "complete")
+    {
+        // done with the upload.
+    }
+    else
+    {
+        // an error occurred
+    }
+#endif
+}
+
+//=========================================================================
diff --git a/indra/newview/llviewerassetupload.h b/indra/newview/llviewerassetupload.h
new file mode 100644
index 0000000000000000000000000000000000000000..c80a7617e127f344ec5a0ac7ecafbc96ef9dd760
--- /dev/null
+++ b/indra/newview/llviewerassetupload.h
@@ -0,0 +1,50 @@
+/**
+* @file llviewerassetupload.h
+* @author optional
+* @brief brief description of the file
+*
+* $LicenseInfo:firstyear=2011&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2011, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+*/
+
+#ifndef LL_VIEWER_ASSET_UPLOAD_H
+#define LL_VIEWER_ASSET_UPLOAD_H
+
+#include "llfoldertype.h"
+#include "llassettype.h"
+#include "llinventorytype.h"
+#include "lleventcoro.h"
+#include "llcoros.h"
+#include "llcorehttputil.h"
+
+#include "llviewermenufile.h"
+
+class LLViewerAssetUpload
+{
+public:
+
+    static void AssetInventoryUploadCoproc(LLCoros::self &self, LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter, const LLUUID &id,
+        std::string url, NewResourceUploadInfo::ptr_t uploadInfo);
+
+
+};
+
+#endif // !VIEWER_ASSET_UPLOAD_H
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index f8e50ba463e616fff5f09006fdd3eade1967affb..7bcf241d5ec20c63777ddd1752b341dc02171684 100755
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -62,6 +62,8 @@
 #include "lluploaddialog.h"
 #include "lltrans.h"
 #include "llfloaterbuycurrency.h"
+#include "llcoproceduremanager.h"
+#include "llviewerassetupload.h"
 
 // linden libraries
 #include "llassetuploadresponders.h"
@@ -621,6 +623,7 @@ void handle_compress_image(void*)
 	}
 }
 
+
 LLUUID upload_new_resource(
 	const std::string& src_filename,
 	std::string name,
@@ -704,123 +707,6 @@ LLUUID upload_new_resource(
 			return LLUUID();
 		}
 	}
-	else if(exten == "tmp")	 	
-	{	 	
-		// This is a generic .lin resource file	 	
-         asset_type = LLAssetType::AT_OBJECT;	 	
-         LLFILE* in = LLFile::fopen(src_filename, "rb");		/* Flawfinder: ignore */	 	
-         if (in)	 	
-         {	 	
-                 // read in the file header	 	
-                 char buf[16384];		/* Flawfinder: ignore */ 	
-                 size_t readbytes;
-                 S32  version;	 	
-                 if (fscanf(in, "LindenResource\nversion %d\n", &version))	 	
-                 {	 	
-                         if (2 == version)	 	
-                         {
-								// *NOTE: This buffer size is hard coded into scanf() below.
-                                 char label[MAX_STRING];		/* Flawfinder: ignore */	 	
-                                 char value[MAX_STRING];		/* Flawfinder: ignore */	 	
-                                 S32  tokens_read;	 	
-                                 while (fgets(buf, 1024, in))	 	
-                                 {	 	
-                                         label[0] = '\0';	 	
-                                         value[0] = '\0';	 	
-                                         tokens_read = sscanf(	/* Flawfinder: ignore */
-											 buf,
-											 "%254s %254s\n",
-											 label, value);	 	
-
-                                         LL_INFOS() << "got: " << label << " = " << value	 	
-                                                         << LL_ENDL;	 	
-
-                                         if (EOF == tokens_read)	 	
-                                         {	 	
-                                                 fclose(in);	 	
-                                                 error_message = llformat("corrupt resource file: %s", src_filename.c_str());
-												 args["FILE"] = src_filename;
-												 upload_error(error_message, "CorruptResourceFile", filename, args);
-                                                 return LLUUID();
-                                         }	 	
-
-                                         if (2 == tokens_read)	 	
-                                         {	 	
-                                                 if (! strcmp("type", label))	 	
-                                                 {	 	
-                                                         asset_type = (LLAssetType::EType)(atoi(value));	 	
-                                                 }	 	
-                                         }	 	
-                                         else	 	
-                                         {	 	
-                                                 if (! strcmp("_DATA_", label))	 	
-                                                 {	 	
-                                                         // below is the data section	 	
-                                                         break;	 	
-                                                 }	 	
-                                         }	 	
-                                         // other values are currently discarded	 	
-                                 }	 	
-
-                         }	 	
-                         else	 	
-                         {	 	
-                                 fclose(in);	 	
-                                 error_message = llformat("unknown linden resource file version in file: %s", src_filename.c_str());
-								 args["FILE"] = src_filename;
-								 upload_error(error_message, "UnknownResourceFileVersion", filename, args);
-                                 return LLUUID();
-                         }	 	
-                 }	 	
-                 else	 	
-                 {	 	
-                         // this is an original binary formatted .lin file	 	
-                         // start over at the beginning of the file	 	
-                         fseek(in, 0, SEEK_SET);	 	
-
-                         const S32 MAX_ASSET_DESCRIPTION_LENGTH = 256;	 	
-                         const S32 MAX_ASSET_NAME_LENGTH = 64;	 	
-                         S32 header_size = 34 + MAX_ASSET_DESCRIPTION_LENGTH + MAX_ASSET_NAME_LENGTH;	 	
-                         S16     type_num;	 	
-
-                         // read in and throw out most of the header except for the type	 	
-                         if (fread(buf, header_size, 1, in) != 1)
-						 {
-							 LL_WARNS() << "Short read" << LL_ENDL;
-						 }
-                         memcpy(&type_num, buf + 16, sizeof(S16));		/* Flawfinder: ignore */	 	
-                         asset_type = (LLAssetType::EType)type_num;	 	
-                 }	 	
-
-                 // copy the file's data segment into another file for uploading	 	
-                 LLFILE* out = LLFile::fopen(filename, "wb");		/* Flawfinder: ignore */	
-                 if (out)	 	
-                 {	 	
-                         while((readbytes = fread(buf, 1, 16384, in)))		/* Flawfinder: ignore */	 	
-                         {	 	
-							 if (fwrite(buf, 1, readbytes, out) != readbytes)
-							 {
-								 LL_WARNS() << "Short write" << LL_ENDL;
-							 }
-                         }	 	
-                         fclose(out);	 	
-                 }	 	
-                 else	 	
-                 {	 	
-                         fclose(in);	 	
-                         error_message = llformat( "Unable to create output file: %s", filename.c_str());
-						 args["FILE"] = filename;
-						 upload_error(error_message, "UnableToCreateOutputFile", filename, args);
-                         return LLUUID();
-                 }	 	
-
-                 fclose(in);	 	
-         }	 	
-         else	 	
-         {	 	
-                 LL_INFOS() << "Couldn't open .lin file " << src_filename << LL_ENDL;	 	
-         }	 	
-	}
 	else if (exten == "bvh")
 	{
 		error_message = llformat("We do not currently support bulk upload of animation files\n");
@@ -876,6 +762,17 @@ LLUUID upload_new_resource(
 		{
 			t_disp_name = src_filename;
 		}
+
+#if 1
+        NewResourceUploadInfo::ptr_t uploadInfo(new NewResourceUploadInfo(
+            name, desc, compression_info,
+            destination_folder_type, inv_type,
+            next_owner_perms, group_perms, everyone_perms,
+            display_name, expected_upload_cost));
+
+        upload_new_resource(tid, asset_type, uploadInfo, 
+                callback, userdata);
+#else
 		upload_new_resource(
 			tid,
 			asset_type,
@@ -891,6 +788,7 @@ LLUUID upload_new_resource(
 			callback,
 			expected_upload_cost,
 			userdata);
+#endif
 	}
 	else
 	{
@@ -1035,6 +933,7 @@ void upload_done_callback(
 	}
 }
 
+#if 0
 static LLAssetID upload_new_resource_prep(
 	const LLTransactionID& tid,
 	LLAssetType::EType asset_type,
@@ -1056,7 +955,9 @@ static LLAssetID upload_new_resource_prep(
 
 	return uuid;
 }
+#endif
 
+#if 0
 LLSD generate_new_resource_upload_capability_body(
 	LLAssetType::EType asset_type,
 	const std::string& name,
@@ -1084,140 +985,81 @@ LLSD generate_new_resource_upload_capability_body(
 
 	return body;
 }
+#endif
 
 void upload_new_resource(
-	const LLTransactionID &tid,
-	LLAssetType::EType asset_type,
-	std::string name,
-	std::string desc,
-	S32 compression_info,
-	LLFolderType::EType destination_folder_type,
-	LLInventoryType::EType inv_type,
-	U32 next_owner_perms,
-	U32 group_perms,
-	U32 everyone_perms,
-	const std::string& display_name,
-	LLAssetStorage::LLStoreAssetCallback callback,
-	S32 expected_upload_cost,
-	void *userdata)
+    const LLTransactionID &tid,
+    LLAssetType::EType assetType,
+    NewResourceUploadInfo::ptr_t &uploadInfo,
+    LLAssetStorage::LLStoreAssetCallback callback,
+    void *userdata)
 {
 	if(gDisconnected)
 	{
 		return ;
 	}
-	
-	LLAssetID uuid = 
-		upload_new_resource_prep(
-			tid,
-			asset_type,
-			inv_type,
-			name,
-			display_name,
-			desc);
-	
-	if( LLAssetType::AT_SOUND == asset_type )
-	{
-		add(LLStatViewer::UPLOAD_SOUND, 1);
-	}
-	else
-	if( LLAssetType::AT_TEXTURE == asset_type )
-	{
-		add(LLStatViewer::UPLOAD_TEXTURE, 1);
-	}
-	else
-	if( LLAssetType::AT_ANIMATION == asset_type)
-	{
-		add(LLStatViewer::ANIMATION_UPLOADS, 1);
-	}
 
-	if(LLInventoryType::IT_NONE == inv_type)
-	{
-		inv_type = LLInventoryType::defaultForAssetType(asset_type);
-	}
-	LLStringUtil::stripNonprintable(name);
-	LLStringUtil::stripNonprintable(desc);
-	if(name.empty())
-	{
-		name = "(No Name)";
-	}
-	if(desc.empty())
-	{
-		desc = "(No Description)";
-	}
-	
-	// At this point, we're ready for the upload.
-	std::string upload_message = "Uploading...\n\n";
-	upload_message.append(display_name);
-	LLUploadDialog::modalUploadDialog(upload_message);
+    uploadInfo->setAssetType(assetType);
+    uploadInfo->setTransactionId(tid);
 
-	LL_INFOS() << "*** Uploading: " << LL_ENDL;
-	LL_INFOS() << "Type: " << LLAssetType::lookup(asset_type) << LL_ENDL;
-	LL_INFOS() << "UUID: " << uuid << LL_ENDL;
-	LL_INFOS() << "Name: " << name << LL_ENDL;
-	LL_INFOS() << "Desc: " << desc << LL_ENDL;
-	LL_INFOS() << "Expected Upload Cost: " << expected_upload_cost << LL_ENDL;
-	LL_DEBUGS() << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type) << LL_ENDL;
-	LL_DEBUGS() << "Asset Type: " << LLAssetType::lookup(asset_type) << LL_ENDL;
 
-	std::string url = gAgent.getRegion()->getCapability(
-		"NewFileAgentInventory");
+	std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory");
 
 	if ( !url.empty() )
 	{
-		LL_INFOS() << "New Agent Inventory via capability" << LL_ENDL;
-
-		LLSD body;
-		body = generate_new_resource_upload_capability_body(
-			asset_type,
-			name,
-			desc,
-			destination_folder_type,
-			inv_type,
-			next_owner_perms,
-			group_perms,
-			everyone_perms);
-
-		LLHTTPClient::post(
-			url,
-			body,
-			new LLNewAgentInventoryResponder(
-				body,
-				uuid,
-				asset_type));
+        LLCoprocedureManager::CoProcedure_t proc = boost::bind(&LLViewerAssetUpload::AssetInventoryUploadCoproc, _1, _2, _3, url, uploadInfo);
+
+        LLCoprocedureManager::getInstance()->enqueueCoprocedure("LLViewerAssetUpload::AssetInventoryUploadCoproc", proc);
+//		LL_INFOS() << "New Agent Inventory via capability" << LL_ENDL;
+//         uploadInfo->prepareUpload();
+//         uploadInfo->logPreparedUpload();
+// 
+//         LLSD body = uploadInfo->generatePostBody();
+// 
+// 		LLHTTPClient::post(
+// 			url,
+// 			body,
+// 			new LLNewAgentInventoryResponder(
+// 				body,
+// 				uploadInfo->getAssetId(),
+// 				assetType));
 	}
 	else
 	{
+        uploadInfo->prepareUpload();
+        uploadInfo->logPreparedUpload();
+
 		LL_INFOS() << "NewAgentInventory capability not found, new agent inventory via asset system." << LL_ENDL;
 		// check for adequate funds
 		// TODO: do this check on the sim
-		if (LLAssetType::AT_SOUND == asset_type ||
-			LLAssetType::AT_TEXTURE == asset_type ||
-			LLAssetType::AT_ANIMATION == asset_type)
+		if (LLAssetType::AT_SOUND == assetType ||
+			LLAssetType::AT_TEXTURE == assetType ||
+			LLAssetType::AT_ANIMATION == assetType)
 		{
 			S32 balance = gStatusBar->getBalance();
-			if (balance < expected_upload_cost)
+			if (balance < uploadInfo->getExpectedUploadCost())
 			{
 				// insufficient funds, bail on this upload
 				LLStringUtil::format_map_t args;
-				args["NAME"] = name;
-				args["AMOUNT"] = llformat("%d", expected_upload_cost);
-				LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("UploadingCosts", args), expected_upload_cost );
+				args["NAME"] = uploadInfo->getName();
+                args["AMOUNT"] = llformat("%d", uploadInfo->getExpectedUploadCost());
+                LLBuyCurrencyHTML::openCurrencyFloater(LLTrans::getString("UploadingCosts", args), uploadInfo->getExpectedUploadCost());
 				return;
 			}
 		}
 
 		LLResourceData* data = new LLResourceData;
 		data->mAssetInfo.mTransactionID = tid;
-		data->mAssetInfo.mUuid = uuid;
-		data->mAssetInfo.mType = asset_type;
+		data->mAssetInfo.mUuid = uploadInfo->getAssetId();
+		data->mAssetInfo.mType = assetType;
 		data->mAssetInfo.mCreatorID = gAgentID;
-		data->mInventoryType = inv_type;
-		data->mNextOwnerPerm = next_owner_perms;
-		data->mExpectedUploadCost = expected_upload_cost;
+		data->mInventoryType = uploadInfo->getInventoryType();
+		data->mNextOwnerPerm = uploadInfo->getNextOwnerPerms();
+		data->mExpectedUploadCost = uploadInfo->getExpectedUploadCost();
 		data->mUserData = userdata;
-		data->mAssetInfo.setName(name);
-		data->mAssetInfo.setDescription(desc);
-		data->mPreferredLocation = destination_folder_type;
+		data->mAssetInfo.setName(uploadInfo->getName());
+		data->mAssetInfo.setDescription(uploadInfo->getDescription());
+		data->mPreferredLocation = uploadInfo->getDestinationFolderType();
 
 		LLAssetStorage::LLStoreAssetCallback asset_callback = &upload_done_callback;
 		if (callback)
@@ -1233,6 +1075,7 @@ void upload_new_resource(
 	}
 }
 
+#if 0
 LLAssetID generate_asset_id_for_new_upload(const LLTransactionID& tid)
 {
 	if ( gDisconnected )
@@ -1292,6 +1135,7 @@ void assign_defaults_and_show_upload_message(
 	upload_message.append(display_name);
 	LLUploadDialog::modalUploadDialog(upload_message);
 }
+#endif
 
 
 void init_menu_file()
@@ -1315,3 +1159,107 @@ void init_menu_file()
 
 	// "File.SaveTexture" moved to llpanelmaininventory so that it can be properly handled.
 }
+
+LLAssetID NewResourceUploadInfo::prepareUpload()
+{
+    LLAssetID uuid = generateNewAssetId();
+
+    incrementUploadStats();
+    assignDefaults();
+
+    return uuid;
+}
+
+std::string NewResourceUploadInfo::getAssetTypeString() const
+{
+    return LLAssetType::lookup(mAssetType);
+}
+
+std::string NewResourceUploadInfo::getInventoryTypeString() const
+{
+    return LLInventoryType::lookup(mInventoryType);
+}
+
+LLSD NewResourceUploadInfo::generatePostBody()
+{
+    LLSD body;
+
+    body["folder_id"] = mFolderId;
+    body["asset_type"] = getAssetTypeString();
+    body["inventory_type"] = getInventoryTypeString();
+    body["name"] = mName;
+    body["description"] = mDescription;
+    body["next_owner_mask"] = LLSD::Integer(mNextOwnerPerms);
+    body["group_mask"] = LLSD::Integer(mGroupPerms);
+    body["everyone_mask"] = LLSD::Integer(mEveryonePerms);
+
+    return body;
+
+}
+
+void NewResourceUploadInfo::logPreparedUpload()
+{
+    LL_INFOS() << "*** Uploading: " << std::endl << 
+        "Type: " << LLAssetType::lookup(mAssetType) << std::endl <<
+        "UUID: " << mAssetId.asString() << std::endl << 
+        "Name: " << mName << std::endl << 
+        "Desc: " << mDescription << std::endl <<
+        "Expected Upload Cost: " << mExpectedUploadCost << std::endl <<
+        "Folder: " << mFolderId << std::endl <<
+        "Asset Type: " << LLAssetType::lookup(mAssetType) << LL_ENDL;
+}
+
+LLAssetID NewResourceUploadInfo::generateNewAssetId()
+{
+    if (gDisconnected)
+    {
+        LLAssetID rv;
+
+        rv.setNull();
+        return rv;
+    }
+    mAssetId = mTransactionId.makeAssetID(gAgent.getSecureSessionID());
+
+    return mAssetId;
+}
+
+void NewResourceUploadInfo::incrementUploadStats() const
+{
+    if (LLAssetType::AT_SOUND == mAssetType)
+    {
+        add(LLStatViewer::UPLOAD_SOUND, 1);
+    }
+    else if (LLAssetType::AT_TEXTURE == mAssetType)
+    {
+        add(LLStatViewer::UPLOAD_TEXTURE, 1);
+    }
+    else if (LLAssetType::AT_ANIMATION == mAssetType)
+    {
+        add(LLStatViewer::ANIMATION_UPLOADS, 1);
+    }
+}
+
+void NewResourceUploadInfo::assignDefaults()
+{
+    if (LLInventoryType::IT_NONE == mInventoryType)
+    {
+        mInventoryType = LLInventoryType::defaultForAssetType(mAssetType);
+    }
+    LLStringUtil::stripNonprintable(mName);
+    LLStringUtil::stripNonprintable(mDescription);
+
+    if (mName.empty())
+    {
+        mName = "(No Name)";
+    }
+    if (mDescription.empty())
+    {
+        mDescription = "(No Description)";
+    }
+
+    mFolderId = gInventory.findCategoryUUIDForType(
+        (mDestinationFolderType == LLFolderType::FT_NONE) ?
+        (LLFolderType::EType)mAssetType : mDestinationFolderType);
+
+}
+
diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h
index 3034d00b22ef4202d7cf4dddf4036198269effe7..76704e8edd62aad4c45591984c25167f721dfc3f 100755
--- a/indra/newview/llviewermenufile.h
+++ b/indra/newview/llviewermenufile.h
@@ -39,20 +39,126 @@ class LLTransactionID;
 
 void init_menu_file();
 
+#if 1
+class NewResourceUploadInfo
+{
+public:
+    typedef boost::shared_ptr<NewResourceUploadInfo> ptr_t;
+
+    NewResourceUploadInfo(std::string name, 
+        std::string description, 
+        S32 compressionInfo,
+        LLFolderType::EType destinationType,
+        LLInventoryType::EType inventoryType,
+        U32 nextOWnerPerms, 
+        U32 groupPerms, 
+        U32 everyonePerms, 
+        std::string displayName,
+        S32 expectedCost) :
+            mName(name),
+            mDescription(description),
+            mDisplayName(displayName),
+            mCompressionInfo(compressionInfo),
+            mNextOwnerPerms(nextOWnerPerms),
+            mGroupPerms(mGroupPerms),
+            mEveryonePerms(mEveryonePerms),
+            mExpectedUploadCost(expectedCost),
+            mInventoryType(inventoryType),
+            mDestinationFolderType(destinationType)
+    { }
+
+    virtual ~NewResourceUploadInfo()
+    { }
+
+    virtual LLAssetID   prepareUpload();
+    virtual LLSD        generatePostBody();
+    virtual void        logPreparedUpload();
+
+    void                setAssetType(LLAssetType::EType assetType) { mAssetType = assetType; }
+    LLAssetType::EType  getAssetType() const { return mAssetType; }
+    std::string         getAssetTypeString() const;
+    void                setTransactionId(LLTransactionID transactionId) { mTransactionId = transactionId; }
+    LLTransactionID     getTransactionId() const { return mTransactionId; }
+    LLUUID              getFolderId() const { return mFolderId; }
+
+    LLAssetID           getAssetId() const { return mAssetId; }
+
+    std::string         getName() const { return mName; };
+    std::string         getDescription() const { return mDescription; };
+    std::string         getDisplayName() const { return mDisplayName; };
+    S32                 getCompressionInfo() const { return mCompressionInfo; };
+    U32                 getNextOwnerPerms() const { return mNextOwnerPerms; };
+    U32                 getGroupPerms() const { return mGroupPerms; };
+    U32                 getEveryonePerms() const { return mEveryonePerms; };
+    S32                 getExpectedUploadCost() const { return mExpectedUploadCost; };
+    LLInventoryType::EType  getInventoryType() const { return mInventoryType; };
+    std::string         getInventoryTypeString() const;
+        
+    LLFolderType::EType     getDestinationFolderType() const { return mDestinationFolderType; };
+
+protected:
+    LLAssetID           generateNewAssetId();
+    void                incrementUploadStats() const;
+    virtual void        assignDefaults();
+
+private:
+    LLAssetType::EType  mAssetType;
+    std::string         mName;
+    std::string         mDescription;
+    std::string         mDisplayName;
+    S32                 mCompressionInfo;
+    U32                 mNextOwnerPerms;
+    U32                 mGroupPerms;
+    U32                 mEveryonePerms;
+    S32                 mExpectedUploadCost;
+    LLUUID              mFolderId;
+
+    LLInventoryType::EType mInventoryType;
+    LLFolderType::EType    mDestinationFolderType;
+
+    LLAssetID           mAssetId;
+    LLTransactionID     mTransactionId;
+};
+
+
 LLUUID upload_new_resource(
-	const std::string& src_filename, 
-	std::string name,
-	std::string desc, 
-	S32 compression_info,
-	LLFolderType::EType destination_folder_type,
-	LLInventoryType::EType inv_type,
-	U32 next_owner_perms,
-	U32 group_perms,
-	U32 everyone_perms,
-	const std::string& display_name,
-	LLAssetStorage::LLStoreAssetCallback callback,
-	S32 expected_upload_cost,
-	void *userdata);
+    const std::string& src_filename,
+    std::string name,
+    std::string desc,
+    S32 compression_info,
+    LLFolderType::EType destination_folder_type,
+    LLInventoryType::EType inv_type,
+    U32 next_owner_perms,
+    U32 group_perms,
+    U32 everyone_perms,
+    const std::string& display_name,
+    LLAssetStorage::LLStoreAssetCallback callback,
+    S32 expected_upload_cost,
+    void *userdata);
+
+void upload_new_resource(
+    const LLTransactionID &tid, 
+    LLAssetType::EType type,
+    NewResourceUploadInfo::ptr_t &uploadInfo,
+    LLAssetStorage::LLStoreAssetCallback callback = NULL,
+    void *userdata = NULL);
+
+
+#else
+LLUUID upload_new_resource(
+    const std::string& src_filename, 
+    std::string name,
+    std::string desc, 
+    S32 compression_info,
+    LLFolderType::EType destination_folder_type,
+    LLInventoryType::EType inv_type,
+    U32 next_owner_perms,
+    U32 group_perms,
+    U32 everyone_perms,
+    const std::string& display_name,
+    LLAssetStorage::LLStoreAssetCallback callback,
+    S32 expected_upload_cost,
+    void *userdata);
 
 void upload_new_resource(
 	const LLTransactionID &tid, 
@@ -70,9 +176,9 @@ void upload_new_resource(
 	S32 expected_upload_cost,
 	void *userdata);
 
-
 LLAssetID generate_asset_id_for_new_upload(const LLTransactionID& tid);
 void increase_new_upload_stats(LLAssetType::EType asset_type);
+#endif
 void assign_defaults_and_show_upload_message(
 	LLAssetType::EType asset_type,
 	LLInventoryType::EType& inventory_type,
@@ -80,6 +186,7 @@ void assign_defaults_and_show_upload_message(
 	const std::string& display_name,
 	std::string& description);
 
+#if 0
 LLSD generate_new_resource_upload_capability_body(
 	LLAssetType::EType asset_type,
 	const std::string& name,
@@ -89,6 +196,7 @@ LLSD generate_new_resource_upload_capability_body(
 	U32 next_owner_perms,
 	U32 group_perms,
 	U32 everyone_perms);
+#endif
 
 void on_new_single_inventory_upload_complete(
 	LLAssetType::EType asset_type,