diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index 70d770ef7ed6d99cdafd183b9198f8cef051f95f..1a382643da537121f296fcde94daf84a9f4962de 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -63,14 +63,15 @@ LLPluginClassMedia::~LLPluginClassMedia()
 	reset();
 }
 
-bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug)
+bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path)
 {	
 	LL_DEBUGS("Plugin") << "launcher: " << launcher_filename << LL_ENDL;
 	LL_DEBUGS("Plugin") << "plugin: " << plugin_filename << LL_ENDL;
+	LL_DEBUGS("Plugin") << "user_data_path: " << user_data_path << LL_ENDL;
 	
 	mPlugin = new LLPluginProcessParent(this);
 	mPlugin->setSleepTime(mSleepTime);
-	mPlugin->init(launcher_filename, plugin_filename, debug);
+	mPlugin->init(launcher_filename, plugin_filename, debug, user_data_path);
 
 	return true;
 }
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index 6b6468871841a88e8353b91b4fc40f439534ae3b..b58067733b5f9022aadad61f12c5a0c7fea749bc 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -49,7 +49,7 @@ class LLPluginClassMedia : public LLPluginProcessParentOwner
 	virtual ~LLPluginClassMedia();
 
 	// local initialization, called by the media manager when creating a source
-	virtual bool init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug = false);
+	virtual bool init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path);
 
 	// undoes everything init() didm called by the media manager when destroying a source
 	virtual void reset();
diff --git a/indra/llplugin/llpluginprocesschild.cpp b/indra/llplugin/llpluginprocesschild.cpp
index 55cf11c6208805cca7e72d15ea28c4ec4c13d2f2..ccf6dab942a1bdb1d28a897ad1feb4f4bf1257fc 100644
--- a/indra/llplugin/llpluginprocesschild.cpp
+++ b/indra/llplugin/llpluginprocesschild.cpp
@@ -145,8 +145,12 @@ void LLPluginProcessChild::idle(void)
 			break;
 			
 			case STATE_PLUGIN_LOADED:
-				setState(STATE_PLUGIN_INITIALIZING);
-				sendMessageToPlugin(LLPluginMessage("base", "init"));
+				{
+					setState(STATE_PLUGIN_INITIALIZING);
+					LLPluginMessage message("base", "init");
+					message.setValue("user_data_path", mUserDataPath);
+					sendMessageToPlugin(message);
+				}
 			break;
 			
 			case STATE_PLUGIN_INITIALIZING:
@@ -310,6 +314,7 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
 			if(message_name == "load_plugin")
 			{
 				mPluginFile = parsed.getValue("file");
+				mUserDataPath = parsed.getValue("user_data_path");
 			}
 			else if(message_name == "shm_add")
 			{
diff --git a/indra/llplugin/llpluginprocesschild.h b/indra/llplugin/llpluginprocesschild.h
index f5c57c3d49d212257723d33a208e3d15bd8ddf22..1cfd9dcaf9a411f1d635ec484c51d00f0225414c 100644
--- a/indra/llplugin/llpluginprocesschild.h
+++ b/indra/llplugin/llpluginprocesschild.h
@@ -96,6 +96,8 @@ class LLPluginProcessChild: public LLPluginMessagePipeOwner, public LLPluginInst
 	LLSocket::ptr_t mSocket;
 	
 	std::string mPluginFile;
+
+	std::string mUserDataPath;
 	
 	LLPluginInstance *mInstance;
 
diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index 332ce288d70207292d2ef16ed3ce7c0e331799b9..f60838b1e733c83d6637f288a0f80c2195649da7 100644
--- a/indra/llplugin/llpluginprocessparent.cpp
+++ b/indra/llplugin/llpluginprocessparent.cpp
@@ -99,12 +99,13 @@ void LLPluginProcessParent::errorState(void)
 		setState(STATE_ERROR);
 }
 
-void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug)
+void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path)
 {	
 	mProcess.setExecutable(launcher_filename);
 	mPluginFile = plugin_filename;
 	mCPUUsage = 0.0f;
 	mDebug = debug;
+	mUserDataPath = user_data_path;
 	
 	setState(STATE_INITIALIZED);
 }
@@ -362,6 +363,7 @@ void LLPluginProcessParent::idle(void)
 				{
 					LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "load_plugin");
 					message.setValue("file", mPluginFile);
+					message.setValue("user_data_path", mUserDataPath);
 					sendMessage(message);
 				}
 
diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h
index 25669f5d78eddb2d9a100809bb5558b30bee8a89..6d661a69601b852fe27293d58c59f7bebb5dabdc 100644
--- a/indra/llplugin/llpluginprocessparent.h
+++ b/indra/llplugin/llpluginprocessparent.h
@@ -58,7 +58,7 @@ class LLPluginProcessParent : public LLPluginMessagePipeOwner
 	LLPluginProcessParent(LLPluginProcessParentOwner *owner);
 	~LLPluginProcessParent();
 		
-	void init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug = false);
+	void init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path);
 	void idle(void);
 	
 	// returns true if the plugin is on its way to steady state
@@ -139,6 +139,8 @@ class LLPluginProcessParent : public LLPluginMessagePipeOwner
 	
 	std::string mPluginFile;
 
+	std::string mUserDataPath;
+
 	LLPluginProcessParentOwner *mOwner;
 	
 	typedef std::map<std::string, LLPluginSharedMemory*> sharedMemoryRegionsType;
diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp
index c0c6e592d584318a72d73059c7336509c2a0846c..b2b17fdd56583a7e71b5aef873a1478ec8f8c63a 100644
--- a/indra/llvfs/lldir.cpp
+++ b/indra/llvfs/lldir.cpp
@@ -394,12 +394,6 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd
 		prefix += "local_assets";
 		break;
 
-	case LL_PATH_MOZILLA_PROFILE:
-		prefix = getOSUserAppDir();
-		prefix += mDirDelimiter;
-		prefix += "browser_profile";
-		break;
-
 	case LL_PATH_EXECUTABLE:
 		prefix = getExecutableDir();
 		break;
diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h
index 07c814769ef1dc1ab50d115c1c91c7567e8cf44e..206e3223e3bdce1e097b1c9dce55fc053e1b4854 100644
--- a/indra/llvfs/lldir.h
+++ b/indra/llvfs/lldir.h
@@ -38,7 +38,7 @@
 #define MAX_PATH MAXPATHLEN
 #endif
 
-// these numbers *may* get serialized, so we need to be explicit
+// these numbers *may* get serialized (really??), so we need to be explicit
 typedef enum ELLPath
 {
 	LL_PATH_NONE = 0,
@@ -54,10 +54,8 @@ typedef enum ELLPath
 	LL_PATH_TOP_SKIN = 10,
 	LL_PATH_CHAT_LOGS = 11,
 	LL_PATH_PER_ACCOUNT_CHAT_LOGS = 12,
-	LL_PATH_MOZILLA_PROFILE = 13,
 	LL_PATH_USER_SKIN = 14,
 	LL_PATH_LOCAL_ASSETS = 15,
-//	LL_PATH_HTML = 16,
 	LL_PATH_EXECUTABLE = 16,
 	LL_PATH_DEFAULT_SKIN = 17,
 	LL_PATH_FONTS = 18,
diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp
index 08c993ed2aa42c57c1d1a18a3291261bc12c5502..ee902d1de791e3e245e1e16169a4569141230493 100644
--- a/indra/llvfs/lldir_linux.cpp
+++ b/indra/llvfs/lldir_linux.cpp
@@ -225,15 +225,6 @@ void LLDir_Linux::initAppDirs(const std::string &app_name,
 		}
 	}
 	
-	res = LLFile::mkdir(getExpandedFilename(LL_PATH_MOZILLA_PROFILE,""));
-	if (res == -1)
-	{
-		if (errno != EEXIST)
-		{
-			llwarns << "Couldn't create LL_PATH_MOZILLA_PROFILE dir " << getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"") << llendl;
-		}
-	}
-
 	mCAFile = getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem");
 }
 
diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp
index a21f3ca0abab877dd4173326edcf0c50d4380950..a8fad8e5bdf7b1fcad74a08138edf7ad6b46f10f 100644
--- a/indra/llvfs/lldir_solaris.cpp
+++ b/indra/llvfs/lldir_solaris.cpp
@@ -244,15 +244,6 @@ void LLDir_Solaris::initAppDirs(const std::string &app_name,
 		}
 	}
 	
-	res = LLFile::mkdir(getExpandedFilename(LL_PATH_MOZILLA_PROFILE,""));
-	if (res == -1)
-	{
-		if (errno != EEXIST)
-		{
-			llwarns << "Couldn't create LL_PATH_MOZILLA_PROFILE dir " << getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"") << llendl;
-		}
-	}
-
 	mCAFile = getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem");
 }
 
diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp
index 4c376f11a5a0532d73f1815abf79286c2969acf4..4eb10c842be332ac35a0c3e235ad78f92e18bb0a 100644
--- a/indra/llvfs/lldir_win32.cpp
+++ b/indra/llvfs/lldir_win32.cpp
@@ -212,14 +212,6 @@ void LLDir_Win32::initAppDirs(const std::string &app_name,
 		}
 	}
 	
-	res = LLFile::mkdir(getExpandedFilename(LL_PATH_MOZILLA_PROFILE,""));
-	if (res == -1)
-	{
-		if (errno != EEXIST)
-		{
-			llwarns << "Couldn't create LL_PATH_MOZILLA_PROFILE dir " << getExpandedFilename(LL_PATH_MOZILLA_PROFILE,"") << llendl;
-		}
-	}
 	res = LLFile::mkdir(getExpandedFilename(LL_PATH_USER_SKIN,""));
 	if (res == -1)
 	{
diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index 25f4c8720a9353f617359da697acbbca3a0577c4..276ad39dfbac89c19559192f98f520c360ab67d8 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -76,6 +76,8 @@ class MediaPluginWebKit :
 
 private:
 
+	std::string mProfileDir;
+
 	enum
 	{
 		INIT_STATE_UNINITIALIZED,		// Browser instance hasn't been set up yet
@@ -187,7 +189,6 @@ class MediaPluginWebKit :
 #else
 		std::string component_dir = application_dir;
 #endif
-		std::string profileDir = application_dir + "/" + "browser_profile";		// cross platform?
 
 		// window handle - needed on Windows and must be app window.
 #if LL_WINDOWS
@@ -199,7 +200,7 @@ class MediaPluginWebKit :
 #endif
 
 		// main browser initialization
-		bool result = LLQtWebKit::getInstance()->init( application_dir, component_dir, profileDir, native_window_handle );
+		bool result = LLQtWebKit::getInstance()->init( application_dir, component_dir, mProfileDir, native_window_handle );
 		if ( result )
 		{
 			// create single browser window
@@ -587,6 +588,9 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
 		{
 			if(message_name == "init")
 			{
+				std::string user_data_path = message_in.getValue("user_data_path"); // n.b. always has trailing platform-specific dir-delimiter
+				mProfileDir = user_data_path + "browser_profile";
+
 				LLPluginMessage message("base", "init_response");
 				LLSD versions = LLSD::emptyMap();
 				versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 952de002720c509500fc818cdc6ba858402cdf51..ef8f63484ee73fc2b95647ef22b5213411efb5c4 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -988,11 +988,10 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
 	}
 	else
 	{
-		std::string plugins_path = gDirUtilp->getLLPluginDir();
-		plugins_path += gDirUtilp->getDirDelimiter();
-		
 		std::string launcher_name = gDirUtilp->getLLPluginLauncher();
 		std::string plugin_name = gDirUtilp->getLLPluginFilename(plugin_basename);
+		std::string user_data_path = gDirUtilp->getOSUserAppDir();
+		user_data_path += gDirUtilp->getDirDelimiter();
 
 		// See if the plugin executable exists
 		llstat s;
@@ -1008,7 +1007,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
 		{
 			LLPluginClassMedia* media_source = new LLPluginClassMedia(owner);
 			media_source->setSize(default_width, default_height);
-			if (media_source->init(launcher_name, plugin_name, gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins")))
+			if (media_source->init(launcher_name, plugin_name, gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins"), user_data_path))
 			{
 				return media_source;
 			}
diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp
index 27cb52a507fecef9d60a4a242f72381936a56547..c6df77f9a4c67f3cc4f49beac56f8d67f9a53893 100644
--- a/indra/test_apps/llplugintest/llmediaplugintest.cpp
+++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp
@@ -1529,7 +1529,17 @@ void LLMediaPluginTest::addMediaPanel( std::string url )
 #elif LL_WINDOWS
 	std::string launcher_name( "SLPlugin.exe" );
 #endif
-	media_source->init( launcher_name, plugin_name );
+
+	// for this test app, use the cwd as the user data path (ugh).
+        char cwd[ FILENAME_MAX ];
+	if (NULL == getcwd( cwd, FILENAME_MAX - 1 ))
+	{
+		std::cerr << "Couldn't get cwd - probably too long - failing to init." << llendl;
+		return;
+	}
+	std::string user_data_path = std::string( cwd ) + "/";
+
+	media_source->init( launcher_name, plugin_name, false, user_data_path );
 	media_source->setDisableTimeout(mDisableTimeout);
 
 	// make a new panel and save parameters