diff --git a/indra/newview/lloutfitgallery.cpp b/indra/newview/lloutfitgallery.cpp
index e5ab736a96be4c65bc035b8280c35ed34c98e7c9..4ee21752866d6446015d2877ea4f48963cfaaa0d 100644
--- a/indra/newview/lloutfitgallery.cpp
+++ b/indra/newview/lloutfitgallery.cpp
@@ -52,11 +52,14 @@ static LLOutfitGallery* gOutfitGallery = NULL;
 LLOutfitGallery::LLOutfitGallery()
     : LLOutfitListBase(),
       mTexturesObserver(NULL),
+      mOutfitsObserver(NULL),
       mScrollPanel(NULL),
       mGalleryPanel(NULL),
       galleryCreated(false),
       mRowCount(0),
-      mItemsAddedCount(0)
+      mItemsAddedCount(0),
+      mPhotoLinkPending(NULL),
+      mOutfitLinkPending(NULL)
 {
 }
 
@@ -342,6 +345,23 @@ void LLOutfitGallery::updateAddedCategory(LLUUID cat_id)
     {
         addToGallery(item);
     }
+
+    LLViewerInventoryCategory* outfit_category = gInventory.getCategory(cat_id);
+    if (!outfit_category)
+        return;
+
+    if (mOutfitsObserver == NULL)
+    {
+        mOutfitsObserver = new LLInventoryCategoriesObserver();
+        gInventory.addObserver(mOutfitsObserver);
+    }
+
+    // Start observing changes in "My Outits" category.
+    mOutfitsObserver->addCategory(cat_id,
+        boost::bind(&LLOutfitGallery::refreshOutfit, this, cat_id));
+
+    outfit_category->fetch();
+    refreshOutfit(cat_id);
 }
 
 void LLOutfitGallery::updateRemovedCategory(LLUUID cat_id)
@@ -349,6 +369,9 @@ void LLOutfitGallery::updateRemovedCategory(LLUUID cat_id)
     outfit_map_t::iterator outfits_iter = mOutfitMap.find(cat_id);
     if (outfits_iter != mOutfitMap.end())
     {
+        // 0. Remove category from observer.
+        mOutfitsObserver->removeCategory(cat_id);
+
         //const LLUUID& outfit_id = outfits_iter->first;
         LLOutfitGalleryItem* item = outfits_iter->second;
 
@@ -362,6 +385,8 @@ void LLOutfitGallery::updateRemovedCategory(LLUUID cat_id)
         // 4. Remove outfit from gallery.
         removeFromGalleryMiddle(item);
 
+
+
         // kill removed item
         if (item != NULL)
         {
@@ -573,22 +598,55 @@ void LLOutfitGallery::loadPhotos()
 {
     //Iterate over inventory
     LLUUID textures = gInventory.findCategoryUUIDForType(LLFolderType::EType::FT_TEXTURE);
-    LLViewerInventoryCategory* category = gInventory.getCategory(textures);
-    if (!category)
+    LLViewerInventoryCategory* textures_category = gInventory.getCategory(textures);
+    if (!textures_category)
         return;
-
     if (mTexturesObserver == NULL)
     {
         mTexturesObserver = new LLInventoryCategoriesObserver();
         gInventory.addObserver(mTexturesObserver);
     }
 
-    // Start observing changes in "My Outfits" category.
+    // Start observing changes in "Textures" category.
     mTexturesObserver->addCategory(textures,
         boost::bind(&LLOutfitGallery::refreshTextures, this, textures));
+    
+    textures_category->fetch();
+}
 
-    category->fetch();
-    refreshTextures(textures);
+void LLOutfitGallery::refreshOutfit(const LLUUID& category_id)
+{
+    LLViewerInventoryCategory* category = gInventory.getCategory(category_id);
+    {
+        std::string outfit_name = category->getName();
+        bool photo_loaded = false;
+        LL_WARNS() << "Outfit name:" << outfit_name << LL_ENDL;
+        LLInventoryModel::cat_array_t sub_cat_array;
+        LLInventoryModel::item_array_t outfit_item_array;
+        // Collect all sub-categories of a given category.
+        gInventory.collectDescendents(
+            category->getUUID(),
+            sub_cat_array,
+            outfit_item_array,
+            LLInventoryModel::EXCLUDE_TRASH);
+        BOOST_FOREACH(LLViewerInventoryItem* outfit_item, outfit_item_array)
+        {
+            LLViewerInventoryItem* linked_item = outfit_item->getLinkedItem();
+            if (linked_item->getActualType() == LLAssetType::AT_TEXTURE)
+            {
+                std::string texture_name = linked_item->getName();
+                LL_WARNS() << "Texture name:" << texture_name << LL_ENDL;
+                LLUUID asset_id = linked_item->getAssetUUID();
+                mOutfitMap[category_id]->setImageAssetId(asset_id);
+                photo_loaded = true;
+                break;
+            }
+            if (!photo_loaded)
+            {
+                mOutfitMap[category_id]->setDefaultImage();
+            }
+        }
+    }
 }
 
 void LLOutfitGallery::refreshTextures(const LLUUID& category_id)
@@ -607,85 +665,44 @@ void LLOutfitGallery::refreshTextures(const LLUUID& category_id)
 
     //Find textures which contain outfit UUID string in description
     LLInventoryModel::item_array_t uploaded_item_array;
+    LLViewerInventoryItem* photo_upload_item = NULL;
     BOOST_FOREACH(LLViewerInventoryItem* item, item_array)
     {
         std::string desc = item->getDescription();
+        std::string name = item->getName();
 
-        LLUUID outfit_id(desc);
-
-        //Check whether description contains correct UUID of outfit
-        if (outfit_id.isNull())
-            continue;
-
-        outfit_map_t::iterator outfit_it = mOutfitMap.find(outfit_id);
-        if (outfit_it != mOutfitMap.end() && !outfit_it->first.isNull())
+        if (name == getString("photo_upload_pending_string"))
         {
-            uploaded_item_array.push_back(item);
+            photo_upload_item = item;
+            break;
         }
     }
 
-    uuid_vec_t vadded;
-    uuid_vec_t vremoved;
-
-    // Create added and removed items vectors.
-    computeDifferenceOfTextures(uploaded_item_array, vadded, vremoved);
-
-    BOOST_FOREACH(LLUUID item_id, vadded)
-    {
-        LLViewerInventoryItem* added_item = gInventory.getItem(item_id);
-        LLUUID asset_id = added_item->getAssetUUID();
-        std::string desc = added_item->getDescription();
-        LLUUID outfit_id(desc);
-        mOutfitMap[outfit_id]->setImageAssetId(asset_id);
-        mTextureMap[outfit_id] = added_item;
-    }
-
-    BOOST_FOREACH(LLUUID item_id, vremoved)
+    if (!mPhotoLinkPending.isNull() && photo_upload_item != NULL)
     {
-        LLViewerInventoryItem* rm_item = gInventory.getItem(item_id);
-        std::string desc = rm_item->getDescription();
-        LLUUID outfit_id(desc);
-        mOutfitMap[outfit_id]->setDefaultImage();
-        mTextureMap.erase(outfit_id);
-    }
-
-    /*
-    LLInventoryModel::item_array_t::const_iterator it = item_array.begin();
-    for ( ; it != item_array.end(); it++)
-    {
-        LLViewerInventoryItem* item = (*it);
-        LLUUID asset_id = item->getAssetUUID();
-
-        std::string desc = item->getDescription();
+        LLUUID upload_pending_id = photo_upload_item->getUUID();
+        LLInventoryObject* upload_object = gInventory.getObject(upload_pending_id);
+        if (!upload_object)
+        {
+            LL_WARNS() << "LLOutfitGallery::refreshTextures added_object is null!" << LL_ENDL;
+        }
+        else
+        {
+            LLViewerInventoryCategory *outfit_cat = gInventory.getCategory(mOutfitLinkPending);
+            linkPhotoToOutfit(upload_pending_id, mOutfitLinkPending);
 
-        LLUUID outfit_id(desc);
+            LLStringUtil::format_map_t photo_string_args;
+            photo_string_args["OUTFIT_NAME"] = outfit_cat->getName();
+            std::string new_name = getString("outfit_photo_string", photo_string_args);
 
-        //Check whether description contains correct UUID of outfit
-        if (outfit_id.isNull())
-            continue;
+            LLSD updates;
+            updates["name"] = new_name;
+            update_inventory_item(upload_pending_id, updates, NULL);
 
-        outfit_map_t::iterator outfit_it = mOutfitMap.find(outfit_id);
-        if (outfit_it != mOutfitMap.end() && !outfit_it->first.isNull())
-        {
-            outfit_it->second->setImageAssetId(asset_id);
-            mTextureMap[outfit_id] = item;
         }
-
-        
-        //LLUUID* item_idp = new LLUUID();
-
-        //gOutfitGallery = this;
-        //const BOOL high_priority = TRUE;
-        //gAssetStorage->getAssetData(asset_id,
-        //    LLAssetType::AT_TEXTURE,
-        //    onLoadComplete,
-        //    (void**)item_idp,
-        //    high_priority);
-        //
-        ////mAssetStatus = PREVIEW_ASSET_LOADING;
-        
+        mPhotoLinkPending.setNull();
+        mOutfitLinkPending.setNull();
     }
-    */
 }
 
 void LLOutfitGallery::onLoadComplete(LLVFS *vfs, const LLUUID& asset_uuid, LLAssetType::EType type, void* user_data, S32 status, LLExtStat ext_status)
@@ -703,6 +720,11 @@ void LLOutfitGallery::onLoadComplete(LLVFS *vfs, const LLUUID& asset_uuid, LLAss
     }
 }
 
+void LLGalleryPhotoStoreCallback(const LLUUID &asset_id, void *user_data, S32 status, LLExtStat ext_status)
+{
+    LL_WARNS() << "Photo stored as asset. UUID:" << asset_id.asString() << LL_ENDL;
+}
+
 void LLOutfitGallery::uploadPhoto(LLUUID outfit_id)
 {
     outfit_map_t::iterator outfit_it = mOutfitMap.find(outfit_id);
@@ -720,7 +742,7 @@ void LLOutfitGallery::uploadPhoto(LLUUID outfit_id)
         if (unit->getValid())
         {
             add_successful = true;
-            LLAssetStorage::LLStoreAssetCallback callback = NULL;
+            //LLAssetStorage::LLStoreAssetCallback callback = &LLGalleryPhotoStoreCallback;
             S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); // kinda hack - assumes that unsubclassed LLFloaterNameDesc is only used for uploading chargeable assets, which it is right now (it's only used unsubclassed for the sound upload dialog, and THAT should be a subclass).
             void *nruserdata = NULL;
             nruserdata = (void *)&outfit_id;
@@ -732,23 +754,30 @@ void LLOutfitGallery::uploadPhoto(LLUUID outfit_id)
             if (!outfit_cat) return;
 
             checkRemovePhoto(outfit_id);
+            
+            std::string upload_pending_name = getString("photo_upload_pending_string");
 
-            LLStringUtil::format_map_t photo_string_args;
-            photo_string_args["OUTFIT_NAME"] = outfit_cat->getName();
-            std::string display_name = getString("outfit_photo_string", photo_string_args);
-
-            upload_new_resource(filename, // file
-                display_name,
+            LLUUID photo_id = upload_new_resource(filename, // file
+                upload_pending_name,
                 outfit_id.asString(),
                 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
                 LLFloaterPerms::getNextOwnerPerms("Uploads"),
                 LLFloaterPerms::getGroupPerms("Uploads"),
                 LLFloaterPerms::getEveryonePerms("Uploads"),
-                display_name, callback, expected_upload_cost, nruserdata);
+                upload_pending_name, &LLGalleryPhotoStoreCallback, expected_upload_cost, nruserdata);
+
+            mPhotoLinkPending = photo_id;
+            mOutfitLinkPending = outfit_id;
         }
     }
 }
 
+void LLOutfitGallery::linkPhotoToOutfit(LLUUID photo_id, LLUUID outfit_id)
+{
+    LLPointer<LLInventoryCallback> cb = new LLUpdateGalleryOnPhotoUpload();
+    link_inventory_object(outfit_id, photo_id, cb);
+}
+
 bool LLOutfitGallery::checkRemovePhoto(LLUUID outfit_id)
 {
     //remove existing photo of outfit from inventory
@@ -771,7 +800,7 @@ void LLOutfitGallery::computeDifferenceOfTextures(
     uuid_vec_t& vremoved)
 {
     uuid_vec_t vnew;
-    // Creating a vector of newly collected sub-categories UUIDs.
+    // Creating a vector of newly collected texture UUIDs.
     for (LLInventoryModel::item_array_t::const_iterator iter = vtextures.begin();
         iter != vtextures.end();
         iter++)
diff --git a/indra/newview/lloutfitgallery.h b/indra/newview/lloutfitgallery.h
index 323e2580f61bd1a5985698aedd0bcb75e158e6f5..47ab85f4e1688d50463b940e6a9954e7af13a09e 100644
--- a/indra/newview/lloutfitgallery.h
+++ b/indra/newview/lloutfitgallery.h
@@ -42,6 +42,16 @@ class LLOutfitGalleryItem;
 class LLOutfitListGearMenuBase;
 class LLOutfitGalleryGearMenu;
 
+class LLUpdateGalleryOnPhotoUpload : public LLInventoryCallback
+{
+public:
+    LLUpdateGalleryOnPhotoUpload(){}
+    virtual ~LLUpdateGalleryOnPhotoUpload(){}
+    /* virtual */ void fire(const LLUUID& inv_item){}
+private:
+};
+
+
 class LLOutfitGallery : public LLOutfitListBase
 {
 public:
@@ -65,6 +75,7 @@ class LLOutfitGallery : public LLOutfitListBase
     /*virtual*/ bool getHasExpandableFolders() { return FALSE; }
 
     void refreshTextures(const LLUUID& category_id);
+    void refreshOutfit(const LLUUID& category_id);
     void computeDifferenceOfTextures(const LLInventoryModel::item_array_t& vtextures, uuid_vec_t& vadded, uuid_vec_t& vremoved);
 
 protected:
@@ -80,6 +91,7 @@ class LLOutfitGallery : public LLOutfitListBase
 private:
     void loadPhotos();
     void uploadPhoto(LLUUID outfit_id);
+    void linkPhotoToOutfit(LLUUID outfit_id, LLUUID photo_id);
     bool checkRemovePhoto(LLUUID outfit_id);
     void setUploadedPhoto(LLUUID outfit_id, LLUUID asset_id);
     void addToGallery(LLOutfitGalleryItem* item);
@@ -110,6 +122,8 @@ class LLOutfitGallery : public LLOutfitListBase
     LLScrollContainer* mScrollPanel;
     LLPanel* mGalleryPanel;
     LLPanel* mLastRowStack;
+    LLUUID mPhotoLinkPending;
+    LLUUID mOutfitLinkPending;
     bool galleryCreated;
     int mRowCount;
     int mItemsAddedCount;
@@ -126,7 +140,7 @@ class LLOutfitGallery : public LLOutfitListBase
 
 
     LLInventoryCategoriesObserver* 	mTexturesObserver;
-
+    LLInventoryCategoriesObserver* 	mOutfitsObserver;
 };
 
 //static LLOutfitGallery* gOutfitGallery;
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml b/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml
index c06c6a86c38aff73d821350b25a88d2c0e3ba03e..682d2d0730b7ecb37ea5583a9f0e2ae732aa5a58 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_gallery.xml
@@ -10,6 +10,9 @@
    left="0"
    top="0"
    width="312">
+  <string name="photo_upload_pending_string">
+    Photo upload pending...
+  </string>
   <string name="outfit_photo_string">
     Photo of "[OUTFIT_NAME]" outfit
   </string>