diff --git a/bin/config-validator.js b/bin/config-validator.js
index 483315ddf269233b4c87010e4c90aab471d7df6d..8782a2e58f6b9a979188d8a4e0caf76d7c5f0af1 100755
--- a/bin/config-validator.js
+++ b/bin/config-validator.js
@@ -77,10 +77,6 @@ async function validate(desc, config, isPreset = false) {
   } catch (err) {
     // ignore
   }
-  // istanbul ignore if
-  if (global.renovateTimers) {
-    global.renovateTimers.forEach(timer => clearTimeout(timer));
-  }
   if (returnVal !== 0) {
     process.exit(returnVal);
   }
diff --git a/lib/manager/travis/package.js b/lib/manager/travis/package.js
index be01696fc361062b14a992c9dd1f4c74d88d0baf..0bdcc65991fcdb594d369856524d2a11d419e8da 100644
--- a/lib/manager/travis/package.js
+++ b/lib/manager/travis/package.js
@@ -9,6 +9,7 @@ module.exports = {
 };
 
 let policies;
+let refreshDate;
 
 function generatePolicies() {
   policies = {
@@ -41,32 +42,32 @@ function generatePolicies() {
   policies.lts_latest.push(policies.lts[policies.lts.length - 1]);
 }
 
-const initTime = new Date();
-for (const data of Object.values(nodeJsSchedule)) {
-  const fields = ['start', 'lts', 'maintenance', 'end'];
-  for (const field of fields) {
-    const fieldDate = new Date(data[field]);
-    if (fieldDate > initTime) {
-      const offsetmilliseconds = 1 + fieldDate.getTime() - initTime.getTime();
-      // istanbul ignore if
-      if (offsetmilliseconds < 10000000000) {
-        global.renovateTimers = global.renovateTimers || [];
-        global.renovateTimers.push(
-          setTimeout(generatePolicies, offsetmilliseconds)
-        );
+function checkPolicies() {
+  if (policies && refreshDate > new Date()) {
+    return;
+  }
+  generatePolicies();
+  refreshDate = new Date('3000-01-01'); // y3k
+  const now = new Date();
+  for (const data of Object.values(nodeJsSchedule)) {
+    const fields = ['start', 'lts', 'maintenance', 'end'];
+    for (const field of fields) {
+      const fieldDate = new Date(data[field]);
+      if (fieldDate > now && fieldDate < refreshDate) {
+        refreshDate = fieldDate;
       }
     }
   }
+  logger.debug('Node.js policies refresh date: ' + refreshDate);
 }
 
-generatePolicies();
-
 async function getPackageUpdates(config) {
-  logger.debug('travis.getPackageUpdates()');
+  logger.trace('travis.getPackageUpdates()');
   const { supportPolicy } = config;
   if (!(supportPolicy && supportPolicy.length)) {
     return [];
   }
+  checkPolicies();
   for (const policy of supportPolicy) {
     if (!Object.keys(policies).includes(policy)) {
       logger.warn(`Unknown supportPolicy: ${policy}`);
diff --git a/lib/workers/global/index.js b/lib/workers/global/index.js
index c2bfc8cfa738a1ea434a035d61c7f0bdab99aa5c..f95bb6fcb11c823003702d9ec43fb6d736f80da2 100644
--- a/lib/workers/global/index.js
+++ b/lib/workers/global/index.js
@@ -64,10 +64,6 @@ async function start() {
       await repositoryWorker.renovateRepository(repoConfig);
     }
     logger.setMeta({});
-    // istanbul ignore if
-    if (global.renovateTimers) {
-      global.renovateTimers.forEach(timer => clearTimeout(timer));
-    }
     logger.info(`${appName} finished`);
   } catch (err) /* istanbul ignore next */ {
     logger.fatal({ err }, `Fatal error: ${err.message}`);