diff --git a/FWCore/Integration/test/BuildFile.xml b/FWCore/Integration/test/BuildFile.xml
index d0b88cd5df008..b3e42d7ee356d 100644
--- a/FWCore/Integration/test/BuildFile.xml
+++ b/FWCore/Integration/test/BuildFile.xml
@@ -427,7 +427,15 @@
     <use name="boost"/>
     <use name="clhep"/>
   </library>
-
+  <library file="TestServicesOnNonFrameworkThreadsAnalyzer.cc" name = "TestServicesOnNonFrameworkThreadsAnalyzer">
+    <flags EDM_PLUGIN="1"/>
+    <use name="FWCore/Framework"/>
+    <use name="FWCore/ParameterSet"/>
+    <use name="FWCore/MessageLogger"/>
+    <use name="clhep"/>
+  </library>
+  <test name="TestFWCoreIntegrationModuleThread" command="cmsRun ${LOCALTOP}/src/FWCore/Integration/test/moduleThread_test_cfg.py"/>
+  
   <bin file="RandomIntProducer_t.cpp">
     <use name="FWCore/Framework"/>
     <use name="FWCore/ParameterSet"/>
diff --git a/FWCore/Integration/test/TestServicesOnNonFrameworkThreadsAnalyzer.cc b/FWCore/Integration/test/TestServicesOnNonFrameworkThreadsAnalyzer.cc
new file mode 100644
index 0000000000000..1084cea88ffcf
--- /dev/null
+++ b/FWCore/Integration/test/TestServicesOnNonFrameworkThreadsAnalyzer.cc
@@ -0,0 +1,119 @@
+#include "FWCore/Framework/interface/stream/EDAnalyzer.h"
+#include "FWCore/Framework/interface/MakerMacros.h"
+#include "FWCore/Framework/interface/Event.h"
+#include "FWCore/Framework/interface/ModuleContextSentry.h"
+#include "FWCore/ServiceRegistry/interface/ServiceRegistry.h"
+#include "FWCore/ServiceRegistry/interface/Service.h"
+
+#include "FWCore/Utilities/interface/RandomNumberGenerator.h"
+#include "FWCore/MessageLogger/interface/MessageLogger.h"
+#include "FWCore/MessageLogger/interface/edm_MessageLogger.h"
+#include <thread>
+#include <mutex>
+#include <condition_variable>
+#include <memory>
+#include <iostream>
+#include <exception>
+
+#include "CLHEP/Random/RandFlat.h"
+
+namespace edmtest {
+  class TestServicesOnNonFrameworkThreadsAnalyzer : public edm::stream::EDAnalyzer<> {
+  public:
+    TestServicesOnNonFrameworkThreadsAnalyzer(edm::ParameterSet const&);
+    ~TestServicesOnNonFrameworkThreadsAnalyzer() override;
+
+    void analyze(edm::Event const&, edm::EventSetup const&) final;
+
+  private:
+    void runOnOtherThread();
+    void shutdownThread();
+    std::unique_ptr<std::thread> m_thread;
+    std::mutex m_mutex;
+    std::condition_variable m_condVar;
+
+    bool m_managerThreadReady = false;
+    bool m_continueProcessing = false;
+    bool m_eventWorkDone = false;
+
+    //context info
+    edm::ModuleCallingContext const* m_moduleCallingContext = nullptr;
+    edm::ServiceToken* m_serviceToken = nullptr;
+    edm::StreamID m_streamID;
+    std::exception_ptr m_except;
+  };
+
+  TestServicesOnNonFrameworkThreadsAnalyzer::TestServicesOnNonFrameworkThreadsAnalyzer(edm::ParameterSet const&)
+      : m_streamID(edm::StreamID::invalidStreamID()) {
+    m_thread = std::make_unique<std::thread>([this]() { this->runOnOtherThread(); });
+
+    m_mutex.lock();
+    m_managerThreadReady = true;
+    m_continueProcessing = true;
+  }
+
+  TestServicesOnNonFrameworkThreadsAnalyzer::~TestServicesOnNonFrameworkThreadsAnalyzer() {
+    if (m_thread) {
+      shutdownThread();
+    }
+  }
+
+  void TestServicesOnNonFrameworkThreadsAnalyzer::analyze(edm::Event const& iEvent, edm::EventSetup const&) {
+    m_eventWorkDone = false;
+    m_moduleCallingContext = iEvent.moduleCallingContext();
+    edm::ServiceToken token = edm::ServiceRegistry::instance().presentToken();
+    m_serviceToken = &token;
+    m_streamID = iEvent.streamID();
+    { edm::LogSystem("FrameworkThread") << "new Event"; }
+    m_mutex.unlock();
+    {
+      std::unique_lock<std::mutex> lk(m_mutex);
+      m_condVar.notify_one();
+      m_condVar.wait(lk, [this] { return this->m_eventWorkDone; });
+      lk.release();
+    }
+    edm::LogSystem("FrameworkThread") << " done";
+    m_managerThreadReady = true;
+    if (m_except) {
+      std::rethrow_exception(m_except);
+    }
+  }
+
+  void TestServicesOnNonFrameworkThreadsAnalyzer::runOnOtherThread() {
+    std::unique_lock<std::mutex> lk(m_mutex);
+
+    do {
+      m_condVar.wait(lk, [this] { return m_managerThreadReady; });
+      if (m_continueProcessing) {
+        edm::ModuleCallingContext newContext(*m_moduleCallingContext);
+        edm::ModuleContextSentry sentry(&newContext, m_moduleCallingContext->parent());
+
+        edm::ServiceRegistry::Operate srSentry(*m_serviceToken);
+        try {
+          edm::Service<edm::RandomNumberGenerator> rng;
+          edm::Service<edm::MessageLogger> ml;
+          ml->setThreadContext(*m_moduleCallingContext);
+          edm::LogSystem("ModuleThread") << "  ++running with rng "
+                                         << CLHEP::RandFlat::shootInt(&rng->getEngine(m_streamID), 10);
+        } catch (...) {
+          m_except = std::current_exception();
+        }
+      }
+      m_eventWorkDone = true;
+      m_managerThreadReady = false;
+      lk.unlock();
+      m_condVar.notify_one();
+      lk.lock();
+    } while (m_continueProcessing);
+  }
+
+  void TestServicesOnNonFrameworkThreadsAnalyzer::shutdownThread() {
+    m_continueProcessing = false;
+    m_mutex.unlock();
+    m_condVar.notify_one();
+    m_thread->join();
+  }
+
+}  // namespace edmtest
+
+DEFINE_FWK_MODULE(edmtest::TestServicesOnNonFrameworkThreadsAnalyzer);
diff --git a/FWCore/Integration/test/moduleThread_test_cfg.py b/FWCore/Integration/test/moduleThread_test_cfg.py
new file mode 100644
index 0000000000000..7404c8d2f9dfe
--- /dev/null
+++ b/FWCore/Integration/test/moduleThread_test_cfg.py
@@ -0,0 +1,15 @@
+import FWCore.ParameterSet.Config as cms
+
+process = cms.Process("Test")
+
+process.source = cms.Source("EmptySource")
+
+process.maxEvents.input = 10
+
+process.test = cms.EDAnalyzer("edmtest::TestServicesOnNonFrameworkThreadsAnalyzer")
+
+process.p = cms.EndPath(process.test)
+
+process.add_(cms.Service("RandomNumberGeneratorService",
+                         test = cms.PSet(initialSeed = cms.untracked.uint32(12345))
+))
diff --git a/FWCore/MessageLogger/interface/edm_MessageLogger.h b/FWCore/MessageLogger/interface/edm_MessageLogger.h
new file mode 100644
index 0000000000000..225dafd2cb4d4
--- /dev/null
+++ b/FWCore/MessageLogger/interface/edm_MessageLogger.h
@@ -0,0 +1,41 @@
+#ifndef FWCore_MessageService_MessageLogger_h
+#define FWCore_MessageService_MessageLogger_h
+
+// -*- C++ -*-
+//
+// Package:     MessageService
+// Class  :     MessageLogger
+//
+/**\class edm::MessageLogger MessageLogger.h FWCore/MessageService/plugins/MessageLogger.h
+
+ Description: Abstract interface for MessageLogger Service
+
+ Usage:
+    <usage>
+
+*/
+//
+
+// system include files
+
+// user include files
+
+// forward declarations
+
+namespace edm {
+  class ModuleCallingContext;
+
+  class MessageLogger {
+  public:
+    virtual ~MessageLogger();
+
+    virtual void setThreadContext(ModuleCallingContext const&) = 0;
+
+  protected:
+    MessageLogger() = default;
+
+  };  // MessageLogger
+
+}  // namespace edm
+
+#endif  // FWCore_MessageService_MessageLogger_h
diff --git a/FWCore/MessageLogger/src/edm_MessageLogger.cc b/FWCore/MessageLogger/src/edm_MessageLogger.cc
new file mode 100644
index 0000000000000..544216a0a477b
--- /dev/null
+++ b/FWCore/MessageLogger/src/edm_MessageLogger.cc
@@ -0,0 +1,10 @@
+//
+//  MessageLogger.cc
+//  CMSSW
+//
+//  Created by Chris Jones on 6/10/21.
+//
+
+#include "FWCore/MessageLogger/interface/edm_MessageLogger.h"
+
+edm::MessageLogger::~MessageLogger() = default;
diff --git a/FWCore/MessageService/BuildFile.xml b/FWCore/MessageService/BuildFile.xml
index 775661fe8762f..d8c57c11ec52d 100644
--- a/FWCore/MessageService/BuildFile.xml
+++ b/FWCore/MessageService/BuildFile.xml
@@ -1,7 +1,5 @@
-<use name="DataFormats/Provenance"/>
 <use name="FWCore/MessageLogger"/>
 <use name="FWCore/ParameterSet"/>
-<use name="FWCore/ServiceRegistry"/>
 <use name="FWCore/Utilities"/>
 <use name="tbb"/>
 <export>
diff --git a/FWCore/MessageService/plugins/BuildFile.xml b/FWCore/MessageService/plugins/BuildFile.xml
index 098d7cf5372f8..9d460cd3bbb41 100644
--- a/FWCore/MessageService/plugins/BuildFile.xml
+++ b/FWCore/MessageService/plugins/BuildFile.xml
@@ -1,4 +1,6 @@
 <library file="*.cc" name="FWCoreMessageServicePlugins">
   <flags EDM_PLUGIN="1"/>
   <use name="FWCore/MessageService"/>
+  <use name="FWCore/ServiceRegistry"/>
+  <use name="DataFormats/Provenance"/>
 </library>
diff --git a/FWCore/MessageService/src/MessageLogger.cc b/FWCore/MessageService/plugins/MessageLogger.cc
similarity index 96%
rename from FWCore/MessageService/src/MessageLogger.cc
rename to FWCore/MessageService/plugins/MessageLogger.cc
index 72148b8e3438f..b6057ac5665cf 100644
--- a/FWCore/MessageService/src/MessageLogger.cc
+++ b/FWCore/MessageService/plugins/MessageLogger.cc
@@ -15,8 +15,8 @@
 
 #include "FWCore/ParameterSet/interface/ParameterSet.h"
 
-#include "FWCore/MessageService/interface/MessageLogger.h"
-#include "FWCore/MessageService/src/MessageServicePSetValidation.h"
+#include "MessageLogger.h"
+#include "MessageServicePSetValidation.h"
 
 #include "FWCore/MessageLogger/interface/MessageLoggerQ.h"
 #include "FWCore/MessageLogger/interface/MessageDrop.h"
@@ -325,6 +325,29 @@ namespace edm {
       nonModule_errorEnabled = messageDrop->errorEnabled;
     }  // ctor
 
+    void MessageLogger::setThreadContext(ModuleCallingContext const& iModContext) {
+      //need to know if we are in a global or stream context
+      auto top = iModContext.getTopModuleCallingContext();
+      assert(nullptr != top);
+      if (ParentContext::Type::kGlobal == top->type()) {
+        auto globalContext = iModContext.getGlobalContext();
+        auto tran = globalContext->transition();
+        if (tran == GlobalContext::Transition::kBeginLuminosityBlock or
+            tran == GlobalContext::Transition::kEndLuminosityBlock) {
+          establishModule(lumiInfoBegin_ + globalContext->luminosityBlockIndex(),
+                          iModContext,
+                          s_globalTransitionNames[static_cast<int>(tran)]);
+        } else {
+          establishModule(
+              runInfoBegin_ + globalContext->runIndex(), iModContext, s_globalTransitionNames[static_cast<int>(tran)]);
+        }
+      } else {
+        auto stream = iModContext.getStreamContext();
+        establishModule(
+            stream->streamID().value(), iModContext, s_streamTransitionNames[static_cast<int>(stream->transition())]);
+      }
+    }
+
     //
     // Shared helper routines for establishing module name and enabling behavior
     //
@@ -867,14 +890,14 @@ namespace edm {
     }
 
     void MessageLogger::postEndJob() {
-      SummarizeInJobReport();    // Put summary info into Job Rep  // change log 10
+      summarizeInJobReport();    // Put summary info into Job Rep  // change log 10
       MessageLoggerQ::MLqSUM();  // trigger summary info.		// change log 9
     }
 
     void MessageLogger::jobFailure() {
       MessageDrop* messageDrop = MessageDrop::instance();
       messageDrop->setSinglet("jobFailure");
-      SummarizeInJobReport();    // Put summary info into Job Rep  // change log 10
+      summarizeInJobReport();    // Put summary info into Job Rep  // change log 10
       MessageLoggerQ::MLqSUM();  // trigger summary info.		// change log 9
     }
 
@@ -882,7 +905,7 @@ namespace edm {
     // Other methods
     //
 
-    void MessageLogger::SummarizeInJobReport() {
+    void MessageLogger::summarizeInJobReport() {
       if (fjrSummaryRequested_) {
         std::map<std::string, double>* smp = new std::map<std::string, double>();
         MessageLoggerQ::MLqJRS(smp);
diff --git a/FWCore/MessageService/interface/MessageLogger.h b/FWCore/MessageService/plugins/MessageLogger.h
similarity index 93%
rename from FWCore/MessageService/interface/MessageLogger.h
rename to FWCore/MessageService/plugins/MessageLogger.h
index d90822251a937..f4cc573f66b28 100644
--- a/FWCore/MessageService/interface/MessageLogger.h
+++ b/FWCore/MessageService/plugins/MessageLogger.h
@@ -1,12 +1,12 @@
-#ifndef FWCore_MessageService_MessageLogger_h
-#define FWCore_MessageService_MessageLogger_h
+#ifndef FWCore_MessageService_plugins_MessageLogger_h
+#define FWCore_MessageService_plugins_MessageLogger_h
 
 // -*- C++ -*-
 //
-// Package:     Services
+// Package:     MessageService
 // Class  :     MessageLogger
 //
-/**\class MessageLogger MessageLogger.h FWCore/MessageService/interface/MessageLogger.h
+/**\class edm::service::MessageLogger MessageLogger.h FWCore/MessageService/plugins/MessageLogger.h
 
  Description: <one line class summary>
 
@@ -33,7 +33,7 @@
 
 #include "DataFormats/Provenance/interface/EventID.h"
 #include "FWCore/MessageLogger/interface/ELseverityLevel.h"
-#include "FWCore/MessageLogger/interface/ErrorObj.h"
+#include "FWCore/MessageLogger/interface/edm_MessageLogger.h"
 #include "FWCore/ServiceRegistry/interface/ActivityRegistry.h"
 #include "FWCore/Utilities/interface/thread_safety_macros.h"
 
@@ -44,18 +44,15 @@ namespace edm {
   class ParameterSet;
   namespace service {
 
-    class MessageLogger {
+    class MessageLogger : public edm::MessageLogger {
     public:
       MessageLogger(ParameterSet const&, ActivityRegistry&);
 
-      void fillErrorObj(edm::ErrorObj& obj) const;
-      bool debugEnabled() const { return debugEnabled_; }
-
-      static bool anyDebugEnabled() { return anyDebugEnabled_; }
-
-      static void SummarizeInJobReport();
+      void setThreadContext(ModuleCallingContext const&) final;
 
     private:
+      static void summarizeInJobReport();
+
       void postBeginJob();
       void preEndJob();
       void postEndJob();
@@ -193,4 +190,4 @@ namespace edm {
 
 }  // namespace edm
 
-#endif  // FWCore_MessageService_MessageLogger_h
+#endif  // FWCore_MessageService_plugins_MessageLogger_h
diff --git a/FWCore/MessageService/src/MessageServicePSetValidation.cc b/FWCore/MessageService/plugins/MessageServicePSetValidation.cc
similarity index 99%
rename from FWCore/MessageService/src/MessageServicePSetValidation.cc
rename to FWCore/MessageService/plugins/MessageServicePSetValidation.cc
index 823aa76330833..9e6e3b229ea78 100644
--- a/FWCore/MessageService/src/MessageServicePSetValidation.cc
+++ b/FWCore/MessageService/plugins/MessageServicePSetValidation.cc
@@ -17,7 +17,7 @@
 
 // user include files
 
-#include "FWCore/MessageService/src/MessageServicePSetValidation.h"
+#include "MessageServicePSetValidation.h"
 
 using namespace edm;
 using namespace edm::service;
diff --git a/FWCore/MessageService/src/MessageServicePSetValidation.h b/FWCore/MessageService/plugins/MessageServicePSetValidation.h
similarity index 100%
rename from FWCore/MessageService/src/MessageServicePSetValidation.h
rename to FWCore/MessageService/plugins/MessageServicePSetValidation.h
diff --git a/FWCore/MessageService/plugins/Module.cc b/FWCore/MessageService/plugins/Module.cc
index b87b8de1184ec..122c677679be4 100644
--- a/FWCore/MessageService/plugins/Module.cc
+++ b/FWCore/MessageService/plugins/Module.cc
@@ -1,11 +1,14 @@
 #include "FWCore/PluginManager/interface/PresenceMacros.h"
-#include "FWCore/MessageService/interface/MessageLogger.h"
+#include "MessageLogger.h"
 #include "FWCore/MessageService/interface/SingleThreadMSPresence.h"
 #include "FWCore/ServiceRegistry/interface/ServiceMaker.h"
 
 #pragma GCC visibility push(hidden)
 using edm::service::MessageLogger;
 using edm::service::SingleThreadMSPresence;
-DEFINE_FWK_SERVICE(MessageLogger);
+
+using MessageLoggerMaker = edm::serviceregistry::AllArgsMaker<edm::MessageLogger, MessageLogger>;
+DEFINE_FWK_SERVICE_MAKER(MessageLogger, MessageLoggerMaker);
+
 DEFINE_FWK_PRESENCE(SingleThreadMSPresence);
 #pragma GCC visibility pop
diff --git a/HLTrigger/special/plugins/HLTCountNumberOfObject.h b/HLTrigger/special/plugins/HLTCountNumberOfObject.h
index e56ea0b75e94f..535ef62f96968 100644
--- a/HLTrigger/special/plugins/HLTCountNumberOfObject.h
+++ b/HLTrigger/special/plugins/HLTCountNumberOfObject.h
@@ -17,8 +17,6 @@
 
 #include "FWCore/ParameterSet/interface/ParameterSet.h"
 
-#include "FWCore/MessageService/interface/MessageLogger.h"
-
 #include "HLTrigger/HLTcore/interface/HLTFilter.h"
 #include "DataFormats/HLTReco/interface/TriggerFilterObjectWithRefs.h"
 #include "HLTrigger/HLTcore/interface/defaultModuleLabel.h"
diff --git a/HLTrigger/special/plugins/HLTTrackWithHits.h b/HLTrigger/special/plugins/HLTTrackWithHits.h
index 8344d0a70f317..4d1edb120d65b 100644
--- a/HLTrigger/special/plugins/HLTTrackWithHits.h
+++ b/HLTrigger/special/plugins/HLTTrackWithHits.h
@@ -17,8 +17,6 @@
 
 #include "FWCore/ParameterSet/interface/ParameterSet.h"
 
-#include "FWCore/MessageService/interface/MessageLogger.h"
-
 #include "HLTrigger/HLTcore/interface/HLTFilter.h"
 #include "DataFormats/HLTReco/interface/TriggerFilterObjectWithRefs.h"
 #include "DataFormats/TrackReco/interface/Track.h"
diff --git a/L1Trigger/TrackFindingTMTT/plugins/TMTrackProducer.cc b/L1Trigger/TrackFindingTMTT/plugins/TMTrackProducer.cc
index 95515b3594aef..e47691281030c 100644
--- a/L1Trigger/TrackFindingTMTT/plugins/TMTrackProducer.cc
+++ b/L1Trigger/TrackFindingTMTT/plugins/TMTrackProducer.cc
@@ -13,7 +13,6 @@
 #include "L1Trigger/TrackFindingTMTT/interface/Array2D.h"
 #include "L1Trigger/TrackFindingTMTT/interface/PrintL1trk.h"
 
-#include "FWCore/MessageService/interface/MessageLogger.h"
 #include "FWCore/Framework/interface/ESHandle.h"
 
 #include <iostream>
diff --git a/MuonAnalysis/MuonAssociators/plugins/TriggerMatcherToHLTDebug.cc b/MuonAnalysis/MuonAssociators/plugins/TriggerMatcherToHLTDebug.cc
index cd9c584cd38b9..a4da0f6908154 100644
--- a/MuonAnalysis/MuonAssociators/plugins/TriggerMatcherToHLTDebug.cc
+++ b/MuonAnalysis/MuonAssociators/plugins/TriggerMatcherToHLTDebug.cc
@@ -54,7 +54,6 @@
 #include "FWCore/Framework/interface/Event.h"
 #include "FWCore/Framework/interface/MakerMacros.h"
 #include "FWCore/Common/interface/TriggerNames.h"
-#include "FWCore/MessageService/interface/MessageLogger.h"
 #include "FWCore/Utilities/interface/InputTag.h"
 #include "FWCore/ParameterSet/interface/ParameterSet.h"