Applying the Patch

Download the patch below and apply against Singularity 1.6.0.3:

cd singularity-viewer-SingularityViewer-8421661
cat modified_singularity.patch | patch -p1 --dry-run
patching file indra/newview/llagent.h
patching file indra/newview/llfloatercustomize.cpp
patching file indra/newview/lltexturectrl.cpp
patching file indra/newview/llviewercontrol.h
patching file indra/newview/llviewermenu.cpp
patching file indra/newview/llviewermenufile.cpp
patching file indra/newview/llviewerobject.cpp
patching file indra/newview/llviewerobjectbackup.cpp
patching file indra/newview/skins/default/xui/en-us/menu_pie_attachment.xml
patching file indra/newview/skins/default/xui/en-us/menu_pie_avatar.xml
patching file indra/newview/statemachine/aifilepicker.cpp
patching file indra/newview/statemachine/aifilepicker.h
patching file indra/plugins/filepicker/llfilepicker.cpp
cat modified_singularity.patch | patch -p1

Then recompile Singularity.

Patch

modified_singularity.patch
diff --git a/indra.orig/newview/llagent.h b/indra/newview/llagent.h
index 2c87d27..c9f7430 100644
--- a/indra.orig/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -30,6 +30,7 @@
  * $/LicenseInfo$
  */
 
+#define TOGGLE_HACKED_GODLIKE_VIEWER 1
 #ifndef LL_LLAGENT_H
 #define LL_LLAGENT_H
 
diff --git a/indra.orig/newview/llfloatercustomize.cpp b/indra/newview/llfloatercustomize.cpp
index b43d471..8b45d67 100644
--- a/indra.orig/newview/llfloatercustomize.cpp
+++ b/indra/newview/llfloatercustomize.cpp
@@ -603,18 +603,18 @@ void LLPanelEditWearable::setSubpart( ESubpart subpart )
 			{
 				can_import = true;
 
-				if (is_complete && 
+				/*if (is_complete && 
 					gAgent.getID() == item->getPermissions().getOwner() &&
 					gAgent.getID() == item->getPermissions().getCreator() &&
 					(PERM_ITEM_UNRESTRICTED &
 					perm_mask) == PERM_ITEM_UNRESTRICTED)
-				{
-					can_export = true;
-				}
+				{*/
+					if(is_complete) can_export = true;
+				//}
 			}
 		}
 		setUIPermissions(perm_mask, is_complete);
-		BOOL editable = ((perm_mask & PERM_MODIFY) && is_complete) ? TRUE : FALSE;
+		BOOL editable = TRUE; //((perm_mask & PERM_MODIFY) && is_complete) ? TRUE : FALSE;
 
 		for(LLViewerVisualParam* param = (LLViewerVisualParam *)avatar->getFirstVisualParam(); 
 			param; 
@@ -868,8 +868,8 @@ void LLPanelEditWearable::addTextureDropTarget( ETextureIndex te, const std::str
 		texture_ctrl->setDefaultImageAssetID(default_image_id);
 		texture_ctrl->setAllowNoTexture( allow_no_texture );
 		// Don't allow (no copy) or (no transfer) textures to be selected.
-		texture_ctrl->setImmediateFilterPermMask(PERM_NONE);//PERM_COPY | PERM_TRANSFER);
-		texture_ctrl->setNonImmediateFilterPermMask(PERM_NONE);//PERM_COPY | PERM_TRANSFER);
+		//texture_ctrl->setImmediateFilterPermMask(PERM_NONE);//PERM_COPY | PERM_TRANSFER);
+		//texture_ctrl->setNonImmediateFilterPermMask(PERM_NONE);//PERM_COPY | PERM_TRANSFER);
 	}
 	mTextureList[name] = te;
 	LLVOAvatar* avatar = gAgentAvatarp;
@@ -960,16 +960,16 @@ void LLPanelEditWearable::draw()
 	LLWearable* wearable = gAgentWearables.getWearable( mType );
 	BOOL has_wearable = (wearable != NULL );
 	BOOL is_dirty = isDirty();
-	BOOL is_modifiable = FALSE;
-	BOOL is_copyable = FALSE;
+	BOOL is_modifiable = TRUE; //FALSE;
+	BOOL is_copyable = TRUE; //FALSE;
 	BOOL is_complete = FALSE;
 	LLViewerInventoryItem* item;
 	item = (LLViewerInventoryItem*)gAgentWearables.getWearableInventoryItem(mType);
 	if(item)
 	{
-		const LLPermissions& perm = item->getPermissions();
-		is_modifiable = perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID());
-		is_copyable = perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID());
+		//const LLPermissions& perm = item->getPermissions();
+		//is_modifiable = perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID());
+		//is_copyable = perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID());
 		is_complete = item->isComplete();
 	}
 
@@ -1252,8 +1252,8 @@ void LLPanelEditWearable::onCommitSexChange( LLUICtrl*, void* userdata )
 
 void LLPanelEditWearable::setUIPermissions(U32 perm_mask, BOOL is_complete)
 {
-	BOOL is_copyable = (perm_mask & PERM_COPY) ? TRUE : FALSE;
-	BOOL is_modifiable = (perm_mask & PERM_MODIFY) ? TRUE : FALSE;
+	BOOL is_copyable = TRUE; //(perm_mask & PERM_COPY) ? TRUE : FALSE;
+	BOOL is_modifiable = TRUE; //(perm_mask & PERM_MODIFY) ? TRUE : FALSE;
 
 	childSetEnabled("Save", is_modifiable && is_complete);
 	childSetEnabled("Save As", is_copyable && is_complete);
@@ -1941,8 +1941,8 @@ void LLFloaterCustomize::onBtnExport_continued(AIFilePicker* filepicker)
 			item = (LLViewerInventoryItem*)gAgentWearables.getWearableInventoryItem((LLWearableType::EType)i);
 			if(item)
 			{
-				const LLPermissions& perm = item->getPermissions();
-				is_modifiable = perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID());
+				//const LLPermissions& perm = item->getPermissions();
+				is_modifiable = true; //perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID());
 			}
 		}
 		if (is_modifiable)
@@ -1965,8 +1965,8 @@ void LLFloaterCustomize::onBtnExport_continued(AIFilePicker* filepicker)
 			item = (LLViewerInventoryItem*)gAgentWearables.getWearableInventoryItem((LLWearableType::EType)i);
 			if(item)
 			{
-				const LLPermissions& perm = item->getPermissions();
-				is_modifiable = perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID());
+				//const LLPermissions& perm = item->getPermissions();
+				is_modifiable = true; //perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID());
 			}
 		}
 		if (is_modifiable)
@@ -2837,7 +2837,7 @@ void LLFloaterCustomize::updateInventoryUI()
 			{
 				panel->setUIPermissions(perm_mask, is_complete);
 			}
-			BOOL is_vis = panel && item && is_complete && (perm_mask & PERM_MODIFY);
+			BOOL is_vis = panel && item && is_complete; //&& (perm_mask & PERM_MODIFY);
 			childSetVisible("panel_container", is_vis);
 		}
 	}
@@ -2853,9 +2853,9 @@ void LLFloaterCustomize::updateScrollingPanelUI()
 		LLViewerInventoryItem* item = (LLViewerInventoryItem*)gAgentWearables.getWearableInventoryItem(panel->getType());
 		if(item)
 		{
-			U32 perm_mask = item->getPermissions().getMaskOwner();
+			//U32 perm_mask = item->getPermissions().getMaskOwner();
 			BOOL is_complete = item->isComplete();
-			updateScrollingPanelList((perm_mask & PERM_MODIFY) ? is_complete : FALSE);
+			updateScrollingPanelList(is_complete); //updateScrollingPanelList((perm_mask & PERM_MODIFY) ? is_complete : FALSE);
 		}
 	}
 }
diff --git a/indra.orig/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 48d9b54..9ea530a 100644
--- a/indra.orig/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -348,13 +348,13 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id)
 		else
 		{
 
-			LLInventoryItem* itemp = gInventory.getItem(image_id);
+			/*LLInventoryItem* itemp = gInventory.getItem(image_id);
 			if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID()))
 			{
 				// no copy texture
 				childSetValue("apply_immediate_check", FALSE);
 				mNoCopyTextureSelected = TRUE;
-			}
+			}*/
 			mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO);
 		}
 	}
@@ -422,7 +422,7 @@ BOOL LLFloaterTexturePicker::handleDragAndDrop(
 	{
 		LLInventoryItem *item = (LLInventoryItem *)cargo_data;
 
-		BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID());
+		/*BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID());
 		BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID());
 		BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER,
 															gAgent.getID());
@@ -436,7 +436,7 @@ BOOL LLFloaterTexturePicker::handleDragAndDrop(
 		PermissionMask filter_perm_mask = mImmediateFilterPermMask;
 		if ( (item_perm_mask & filter_perm_mask) == filter_perm_mask )
 
-		{
+		{*/
 			if (drop)
 			{
 				setImageID( item->getAssetUUID() );
@@ -444,11 +444,11 @@ BOOL LLFloaterTexturePicker::handleDragAndDrop(
 			}
 
 			*accept = ACCEPT_YES_SINGLE;
-		}
+		/*}
 		else
 		{
 			*accept = ACCEPT_NO;
-		}
+		}*/
 	}
 	else
 	{
@@ -519,9 +519,9 @@ BOOL LLFloaterTexturePicker::postBuild()
 	/**
 	LLInventoryItem* itemp = gInventory.getItem(mImageAssetID);
 
-	if (itemp && (itemp->getPermissions().getMaskOwner() & PERM_ALL))
+	if (itemp && (itemp->getPermissions().getMaskOwner() & PERM_ALL))*/
 		childSetValue("texture_uuid", mImageAssetID);
-	else
+	/*else
 		childSetValue("texture_uuid", LLUUID::null.asString());
 	**/
 	if (!mLabel.empty())
@@ -925,16 +925,16 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem
 		if (itemp)
 		{
 			// <dogmode>
-			if (itemp->getPermissions().getMaskOwner() & PERM_ALL)
+			//if (itemp->getPermissions().getMaskOwner() & PERM_ALL)
 				self->childSetValue("texture_uuid", self->mImageAssetID);
-			else
-				self->childSetValue("texture_uuid", LLUUID::null.asString());
+			/*else
+				self->childSetValue("texture_uuid", LLUUID::null.asString());*/
 			// </dogmode>
 
-			if (!itemp->getPermissions().allowCopyBy(gAgent.getID()))
+			/*if (!itemp->getPermissions().allowCopyBy(gAgent.getID()))
 			{
 				self->mNoCopyTextureSelected = TRUE;
-			}
+			}*/
 			self->mImageAssetID = itemp->getAssetUUID();
 			self->mIsDirty = TRUE;
 			if (user_action)
@@ -1030,15 +1030,15 @@ void LLFloaterTexturePicker::onTextureSelect( const LLTextureEntry& te, void *da
 
 		LLInventoryItem* itemp = gInventory.getItem(inventory_item_id);
 
-		if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID()))
+		/*if (itemp && !itemp->getPermissions().allowCopyBy(gAgent.getID()))
 		{
 			// no copy texture
 			self->mNoCopyTextureSelected = TRUE;
 		}
 		else 
-		{
+		{*/
 			self->childSetValue("texture_uuid", inventory_item_id.asString());
-		}
+		//}
 
 		self->commitIfImmediateSet();
 	}
diff --git a/indra.orig/newview/llviewercontrol.h b/indra/newview/llviewercontrol.h
index df4313e..91e543e 100644
--- a/indra.orig/newview/llviewercontrol.h
+++ b/indra/newview/llviewercontrol.h
@@ -41,7 +41,7 @@ class LLUICtrl;
 
 // Enabled this definition to compile a 'hacked' viewer that
 // allows a hacked godmode to be toggled on and off.
-#define TOGGLE_HACKED_GODLIKE_VIEWER 
+#define TOGGLE_HACKED_GODLIKE_VIEWER 1
 #ifdef TOGGLE_HACKED_GODLIKE_VIEWER
 extern BOOL gHackGodmode;
 #endif
diff --git a/indra.orig/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index aff0628..ab767b2 100644
--- a/indra.orig/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -1028,14 +1028,14 @@ void init_client_menu(LLMenuGL* menu)
 
 // <dogmode> 
 #ifdef TOGGLE_HACKED_GODLIKE_VIEWER
-	if (!LLViewerLogin::getInstance()->isInProductionGrid())
-	{
+	//if (!LLViewerLogin::getInstance()->isInProductionGrid())
+	//{
 		menu->append(new LLMenuItemCheckGL("Hacked Godmode",
 										   &handle_toggle_hacked_godmode,
 										   NULL,
 										   &check_toggle_hacked_godmode,
 										   (void*)"HackedGodmode"));
-	}
+	//}
 #endif
 // </dogmode>
 	menu->append(new LLMenuItemCallGL("Clear Group Cache", 
@@ -2831,6 +2831,8 @@ class LLObjectEnableExport : public view_listener_t
 		bool new_value = (object != NULL);
 		if (new_value)
 		{
+		  gMenuHolder->findControl(userdata["control"].asString())->setValue(new_value);
+		  return true;
 			struct ff : public LLSelectedNodeFunctor
 			{
 				ff(const LLSD& data) : LLSelectedNodeFunctor(), userdata(data)
@@ -4922,8 +4924,8 @@ BOOL enable_take()
 		return TRUE;
 #else
 # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
-		if (!LLViewerLogin::getInstance()->isInProductionGrid() 
-            && gAgent.isGodlike())
+		if (/*!LLViewerLogin::getInstance()->isInProductionGrid()*/ 
+            /*&&*/ gAgent.isGodlike())
 		{
 			return TRUE;
 		}
@@ -5554,8 +5556,8 @@ class LLObjectEnableDelete : public view_listener_t
 			TRUE;
 #else
 # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
-			(!LLViewerLogin::getInstance()->isInProductionGrid()
-             && gAgent.isGodlike()) ||
+			(/*!LLViewerLogin::getInstance()->isInProductionGrid()*/
+             /*&&*/ gAgent.isGodlike()) ||
 # endif
 			LLSelectMgr::getInstance()->canDoDelete();
 #endif
@@ -7834,8 +7836,8 @@ class LLToolsEnableTakeCopy : public view_listener_t
 			all_valid = true;
 #ifndef HACKED_GODLIKE_VIEWER
 # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
-			if (LLViewerLogin::getInstance()->isInProductionGrid()
-                || !gAgent.isGodlike())
+			if (/*LLViewerLogin::getInstance()->isInProductionGrid()*/
+                /*||*/ !gAgent.isGodlike())
 # endif
 			{
 				struct f : public LLSelectedObjectFunctor
@@ -7962,8 +7964,8 @@ BOOL enable_save_into_inventory(void*)
 	return TRUE;
 #else
 # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
-	if (!LLViewerLogin::getInstance()->isInProductionGrid()
-        && gAgent.isGodlike())
+	if (/*!LLViewerLogin::getInstance()->isInProductionGrid()*/
+        /*&&*/ gAgent.isGodlike())
 	{
 		return TRUE;
 	}
@@ -9567,6 +9569,7 @@ void initialize_menus()
 	addMenu(new LLAvatarEnableFreezeEject(), "Avatar.EnableFreezeEject");
 	addMenu(new LLAvatarCopyUUID(), "Avatar.CopyUUID");
 	addMenu(new LLAvatarClientUUID(), "Avatar.ClientID");
+	addMenu(new LLObjectExport(), "Avatar.Export");
 
 	// Object pie menu
 	addMenu(new LLObjectOpen(), "Object.Open");
@@ -9622,6 +9625,7 @@ void initialize_menus()
 
 	addMenu(new LLAttachmentEnableDrop(), "Attachment.EnableDrop");
 	addMenu(new LLAttachmentEnableDetach(), "Attachment.EnableDetach");
+	addMenu(new LLObjectEnableExport(), "Attachment.EnableExport");
 
 	// Land pie menu
 	addMenu(new LLLandBuild(), "Land.Build");
diff --git a/indra.orig/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 7c449c2..b980116 100644
--- a/indra.orig/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -889,7 +889,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
 	{
 		// Unknown extension
 		// *TODO: Translate?
-		error_message = llformat("Unknown file extension .%s\nExpected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh", exten.c_str());
+		error_message = llformat("Unknown file extension .%s\nExpected .wav, .tga, .bmp, .jpg, .jpeg, .bvh or .animatn", exten.c_str());
 		error = TRUE;;
 	}
 
diff --git a/indra.orig/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 9bd7e57..a85d32a 100644
--- a/indra.orig/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -5118,8 +5118,8 @@ BOOL LLViewerObject::permYouOwner() const
 		return TRUE;
 #else
 # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
-		if (!LLViewerLogin::getInstance()->isInProductionGrid()
-            && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+		if (/*!LLViewerLogin::getInstance()->isInProductionGrid()*/
+            /*&&*/ (gAgent.getGodLevel() >= GOD_MAINTENANCE))
 		{
 			return TRUE;
 		}
@@ -5155,8 +5155,8 @@ BOOL LLViewerObject::permOwnerModify() const
 		return TRUE;
 #else
 # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
-		if (!LLViewerLogin::getInstance()->isInProductionGrid()
-            && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+		if (/*!LLViewerLogin::getInstance()->isInProductionGrid()*/
+            /*&&*/ (gAgent.getGodLevel() >= GOD_MAINTENANCE))
 	{
 			return TRUE;
 	}
@@ -5179,8 +5179,8 @@ BOOL LLViewerObject::permModify() const
 		return TRUE;
 #else
 # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
-		if (!LLViewerLogin::getInstance()->isInProductionGrid()
-            && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+		if (/*!LLViewerLogin::getInstance()->isInProductionGrid()*/
+            /*&&*/ (gAgent.getGodLevel() >= GOD_MAINTENANCE))
 	{
 			return TRUE;
 	}
@@ -5203,8 +5203,8 @@ BOOL LLViewerObject::permCopy() const
 		return TRUE;
 #else
 # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
-		if (!LLViewerLogin::getInstance()->isInProductionGrid()
-            && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+		if (/*!LLViewerLogin::getInstance()->isInProductionGrid()*/
+            /*&&*/ (gAgent.getGodLevel() >= GOD_MAINTENANCE))
 		{
 			return TRUE;
 		}
@@ -5227,8 +5227,8 @@ BOOL LLViewerObject::permMove() const
 		return TRUE;
 #else
 # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
-		if (!LLViewerLogin::getInstance()->isInProductionGrid()
-            && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+		if (/*!LLViewerLogin::getInstance()->isInProductionGrid()*/
+            /*&&*/ (gAgent.getGodLevel() >= GOD_MAINTENANCE))
 		{
 			return TRUE;
 		}
@@ -5251,8 +5251,8 @@ BOOL LLViewerObject::permTransfer() const
 		return TRUE;
 #else
 # ifdef TOGGLE_HACKED_GODLIKE_VIEWER
-		if (!LLViewerLogin::getInstance()->isInProductionGrid()
-            && (gAgent.getGodLevel() >= GOD_MAINTENANCE))
+		if (/*!LLViewerLogin::getInstance()->isInProductionGrid()*/
+            /*&&*/ (gAgent.getGodLevel() >= GOD_MAINTENANCE))
 		{
 			return TRUE;
 		}
diff --git a/indra.orig/newview/llviewerobjectbackup.cpp b/indra/newview/llviewerobjectbackup.cpp
index aa0d8fe..c06beb8 100644
--- a/indra.orig/newview/llviewerobjectbackup.cpp
+++ b/indra/newview/llviewerobjectbackup.cpp
@@ -95,8 +95,8 @@ static LLUUID LL_TEXTURE_MEDIA			= LLUUID("8b5fec65-8d8d-9dc5-cda8-8fdf2716e361"
 
 void setDefaultTextures()
 {
-	if (!gHippoGridManager->getConnectedGrid()->isSecondLife())
-	{
+	//if (!gHippoGridManager->getConnectedGrid()->isSecondLife())
+	//{
 		// When not in SL (no texture perm check needed), we can get these
 		// defaults from the user settings...
 		LL_TEXTURE_PLYWOOD = LLUUID(gSavedSettings.getString("DefaultObjectTexture"));
@@ -107,7 +107,7 @@ void setDefaultTextures()
 			// AllowInvisibleTextureInPicker patch)
 			LL_TEXTURE_INVISIBLE = LLUUID(gSavedSettings.getString("UIImgInvisibleUUID"));
 		}
-	}
+	//}
 }
 
 class importResponder: public LLNewAgentInventoryResponder
@@ -396,6 +396,7 @@ void LLObjectBackup::exportObject_continued(AIFilePicker* filepicker)
 
 bool LLObjectBackup::validatePerms(const LLPermissions *item_permissions)
 {
+  return true;
 	if (gHippoGridManager->getConnectedGrid()->isSecondLife())
 	{
 		// In Second Life, you must be the creator to be permitted to export the asset.
@@ -421,11 +422,11 @@ bool LLObjectBackup::validatePerms(const LLPermissions *item_permissions)
 // the textures in the Library), whoever is the actual creator... Go figure !
 LLUUID LLObjectBackup::validateTextureID(LLUUID asset_id)
 {
-	if (!gHippoGridManager->getConnectedGrid()->isSecondLife())
-	{
+	//if (!gHippoGridManager->getConnectedGrid()->isSecondLife())
+	//{
 		// If we are not in Second Life, don't bother.
 		return asset_id;
-	}
+	//}
 	LLUUID texture = LL_TEXTURE_PLYWOOD;
 	if (asset_id == texture ||
 		asset_id == LL_TEXTURE_BLANK ||
diff --git a/indra.orig/newview/skins/default/xui/en-us/menu_pie_attachment.xml b/indra/newview/skins/default/xui/en-us/menu_pie_attachment.xml
index ae508e7..7e2356d 100644
--- a/indra.orig/newview/skins/default/xui/en-us/menu_pie_attachment.xml
+++ b/indra/newview/skins/default/xui/en-us/menu_pie_attachment.xml
@@ -35,6 +35,10 @@
 			<on_click function="Object.DERENDER" />
 			<on_enable function="Object.EnableDerender" />
 		</menu_item_call>
+    <menu_item_call enabled="true" label="Export" mouse_opaque="true" name="Object Export">
+      <on_click function="Object.Export" />
+      <on_enable function="Object.EnableExport" />
+    </menu_item_call>
 	</pie_menu>
 	<menu_item_call enabled="true" label="Appearance..." name="Appearance...">
 		<on_click function="ShowFloater" userdata="appearance" />
diff --git a/indra.orig/newview/skins/default/xui/en-us/menu_pie_avatar.xml b/indra/newview/skins/default/xui/en-us/menu_pie_avatar.xml
index 6258c7d..4a6bde8 100644
--- a/indra.orig/newview/skins/default/xui/en-us/menu_pie_avatar.xml
+++ b/indra/newview/skins/default/xui/en-us/menu_pie_avatar.xml
@@ -46,6 +46,10 @@
 			<menu_item_call enabled="true" label="Derender" mouse_opaque="true" name="Derender">
 				<on_click function="Object.DERENDER" />
 			</menu_item_call>
+      <menu_item_call enabled="true" label="Export" mouse_opaque="true" name="Object Export">
+        <on_click function="Object.Export" />
+        <on_enable function="Object.EnableExport" />
+      </menu_item_call>
 		</pie_menu>
 		<menu_item_call enabled="false" label="Eject..." mouse_opaque="true" name="Eject...">
 			<on_click function="Avatar.Eject" />
diff --git a/indra.orig/newview/statemachine/aifilepicker.cpp b/indra/newview/statemachine/aifilepicker.cpp
index 38cbf69..773b99f 100644
--- a/indra.orig/newview/statemachine/aifilepicker.cpp
+++ b/indra/newview/statemachine/aifilepicker.cpp
@@ -147,6 +147,9 @@ void AIFilePicker::open(ELoadFilter filter, std::string const& default_path, std
 	  case FFLOAD_ANIM:
 		  mFilter = "anim";
 		  break;
+		case FFLOAD_ANIMATN:
+		  mFilter = "animatn";
+		  break;
 #ifdef _CORY_TESTING
 	  case FFLOAD_GEOMETRY:
 		  mFilter = "geometry";
diff --git a/indra.orig/newview/statemachine/aifilepicker.h b/indra/newview/statemachine/aifilepicker.h
index c862231..16708cc 100644
--- a/indra.orig/newview/statemachine/aifilepicker.h
+++ b/indra/newview/statemachine/aifilepicker.h
@@ -43,6 +43,7 @@ enum ELoadFilter
 	FFLOAD_WAV,
 	FFLOAD_IMAGE,
 	FFLOAD_ANIM,
+	FFLOAD_ANIMATN,
 	FFLOAD_XML,
 	FFLOAD_SLOBJECT,
 	FFLOAD_RAW,
--- a/indra.orig/plugins/filepicker/llfilepicker.cpp
+++ b/indra/plugins/filepicker/llfilepicker.cpp
@@ -49,7 +49,7 @@ LLFilePicker LLFilePicker::sInstance;
 #define AO_FILTER L"Animation Override (*.ao)\0*.ao\0"
 #define BLACKLIST_FILTER L"Asset Blacklist (*.blacklist)\0*.blacklist\0"
 // </edit>
-#define ANIM_FILTER L"Animations (*.bvh)\0*.bvh\0"
+#define ANIM_FILTER L"Animations (*.bvh; *.anim; *.animatn)\0*.bvh\0;*.anim\0;*.animatn\0"
 #ifdef _CORY_TESTING
 #define GEOMETRY_FILTER L"SL Geometry (*.slg)\0*.slg\0"
 #endif
@@ -752,8 +752,10 @@ Boolean LLFilePickerBase::navOpenFilterProc(AEDesc *theItem, void *info, void *c
 						}
 						else if (filter == FFLOAD_ANIM)
 						{
-							if (fileInfo.filetype != 'BVH ' && 
-								(fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("bvh"), kCFCompareCaseInsensitive) != kCFCompareEqualTo))
+							if (fileInfo.filetype != 'BVH ' && fileInfo.filetype != 'ANIM ' && fileInfo.filetype != 'ANIMATN ' &&
+								(fileInfo.extension && (CFStringCompare(fileInfo.extension, CFSTR("bvh"), kCFCompareCaseInsensitive) != kCFCompareEqualTo &&
+								CFStringCompare(fileInfo.extension, CFSTR("anim"), kCFCompareCaseInsensitive) != kCFCompareEqualTo &&
+								CFStringCompare(fileInfo.extension, CFSTR("animatn"), kCFCompareCaseInsensitive) != kCFCompareEqualTo))
 							)
 							{
 								result = false;