diff --git a/CHANGELOG b/CHANGELOG
index 2af2056979d6fe3909903d2cddb3e81c4ec61fd2..69ff459238cc0a7d310cdbbbe466fb7defafcf89 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -63,6 +63,7 @@ v 8.12.0 (unreleased)
   - Fix badge count alignment (ClemMakesApps)
   - Remove green outline from `New branch unavailable` button on issue page !5858 (winniehell)
   - Fix repo title alignment (ClemMakesApps)
+  - Change update interval of contacted_at
   - Fix branch title trailing space on hover (ClemMakesApps)
   - Award emoji tooltips containing more than 10 usernames are now truncated !4780 (jlogandavison)
   - Fix duplicate "me" in award emoji tooltip !5218 (jlogandavison)
diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb
index 49f05f881a25f246f03c5b208238da5c204f75c8..ed5d4b13b7eedd75730c5632cb26f0d212c503b0 100644
--- a/app/models/ci/runner.rb
+++ b/app/models/ci/runner.rb
@@ -2,7 +2,7 @@ module Ci
   class Runner < ActiveRecord::Base
     extend Ci::Model
 
-    LAST_CONTACT_TIME = 5.minutes.ago
+    LAST_CONTACT_TIME = 2.hours.ago
     AVAILABLE_SCOPES = %w[specific shared active paused online]
     FORM_EDITABLE = %i[description tag_list active run_untagged locked]
 
diff --git a/lib/ci/api/builds.rb b/lib/ci/api/builds.rb
index 9f3b582a263c0a9d5aa35f1570bf787778742184..eb4947cdbf11c3ef139126539f9752f7755bd5b5 100644
--- a/lib/ci/api/builds.rb
+++ b/lib/ci/api/builds.rb
@@ -12,7 +12,7 @@ module Ci
         #   POST /builds/register
         post "register" do
           authenticate_runner!
-          update_runner_last_contact
+          update_runner_last_contact(save: false)
           update_runner_info
           required_attributes! [:token]
           not_found! unless current_runner.active?
diff --git a/lib/ci/api/helpers.rb b/lib/ci/api/helpers.rb
index 199d62d9b8a1c2f08f2182fc1d1444b117f11ae5..bcabf7a21b2124a9da967dddd7aee280b419fc8e 100644
--- a/lib/ci/api/helpers.rb
+++ b/lib/ci/api/helpers.rb
@@ -3,7 +3,7 @@ module Ci
     module Helpers
       BUILD_TOKEN_HEADER = "HTTP_BUILD_TOKEN"
       BUILD_TOKEN_PARAM = :token
-      UPDATE_RUNNER_EVERY = 60
+      UPDATE_RUNNER_EVERY = 40 * 60
 
       def authenticate_runners!
         forbidden! unless runner_registration_token_valid?
@@ -22,11 +22,13 @@ module Ci
         params[:token] == current_application_settings.runners_registration_token
       end
 
-      def update_runner_last_contact
+      def update_runner_last_contact(save: true)
         # Use a random threshold to prevent beating DB updates
+        # it generates a distribution between: [40m, 80m]
         contacted_at_max_age = UPDATE_RUNNER_EVERY + Random.rand(UPDATE_RUNNER_EVERY)
         if current_runner.contacted_at.nil? || Time.now - current_runner.contacted_at >= contacted_at_max_age
-          current_runner.update_attributes(contacted_at: Time.now)
+          current_runner.contacted_at = Time.now
+          current_runner.save if current_runner.changed? && save
         end
       end