diff --git a/doc/contributions.txt b/doc/contributions.txt
index 04edfb4bea1a9857e1c875b3ccf4dd84c5d43ba2..4b4ec9dcd54ae53327b31591976d924646535bf8 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -629,6 +629,7 @@ Jonathan Yap
 	STORM-1809
 	STORM-1793
 	STORM-1810
+	STORM-68
 Kadah Coba
 	STORM-1060
 Jondan Lundquist
diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp
index fbf23bc3f09a760eee88c85f29cf41df9a1a5352..4e5a328c547625ce1f963adc6ef16cb2ae0cd447 100644
--- a/indra/llinventory/llinventory.cpp
+++ b/indra/llinventory/llinventory.cpp
@@ -303,6 +303,11 @@ LLInventoryItem::LLInventoryItem(const LLUUID& uuid,
 	LLStringUtil::replaceNonstandardASCII(mDescription, ' ');
 	LLStringUtil::replaceChar(mDescription, '|', ' ');
 	mPermissions.initMasks(inv_type);
+//	if (LLInventoryType::IT_LSL == inv_type)
+//	{
+//		mPermissions.setMaskNext(permissions.getMaskNextOwner());
+		mPermissions.setMaskNext(PERM_ALL);
+//	}
 }
 
 LLInventoryItem::LLInventoryItem() :
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 05c05b9393e6ebe87e8a3a2a8f2f3ec458a2926d..b3ed917574a42bcdd5e495b7371fd681da5978b8 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -13516,5 +13516,335 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
+    <key>ObjectsNextOwnerCopy</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created objects can be copied by next owner</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>ObjectsNextOwnerModify</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created objects can be modified by next owner</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>ObjectsNextOwnerTransfer</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created objects can be resold or given away by next owner</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>ObjectsEveryoneCopy</key>
+      <map>
+        <key>Comment</key>
+        <string>Everyone can copy the newly created object</string>
+        <key>Persist</key>
+        <integer>1</integer>
+        <key>Type</key>
+        <string>Boolean</string>
+        <key>Value</key>
+        <integer>0</integer>
+    </map>
+    <key>ObjectsShareWithGroup</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created objects are shared with the currently active group</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>UploadsNextOwnerCopy</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly uploaded items can be copied by next owner</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>UploadsNextOwnerModify</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly uploaded items can be modified by next owner</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>UploadsNextOwnerTransfer</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly uploaded items can be resold or given away by next owner</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>UploadsEveryoneCopy</key>
+      <map>
+        <key>Comment</key>
+        <string>Everyone can copy the newly uploaded item</string>
+        <key>Persist</key>
+        <integer>1</integer>
+        <key>Type</key>
+        <string>Boolean</string>
+        <key>Value</key>
+        <integer>0</integer>
+    </map>
+    <key>UploadsShareWithGroup</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly uploaded items are shared with the currently active group</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>ScriptsNextOwnerCopy</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created scripts can be copied by next owner</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>ScriptsNextOwnerModify</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created scripts can be modified by next owner</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>ScriptsNextOwnerTransfer</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created scripts can be resold or given away by next owner</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>ScriptsEveryoneCopy</key>
+      <map>
+        <key>Comment</key>
+        <string>Everyone can copy the newly created script</string>
+        <key>Persist</key>
+        <integer>1</integer>
+        <key>Type</key>
+        <string>Boolean</string>
+        <key>Value</key>
+        <integer>0</integer>
+    </map>
+    <key>ScriptsShareWithGroup</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created scripts are shared with the currently active group</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>NotecardsNextOwnerCopy</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created notecards can be copied by next owner</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>NotecardsNextOwnerModify</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created notecards can be modified by next owner</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>NotecardsNextOwnerTransfer</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created notecards can be resold or given away by next owner</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>NotecardsEveryoneCopy</key>
+      <map>
+        <key>Comment</key>
+        <string>Everyone can copy the newly created notecard</string>
+        <key>Persist</key>
+        <integer>1</integer>
+        <key>Type</key>
+        <string>Boolean</string>
+        <key>Value</key>
+        <integer>0</integer>
+    </map>
+    <key>NotecardsShareWithGroup</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created notecards are shared with the currently active group</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>GesturesNextOwnerCopy</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created gestures can be copied by next owner</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>GesturesNextOwnerModify</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created gestures can be modified by next owner</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>GesturesNextOwnerTransfer</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created gestures can be resold or given away by next owner</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>GesturesEveryoneCopy</key>
+      <map>
+        <key>Comment</key>
+        <string>Everyone can copy the newly created gesture</string>
+        <key>Persist</key>
+        <integer>1</integer>
+        <key>Type</key>
+        <string>Boolean</string>
+        <key>Value</key>
+        <integer>0</integer>
+    </map>
+    <key>GesturesShareWithGroup</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created gestures are shared with the currently active group</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>WearablesNextOwnerCopy</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created clothing or body part can be copied by next owner</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>WearablesNextOwnerModify</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created clothing or body part can be modified by next owner</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    <key>WearablesNextOwnerTransfer</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created clothing or body part can be resold or given away by next owner</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
+    <key>WearablesEveryoneCopy</key>
+      <map>
+        <key>Comment</key>
+        <string>Everyone can copy the newly created clothing or body part</string>
+        <key>Persist</key>
+        <integer>1</integer>
+        <key>Type</key>
+        <string>Boolean</string>
+        <key>Value</key>
+        <integer>0</integer>
+    </map>
+    <key>WearablesShareWithGroup</key>
+    <map>
+      <key>Comment</key>
+      <string>Newly created clothing or body part is shared with the currently active group</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
 </map>
 </llsd>
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index dd02a74a381f764d8ba787c04b2ae311186b3b7c..7017357346762cae989cdfef5b2b2eb3ae1808f2 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -49,6 +49,7 @@
 #include "llvoavatarself.h"
 #include "llwearable.h"
 #include "llwearablelist.h"
+#include "llfloaterperms.h"
 
 #include <boost/scoped_ptr.hpp>
 
@@ -65,8 +66,24 @@ class LLWearAndEditCallback : public LLInventoryCallback
 {
 	void fire(const LLUUID& inv_item)
 	{
+llwarns << "DBG 1" << llendl;
 		if (inv_item.isNull()) return;
 
+llwarns << "DBG 2" << llendl;
+		LLViewerInventoryItem* item = gInventory.getItem(inv_item);
+		if (!item) return;
+
+llwarns << "DBG 3" << llendl;
+		LLPermissions perm = item->getPermissions();
+		perm.setMaskNext(LLFloaterPerms::getNextOwnerPerms("Wearables"));
+		perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Wearables"));
+		perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Wearables"));
+		item->setPermissions(perm);
+
+llwarns << "DBG 4" << llendl;
+		gInventory.updateItem(item);
+		gInventory.notifyObservers();
+
 		// Request editing the item after it gets worn.
 		gAgentWearables.requestEditingWearable(inv_item);
 
@@ -75,6 +92,27 @@ class LLWearAndEditCallback : public LLInventoryCallback
 	}
 };
 
+class LLCreateWearableCallback : public LLInventoryCallback
+{
+	void fire(const LLUUID& inv_item)
+	{
+		if (inv_item.isNull())
+			return;
+
+		LLViewerInventoryItem* item = gInventory.getItem(inv_item);
+		if (!item) return;
+
+		LLPermissions perm = item->getPermissions();
+		perm.setMaskNext(LLFloaterPerms::getNextOwnerPerms("Wearables"));
+		perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Wearables"));
+		perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Wearables"));
+		item->setPermissions(perm);
+
+		gInventory.updateItem(item);
+		gInventory.notifyObservers();
+	}
+};
+
 ///////////////////////////////////////////////////////////////////////////////
 
 // HACK: For EXT-3923: Pants item shows in inventory with skin icon and messes with "current look"
@@ -1982,7 +2020,16 @@ void LLAgentWearables::createWearable(LLWearableType::EType type, bool wear, con
 	LLWearable* wearable = LLWearableList::instance().createNewWearable(type);
 	LLAssetType::EType asset_type = wearable->getAssetType();
 	LLInventoryType::EType inv_type = LLInventoryType::IT_WEARABLE;
-	LLPointer<LLInventoryCallback> cb = wear ? new LLWearAndEditCallback : NULL;
+	LLPointer<LLInventoryCallback> cb;
+	if (wear)
+	{
+		cb = new LLWearAndEditCallback;
+	}
+	else
+	{
+		cb = new LLCreateWearableCallback;
+	}
+
 	LLUUID folder_id;
 
 	if (parent_id.notNull())
@@ -1995,10 +2042,15 @@ void LLAgentWearables::createWearable(LLWearableType::EType type, bool wear, con
 		folder_id = gInventory.findCategoryUUIDForType(folder_type);
 	}
 
-	create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
-						  folder_id, wearable->getTransactionID(), wearable->getName(),
-						  wearable->getDescription(), asset_type, inv_type, wearable->getType(),
-						  wearable->getPermissions().getMaskNextOwner(),
+	create_inventory_item(gAgent.getID(),
+						  gAgent.getSessionID(),
+						  folder_id,
+						  wearable->getTransactionID(),
+						  wearable->getName(),
+						  wearable->getDescription(),
+						  asset_type, inv_type,
+						  wearable->getType(),
+						  LLFloaterPerms::getNextOwnerPerms("Wearables"),
 						  cb);
 }
 
diff --git a/indra/newview/llfloaterbvhpreview.cpp b/indra/newview/llfloaterbvhpreview.cpp
index b050a638dcccb3b93a0e26b6c5c0ff2e472bdd30..720c2cbeeaa84bf090716d3b1d2aa960d77145ed 100644
--- a/indra/newview/llfloaterbvhpreview.cpp
+++ b/indra/newview/llfloaterbvhpreview.cpp
@@ -991,7 +991,7 @@ void LLFloaterBvhPreview::onBtnOK(void* userdata)
 						    0,
 						    LLFolderType::FT_NONE,
 						    LLInventoryType::IT_ANIMATION,
-						    LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
+						    LLFloaterPerms::getNextOwnerPerms("Uploads"), LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"),
 						    name,
 						    callback, expected_upload_cost, userdata);
 
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index 56051ff68458f5cbd589ae833028116bbad3be41..dcc245ee208b93aca8815c87ea04ef13028d6d72 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -48,6 +48,7 @@
 #include "llviewermenu.h" 
 #include "llviewerinventory.h"
 #include "llviewercontrol.h"
+#include "llfloaterperms.h"
 
 BOOL item_name_precedes( LLInventoryItem* a, LLInventoryItem* b )
 {
@@ -74,6 +75,16 @@ class GestureShowCallback : public LLInventoryCallback
 	void fire(const LLUUID &inv_item)
 	{
 		LLPreviewGesture::show(inv_item, LLUUID::null);
+		
+		LLInventoryItem* item = gInventory.getItem(inv_item);
+		if (item)
+		{
+			LLPermissions perm = item->getPermissions();
+			perm.setMaskNext(LLFloaterPerms::getNextOwnerPerms("Gestures"));
+			perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Gestures"));
+			perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Gestures"));
+			item->setPermissions(perm);
+		}
 	}
 };
 
@@ -449,9 +460,17 @@ void LLFloaterGesture::onClickPlay()
 void LLFloaterGesture::onClickNew()
 {
 	LLPointer<LLInventoryCallback> cb = new GestureShowCallback();
-	create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
-		LLUUID::null, LLTransactionID::tnull, "New Gesture", "", LLAssetType::AT_GESTURE,
-		LLInventoryType::IT_GESTURE, NOT_WEARABLE, PERM_MOVE | PERM_TRANSFER, cb);
+	create_inventory_item(gAgent.getID(),
+						  gAgent.getSessionID(),
+						  LLUUID::null,
+						  LLTransactionID::tnull,
+						  "New Gesture",
+						  "",
+						  LLAssetType::AT_GESTURE,
+						  LLInventoryType::IT_GESTURE,
+						  NOT_WEARABLE,
+						  PERM_MOVE | LLFloaterPerms::getNextOwnerPerms("Gestures"),
+						  cb);
 }
 
 void LLFloaterGesture::onActivateBtnClick()
diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp
index 27b1c3b9cd6e1546d67ccd7dcd5fb12b81251fd1..eefc3522876686eeec4c26079b05cf9e1c71092b 100644
--- a/indra/newview/llfloaternamedesc.cpp
+++ b/indra/newview/llfloaternamedesc.cpp
@@ -171,7 +171,7 @@ void LLFloaterNameDesc::onBtnOK( )
 			    getChild<LLUICtrl>("name_form")->getValue().asString(), 
 			    getChild<LLUICtrl>("description_form")->getValue().asString(), 
 			    0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
-			    LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(),
+			    LLFloaterPerms::getNextOwnerPerms("Uploads"), LLFloaterPerms::getGroupPerms("Uploads"), LLFloaterPerms::getEveryonePerms("Uploads"),
 			    display_name, callback, expected_upload_cost, nruserdata);
 	closeFloater(false);
 }
diff --git a/indra/newview/llfloaterperms.cpp b/indra/newview/llfloaterperms.cpp
index 80b55c3cbbe6ac6d3780cc73ea203fd985126d07..3853dd0ef665aab4751b063ba39d9ea3d8cb2436 100644
--- a/indra/newview/llfloaterperms.cpp
+++ b/indra/newview/llfloaterperms.cpp
@@ -37,96 +37,139 @@
 LLFloaterPerms::LLFloaterPerms(const LLSD& seed)
 : LLFloater(seed)
 {
-	mCommitCallbackRegistrar.add("Perms.Copy",	boost::bind(&LLFloaterPerms::onCommitCopy, this));
-	mCommitCallbackRegistrar.add("Perms.OK",	boost::bind(&LLFloaterPerms::onClickOK, this));
-	mCommitCallbackRegistrar.add("Perms.Cancel",	boost::bind(&LLFloaterPerms::onClickCancel, this));
-
 }
 
 BOOL LLFloaterPerms::postBuild()
 {
-	mCloseSignal.connect(boost::bind(&LLFloaterPerms::cancel, this));
-	
-	refresh();
-	
-	return TRUE;
+	return true;
 }
 
-void LLFloaterPerms::onClickOK()
-{
-	ok();
-	closeFloater();
+//static 
+U32 LLFloaterPerms::getGroupPerms(std::string prefix)
+{	
+	return gSavedSettings.getBOOL(prefix+"ShareWithGroup") ? PERM_COPY : PERM_NONE;
 }
 
-void LLFloaterPerms::onClickCancel()
+//static 
+U32 LLFloaterPerms::getEveryonePerms(std::string prefix)
 {
-	cancel();
-	closeFloater();
+	return gSavedSettings.getBOOL(prefix+"EveryoneCopy") ? PERM_COPY : PERM_NONE;
 }
 
-void LLFloaterPerms::onCommitCopy()
+//static 
+U32 LLFloaterPerms::getNextOwnerPerms(std::string prefix)
 {
-	// Implements fair use
-	BOOL copyable = gSavedSettings.getBOOL("NextOwnerCopy");
-	if(!copyable)
+	U32 flags = PERM_MOVE;
+	if ( gSavedSettings.getBOOL(prefix+"NextOwnerCopy") )
 	{
-		gSavedSettings.setBOOL("NextOwnerTransfer", TRUE);
+		flags |= PERM_COPY;
 	}
-	LLCheckBoxCtrl* xfer = getChild<LLCheckBoxCtrl>("next_owner_transfer");
-	xfer->setEnabled(copyable);
+	if ( gSavedSettings.getBOOL(prefix+"NextOwnerModify") )
+	{
+		flags |= PERM_MODIFY;
+	}
+	if ( gSavedSettings.getBOOL(prefix+"NextOwnerTransfer") )
+	{
+		flags |= PERM_TRANSFER;
+	}
+	return flags;
 }
 
-void LLFloaterPerms::ok()
+//static 
+U32 LLFloaterPerms::getNextOwnerPermsInverted(std::string prefix)
 {
-	refresh(); // Changes were already applied to saved settings. Refreshing internal values makes it official.
+	// Sets bits for permissions that are off
+	U32 flags = PERM_MOVE;
+	if ( !gSavedSettings.getBOOL(prefix+"NextOwnerCopy") )
+	{
+		flags |= PERM_COPY;
+	}
+	if ( !gSavedSettings.getBOOL(prefix+"NextOwnerModify") )
+	{
+		flags |= PERM_MODIFY;
+	}
+	if ( !gSavedSettings.getBOOL(prefix+"NextOwnerTransfer") )
+	{
+		flags |= PERM_TRANSFER;
+	}
+	return flags;
 }
 
-void LLFloaterPerms::cancel()
+LLFloaterPermsDefault::LLFloaterPermsDefault(const LLSD& seed)
+: LLFloater(seed)
 {
-	gSavedSettings.setBOOL("ShareWithGroup",    mShareWithGroup);
-	gSavedSettings.setBOOL("EveryoneCopy",      mEveryoneCopy);
-	gSavedSettings.setBOOL("NextOwnerCopy",     mNextOwnerCopy);
-	gSavedSettings.setBOOL("NextOwnerModify",   mNextOwnerModify);
-	gSavedSettings.setBOOL("NextOwnerTransfer", mNextOwnerTransfer);
+	mCommitCallbackRegistrar.add("PermsDefault.Copy", boost::bind(&LLFloaterPermsDefault::onCommitCopy, this, _2));
+	mCommitCallbackRegistrar.add("PermsDefault.OK", boost::bind(&LLFloaterPermsDefault::onClickOK, this));
+	mCommitCallbackRegistrar.add("PermsDefault.Cancel", boost::bind(&LLFloaterPermsDefault::onClickCancel, this));
 }
 
-void LLFloaterPerms::refresh()
+BOOL LLFloaterPermsDefault::postBuild()
 {
-	mShareWithGroup    = gSavedSettings.getBOOL("ShareWithGroup");
-	mEveryoneCopy      = gSavedSettings.getBOOL("EveryoneCopy");
-	mNextOwnerCopy     = gSavedSettings.getBOOL("NextOwnerCopy");
-	mNextOwnerModify   = gSavedSettings.getBOOL("NextOwnerModify");
-	mNextOwnerTransfer = gSavedSettings.getBOOL("NextOwnerTransfer");
+	mCloseSignal.connect(boost::bind(&LLFloaterPermsDefault::cancel, this));
+
+	category_names[CAT_OBJECTS] = "Objects";
+	category_names[CAT_UPLOADS] = "Uploads";
+	category_names[CAT_SCRIPTS] = "Scripts";
+	category_names[CAT_NOTECARDS] = "Notecards";
+	category_names[CAT_GESTURES] = "Gestures";
+	category_names[CAT_WEARABLES] = "Wearables";
+
+	refresh();
+	
+	return true;
 }
 
-//static 
-U32 LLFloaterPerms::getGroupPerms(std::string prefix)
-{	
-	return gSavedSettings.getBOOL(prefix+"ShareWithGroup") ? PERM_COPY : PERM_NONE;
+void LLFloaterPermsDefault::onClickOK()
+{
+	ok();
+	closeFloater();
 }
 
-//static 
-U32 LLFloaterPerms::getEveryonePerms(std::string prefix)
+void LLFloaterPermsDefault::onClickCancel()
 {
-	return gSavedSettings.getBOOL(prefix+"EveryoneCopy") ? PERM_COPY : PERM_NONE;
+	cancel();
+	closeFloater();
 }
 
-//static 
-U32 LLFloaterPerms::getNextOwnerPerms(std::string prefix)
+void LLFloaterPermsDefault::onCommitCopy(const LLSD& user_data)
 {
-	U32 flags = PERM_MOVE;
-	if ( gSavedSettings.getBOOL(prefix+"NextOwnerCopy") )
+	// Implements fair use
+	std::string prefix = user_data.asString();
+
+	BOOL copyable = gSavedSettings.getBOOL(prefix+"NextOwnerCopy");
+	if(!copyable)
 	{
-		flags |= PERM_COPY;
+		gSavedSettings.setBOOL(prefix+"NextOwnerTransfer", TRUE);
 	}
-	if ( gSavedSettings.getBOOL(prefix+"NextOwnerModify") )
+	LLCheckBoxCtrl* xfer = getChild<LLCheckBoxCtrl>(prefix+"_transfer");
+	xfer->setEnabled(copyable);
+}
+
+void LLFloaterPermsDefault::ok()
+{
+	refresh(); // Changes were already applied to saved settings. Refreshing internal values makes it official.
+}
+
+void LLFloaterPermsDefault::cancel()
+{
+	for (U32 iter = CAT_OBJECTS; iter < CAT_LAST; iter++)
 	{
-		flags |= PERM_MODIFY;
+		gSavedSettings.setBOOL(category_names[iter]+"NextOwnerCopy",		mNextOwnerCopy[iter]);
+		gSavedSettings.setBOOL(category_names[iter]+"NextOwnerModify",		mNextOwnerModify[iter]);
+		gSavedSettings.setBOOL(category_names[iter]+"NextOwnerTransfer",	mNextOwnerTransfer[iter]);
+		gSavedSettings.setBOOL(category_names[iter]+"ShareWithGroup",		mShareWithGroup[iter]);
+		gSavedSettings.setBOOL(category_names[iter]+"EveryoneCopy",			mEveryoneCopy[iter]);
 	}
-	if ( gSavedSettings.getBOOL(prefix+"NextOwnerTransfer") )
+}
+
+void LLFloaterPermsDefault::refresh()
+{
+	for (U32 iter = CAT_OBJECTS; iter < CAT_LAST; iter++)
 	{
-		flags |= PERM_TRANSFER;
+		mShareWithGroup[iter]    = gSavedSettings.getBOOL(category_names[iter]+"ShareWithGroup");
+		mEveryoneCopy[iter]      = gSavedSettings.getBOOL(category_names[iter]+"EveryoneCopy");
+		mNextOwnerCopy[iter]     = gSavedSettings.getBOOL(category_names[iter]+"NextOwnerCopy");
+		mNextOwnerModify[iter]   = gSavedSettings.getBOOL(category_names[iter]+"NextOwnerModify");
+		mNextOwnerTransfer[iter] = gSavedSettings.getBOOL(category_names[iter]+"NextOwnerTransfer");
 	}
-	return flags;
 }
-
diff --git a/indra/newview/llfloaterperms.h b/indra/newview/llfloaterperms.h
index 6b65f4b0cd2b866290432fed1bd4263369d5ca93..bb4a6f9702c4d3824893b91ed3070ea2a7f08f25 100644
--- a/indra/newview/llfloaterperms.h
+++ b/indra/newview/llfloaterperms.h
@@ -36,26 +36,53 @@ class LLFloaterPerms : public LLFloater
 	
 public:
 	/*virtual*/ BOOL postBuild();
-	void ok();
-	void cancel();
-	void onClickOK();
-	void onClickCancel();
-	void onCommitCopy();
+
 	// Convenience methods to get current permission preference bitfields from saved settings:
 	static U32 getEveryonePerms(std::string prefix=""); // prefix + "EveryoneCopy"
 	static U32 getGroupPerms(std::string prefix=""); // prefix + "ShareWithGroup"
 	static U32 getNextOwnerPerms(std::string prefix=""); // bitfield for prefix + "NextOwner" + "Copy", "Modify", and "Transfer"
+	static U32 getNextOwnerPermsInverted(std::string prefix="");
 
 private:
 	LLFloaterPerms(const LLSD& seed);
+
+};
+
+class LLFloaterPermsDefault : public LLFloater
+{
+	friend class LLFloaterReg;
+
+public:
+	/*virtual*/ BOOL postBuild();
+	void ok();
+	void cancel();
+	void onClickOK();
+	void onClickCancel();
+	void onCommitCopy(const LLSD& user_data);
+
+enum Categories
+{
+	CAT_OBJECTS,
+	CAT_UPLOADS,
+	CAT_SCRIPTS,
+	CAT_NOTECARDS,
+	CAT_GESTURES,
+	CAT_WEARABLES,
+	CAT_LAST
+};
+
+private:
+	LLFloaterPermsDefault(const LLSD& seed);
 	void refresh();
 
-	BOOL // cached values only for implementing cancel.
-		mShareWithGroup,
-		mEveryoneCopy,
-		mNextOwnerCopy,
-		mNextOwnerModify,
-		mNextOwnerTransfer;
+	std::string category_names[CAT_LAST];
+
+	// cached values only for implementing cancel.
+	bool mShareWithGroup[CAT_LAST];
+	bool mEveryoneCopy[CAT_LAST];
+	bool mNextOwnerCopy[CAT_LAST];
+	bool mNextOwnerModify[CAT_LAST];
+	bool mNextOwnerTransfer[CAT_LAST];
 };
 
 #endif
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 173b0e538cab14114b54b4116b0cf97fb2e9fd87..596c73870d08e1de67fc9b09150036462b1db96e 100755
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -346,7 +346,8 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
 	mCommitCallbackRegistrar.add("Pref.BlockList",				boost::bind(&LLFloaterPreference::onClickBlockList, this));
 	mCommitCallbackRegistrar.add("Pref.Proxy",					boost::bind(&LLFloaterPreference::onClickProxySettings, this));
 	mCommitCallbackRegistrar.add("Pref.TranslationSettings",	boost::bind(&LLFloaterPreference::onClickTranslationSettings, this));
-	
+	mCommitCallbackRegistrar.add("Pref.PermsDefault",	boost::bind(&LLFloaterPreference::onClickPermsDefault, this));
+
 	sSkin = gSavedSettings.getString("SkinCurrent");
 
 	mCommitCallbackRegistrar.add("Pref.ClickActionChange",				boost::bind(&LLFloaterPreference::onClickActionChange, this));
@@ -1520,6 +1521,11 @@ void LLFloaterPreference::onClickActionChange()
 	mClickActionDirty = true;
 }
 
+void LLFloaterPreference::onClickPermsDefault()
+{
+	LLFloaterReg::showInstance("perms_default");
+}
+
 void LLFloaterPreference::updateClickActionSettings()
 {
 	const int single_clk_action = getChild<LLComboBox>("single_click_action_combo")->getValue().asInteger();
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index ec5994e91754afa5a071a478179dac2843b8e565..bc6e74b0c74edf5c5f06b0645436cd2e338d4f33 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -157,6 +157,7 @@ class LLFloaterPreference : public LLFloater, public LLAvatarPropertiesObserver
 	void onClickBlockList();
 	void onClickProxySettings();
 	void onClickTranslationSettings();
+	void onClickPermsDefault();
 	void applyUIColor(LLUICtrl* ctrl, const LLSD& param);
 	void getUIColor(LLUICtrl* ctrl, const LLSD& param);
 	
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index d8d62e5bbbee6d422889cce9408079e61b0638eb..1d429c5963140dbdb39ba14b675e4ea48ac3acf6 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -980,8 +980,8 @@ void LLSnapshotLivePreview::saveTexture()
 				    LLFolderType::FT_SNAPSHOT_CATEGORY,
 				    LLInventoryType::IT_SNAPSHOT,
 				    PERM_ALL,  // Note: Snapshots to inventory is a special case of content upload
-				    LLFloaterPerms::getGroupPerms(), // that is more permissive than other uploads
-				    LLFloaterPerms::getEveryonePerms(),
+				    LLFloaterPerms::getGroupPerms("Uploads"), // that is more permissive than other uploads
+				    LLFloaterPerms::getEveryonePerms("Uploads"),
 				    "Snapshot : " + pos_string,
 				    callback, expected_upload_cost, userdata);
 		gViewerWindow->playSnapshotAnimAndSound();
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 85ecb133d07eefea4624693663a7f92dc71a37e1..bca2a28dfd7b88dedc10b263928c53b1504d63c3 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -2778,7 +2778,7 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
 	{
 		LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
 		titem->unpackMessage(msg, _PREHASH_ItemData, i);
-		llinfos << "unpaked item '" << titem->getName() << "' in "
+		llinfos << "unpacked item '" << titem->getName() << "' in "
 				<< titem->getParentUUID() << llendl;
 		U32 callback_id;
 		msg->getU32Fast(_PREHASH_ItemData, _PREHASH_CallbackID, callback_id);
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index f461c7e46fb4baa46bdc46ac2f5c31404f1230a8..03547f103a5d65f03130688f101f6353d1f3a8b7 100755
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -1369,9 +1369,9 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
 	result["asset_type"] = "mesh";
 	result["inventory_type"] = "object";
 	result["description"] = "(No Description)";
-	result["next_owner_mask"] = LLSD::Integer(LLFloaterPerms::getNextOwnerPerms());
-	result["group_mask"] = LLSD::Integer(LLFloaterPerms::getGroupPerms());
-	result["everyone_mask"] = LLSD::Integer(LLFloaterPerms::getEveryonePerms());
+	result["next_owner_mask"] = LLSD::Integer(LLFloaterPerms::getNextOwnerPerms("Uploads"));
+	result["group_mask"] = LLSD::Integer(LLFloaterPerms::getGroupPerms("Uploads"));
+	result["everyone_mask"] = LLSD::Integer(LLFloaterPerms::getEveryonePerms("Uploads"));
 
 	res["mesh_list"] = LLSD::emptyArray();
 	res["texture_list"] = LLSD::emptyArray();
diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp
index a64b4ec94d599dce7b7d9588425b75430e9a7734..f180afa037f1f49b95ff3862a580712577013dc1 100644
--- a/indra/newview/llpanelcontents.cpp
+++ b/indra/newview/llpanelcontents.cpp
@@ -59,6 +59,7 @@
 #include "llviewerregion.h"
 #include "llviewerwindow.h"
 #include "llworld.h"
+#include "llfloaterperms.h"
 
 //
 // Imported globals
@@ -156,12 +157,15 @@ void LLPanelContents::onClickNewScript(void *userdata)
 	{
 		LLPermissions perm;
 		perm.init(gAgent.getID(), gAgent.getID(), LLUUID::null, LLUUID::null);
+
+		// Parameters are base, owner, everyone, group, next
 		perm.initMasks(
 			PERM_ALL,
 			PERM_ALL,
 			PERM_NONE,
 			PERM_NONE,
-			PERM_MOVE | PERM_TRANSFER);
+			PERM_ALL);
+//			PERM_MOVE | LLFloaterPerms::getNextOwnerPerms("Scripts"));
 		std::string desc;
 		LLViewerAssetType::generateDescriptionFor(LLAssetType::AT_LSL_TEXT, desc);
 		LLPointer<LLViewerInventoryItem> new_item =
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 7fdaac68c8753b048e3f36e3a163cfb67e4f3e64..356c79a036f1f0cd5c506310cac9ba5c7a8c7ab7 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -244,12 +244,12 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterPayUtil::registerFloater();
 
 	LLFloaterReg::add("people", "floater_people.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
+	LLFloaterReg::add("perms_default", "floater_perms_default.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPermsDefault>);
 	LLFloaterReg::add("places", "floater_places.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
 	LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
 	LLFloaterReg::add("prefs_proxy", "floater_preferences_proxy.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreferenceProxy>);
 	LLFloaterReg::add("prefs_hardware_settings", "floater_hardware_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHardwareSettings>);
 	LLFloaterReg::add("prefs_translation", "floater_translation_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterTranslationSettings>);
-	LLFloaterReg::add("perm_prefs", "floater_perm_prefs.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPerms>);
 	LLFloaterReg::add("picks", "floater_picks.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSidePanelContainer>);
 	LLFloaterReg::add("pref_joystick", "floater_joystick.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterJoystick>);
 	LLFloaterReg::add("preview_anim", "floater_preview_animation.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewAnim>, "preview");
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 45ca23cdfe2d3b19b49dd1f1410d99902731a57b..0d56233db15ee6367b7d01f150ccb3ffecb40c82 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -64,6 +64,7 @@
 #include "llavatarnamecache.h"
 #include "llavataractions.h"
 #include "lllogininstance.h"
+#include "llfloaterperms.h"
 
 ///----------------------------------------------------------------------------
 /// Helper class to store special inventory item names and their localized values.
@@ -1013,6 +1014,24 @@ void ActivateGestureCallback::fire(const LLUUID& inv_item)
 	LLGestureMgr::instance().activateGesture(inv_item);
 }
 
+void CreateScriptCallback::fire(const LLUUID& inv_item)
+{
+	if (inv_item.isNull())
+		return;
+
+	LLViewerInventoryItem* item = gInventory.getItem(inv_item);
+	if (!item) return;
+
+	LLPermissions perm = item->getPermissions();
+	perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Scripts"));
+	perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Scripts"));
+
+	item->setPermissions(perm);
+
+    gInventory.updateItem(item);
+    gInventory.notifyObservers();
+}
+
 void CreateGestureCallback::fire(const LLUUID& inv_item)
 {
 	if (inv_item.isNull())
@@ -1022,6 +1041,12 @@ void CreateGestureCallback::fire(const LLUUID& inv_item)
 	
 	LLViewerInventoryItem* item = gInventory.getItem(inv_item);
 	if (!item) return;
+
+	LLPermissions perm = item->getPermissions();
+	perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Gestures"));
+	perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Gestures"));
+	item->setPermissions(perm);
+
     gInventory.updateItem(item);
     gInventory.notifyObservers();
 
@@ -1030,6 +1055,23 @@ void CreateGestureCallback::fire(const LLUUID& inv_item)
 	gFloaterView->adjustToFitScreen(preview, FALSE);
 }
 
+void CreateNotecardCallback::fire(const LLUUID& inv_item)
+{
+	if (inv_item.isNull())
+		return;
+	
+	LLViewerInventoryItem* item = gInventory.getItem(inv_item);
+	if (!item) return;
+
+	LLPermissions perm = item->getPermissions();
+	perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Notecards"));
+	perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Notecards"));
+	item->setPermissions(perm);
+
+    gInventory.updateItem(item);
+    gInventory.notifyObservers();
+}
+
 void AddFavoriteLandmarkCallback::fire(const LLUUID& inv_item_id)
 {
 	if (mTargetLandmarkId.isNull()) return;
@@ -1285,22 +1327,44 @@ void create_new_item(const std::string& name,
 	LLViewerAssetType::generateDescriptionFor(asset_type, desc);
 	next_owner_perm = (next_owner_perm) ? next_owner_perm : PERM_MOVE | PERM_TRANSFER;
 
-	
-	if (inv_type == LLInventoryType::IT_GESTURE)
-	{
-		LLPointer<LLInventoryCallback> cb = new CreateGestureCallback();
-		create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
-							  parent_id, LLTransactionID::tnull, name, desc, asset_type, inv_type,
-							  NOT_WEARABLE, next_owner_perm, cb);
-	}
-	else
+	LLPointer<LLInventoryCallback> cb = NULL;
+
+	switch (inv_type)
 	{
-		LLPointer<LLInventoryCallback> cb = NULL;
-		create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
-							  parent_id, LLTransactionID::tnull, name, desc, asset_type, inv_type,
-							  NOT_WEARABLE, next_owner_perm, cb);
-	}
 	
+		case LLInventoryType::IT_LSL:
+		{
+			cb = new CreateScriptCallback();
+			next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Scripts");
+			break;
+		}
+
+		case LLInventoryType::IT_GESTURE:
+		{
+			cb = new CreateGestureCallback();
+			next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Gestures");
+			break;
+		}
+
+		case LLInventoryType::IT_NOTECARD:
+		{
+			cb = new CreateNotecardCallback();
+			next_owner_perm = LLFloaterPerms::getNextOwnerPerms("Notecards");
+			break;
+		}
+	}
+
+	create_inventory_item(gAgent.getID(),
+						  gAgent.getSessionID(),
+						  parent_id,
+						  LLTransactionID::tnull,
+						  name,
+						  desc,
+						  asset_type,
+						  inv_type,
+						  NOT_WEARABLE,
+						  next_owner_perm,
+						  cb);
 }	
 
 const std::string NEW_LSL_NAME = "New Script"; // *TODO:Translate? (probably not)
@@ -1341,7 +1405,7 @@ void menu_create_inventory_item(LLFolderView* root, LLFolderBridge *bridge, cons
 					  parent_id,
 					  LLAssetType::AT_LSL_TEXT,
 					  LLInventoryType::IT_LSL,
-					  PERM_MOVE | PERM_TRANSFER);
+					  PERM_MOVE | PERM_TRANSFER); // overridden in create_new_item
 	}
 	else if ("notecard" == type_name)
 	{
@@ -1350,7 +1414,7 @@ void menu_create_inventory_item(LLFolderView* root, LLFolderBridge *bridge, cons
 					  parent_id,
 					  LLAssetType::AT_NOTECARD,
 					  LLInventoryType::IT_NOTECARD,
-					  PERM_ALL);
+					  PERM_ALL); // overridden in create_new_item
 	}
 	else if ("gesture" == type_name)
 	{
@@ -1359,7 +1423,7 @@ void menu_create_inventory_item(LLFolderView* root, LLFolderBridge *bridge, cons
 					  parent_id,
 					  LLAssetType::AT_GESTURE,
 					  LLInventoryType::IT_GESTURE,
-					  PERM_ALL);
+					  PERM_ALL); // overridden in create_new_item
 	}
 	else
 	{
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index 7822ef4da6548d688f39fd5c9bd2ec188467eabc..a88a5d31bed958f57ea8ae7a27bc37682f516435 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -279,12 +279,24 @@ class ActivateGestureCallback : public LLInventoryCallback
 	void fire(const LLUUID& inv_item);
 };
 
+class CreateScriptCallback : public LLInventoryCallback
+{
+public:
+	void fire(const LLUUID& inv_item);
+};
+
 class CreateGestureCallback : public LLInventoryCallback
 {
 public:
 	void fire(const LLUUID& inv_item);
 };
 
+class CreateNotecardCallback : public LLInventoryCallback
+{
+public:
+	void fire(const LLUUID& inv_item);
+};
+
 class AddFavoriteLandmarkCallback : public LLInventoryCallback
 {
 public:
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index dc2ea4bd1f48d98be0cd2655b5c6538b9f2bae0a..aa0c0008aafabae814e819b88ad9183b323d856b 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -441,9 +441,9 @@ class LLFileUploadBulk : public view_listener_t
 				0,
 				LLFolderType::FT_NONE,
 				LLInventoryType::IT_NONE,
-				LLFloaterPerms::getNextOwnerPerms(),
-				LLFloaterPerms::getGroupPerms(),
-				LLFloaterPerms::getEveryonePerms(),
+				LLFloaterPerms::getNextOwnerPerms("Uploads"),
+				LLFloaterPerms::getGroupPerms("Uploads"),
+				LLFloaterPerms::getEveryonePerms("Uploads"),
 				display_name,
 				callback,
 				expected_upload_cost,
@@ -1004,9 +1004,9 @@ void upload_done_callback(
 			0,
 			LLFolderType::FT_NONE,
 			LLInventoryType::IT_NONE,
-			PERM_NONE,
-			PERM_NONE,
-			PERM_NONE,
+			LLFloaterPerms::getNextOwnerPerms("Uploads"),
+			LLFloaterPerms::getGroupPerms("Uploads"),
+			LLFloaterPerms::getEveryonePerms("Uploads"),
 			display_name,
 			callback,
 			expected_upload_cost, // assuming next in a group of uploads is of roughly the same type, i.e. same upload cost
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index cd300accb7f74070ea0f940d7d7d459912393d25..98856d125fe4ef9a33d8386ba6e8aabd15ae305a 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -100,6 +100,7 @@
 #include "lltrans.h"
 #include "llsdutil.h"
 #include "llmediaentry.h"
+#include "llfloaterperms.h"
 
 //#define DEBUG_UPDATE_TYPE
 
@@ -2571,8 +2572,15 @@ void LLViewerObject::saveScript(
 	 * interaction with doUpdateInventory() called below.
 	 */
 	lldebugs << "LLViewerObject::saveScript() " << item->getUUID() << " " << item->getAssetUUID() << llendl;
+
+	LLPermissions perm = item->getPermissions();
+	perm.setMaskNext(LLFloaterPerms::getNextOwnerPerms("Scripts"));
+	perm.setMaskEveryone(LLFloaterPerms::getEveryonePerms("Scripts"));
+	perm.setMaskGroup(LLFloaterPerms::getGroupPerms("Scripts"));
+	perm.setMaskNext(PERM_ALL);
+
 	LLPointer<LLViewerInventoryItem> task_item =
-		new LLViewerInventoryItem(item->getUUID(), mID, item->getPermissions(),
+		new LLViewerInventoryItem(item->getUUID(), mID, perm,
 								  item->getAssetUUID(), item->getType(),
 								  item->getInventoryType(),
 								  item->getName(), item->getDescription(),
@@ -2594,6 +2602,8 @@ void LLViewerObject::saveScript(
 	task_item->packMessage(msg);
 	msg->sendReliable(mRegionp->getHost());
 
+	task_item->setPermissions(perm);
+
 	// do the internal logic
 	doUpdateInventory(task_item, TASK_INVENTORY_ITEM_KEY, is_new);
 }
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 6912faa9ec93bc5420356d13f8aa9aaae56e57b6..09eec8e5abc45519affd68321a04205c7937e11d 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -74,6 +74,7 @@
 #include "object_flags.h"
 
 #include "llappviewer.h"
+#include "llfloaterperms.h"
 
 extern F32 gMinObjectDistance;
 extern BOOL gAnimateTextures;
@@ -266,6 +267,17 @@ void LLViewerObjectList::processUpdateCore(LLViewerObject* objectp,
 			// llinfos << "DEBUG selecting " << objectp->mID << " " 
 			// << objectp->mLocalID << llendl;
 			LLSelectMgr::getInstance()->selectObjectAndFamily(objectp);
+
+			// This is a bit of a hack.  Because the server ensures one of either COPY or TRANSFER is always be on
+			// to set the bits we want it is first necessary to set them all on and then clear the ones that
+			// are not needed.
+			LLSelectMgr::getInstance()->selectionSetObjectPermissions(PERM_NEXT_OWNER, TRUE, PERM_COPY | PERM_MODIFY | PERM_TRANSFER);
+			LLSelectMgr::getInstance()->selectionSetObjectPermissions(PERM_NEXT_OWNER, FALSE, LLFloaterPerms::getNextOwnerPermsInverted("Objects"));
+
+			LLSelectMgr::getInstance()->selectionSetObjectPermissions(PERM_EVERYONE, TRUE, LLFloaterPerms::getEveryonePerms("Objects"));
+
+			LLSelectMgr::getInstance()->selectionSetObjectPermissions(PERM_GROUP, TRUE, LLFloaterPerms::getGroupPerms("Objects"));
+
 			dialog_refresh_all();
 		}
 
diff --git a/indra/newview/skins/default/xui/en/floater_perms_default.xml b/indra/newview/skins/default/xui/en/floater_perms_default.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ac19be8d152adacb11131e8ed78a3f5a3ce2fc19
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_perms_default.xml
@@ -0,0 +1,508 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ height="250"
+ layout="topleft"
+ name="perms default"
+ help_topic="perms_default"
+ save_rect="true"
+ title="DEFAULT CREATION PERMISSIONS"
+ width="700">
+
+  <panel
+   follows="left|top|right|bottom"
+   height="200"
+   label="Default Permissions"
+   layout="topleft"
+   left="10"
+   name="default permissions"
+   top="20"
+   width="690">
+
+     <text
+      type="string"
+      length="1"
+      follows="left|top"
+      height="16"
+      halign="center"
+      layout="topleft"
+      left="120"
+      top="10"
+      width="100">
+         Copy
+      </text>
+
+      <text
+       type="string"
+       length="1"
+       follows="left|top"
+       height="16"
+       halign="center"
+       layout="topleft"
+       left_pad="5"
+       top="10"
+       width="100">
+          Modify
+      </text>
+
+      <text
+       type="string"
+       length="1"
+       follows="left|top"
+       height="16"
+       halign="center"
+       layout="topleft"
+       left_pad="5"
+       top="10"
+       width="100">
+          Transfer
+      </text>
+
+      <text
+       type="string"
+       length="1"
+       follows="left|top"
+       height="32"
+       halign="center"
+       layout="topleft"
+       left_pad="5"
+       top="10"
+       word_wrap="true"
+       width="100">
+          Share with group
+      </text>
+
+      <text
+       type="string"
+       length="1"
+       follows="left|top"
+       height="32"
+       halign="center"
+       layout="topleft"
+       left_pad="5"
+       top="10"
+       word_wrap="true"
+       width="120">
+          Allow anyone to copy
+      </text>
+
+
+      <text
+       type="string"
+       length="1"
+       follows="left|top"
+       height="16"
+       layout="topleft"
+       left="0"
+       top_pad="10"
+       tool_tip="Set default permissions for when Objects are created"
+       width="100">
+          Objects
+      </text>
+      <icon
+       follows="left|top"
+       height="16"
+       image_name="Inv_Object"
+       layout="topleft"
+       left_pad="2"
+       width="18"/>
+
+      <check_box
+       control_name="ObjectsNextOwnerCopy"
+       height="16"
+       layout="topleft"
+       name="objects_c"
+       left_pad="45"
+       top_delta="0"
+       width="100">
+        <check_box.commit_callback
+         function="PermsDefault.Copy"
+         parameter="Objects" />
+      </check_box>
+      <check_box
+       control_name="ObjectsNextOwnerModify"
+       height="16"
+       layout="topleft"
+       name="objects_m"
+       left_pad="0"
+       top_delta="0"
+       width="100" />
+      <check_box
+       enabled_control="ObjectsNextOwnerCopy"
+       control_name="ObjectsNextOwnerTransfer"
+       height="16"
+       layout="topleft"
+       name="Objects_transfer"
+       left_pad="0"
+       top_delta="0"
+       width="100" />
+      <check_box
+       control_name="ObjectsShareWithGroup"
+       height="16"
+       layout="topleft"
+       name="objects_s"
+       left_pad="0"
+       top_delta="0"
+       width="120" />
+      <check_box
+       control_name="ObjectsEveryoneCopy"
+       height="16"
+       layout="topleft"
+       name="objects_a"
+       left_pad="0"
+       top_delta="0"
+       width="100" />
+
+      <text
+       type="string"
+       length="1"
+       follows="left|top"
+       height="16"
+       layout="topleft"
+       left="0"
+       tool_tip="Set default permissions for uploaded items"
+       width="100">
+          Uploads
+      </text>
+      <icon
+       follows="left|top"
+       height="16"
+       image_name="Inv_Texture"
+       layout="topleft"
+       left_pad="2"
+       width="18"/>
+
+      <check_box
+       control_name="UploadsNextOwnerCopy"
+       height="16"
+       layout="topleft"
+       name="uploads_c"
+       left_pad="45"
+       top_delta="0"
+       width="100">
+        <check_box.commit_callback
+         function="PermsDefault.Copy"
+         parameter="Uploads" />
+      </check_box>
+      <check_box
+       control_name="UploadsNextOwnerModify"
+       height="16"
+       layout="topleft"
+       name="uploads_m"
+       left_pad="0"
+       top_delta="0"
+       width="100" />
+      <check_box
+       enabled_control="UploadsNextOwnerCopy"
+       control_name="UploadsNextOwnerTransfer"
+       height="16"
+       layout="topleft"
+       name="Uploads_transfer"
+       left_pad="0"
+       top_delta="0"
+       width="100" />
+      <check_box
+       control_name="UploadsShareWithGroup"
+       height="16"
+       layout="topleft"
+       name="uploads_s"
+       left_pad="0"
+       top_delta="0"
+       width="120" />
+      <check_box
+       control_name="UploadsEveryoneCopy"
+       height="16"
+       layout="topleft"
+       name="uploads_a"
+       left_pad="0"
+       top_delta="0"
+       width="100" />
+
+      <text
+       type="string"
+       length="1"
+       follows="left|top"
+       height="16"
+       layout="topleft"
+       left="0"
+       tool_tip="Set default permissions for when Scripts are created"
+       width="100">
+          Scripts
+      </text>
+      <icon
+       follows="left|top"
+       height="16"
+       image_name="Inv_Script"
+       layout="topleft"
+       left_pad="2"
+       width="18"/>
+
+      <check_box
+       control_name="ScriptsNextOwnerCopy"
+       height="16"
+       layout="topleft"
+       name="scripts_c"
+       left_pad="45"
+       top_delta="0"
+       width="100">
+        <check_box.commit_callback
+         function="PermsDefault.Copy"
+         parameter="Scripts" />
+      </check_box>
+      <check_box
+       control_name="ScriptsNextOwnerModify"
+       height="16"
+       layout="topleft"
+       name="scripts_m"
+       left_pad="0"
+       top_delta="0"
+       width="100" />
+      <check_box
+       enabled_control="ScriptsNextOwnerCopy"
+       control_name="ScriptsNextOwnerTransfer"
+       height="16"
+       layout="topleft"
+       name="Scripts_transfer"
+       left_pad="0"
+       top_delta="0"
+       width="100" />
+      <check_box
+       control_name="ScriptsShareWithGroup"
+       height="16"
+       layout="topleft"
+       name="scripts_s"
+       left_pad="0"
+       top_delta="0"
+       width="120" />
+      <check_box
+       control_name="ScriptsEveryoneCopy"
+       height="16"
+       layout="topleft"
+       name="scripts_a"
+       left_pad="0"
+       top_delta="0"
+       width="100" />
+
+      <text
+       type="string"
+       length="1"
+       follows="left|top"
+       height="16"
+       layout="topleft"
+       left="0"
+       tool_tip="Set default permissions for when Notecards are created"
+       width="100">
+        Notecards
+      </text>
+      <icon
+       follows="left|top"
+       height="16"
+       image_name="Inv_Notecard"
+       layout="topleft"
+       left_pad="2"
+       width="18"/>
+
+      <check_box
+       control_name="NotecardsNextOwnerCopy"
+       height="16"
+       layout="topleft"
+       name="notecards_c"
+       left_pad="45"
+       top_delta="0"
+       width="100">
+        <check_box.commit_callback
+         function="PermsDefault.Copy"
+         parameter="Notecards" />
+      </check_box>
+      <check_box
+       control_name="NotecardsNextOwnerModify"
+       height="16"
+       layout="topleft"
+       name="notecards_m"
+       left_pad="0"
+       top_delta="0"
+       width="100" />
+      <check_box
+       enabled_control="NotecardsNextOwnerCopy"
+       control_name="NotecardsNextOwnerTransfer"
+       height="16"
+       layout="topleft"
+       name="Notecards_transfer"
+       left_pad="0"
+       top_delta="0"
+       width="100" />
+      <check_box
+       control_name="NotecardsShareWithGroup"
+       height="16"
+       layout="topleft"
+       name="notecards_s"
+       left_pad="0"
+       top_delta="0"
+       width="120" />
+      <check_box
+       control_name="NotecardsEveryoneCopy"
+       height="16"
+       layout="topleft"
+       name="notecards_a"
+       left_pad="0"
+       top_delta="0"
+       width="100" />
+
+      <text
+       type="string"
+       length="1"
+       follows="left|top"
+       height="16"
+       layout="topleft"
+       left="0"
+       tool_tip="Set default permissions for when Gestures are created"
+       width="100">
+          Gestures
+      </text>
+      <icon
+       follows="left|top"
+       height="16"
+       image_name="Inv_Gesture"
+       layout="topleft"
+       left_pad="2"
+       width="18"/>
+
+      <check_box
+       control_name="GesturesNextOwnerCopy"
+       height="16"
+       layout="topleft"
+       name="gestures_c"
+       left_pad="45"
+       top_delta="0"
+       width="100">
+        <check_box.commit_callback
+         function="PermsDefault.Copy"
+         parameter="Gestures" />
+      </check_box>
+      <check_box
+       control_name="GesturesNextOwnerModify"
+       height="16"
+       layout="topleft"
+       name="gestures_m"
+       left_pad="0"
+       top_delta="0"
+       width="100" />
+      <check_box
+       enabled_control="GesturesNextOwnerCopy"
+       control_name="GesturesNextOwnerTransfer"
+       height="16"
+       layout="topleft"
+       name="Gestures_transfer"
+       left_pad="0"
+       top_delta="0"
+       width="100" />
+      <check_box
+       control_name="GesturesShareWithGroup"
+       height="16"
+       layout="topleft"
+       name="gestures_s"
+       left_pad="0"
+       top_delta="0"
+       width="120" />
+      <check_box
+       control_name="GesturesEveryoneCopy"
+       height="16"
+       layout="topleft"
+       name="gestures_a"
+       left_pad="0"
+       top_delta="0"
+       width="100" />
+
+
+      <text
+       type="string"
+       length="1"
+       follows="left|top"
+       height="16"
+       layout="topleft"
+       left="0"
+       tool_tip="Set default permissions for when Clothing or Body Parts are created"
+       width="100">
+          Wearables
+      </text>
+      <icon
+       follows="left|top"
+       height="16"
+       image_name="Inv_BodyShape"
+       layout="topleft"
+       left_pad="2"
+       width="18"/>
+
+      <check_box
+       control_name="WearablesNextOwnerCopy"
+       height="16"
+       layout="topleft"
+       name="wearables_c"
+       left_pad="45"
+       top_delta="0"
+       width="100">
+        <check_box.commit_callback
+         function="PermsDefault.Copy"
+         parameter="Wearables" />
+      </check_box>
+      <check_box
+       control_name="WearablesNextOwnerModify"
+       height="16"
+       layout="topleft"
+       name="wearables_m"
+       left_pad="0"
+       top_delta="0"
+       width="100" />
+      <check_box
+       enabled_control="WearablesNextOwnerCopy"
+       control_name="WearablesNextOwnerTransfer"
+       height="16"
+       layout="topleft"
+       name="Wearables_transfer"
+       left_pad="0"
+       top_delta="0"
+       width="100" />
+      <check_box
+       control_name="WearablesShareWithGroup"
+       height="16"
+       layout="topleft"
+       name="wearables_s"
+       left_pad="0"
+       top_delta="0"
+       width="120" />
+      <check_box
+       control_name="WearablesEveryoneCopy"
+       height="16"
+       layout="topleft"
+       name="wearables_a"
+       left_pad="0"
+       top_delta="0"
+       width="100" />
+
+  </panel>
+
+  <button
+   height="20"
+   label="OK"
+   label_selected="OK"
+   layout="topleft"
+   name="ok"
+   left="480"
+   width="100">
+	<button.commit_callback
+	 function="PermsDefault.OK" />
+  </button>
+
+  <button
+   height="20"
+   label="Cancel"
+   label_selected="Cancel"
+   layout="topleft"
+   left_pad="5"
+   name="cancel"
+   top_delta="0"
+   width="100">
+    <button.commit_callback
+     function="PermsDefault.Cancel" />
+  </button>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 5ba566b175e59a113a0abc154e62f0748e39f9fd..c660ef13ae763fcb299b572c8929a12d5c08e60c 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -1131,13 +1131,6 @@
                  function="File.UploadBulk"
                  parameter="" />
             </menu_item_call>
-            <menu_item_call
-             label="Set Default Upload Permissions"
-             name="perm prefs">
-                <menu_item_call.on_click
-                 function="Floater.Toggle"
-                 parameter="perm_prefs" />
-            </menu_item_call>
         </menu>
         <menu_item_separator/>
         <menu_item_call
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 2cc9d9c1b075437557c7467dfb98f39bd61ad50a..b6985f911e284bf3727a74a9175513dba94ccd9a 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -222,4 +222,15 @@
      name="show_develop_menu_check"
      top_pad="5"
      width="237"/>
+    <button
+     height="20"
+     label="Default Creation Permissions"
+     layout="topleft"
+     name="Default Creation Permissions"
+     left="30"
+     top_pad = "20"
+     width="250">
+	<button.commit_callback
+	 function="Pref.PermsDefault" />
+  </button>
 </panel>