Index: uspace/srv/net/dhcp/dhcp.c
===================================================================
--- uspace/srv/net/dhcp/dhcp.c	(revision 5441670e049ac8387955538c8c938f7204305e9a)
+++ uspace/srv/net/dhcp/dhcp.c	(revision cc575ef99163b3a869a65477f280acca17c5bdd5)
@@ -418,4 +418,23 @@
 }
 
+static int dhcp_discover_proc(dhcp_link_t *dlink)
+{
+	dlink->state = ds_selecting;
+
+	int rc = dhcp_send_discover(dlink);
+	if (rc != EOK)
+		return EIO;
+
+	dlink->retries_left = dhcp_discover_retries;
+	
+	if(dlink->timeout->state == fts_not_set || 
+		dlink->timeout->state == fts_fired) {
+		fibril_timer_set(dlink->timeout, dhcp_discover_timeout_val,
+			dhcpsrv_discover_timeout, dlink);
+	}
+	
+	return rc;
+}
+
 int dhcpsrv_link_add(service_id_t link_id)
 {
@@ -459,8 +478,6 @@
 	}
 
-	dlink->state = ds_selecting;
-
 	log_msg(LOG_DEFAULT, LVL_DEBUG, "Send DHCPDISCOVER");
-	rc = dhcp_send_discover(dlink);
+	rc = dhcp_discover_proc(dlink);
 	if (rc != EOK) {
 		log_msg(LOG_DEFAULT, LVL_ERROR, "Error sending DHCPDISCOVER.");
@@ -469,8 +486,4 @@
 		goto error;
 	}
-
-	dlink->retries_left = dhcp_discover_retries;
-	fibril_timer_set(dlink->timeout, dhcp_discover_timeout_val,
-	    dhcpsrv_discover_timeout, dlink);
 
 	list_append(&dlink->links, &dhcp_links);
@@ -487,4 +500,19 @@
 {
 	return ENOTSUP;
+}
+
+int dhcpsrv_discover(service_id_t link_id)
+{
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "dhcpsrv_link_add(%zu)", link_id);
+	
+	dhcp_link_t *dlink = dhcpsrv_link_find(link_id);
+
+	if (dlink == NULL) {
+		log_msg(LOG_DEFAULT, LVL_NOTE, "Link %zu doesn't exist",
+		    link_id);
+		return EINVAL;
+	}
+	
+	return dhcp_discover_proc(dlink);
 }
 
Index: uspace/srv/net/dhcp/dhcp.h
===================================================================
--- uspace/srv/net/dhcp/dhcp.h	(revision 5441670e049ac8387955538c8c938f7204305e9a)
+++ uspace/srv/net/dhcp/dhcp.h	(revision cc575ef99163b3a869a65477f280acca17c5bdd5)
@@ -43,4 +43,5 @@
 extern int dhcpsrv_link_add(service_id_t);
 extern int dhcpsrv_link_remove(service_id_t);
+extern int dhcpsrv_discover(service_id_t);
 
 #endif
Index: uspace/srv/net/dhcp/main.c
===================================================================
--- uspace/srv/net/dhcp/main.c	(revision 5441670e049ac8387955538c8c938f7204305e9a)
+++ uspace/srv/net/dhcp/main.c	(revision cc575ef99163b3a869a65477f280acca17c5bdd5)
@@ -109,4 +109,17 @@
 }
 
+static void dhcp_discover_srv(ipc_callid_t callid, ipc_call_t *call)
+{
+	sysarg_t link_id;
+	int rc;
+
+	log_msg(LOG_DEFAULT, LVL_DEBUG, "dhcp_discover_srv()");
+
+	link_id = IPC_GET_ARG1(*call);
+
+	rc = dhcpsrv_discover(link_id);
+	async_answer_0(callid, rc);
+}
+
 static void dhcp_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
 {
@@ -133,4 +146,7 @@
 		case DHCP_LINK_REMOVE:
 			dhcp_link_remove_srv(callid, &call);
+			break;
+		case DHCP_DISCOVER:
+			dhcp_discover_srv(callid, &call);
 			break;
 		default:
