diff --git a/doc/language_issues.en b/doc/language_issues.en
index 7819541c2..9edc57d19 100644
--- a/doc/language_issues.en
+++ b/doc/language_issues.en
@@ -1446,6 +1446,7 @@ WARNING: untranslated string: password not set = Password not set.
 WARNING: untranslated string: password too short = Password is too short.
 WARNING: untranslated string: passwords do not match = Passwords do not match.
 WARNING: untranslated string: percentage = Percentage
+WARNING: untranslated string: periodically reload graphs = Periodically refresh RRD graphs
 WARNING: untranslated string: persistent = Persistent
 WARNING: untranslated string: pfs yes no = Perfect Forward Secrecy (PFS)
 WARNING: untranslated string: pkcs12 file password = PKCS12 File Password
diff --git a/doc/language_issues.es b/doc/language_issues.es
index 952321fbe..3d623302c 100644
--- a/doc/language_issues.es
+++ b/doc/language_issues.es
@@ -1318,6 +1318,7 @@ WARNING: untranslated string: pakfire tree = Repository
 WARNING: untranslated string: pakfire tree stable = Stable
 WARNING: untranslated string: pakfire tree testing = Testing
 WARNING: untranslated string: pakfire tree unstable = Unstable
+WARNING: untranslated string: periodically reload graphs = Periodically refresh RRD graphs
 WARNING: untranslated string: please reboot to apply your changes = Please reboot to apply your changes
 WARNING: untranslated string: pptp netconfig = My Net Config
 WARNING: untranslated string: pptp peer = Peer
diff --git a/doc/language_issues.fr b/doc/language_issues.fr
index 9fe5ca21c..e3a38df4e 100644
--- a/doc/language_issues.fr
+++ b/doc/language_issues.fr
@@ -914,6 +914,7 @@ WARNING: untranslated string: guardian logtarget_syslog = unknown string
 WARNING: untranslated string: guardian no entries = unknown string
 WARNING: untranslated string: guardian service = unknown string
 WARNING: untranslated string: pakfire ago = ago.
+WARNING: untranslated string: periodically reload graphs = Periodically refresh RRD graphs
 WARNING: untranslated string: route config changed = unknown string
 WARNING: untranslated string: routing config added = unknown string
 WARNING: untranslated string: routing config changed = unknown string
diff --git a/doc/language_issues.it b/doc/language_issues.it
index 29c9c7d58..a66c693b0 100644
--- a/doc/language_issues.it
+++ b/doc/language_issues.it
@@ -1108,6 +1108,7 @@ WARNING: untranslated string: pakfire tree = Repository
 WARNING: untranslated string: pakfire tree stable = Stable
 WARNING: untranslated string: pakfire tree testing = Testing
 WARNING: untranslated string: pakfire tree unstable = Unstable
+WARNING: untranslated string: periodically reload graphs = Periodically refresh RRD graphs
 WARNING: untranslated string: please reboot to apply your changes = Please reboot to apply your changes
 WARNING: untranslated string: pptp netconfig = My Net Config
 WARNING: untranslated string: pptp peer = Peer
diff --git a/doc/language_issues.nl b/doc/language_issues.nl
index d6cad0dee..a2b978ccc 100644
--- a/doc/language_issues.nl
+++ b/doc/language_issues.nl
@@ -1140,6 +1140,7 @@ WARNING: untranslated string: pakfire tree = Repository
 WARNING: untranslated string: pakfire tree stable = Stable
 WARNING: untranslated string: pakfire tree testing = Testing
 WARNING: untranslated string: pakfire tree unstable = Unstable
+WARNING: untranslated string: periodically reload graphs = Periodically refresh RRD graphs
 WARNING: untranslated string: please reboot to apply your changes = Please reboot to apply your changes
 WARNING: untranslated string: pptp netconfig = My Net Config
 WARNING: untranslated string: pptp peer = Peer
diff --git a/doc/language_issues.pl b/doc/language_issues.pl
index b8fba938f..7f2b72cc0 100644
--- a/doc/language_issues.pl
+++ b/doc/language_issues.pl
@@ -1327,6 +1327,7 @@ WARNING: untranslated string: pakfire tree = Repository
 WARNING: untranslated string: pakfire tree stable = Stable
 WARNING: untranslated string: pakfire tree testing = Testing
 WARNING: untranslated string: pakfire tree unstable = Unstable
+WARNING: untranslated string: periodically reload graphs = Periodically refresh RRD graphs
 WARNING: untranslated string: please reboot to apply your changes = Please reboot to apply your changes
 WARNING: untranslated string: pptp netconfig = My Net Config
 WARNING: untranslated string: pptp peer = Peer
diff --git a/doc/language_issues.ru b/doc/language_issues.ru
index d507911f1..f988580cf 100644
--- a/doc/language_issues.ru
+++ b/doc/language_issues.ru
@@ -1322,6 +1322,7 @@ WARNING: untranslated string: pakfire tree = Repository
 WARNING: untranslated string: pakfire tree stable = Stable
 WARNING: untranslated string: pakfire tree testing = Testing
 WARNING: untranslated string: pakfire tree unstable = Unstable
+WARNING: untranslated string: periodically reload graphs = Periodically refresh RRD graphs
 WARNING: untranslated string: please reboot to apply your changes = Please reboot to apply your changes
 WARNING: untranslated string: pptp netconfig = My Net Config
 WARNING: untranslated string: pptp peer = Peer
diff --git a/doc/language_issues.tr b/doc/language_issues.tr
index 04343d527..dc0fd98f0 100644
--- a/doc/language_issues.tr
+++ b/doc/language_issues.tr
@@ -1021,6 +1021,7 @@ WARNING: untranslated string: pakfire tree = Repository
 WARNING: untranslated string: pakfire tree stable = Stable
 WARNING: untranslated string: pakfire tree testing = Testing
 WARNING: untranslated string: pakfire tree unstable = Unstable
+WARNING: untranslated string: periodically reload graphs = Periodically refresh RRD graphs
 WARNING: untranslated string: please reboot to apply your changes = Please reboot to apply your changes
 WARNING: untranslated string: processor vulnerability mitigations = Processor Vulnerability Mitigations
 WARNING: untranslated string: ptr = PTR
diff --git a/doc/language_missings b/doc/language_missings
index f10c4f242..89808f3b5 100644
--- a/doc/language_missings
+++ b/doc/language_missings
@@ -669,6 +669,7 @@
 < pakfire tree stable
 < pakfire tree testing
 < pakfire tree unstable
+< periodically reload graphs
 < please reboot to apply your changes
 < pptp netconfig
 < pptp peer
@@ -922,6 +923,7 @@
 < dhcp valid range required when deny known clients checked
 < g.dtm
 < g.lite
+< periodically reload graphs
 < token
 < token not set
 < upload fcdsl.o
@@ -1198,6 +1200,7 @@
 < pakfire tree stable
 < pakfire tree testing
 < pakfire tree unstable
+< periodically reload graphs
 < please reboot to apply your changes
 < pptp netconfig
 < pptp peer
@@ -1632,6 +1635,7 @@
 < pakfire tree stable
 < pakfire tree testing
 < pakfire tree unstable
+< periodically reload graphs
 < please reboot to apply your changes
 < pptp netconfig
 < pptp peer
@@ -2407,6 +2411,7 @@
 < pakfire tree stable
 < pakfire tree testing
 < pakfire tree unstable
+< periodically reload graphs
 < please reboot to apply your changes
 < pptp netconfig
 < pptp peer
@@ -3297,6 +3302,7 @@
 < pakfire tree stable
 < pakfire tree testing
 < pakfire tree unstable
+< periodically reload graphs
 < please reboot to apply your changes
 < pptp netconfig
 < pptp peer
@@ -3660,6 +3666,7 @@
 < pakfire tree stable
 < pakfire tree testing
 < pakfire tree unstable
+< periodically reload graphs
 < please reboot to apply your changes
 < processor vulnerability mitigations
 < ptr
diff --git a/html/cgi-bin/gui.cgi b/html/cgi-bin/gui.cgi
index f06b0f923..a5255dbce 100644
--- a/html/cgi-bin/gui.cgi
+++ b/html/cgi-bin/gui.cgi
@@ -37,6 +37,7 @@ my $errormessage='';
 
 
 $cgiparams{'SPEED'} = 'off';
+$cgiparams{'RELOADGRAPHS'} = 'off';
 $cgiparams{'WINDOWWITHHOSTNAME'} = 'off';
 $cgiparams{'REFRESHINDEX'} = 'off';
 $cgiparams{'ACTION'} = '';
@@ -88,6 +89,7 @@ if ($cgiparams{'ACTION'} eq "$Lang::tr{'save'}")
 	$mainsettings{'WINDOWWITHHOSTNAME'} = $cgiparams{'WINDOWWITHHOSTNAME'};
 	$mainsettings{'PPPUPDOWNBEEP'} = $cgiparams{'PPPUPDOWNBEEP'};
 	$mainsettings{'SPEED'} = $cgiparams{'SPEED'};
+	$mainsettings{'RELOADGRAPHS'} = $cgiparams{'RELOADGRAPHS'};
 	$mainsettings{'THEME'} = $cgiparams{'theme'};
 	$mainsettings{'REFRESHINDEX'} = $cgiparams{'REFRESHINDEX'};
 	&General::writehash("${General::swroot}/main/settings", \%mainsettings);
@@ -125,6 +127,11 @@ if ($cgiparams{'ACTION'} eq "$Lang::tr{'save'}")
 	# by manually setting the var to off
 		$cgiparams{'SPEED'} = 'on';
 	}
+	if($mainsettings{'RELOADGRAPHS'}) {
+		$cgiparams{'RELOADGRAPHS'} = $mainsettings{'RELOADGRAPHS'};
+	} else {
+		$cgiparams{'RELOADGRAPHS'} = 'off';
+	}
 }
 
 # Default settings
@@ -134,6 +141,7 @@ if ($cgiparams{'ACTION'} eq "$Lang::tr{'restore defaults'}")
 	$cgiparams{'PPPUPDOWNBEEP'} = 'on';
 	$cgiparams{'REFRESHINDEX'} = 'off';
 	$cgiparams{'SPEED'} = 'on';
+	$cgiparams{'RELOADGRAPHS'} = 'off';
 	$cgiparams{'THEME'} = 'ipfire';
 }
 
@@ -153,6 +161,10 @@ $checked{'SPEED'}{'off'} = '';
 $checked{'SPEED'}{'on'} = '';
 $checked{'SPEED'}{$cgiparams{'SPEED'}} = "checked='checked'";
 
+$checked{'RELOADGRAPHS'}{'off'} = '';
+$checked{'RELOADGRAPHS'}{'on'} = '';
+$checked{'RELOADGRAPHS'}{$cgiparams{'RELOADGRAPHS'}} = "checked='checked'";
+
 &Header::openpage($Lang::tr{'gui settings'}, 1, '');
 &Header::openbigbox('100%', 'left', '', $errormessage);
 
@@ -179,6 +191,10 @@ print <<END
     <td><input type='checkbox' name='SPEED' $checked{'SPEED'}{'on'} /></td>
     <td>$Lang::tr{'show ajax speedmeter in footer'}</td>
 </tr>
+<tr>
+    <td><input type='checkbox' name='RELOADGRAPHS' $checked{'RELOADGRAPHS'}{'on'} /></td>
+    <td>$Lang::tr{'periodically reload graphs'}</td>
+</tr>
 <tr>
     <td>&nbsp;</td>
     <td>$Lang::tr{'languagepurpose'}</td>
diff --git a/html/html/themes/ipfire/include/functions.pl b/html/html/themes/ipfire/include/functions.pl
index 9aec77497..7f3401119 100644
--- a/html/html/themes/ipfire/include/functions.pl
+++ b/html/html/themes/ipfire/include/functions.pl
@@ -147,6 +147,13 @@ END
 ;
 }
 
+if ($settings{'RELOADGRAPHS'} eq 'on') {
+print <<END
+	<script src="/themes/ipfire/include/js/reloadGraphs.js"></script>
+END
+;
+}
+
 print <<END
 	</head>
 	<body>
diff --git a/html/html/themes/ipfire/include/js/reloadGraphs.js b/html/html/themes/ipfire/include/js/reloadGraphs.js
new file mode 100644
index 000000000..c0c8bec9e
--- /dev/null
+++ b/html/html/themes/ipfire/include/js/reloadGraphs.js
@@ -0,0 +1,81 @@
+/*#############################################################################
+#                                                                             #
+# IPFire.org - A linux based firewall                                         #
+# Copyright (C) 2007-2021  IPFire Team  <info@ipfire.org>                     #
+#                                                                             #
+# This program is free software: you can redistribute it and/or modify        #
+# it under the terms of the GNU General Public License as published by        #
+# the Free Software Foundation, either version 3 of the License, or           #
+# (at your option) any later version.                                         #
+#                                                                             #
+# This program is distributed in the hope that it will be useful,             #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of              #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               #
+# GNU General Public License for more details.                                #
+#                                                                             #
+# You should have received a copy of the GNU General Public License           #
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
+#                                                                             #
+#############################################################################*/		
+
+var graphs_reloadTimers = new Map();
+
+//graph onload event: graph is now loaded, start reload timer
+function graphs_onloadEvent(graphObj, startTimer = true) {		
+	if(! graphObj) {
+		return; //graph iframe object is missing
+	}
+
+	//get graph parameters from iframe url: [url]?[graph name]?[time range]
+	let url = graphObj.contentWindow.location.href;
+	if((! url) || (url === 'about:blank')) {
+		url = graphObj.src;
+	}
+	url = url.split('?', 3);
+	let graphRange = url.pop();
+	let graphName = url.pop();
+
+	if((! graphName) || (! graphRange)) {
+		return; //url parameters are missing
+	}
+
+	//clear pending reload timeout to prevent multiple timer starts
+	if(graphs_reloadTimers.has(graphName)) {
+		clearTimeout(graphs_reloadTimers.get(graphName));
+		graphs_reloadTimers.delete(graphName);
+	}
+
+	if(startTimer) {
+		//determine reload interval
+		let interval = 60; //default: 60s
+		if(graphRange === 'hour') {
+			interval = 10;
+		} else if(graphRange === 'month' || graphRange === 'year') {
+			interval = 180;
+		}
+
+		//start timeout and store timer id
+		let timer = setTimeout(function(graphFrame, timerRef) {
+			graphs_reloadTimers.delete(timerRef); //clear expired timer
+
+			//reload graph iframe, ignore cache
+			graphFrame.contentWindow.location.reload(true);
+		}, interval * 1000, graphObj, graphName);
+		graphs_reloadTimers.set(graphName, timer);
+	}
+}
+
+//document.ready, must fire before iframes load
+$(function() {
+	//attach onload event to graphs
+	$('iframe.graph').each(function() {
+		$(this).on({
+			load: function() {
+				graphs_onloadEvent(this);
+			},
+			error: function() { //stop reload on error
+				graphs_onloadEvent(this, false);
+			}
+		});
+	});
+});
diff --git a/langs/de/cgi-bin/de.pl b/langs/de/cgi-bin/de.pl
index b3c2a69da..00e6b9853 100644
--- a/langs/de/cgi-bin/de.pl
+++ b/langs/de/cgi-bin/de.pl
@@ -2007,6 +2007,7 @@
 'pc add' => 'PC hinzufügen',
 'pdc options' => 'PDC Optionen',
 'percentage' => 'Prozent',
+'periodically reload graphs' => 'RRD Graphen periodisch neu laden',
 'persistent' => 'Dauerhaft',
 'pfs yes no' => 'Perfect Forward Secrecy (PFS)',
 'phase1 group' => 'Phase1 Gruppe',
diff --git a/langs/en/cgi-bin/en.pl b/langs/en/cgi-bin/en.pl
index 9767be178..ed9e4996a 100644
--- a/langs/en/cgi-bin/en.pl
+++ b/langs/en/cgi-bin/en.pl
@@ -2037,6 +2037,7 @@
 'pc add' => 'Add workstation',
 'pdc options' => 'PDC options',
 'percentage' => 'Percentage',
+'periodically reload graphs' => 'Periodically refresh RRD graphs',
 'persistent' => 'Persistent',
 'pfs yes no' => 'Perfect Forward Secrecy (PFS)',
 'phase1 group' => 'Phase1 Group',
