diff --git a/indra/llcommon/llprocess.cpp b/indra/llcommon/llprocess.cpp
index 9667e4e03360594aca8b2a21d5bb6ae6c72cd079..715df36f399ab3ba77d5dc9a038ea93bb037800b 100644
--- a/indra/llcommon/llprocess.cpp
+++ b/indra/llcommon/llprocess.cpp
@@ -819,16 +819,43 @@ bool LLProcess::kill(const std::string& who)
 	return ! isRunning();
 }
 
+//static
+bool LLProcess::kill(const LLProcessPtr& p, const std::string& who)
+{
+	if (! p)
+		return true;                // process dead! (was never running)
+	return p->kill(who);
+}
+
 bool LLProcess::isRunning() const
 {
 	return getStatus().mState == RUNNING;
 }
 
+//static
+bool LLProcess::isRunning(const LLProcessPtr& p)
+{
+	if (! p)
+		return false;
+	return p->isRunning();
+}
+
 LLProcess::Status LLProcess::getStatus() const
 {
 	return mStatus;
 }
 
+//static
+LLProcess::Status LLProcess::getStatus(const LLProcessPtr& p)
+{
+	if (! p)
+	{
+		// default-constructed Status has mState == UNSTARTED
+		return Status();
+	}
+	return p->getStatus();
+}
+
 std::string LLProcess::getStatusString() const
 {
 	return getStatusString(getStatus());
@@ -839,6 +866,17 @@ std::string LLProcess::getStatusString(const Status& status) const
 	return getStatusString(mDesc, status);
 }
 
+//static
+std::string LLProcess::getStatusString(const std::string& desc, const LLProcessPtr& p)
+{
+	if (! p)
+	{
+		// default-constructed Status has mState == UNSTARTED
+		return getStatusString(desc, Status());
+	}
+	return desc + " " + p->getStatusString();
+}
+
 //static
 std::string LLProcess::getStatusString(const std::string& desc, const Status& status)
 {
diff --git a/indra/llcommon/llprocess.h b/indra/llcommon/llprocess.h
index 51010966f9d7dd48001606624b1a57fa6ac27e86..d711ce2f743c98c18b1727937710b2e46d622163 100644
--- a/indra/llcommon/llprocess.h
+++ b/indra/llcommon/llprocess.h
@@ -239,6 +239,10 @@ class LL_COMMON_API LLProcess: public boost::noncopyable
 
 	/// Is child process still running?
 	bool isRunning() const;
+	// static isRunning(LLProcessPtr), getStatus(LLProcessPtr),
+	// getStatusString(LLProcessPtr), kill(LLProcessPtr) handle the case in
+	// which the passed LLProcessPtr might be NULL (default-constructed).
+	static bool isRunning(const LLProcessPtr&);
 
 	/**
 	 * State of child process
@@ -272,8 +276,10 @@ class LL_COMMON_API LLProcess: public boost::noncopyable
 
 	/// Status query
 	Status getStatus() const;
+	static Status getStatus(const LLProcessPtr&);
 	/// English Status string query, for logging etc.
 	std::string getStatusString() const;
+	static std::string getStatusString(const std::string& desc, const LLProcessPtr&);
 	/// English Status string query for previously-captured Status
 	std::string getStatusString(const Status& status) const;
 	/// static English Status string query
@@ -282,6 +288,7 @@ class LL_COMMON_API LLProcess: public boost::noncopyable
 	// Attempt to kill the process -- returns true if the process is no longer running when it returns.
 	// Note that even if this returns false, the process may exit some time after it's called.
 	bool kill(const std::string& who="");
+	static bool kill(const LLProcessPtr& p, const std::string& who="");
 
 #if LL_WINDOWS
 	typedef int id;                 ///< as returned by getProcessID()
@@ -314,10 +321,10 @@ class LL_COMMON_API LLProcess: public boost::noncopyable
 	 * New functionality should be added as nonstatic members operating on
 	 * the same data as getProcessHandle().
 	 *
-	 * In particular, if child termination is detected by static isRunning()
+	 * In particular, if child termination is detected by this static isRunning()
 	 * rather than by nonstatic isRunning(), the LLProcess object won't be
 	 * aware of the child's changed status and may encounter OS errors trying
-	 * to obtain it. static isRunning() is only intended for after the
+	 * to obtain it. This static isRunning() is only intended for after the
 	 * launching LLProcess object has been destroyed.
 	 */
 	static handle isRunning(handle, const std::string& desc="");
diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index f10eaee5b48041d0f3ee66461259875846d6b3be..71a6145b581b519fd02e70a8fb3c58be04a07653 100644
--- a/indra/llplugin/llpluginprocessparent.cpp
+++ b/indra/llplugin/llpluginprocessparent.cpp
@@ -134,11 +134,8 @@ LLPluginProcessParent::~LLPluginProcessParent()
 		// and remove it from our map
 		mSharedMemoryRegions.erase(iter);
 	}
-	
-	if (mProcess)
-	{
-		mProcess->kill();
-	}
+
+	LLProcess::kill(mProcess);
 	killSockets();
 }
 
@@ -471,7 +468,7 @@ void LLPluginProcessParent::idle(void)
 			break;
 			
 			case STATE_EXITING:
-				if (! mProcess->isRunning())
+				if (! LLProcess::isRunning(mProcess))
 				{
 					setState(STATE_CLEANUP);
 				}
@@ -499,7 +496,7 @@ void LLPluginProcessParent::idle(void)
 			break;
 			
 			case STATE_CLEANUP:
-				mProcess->kill();
+				LLProcess::kill(mProcess);
 				killSockets();
 				setState(STATE_DONE);
 			break;
@@ -1078,7 +1075,7 @@ bool LLPluginProcessParent::pluginLockedUpOrQuit()
 {
 	bool result = false;
 	
-	if (! mProcess->isRunning())
+	if (! LLProcess::isRunning(mProcess))
 	{
 		LL_WARNS("Plugin") << "child exited" << LL_ENDL;
 		result = true;