diff --git a/Control/CLIDComps/src/ClassIDSvc.cxx b/Control/CLIDComps/src/ClassIDSvc.cxx
index ad4796efdaa50188646478fd18605331d5a6d236..f95d037bca4d98b63e1289e644e8c52c9b2ddcca 100644
--- a/Control/CLIDComps/src/ClassIDSvc.cxx
+++ b/Control/CLIDComps/src/ClassIDSvc.cxx
@@ -32,6 +32,15 @@ namespace {
     boost::replace_all(s, string(";"), string());
   }
 
+  bool tryNumeric (const std::string& s, CLID& clid)
+  {
+    clid = CLID_NULL;
+    char* endptr = nullptr;
+    clid = strtol (s.c_str(), &endptr, 10);
+    return clid != CLID_NULL && endptr == (s.c_str() + s.size());
+  }
+  
+
 // HACK LIFTED FROM AthenaBaseComps/AthMsgStreamMacros.h to remove dep loop
 #define ATH_MSG_LVL(lvl, x) \
    do {                                      \
@@ -358,6 +367,10 @@ ClassIDSvc::getIDOfTypeNameInternal(const std::string& typeName, CLID& id) const
     ATH_CONST_MSG_VERBOSE( "getIDOfTypeName(" << typeName << ") CLID is " << id);
     sc = StatusCode::SUCCESS;
   }
+  else if (tryNumeric (typeName, id)) {
+    ATH_CONST_MSG_VERBOSE( "getIDOfTypeName(" << typeName << ") is a numeric CLID");
+    sc = StatusCode::SUCCESS;
+  }
   else {
     ATH_CONST_MSG_VERBOSE( "getIDOfTypeName(" << typeName << ") no associated CLID found " );
   }
diff --git a/Control/CLIDComps/test/ClassIDSvc_test.cxx b/Control/CLIDComps/test/ClassIDSvc_test.cxx
index 2f3205aba1ff33dbf2cc5a538a392fb04c324c9c..21e4a8729189504bb5f9fe92139f911a9aac9c22 100644
--- a/Control/CLIDComps/test/ClassIDSvc_test.cxx
+++ b/Control/CLIDComps/test/ClassIDSvc_test.cxx
@@ -105,6 +105,8 @@ void basic_test(ISvcLocator* pSvcLoc) {
   assert(pClassIDSvc->getIDOfTypeName("Blu", id).isSuccess());
   assert(id == 9943);
   assert(pClassIDSvc->getIDOfTypeName("NotExist", id).isFailure());
+  assert(pClassIDSvc->getIDOfTypeName("12345", id).isSuccess());
+  assert(id == 12345);
 
   assert(pClassIDSvc->isIDInUse(9942));
   //  assert(!pClassIDSvc->isIDInUse(9945));