diff --git a/common/discover.c b/common/discover.c
index 8e7f632..8c741f1 100644
--- a/common/discover.c
+++ b/common/discover.c
@@ -835,7 +835,7 @@ end_iface_scan(struct iface_conf_list *ifaces) {
 	ifaces->head = NULL;
 	ifaces->next = NULL;
 }
-#endif 
+#endif
 
 /* XXX: perhaps create drealloc() rather than do it manually */
 void
@@ -912,6 +912,47 @@ add_ipv6_addr_to_interface(struct interface_info *iface,
 }
 #endif /* DHCPv6 */
 
+#ifdef RELOAD_ON_SIGUSR2
+/*
+ * Reloads IP addresses on every interface dhcrelay was started with.
+ * This gives possibility to reload configuration without restarting
+ * whole process.
+ */
+void iface_addr_rescan( __attribute__((unused)) int signum) {
+	struct iface_conf_list ifaces;
+	struct iface_info info;
+	struct interface_info *tmp = NULL;
+	struct sockaddr_in *a = NULL;
+	int err = 0;
+	int saved_ifaces=0;
+	int fixed_ifaces = 0;
+	log_info("Interfaces refresh requested.");
+
+	if (!begin_iface_scan(&ifaces)) {
+		log_error("Can't get list of interfaces.");
+		return;
+	}
+
+	// Cleaning address count for interfaces
+	for (tmp = interfaces; tmp; tmp = tmp->next) {
+		tmp->address_count = 0;
+		saved_ifaces++;
+	}
+
+	while (next_iface(&info, &err, &ifaces)) {
+		for (tmp = interfaces; tmp; tmp = tmp->next) {
+			if (strcmp(tmp->name, info.name) == 0) {
+				a = (struct sockaddr_in*)&info.addr;
+				add_ipv4_addr_to_interface(tmp, &a->sin_addr);
+				fixed_ifaces++;
+			}
+		}
+	}
+	end_iface_scan(&ifaces);
+	log_info("Refreshed interfaces: %d (startup config was: %d interfaces)", fixed_ifaces, saved_ifaces);
+}
+#endif /* RELOAD_ON_SIGUSR2 */
+
 /* Use the SIOCGIFCONF ioctl to get a list of all the attached interfaces.
    For each interface that's of type INET and not the loopback interface,
    register that interface with the network I/O software, figure out what
diff --git a/configure b/configure
index de9bcfe..1a7508b 100755
--- a/configure
+++ b/configure
@@ -761,6 +761,7 @@ enable_use_sockets
 enable_secs_byteorder
 enable_log_pid
 enable_binary_leases
+enable_reload_on_sigusr2
 with_atf
 with_srv_lease_file
 with_srv6_lease_file
@@ -5392,6 +5393,21 @@ $as_echo "#define ENABLE_EXECUTE 1" >>confdefs.h
 
 fi
 
+# dhcrelay reload on SIGUSR2 support.
+# Check whether --enable-reload-on-sigusr2 was given.
+if test "${enable_reload_on_sigusr2+set}" = set; then :
+  enableval=$enable_reload_on_sigusr2;
+fi
+
+# enable_reload_on_sigusr2 is off by default, so define if it is explicitly enabled.
+if test "$enable_reload_on_sigusr2" = "yes" ; then
+
+$as_echo "#define RELOAD_ON_SIGUSR2 1" >>confdefs.h
+
+else
+    enable_reload_on_sigusr2="no"
+fi
+
 # Server tracing support.
 # Check whether --enable-tracing was given.
 if test "${enable_tracing+set}" = set; then :
@@ -8725,12 +8741,13 @@ Flags:
 DHCP versions:   $DHCP_VERSIONS
 
 Features:
-  debug:         $enable_debug
-  failover:      $enable_failover
-  execute:       $enable_execute
-  binary-leases: $enable_binary_leases
-  dhcpv6:        $enable_dhcpv6
-  delayed-ack:   $enable_delayed_ack
+  debug:              $enable_debug
+  failover:           $enable_failover
+  execute:            $enable_execute
+  binary-leases:      $enable_binary_leases
+  dhcpv6:             $enable_dhcpv6
+  delayed-ack:        $enable_delayed_ack
+  reload with SIGUSR2 $enable_reload_on_sigusr2
 
 Developer:
   ATF unittests : $atf_path
diff --git a/configure.ac b/configure.ac
index 8cce080..7b8210d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -203,6 +203,14 @@ if test "$enable_use_sockets" = "yes"; then
 		[Define to 1 to use the standard BSD socket API.])
 fi
 
+AC_ARG_ENABLE(enable_reload_on_sigusr2,
+	AS_HELP_STRING([--enable-reload-on-sigusr2],[dhcrelay reload on SIGUSR2 support]))
+
+if test "$enable_reload_on_sigusr2" = "yes"; then
+	AC_DEFINE([RELOAD_ON_SIGUSR2], [1],
+		[dhcrelay reload on SIGUSR2 support])
+fi
+
 # Try to hnadle incorrect byte order for secs field
 # This is off by default
 AC_ARG_ENABLE(secs_byteorder,
diff --git a/includes/config.h.in b/includes/config.h.in
index 02f5dbc..04d3729 100644
--- a/includes/config.h.in
+++ b/includes/config.h.in
@@ -169,6 +169,9 @@
 /* Define to include server activity tracing support. */
 #undef TRACING
 
+/* Define to include dhcrelay reload on SIGUSR2 support */
+#undef RELOAD_ON_SIGUSR2 1
+
 /* Define to 1 if ethernet devices are in /dev/net */
 #undef USE_DEV_NET
 
diff --git a/includes/dhcpd.h b/includes/dhcpd.h
index 261714d..e907e27 100644
--- a/includes/dhcpd.h
+++ b/includes/dhcpd.h
@@ -3796,6 +3796,10 @@ void mark_phosts_unavailable(void);
 void mark_interfaces_unavailable(void);
 void report_jumbo_ranges();
 
+#ifdef RELOAD_ON_SIGUSR2
+void iface_addr_rescan(int signum);
+#endif /* RELOAD_ON_SIGUSR2 */
+
 #if defined(DHCPv6)
 int find_hosts6(struct host_decl** host, struct packet* packet,
                 const struct data_string* client_id, char* file, int line);
diff --git a/relay/dhcrelay.c b/relay/dhcrelay.c
index 344cee7..c3a70ae 100644
--- a/relay/dhcrelay.c
+++ b/relay/dhcrelay.c
@@ -700,6 +700,10 @@ main(int argc, char **argv) {
 	signal(SIGTERM, dhcp_signal_handler);  /* kill */
 #endif
 
+#ifdef RELOAD_ON_SIGUSR2
+	signal(SIGUSR2, iface_addr_rescan);
+#endif /* RELOAD_ON_SIGUSR2 */
+
 	/* Start dispatching packets and timeouts... */
 	dispatch();
 
