diff --git a/indra/viewer_components/updater/llupdaterservice.cpp b/indra/viewer_components/updater/llupdaterservice.cpp
index 1665e41e7029546e6b4281807adb6a8d9ad7d731..df021948c347668c948ab9fce08daf8ff386fa11 100644
--- a/indra/viewer_components/updater/llupdaterservice.cpp
+++ b/indra/viewer_components/updater/llupdaterservice.cpp
@@ -158,7 +158,8 @@ class LLUpdaterServiceImpl :
 private:
 	std::string mNewChannel;
 	std::string mNewVersion;
-	
+	LLTempBoundListener mMainLoopConnection;
+
 	void restartTimer(unsigned int seconds);
 	void setState(LLUpdaterService::eUpdaterState state);
 	void stopTimer();
@@ -179,7 +180,8 @@ LLUpdaterServiceImpl::LLUpdaterServiceImpl() :
 LLUpdaterServiceImpl::~LLUpdaterServiceImpl()
 {
 	LL_INFOS("UpdaterService") << "shutting down updater service" << LL_ENDL;
-	LLEventPumps::instance().obtain("mainloop").stopListening(sListenerName);
+	// Destroying an LLTempBoundListener implicitly disconnects. That's its
+	// whole purpose.
 }
 
 void LLUpdaterServiceImpl::initialize(const std::string&  channel,
@@ -560,7 +562,7 @@ void LLUpdaterServiceImpl::restartTimer(unsigned int seconds)
 	seconds << " seconds" << LL_ENDL; 
 	mTimer.start();
 	mTimer.setTimerExpirySec((F32)seconds);
-	LLEventPumps::instance().obtain("mainloop").listen(
+	mMainLoopConnection = LLEventPumps::instance().obtain("mainloop").listen(
 		sListenerName, boost::bind(&LLUpdaterServiceImpl::onMainLoop, this, _1));
 }
 
@@ -589,7 +591,7 @@ void LLUpdaterServiceImpl::setState(LLUpdaterService::eUpdaterState state)
 void LLUpdaterServiceImpl::stopTimer()
 {
 	mTimer.stop();
-	LLEventPumps::instance().obtain("mainloop").stopListening(sListenerName);
+	mMainLoopConnection.disconnect();
 }
 
 bool LLUpdaterServiceImpl::onMainLoop(LLSD const & event)