Index: programs/mythbackend/mainserver.h
===================================================================
--- programs/mythbackend/mainserver.h	(revision 21527)
+++ programs/mythbackend/mainserver.h	(working copy)
@@ -193,7 +193,7 @@
     vector<PlaybackSock *> playbackList;
     vector<FileTransfer *> fileTransferList;
 
-    QTimer *masterServerReconnect;
+    QTimer *masterServerReconnect; // audited ref #5318
     PlaybackSock *masterServer;
     
     bool ismaster;
@@ -225,6 +225,8 @@
     static QMutex truncate_and_close_lock;
 
     int m_exitCode;
+
+    static const uint kMasterServerReconnectTimeout;
 };
 
 #endif
Index: programs/mythbackend/mainserver.cpp
===================================================================
--- programs/mythbackend/mainserver.cpp	(revision 21527)
+++ programs/mythbackend/mainserver.cpp	(working copy)
@@ -109,6 +109,7 @@
 };
 
 QMutex MainServer::truncate_and_close_lock;
+const uint MainServer::kMasterServerReconnectTimeout = 1000; //ms
 
 class ProcessRequestThread : public QThread
 {
@@ -207,7 +208,7 @@
         masterServerReconnect->setSingleShot(true);
         connect(masterServerReconnect, SIGNAL(timeout()), this,
                 SLOT(reconnectTimeout()));
-        masterServerReconnect->start(1000);
+        masterServerReconnect->start(kMasterServerReconnectTimeout);
     }
 
     deferredDeleteTimer = new QTimer(this);
@@ -844,6 +845,12 @@
         if (me->Message().left(6) == "LOCAL_")
             return;
 
+        if (me->Message() == "RECONNECT_TO_MASTER")
+        {
+            VERBOSE(VB_IMPORTANT, "Got RECONNECT_TO_MASTER message");
+            masterServerReconnect->start(kMasterServerReconnectTimeout);
+        }
+
         broadcast = QStringList( "BACKEND_MESSAGE" );
         broadcast << me->Message();
         broadcast += me->ExtraDataList();
@@ -4596,7 +4603,9 @@
             sockListLock.unlock();
             masterServer->DownRef();
             masterServer = NULL;
-            masterServerReconnect->start(1000);
+            VERBOSE(VB_IMPORTANT, "Sending RECONNECT_TO_MASTER message");
+            MythEvent me("RECONNECT_TO_MASTER");
+            gContext->dispatch(me);
             return;
         }
         else if (sock == socket)
@@ -4966,7 +4975,7 @@
     if (!masterServerSock->connect(server, port))
     {
         VERBOSE(VB_IMPORTANT, "Connection to master server timed out.");
-        masterServerReconnect->start(1000);
+        masterServerReconnect->start(kMasterServerReconnectTimeout);
         masterServerSock->DownRef();
         return;
     }
@@ -4974,7 +4983,7 @@
     if (masterServerSock->state() != MythSocket::Connected)
     {
         VERBOSE(VB_IMPORTANT, "Could not connect to master server.");
-        masterServerReconnect->start(1000);
+        masterServerReconnect->start(kMasterServerReconnectTimeout);
         masterServerSock->DownRef();
         return;
     }
@@ -5007,9 +5016,9 @@
         }
     }
 
-    masterServerSock->writeStringList(strlist);
-    masterServerSock->readStringList(strlist);
-    if (strlist.empty() || strlist[0] == "ERROR")
+    if (!masterServerSock->writeStringList(strlist) ||
+        !masterServerSock->readStringList(strlist) ||
+        strlist.empty() || strlist[0] == "ERROR")
     {
         masterServerSock->DownRef();
         masterServerSock->Unlock();
@@ -5027,7 +5036,7 @@
                      QString(", error was %1").arg(strlist[1]) :
                      QString(", remote error")));
         }
-        masterServerReconnect->start(1000);
+        masterServerReconnect->start(kMasterServerReconnectTimeout);
         return;
     }
 
