diff --git a/doc/contributions.txt b/doc/contributions.txt
index 74b316b3ec086f4ddac80c7fac467ee6213ad23b..9292d1ba401ffc36e1e91f5038d04fbed3042a19 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -265,6 +265,7 @@ Seg Baphomet
 	VWR-1585
 	VWR-1586
 	VWR-3206
+	VWR-2488
 SignpostMarv Martin
 	VWR-153
 	VWR-154
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index d051fa6043d30c1c98f3ba5a65581392d7f28bfa..c82a9b788b0173f9af6519b74bba36d03f745049 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -35,7 +35,7 @@
 const S32 LL_VERSION_MAJOR = 1;
 const S32 LL_VERSION_MINOR = 18;
 const S32 LL_VERSION_PATCH = 6;
-const S32 LL_VERSION_BUILD = 3;
+const S32 LL_VERSION_BUILD = 4;
 
 const char * const LL_CHANNEL = "Second Life Release";
 
diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp
index df446a7239c08f91619805c09e92e49395335994..df939a9c99b8a0d231749c24acc09ff4a99bfa64 100755
--- a/indra/llcrashlogger/llcrashlogger.cpp
+++ b/indra/llcrashlogger/llcrashlogger.cpp
@@ -1,4 +1,4 @@
-/** 
+ /** 
 * @file llcrashlogger.cpp
 * @brief Crash logger implementation
 *
@@ -144,9 +144,18 @@ void LLCrashLogger::gatherFiles()
 	mCrashHost = "https://";
 	mCrashHost += mDebugLog["CurrentSimHost"].asString();
 	mCrashHost += ":12043/crash/report";
-	mAltCrashHost = "https://";
-	mAltCrashHost += mDebugLog["GridUtilHost"].asString();
-	mAltCrashHost += ":12043/crash/report";
+	// Use login servers as the alternate, since they are already load balanced and have a known name
+	// First, check to see if we have a valid grid name. If not, use agni.
+	mAltCrashHost = "https://login.";
+	if(mDebugLog["GridName"].asString() != "")
+	{
+		mAltCrashHost += mDebugLog["GridName"].asString();
+	}
+	else
+	{
+		mAltCrashHost += "agni";
+	}
+	mAltCrashHost += ".lindenlab.com:12043/crash/report";
 
 	mCrashInfo["DebugLog"] = mDebugLog;
 	mFileMap["StatsLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stats.log");
@@ -230,9 +239,6 @@ bool LLCrashLogger::sendCrashLogs()
 		updateApplication("Sending logs...");
 	}
 
-	//util.* servers no longer have a public interface, so there's no alternate server anymore.
-	//leaving this in if we decide we need another alternate server for crash report receiving.
-	/*	
 	if(!gSent)
 	{
 		gBreak = false;
@@ -243,7 +249,7 @@ bool LLCrashLogger::sendCrashLogs()
 			updateApplication("Sending logs to Alternate Server...");
 		}
 	}
-	*/
+	
 
 	mSentCrashLogs = gSent;
 
diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings
index dff6ab4cbbe6aaccd4d0e3c5dc55c56a0e2310b5..81d40ac48427db5304e7f56d1d5d5c03d626ed77 100644
--- a/indra/newview/English.lproj/InfoPlist.strings
+++ b/indra/newview/English.lproj/InfoPlist.strings
@@ -1,5 +1,5 @@
 /* Localized versions of Info.plist keys */
 
 CFBundleName = "Second Life";
-CFBundleShortVersionString = "Second Life version 1.18.6.3";
-CFBundleGetInfoString = "Second Life version 1.18.6.3, Copyright 2004-2007 Linden Research, Inc.";
+CFBundleShortVersionString = "Second Life version 1.18.6.4";
+CFBundleGetInfoString = "Second Life version 1.18.6.4, Copyright 2004-2007 Linden Research, Inc.";
diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist
index 73117e1e0660efade619a427b201a1837bf5de6a..44e9a47438e569061646633ea16ee901c8edda8d 100644
--- a/indra/newview/Info-SecondLife.plist
+++ b/indra/newview/Info-SecondLife.plist
@@ -32,7 +32,7 @@
 		</dict>
 	</array>
 	<key>CFBundleVersion</key>
-	<string>1.18.6.3</string>
+	<string>1.18.6.4</string>
 	<key>CSResourcesFileMapped</key>
 	<true/>
 </dict>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 96d9670ac95e5edbe516e38e75b3651e62a17498..28496dc9101549618c818b90076d76c45d0d7926 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -2501,7 +2501,7 @@ void LLAppViewer::writeSystemInfo()
 {
 	gDebugInfo["SLLog"] = LLError::logFileName();
 
-	gDebugInfo["ClientInfo"]["Name"] = gSecondLife;
+	gDebugInfo["ClientInfo"]["Name"] = gChannelName;
 	gDebugInfo["ClientInfo"]["MajorVersion"] = LL_VERSION_MAJOR;
 	gDebugInfo["ClientInfo"]["MinorVersion"] = LL_VERSION_MINOR;
 	gDebugInfo["ClientInfo"]["PatchVersion"] = LL_VERSION_PATCH;
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index abde6ccfcba9f84e139feaf57ec01b23e6dbd3f9..2167e1f2ca3f622015fe3169599d6bc8d7ebed95 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -2536,7 +2536,7 @@ LLPanelLandAccess::LLPanelLandAccess(LLParcelSelectionHandle& parcel)
 
 BOOL LLPanelLandAccess::postBuild()
 {
-	childSetCommitCallback("public_access", onCommitAny, this);
+	childSetCommitCallback("public_access", onCommitPublicAccess, this);
 	childSetCommitCallback("limit_payment", onCommitAny, this);
 	childSetCommitCallback("limit_age_verified", onCommitAny, this);
 	childSetCommitCallback("GroupCheck", onCommitAny, this);
@@ -2580,7 +2580,7 @@ void LLPanelLandAccess::refresh()
 	{
 		BOOL use_access_list = parcel->getParcelFlag(PF_USE_ACCESS_LIST);
 		BOOL use_group = parcel->getParcelFlag(PF_USE_ACCESS_GROUP);
-		BOOL public_access = !use_access_list;
+		BOOL public_access = !use_access_list && !use_group;
 		
 		childSetValue("public_access", public_access );
 		childSetValue("GroupCheck", use_group );
@@ -2767,6 +2767,7 @@ void LLPanelLandAccess::refresh_ui()
 			{
 				childSetToolTip("Only Allow", LLString());
 			}
+			childSetEnabled("GroupCheck", FALSE);
 			childSetEnabled("PassCheck", FALSE);
 			childSetEnabled("pass_combo", FALSE);
 			childSetEnabled("AccessList", FALSE);
@@ -2775,6 +2776,11 @@ void LLPanelLandAccess::refresh_ui()
 		{
 			childSetEnabled("limit_payment", FALSE);
 			childSetEnabled("limit_age_verified", FALSE);
+			char group_name[MAX_STRING];	/*Flawfinder: ignore*/
+			if (gCacheName->getGroupName(parcel->getGroupID(), group_name))
+			{			
+				childSetEnabled("GroupCheck", can_manage_allowed);
+			}
 			BOOL group_access = childGetValue("GroupCheck").asBoolean();
 			BOOL sell_passes = childGetValue("PassCheck").asBoolean();
 			childSetEnabled("PassCheck", can_manage_allowed);
@@ -2785,13 +2791,6 @@ void LLPanelLandAccess::refresh_ui()
 				childSetEnabled("HoursSpin", can_manage_allowed);
 			}
 		}
-
-		char group_name[MAX_STRING];	/*Flawfinder: ignore*/
-		if (gCacheName->getGroupName(parcel->getGroupID(), group_name))
-		{			
-			childSetEnabled("GroupCheck", can_manage_allowed);
-		}
-		
 		childSetEnabled("AccessList", can_manage_allowed);
 		S32 allowed_list_count = parcel->mAccessList.size();
 		childSetEnabled("add_allowed", can_manage_allowed && allowed_list_count < PARCEL_MAX_ACCESS_LIST);
@@ -2827,6 +2826,29 @@ void LLPanelLandAccess::draw()
 	LLPanel::draw();
 }
 
+// static
+void LLPanelLandAccess::onCommitPublicAccess(LLUICtrl *ctrl, void *userdata)
+{
+	LLPanelLandAccess *self = (LLPanelLandAccess *)userdata;
+	LLParcel* parcel = self->mParcel->getParcel();
+	if (!parcel)
+	{
+		return;
+	}
+
+	// If we disabled public access, enable group access by default (if applicable)
+	BOOL public_access = self->childGetValue("public_access").asBoolean();
+	if (public_access == FALSE)
+	{
+		char group_name[MAX_STRING];	/*Flawfinder: ignore*/
+		if (gCacheName->getGroupName(parcel->getGroupID(), group_name))
+		{
+			self->childSetValue("GroupCheck", public_access ? FALSE : TRUE);
+		}
+	}
+	
+	onCommitAny(ctrl, userdata);
+}
 
 // static
 void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
@@ -2841,7 +2863,6 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
 
 	// Extract data from UI
 	BOOL public_access = self->childGetValue("public_access").asBoolean();
-
 	BOOL use_access_group = self->childGetValue("GroupCheck").asBoolean();
 	if (use_access_group)
 	{
@@ -2859,6 +2880,7 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata)
 	if (public_access)
 	{
 		use_access_list = FALSE;
+		use_access_group = FALSE;
 		limit_payment = self->childGetValue("limit_payment").asBoolean();
 		limit_age_verified = self->childGetValue("limit_age_verified").asBoolean();
 	}
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index 4bb88aa127a8ce3a7dd9da93aad3c24038d3b98a..4407e0b5b44b74c276eb38be08720d35888019df 100644
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -395,6 +395,7 @@ class LLPanelLandAccess
 	void refreshNames();
 	virtual void draw();
 
+	static void onCommitPublicAccess(LLUICtrl* ctrl, void *userdata);
 	static void onCommitAny(LLUICtrl* ctrl, void *userdata);
 	static void onClickAddAccess(void*);
 	static void callbackAvatarCBAccess(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* userdata);
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 2cac860423ca503e02bef1a2ea5d4a936a0ccf6e..cf8fff8543d3612c8c6c799d1409b76064e2978f 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -85,6 +85,25 @@ const S32 MAX_PASSWORD = 16;
 LLPanelLogin *LLPanelLogin::sInstance = NULL;
 
 
+class LLLoginRefreshHandler : public LLCommandHandler
+{
+public:
+	LLLoginRefreshHandler() : LLCommandHandler("login_refresh") { }
+	bool handle(const LLSD& tokens, const LLSD& queryMap)
+	{	
+#if LL_LIBXUL_ENABLED
+		if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP)
+		{
+			LLPanelLogin::loadLoginPage();
+		}	
+#endif
+		return true;
+	}
+};
+
+LLLoginRefreshHandler gLoginRefreshHandler;
+
+
 //parses the input url and returns true if afterwards
 //a web-login-key, firstname and lastname  is set
 bool LLLoginHandler::parseDirectLogin(std::string url)
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 96af7d2bd2d1e3c5c796292dbb7fb7fbb478b53c..675a447dc487c53c88f035f89486855ba8d8df18 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -777,9 +777,6 @@ BOOL idle_startup()
 			gSavedSettings.setString("FirstName", firstname);
 			gSavedSettings.setString("LastName", lastname);
 
-
-			
-
 			llinfos << "Attempting login as: " << firstname << " " << lastname << llendl;
 			gDebugInfo["LoginName"] = firstname + " " + lastname;	
 		}
@@ -899,7 +896,7 @@ BOOL idle_startup()
 	if(STATE_LOGIN_AUTH_INIT == LLStartUp::getStartupState())
 	{
 //#define LL_MINIMIAL_REQUESTED_OPTIONS
-		gDebugInfo["GridUtilHost"] = gGridInfo[gGridChoice].mName;
+		gDebugInfo["GridName"] = gGridInfo[gGridChoice].mLabel;
 
 		lldebugs << "STATE_LOGIN_AUTH_INIT" << llendl;
 		if (!gUserAuthp)
@@ -1486,6 +1483,7 @@ BOOL idle_startup()
 
 		// Finish agent initialization.  (Requires gSavedSettings, builds camera)
 		gAgent.init();
+		set_underclothes_menu_options();
 
 		// Since we connected, save off the settings so the user doesn't have to
 		// type the name/password again if we crash.
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 4c7229b0d9fda5a6f1d089c77c4082e2b0963c46..ab82fef6cc645c31505c2903f4c1c463c96f9975 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -607,6 +607,21 @@ void initialize_menus();
 //
 // Break up groups of more than 6 items with separators
 //-----------------------------------------------------------------------------
+
+void set_underclothes_menu_options()
+{
+	if (gMenuHolder && gAgent.isTeen())
+	{
+		gMenuHolder->getChildByName("Self Underpants", TRUE)->setVisible(FALSE);
+		gMenuHolder->getChildByName("Self Undershirt", TRUE)->setVisible(FALSE);
+	}
+	if (gMenuBarView && gAgent.isTeen())
+	{
+		gMenuBarView->getChildByName("Menu Underpants", TRUE)->setVisible(FALSE);
+		gMenuBarView->getChildByName("Menu Undershirt", TRUE)->setVisible(FALSE);
+	}
+}
+
 void init_menus()
 {
 	S32 top = gViewerWindow->getRootView()->getRect().getHeight();
@@ -643,12 +658,6 @@ void init_menus()
 	gDetachScreenPieMenu = (LLPieMenu*)gMenuHolder->getChildByName("Object Detach HUD", true);
 	gDetachPieMenu = (LLPieMenu*)gMenuHolder->getChildByName("Object Detach", true);
 
-	if (gAgent.isTeen())
-	{
-		gMenuHolder->getChildByName("Self Underpants", TRUE)->setVisible(FALSE);
-		gMenuHolder->getChildByName("Self Undershirt", TRUE)->setVisible(FALSE);
-	}
-
 	gPieAvatar = gUICtrlFactory->buildPieMenu("menu_pie_avatar.xml", gMenuHolder);
 
 	gPieObject = gUICtrlFactory->buildPieMenu("menu_pie_object.xml", gMenuHolder);
@@ -710,12 +719,6 @@ void init_menus()
 	gAttachSubMenu = gMenuBarView->getChildMenuByName("Attach Object", TRUE);
 	gDetachSubMenu = gMenuBarView->getChildMenuByName("Detach Object", TRUE);
 
-	if (gAgent.isTeen())
-	{
-		gMenuBarView->getChildByName("Menu Underpants", TRUE)->setVisible(FALSE);
-		gMenuBarView->getChildByName("Menu Undershirt", TRUE)->setVisible(FALSE);
-	}
-
 	// TomY TODO convert these two
 	LLMenuGL*menu;
 
@@ -763,6 +766,8 @@ void init_menus()
 	
 }
 
+
+
 void init_landmark_menu(LLMenuGL* menu)
 {
 	if (!menu) return;
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index 6814c31eb8067930a2a0fa47d803dce4f28c189e..003e3efe4296d7fbcd815ad7c1273227655161f1 100644
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -93,6 +93,7 @@ BOOL enable_god_liaison(void* user_data);
 BOOL enable_god_customer_service(void* user_data);
 BOOL enable_god_basic(void* user_data);
 void handle_show_newest_map(void*);
+void set_underclothes_menu_options();
 
 void exchange_callingcard(const LLUUID& dest_id);
 
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index abd3b269f6c793dbc71809abfe44457853c5ce08..c7d2cb73186c79305bd3c3b9bade09c16acf5eaa 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -409,7 +409,7 @@ def package_finish(self):
                 # make sure we don't have stale files laying about
                 self.remove(sparsename, finalname)
 
-                self.run_command('hdiutil create "%(sparse)s" -volname "%(channel)s" -fs HFS+ -type SPARSE -megabytes 300' % {
+                self.run_command('hdiutil create "%(sparse)s" -volname "%(channel)s" -fs HFS+ -type SPARSE -megabytes 300 -layout SPUD' % {
                         'sparse':sparsename,
                         'channel':channel_standin})
 
@@ -523,13 +523,14 @@ def construct(self):
                 super(Linux_x86_64Manifest, self).construct()
                 self.path("secondlife-x86_64-bin-stripped","bin/do-not-directly-run-secondlife-bin")
                 self.path("../linux_crash_logger/linux-crash-logger-x86_64-bin-stripped","linux-crash-logger.bin")
-                # TODO: I get the sense that this isn't fully fleshed out
-                if self.prefix("../../libraries/x86_64-linux/lib_release_client", "lib"):
-                        self.path("libkdu_v42R.so")
-                        self.path("libxmlrpc.so.0")
-                        # self.path("libllkdu.so", "../bin/libllkdu.so") # llkdu goes in bin for some reason
-                        self.end_prefix("lib")
+                self.path("linux_tools/launch_url.sh","launch_url.sh")
+                if self.prefix("res-sdl"):
+                        self.path("*")
+                        # recurse
+                        self.end_prefix("res-sdl")
 
+                self.path("featuretable_linux.txt")
+                self.path("secondlife-i686.supp")
 
 if __name__ == "__main__":
         main(srctree=viewer_dir, dsttree=os.path.join(viewer_dir, "packaged"))