diff --git a/indra/llfilesystem/lldiskcache.cpp b/indra/llfilesystem/lldiskcache.cpp
index 02678864b98835211e64dc6b31348d3f4d48a0b6..68423cc4f8749b86c2362e37b28f035019310e90 100644
--- a/indra/llfilesystem/lldiskcache.cpp
+++ b/indra/llfilesystem/lldiskcache.cpp
@@ -335,3 +335,25 @@ uintmax_t LLDiskCache::dirFileSize(const std::string dir)
 
     return total_file_size;
 }
+
+LLPurgeDiskCacheThread::LLPurgeDiskCacheThread() :
+    LLThread("PurgeDiskCacheThread", nullptr)
+{
+}
+
+void LLPurgeDiskCacheThread::run()
+{
+    constexpr F64 CHECK_INTERVAL = 60;
+    mTimer.setTimerExpirySec(CHECK_INTERVAL);
+    mTimer.start();
+
+    do
+    {
+        if (mTimer.checkExpirationAndReset(CHECK_INTERVAL))
+        {
+            LLDiskCache::instance().purge();
+        }
+
+        ms_sleep(100);
+    } while (!isQuitting());
+}
\ No newline at end of file
diff --git a/indra/llfilesystem/lldiskcache.h b/indra/llfilesystem/lldiskcache.h
index c19714434a9ce616c260f6b1104b4328f4bd8450..867a80f33272fc1d7125f718bfa62217fac89c38 100644
--- a/indra/llfilesystem/lldiskcache.h
+++ b/indra/llfilesystem/lldiskcache.h
@@ -180,4 +180,15 @@ class LLDiskCache :
         bool mEnableCacheDebugInfo;
 };
 
+class LLPurgeDiskCacheThread : public LLThread
+{
+public:
+    LLPurgeDiskCacheThread();
+
+protected:
+    void run() override;
+
+private:
+    LLTimer mTimer;
+};
 #endif // _LLDISKCACHE
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index cbd33e9244d5ff56e11138cc9fe26f59f8049d0d..0cae9cd9cc1978c285c591956b51b39c36e8f54f 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -1362,7 +1362,7 @@
       <key>Value</key>
       <integer>23</integer>
     </map>
-    <key>EnableCacheDebugInfo</key>
+    <key>EnableDiskCacheDebugInfo</key>
     <map>
       <key>Comment</key>
       <string>When set, display additional cache debugging information</string>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index c519e55fc343c2350ae024639a045c4bf09f671a..fd094b12d7ce2cb217485a3bc5dfa186c5196632 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -655,6 +655,7 @@ LLAppViewer* LLAppViewer::sInstance = NULL;
 LLTextureCache* LLAppViewer::sTextureCache = NULL;
 LLImageDecodeThread* LLAppViewer::sImageDecodeThread = NULL;
 LLTextureFetch* LLAppViewer::sTextureFetch = NULL;
+LLPurgeDiskCacheThread* LLAppViewer::sPurgeDiskCacheThread = NULL;
 
 std::string getRuntime()
 {
@@ -2032,6 +2033,7 @@ bool LLAppViewer::cleanup()
 	sTextureFetch->shutdown();
 	sTextureCache->shutdown();
 	sImageDecodeThread->shutdown();
+	sPurgeDiskCacheThread->shutdown();
 
 	sTextureFetch->shutDownTextureCacheThread() ;
 	sTextureFetch->shutDownImageDecodeThread() ;
@@ -2054,6 +2056,8 @@ bool LLAppViewer::cleanup()
     sImageDecodeThread = NULL;
 	delete mFastTimerLogThread;
 	mFastTimerLogThread = NULL;
+	delete sPurgeDiskCacheThread;
+	sPurgeDiskCacheThread = NULL;
 
 	if (LLFastTimerView::sAnalyzePerformance)
 	{
@@ -2174,6 +2178,7 @@ bool LLAppViewer::initThreads()
 													sImageDecodeThread,
 													enable_threads && true,
 													app_metrics_qa_mode);
+	LLAppViewer::sPurgeDiskCacheThread = new LLPurgeDiskCacheThread();
 
 	if (LLTrace::BlockTimer::sLog || LLTrace::BlockTimer::sMetricLog)
 	{
@@ -4210,6 +4215,7 @@ bool LLAppViewer::initCache()
 			LLDiskCache::getInstance()->purge();
 		}
 	}
+	LLAppViewer::getPurgeDiskCacheThread()->start();
 
 	LLSplashScreen::update(LLTrans::getString("StartupInitializingTextureCache"));
 
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 5e24398caac6c22fff07d63377057bac79cf7be0..00d694304760d39bb4bb6dd3bae9bf5ad87c4beb 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -58,6 +58,7 @@ class LLImageDecodeThread;
 class LLTextureFetch;
 class LLWatchdogTimeout;
 class LLViewerJoystick;
+class LLPurgeDiskCacheThread;
 
 extern LLTrace::BlockTimerStatHandle FTM_FRAME;
 
@@ -117,6 +118,7 @@ class LLAppViewer : public LLApp
 	static LLTextureCache* getTextureCache() { return sTextureCache; }
 	static LLImageDecodeThread* getImageDecodeThread() { return sImageDecodeThread; }
 	static LLTextureFetch* getTextureFetch() { return sTextureFetch; }
+	static LLPurgeDiskCacheThread* getPurgeDiskCacheThread() { return sPurgeDiskCacheThread; }
 
 	static U32 getTextureCacheVersion() ;
 	static U32 getObjectCacheVersion() ;
@@ -284,6 +286,7 @@ class LLAppViewer : public LLApp
 	static LLTextureCache* sTextureCache; 
 	static LLImageDecodeThread* sImageDecodeThread; 
 	static LLTextureFetch* sTextureFetch;
+	static LLPurgeDiskCacheThread* sPurgeDiskCacheThread;
 
 	S32 mNumSessions;