--- src/lease.c
+++ src/lease.c
@@ -230,13 +230,29 @@
       lease_set_hostname(lease, name, 1, get_domain(lease->addr), NULL); /* updates auth flag only */
 }
 
+static void ourvprintf(FILE* f, int *errp, char *format, va_list ap)
+{
+  if (!(*errp) && f && vfprintf(f, format, ap) < 0)
+    *errp = errno;
+}
+
+static void ourprintf3(FILE* f, int *errp, char *format, ...) __attribute__((format(printf, 3, 4)));
+static void ourprintf3(FILE* f, int *errp, char *format, ...)
+{
+  va_list ap;
+
+  va_start(ap, format);
+  ourvprintf(f, errp, format, ap);
+  va_end(ap);
+}
+
+static void ourprintf(int *errp, char *format, ...) __attribute__((format(printf, 2, 3)));
 static void ourprintf(int *errp, char *format, ...)
 {
   va_list ap;
   
   va_start(ap, format);
-  if (!(*errp) && vfprintf(daemon->lease_stream, format, ap) < 0)
-    *errp = errno;
+  ourvprintf(daemon->lease_stream, errp, format, ap);
   va_end(ap);
 }
 
@@ -244,14 +260,28 @@
 {
   struct dhcp_lease *lease;
   time_t next_event;
-  int i, err = 0;
+  int i, err = 0, err_multid = 0;
+  static const char multid_leases_filename[] = "/var/tmp/multid.leases";
 
   if (file_dirty != 0 && daemon->lease_stream)
     {
+      FILE *multid_leases;
+      char interface_name[IF_NAMESIZE];
+      int dhcp_fd = daemon->dhcpfd;
+
+#ifdef HAVE_DHCP6
+      if (!daemon->dhcp)
+        dhcp_fd = daemon->dhcp6fd;
+#endif
+
       errno = 0;
       rewind(daemon->lease_stream);
       if (errno != 0 || ftruncate(fileno(daemon->lease_stream), 0) != 0)
 	err = errno;
+
+      multid_leases = fopen(multid_leases_filename, "w");
+      if (errno != 0)
+        err_multid = errno;
       
       for (lease = leases; lease; lease = lease->next)
 	{
@@ -281,14 +311,70 @@
 	  ourprintf(&err, " %s ", daemon->addrbuff);
 	  ourprintf(&err, "%s ", lease->hostname ? lease->hostname : "*");
 	  	  
+
+	  if (!indextoname(dhcp_fd, lease->last_interface, interface_name))
+	    interface_name[0] = 0;
+#if 0
+	  my_syslog(MS_DHCP | LOG_INFO, "multid.leases-debug lease->last_interface=%d interface_name=\"%s\"", lease->last_interface, interface_name);
+#endif
+
+	  /* (w)lease mac-address ip-address lease-expires "hostname" client-id mac-address "" */
+	  /* Example: lease 00:12:79:41:AA:01 192.168.178.40 1122416 "computer" 0100127941b4a0 00:12:79:41:AA:01 "" */
+	  ourprintf3(
+	    multid_leases,
+	    &err_multid,
+	    "%s %.2x:%.2x:%.2x:%.2x:%.2x:%.2x %s %lu \"%s\" ",
+	    (strstr(interface_name, "wlan") || strstr(interface_name, "wifi") || strstr(interface_name, "ath")) ? "wlease" : "lease",
+	    lease->hwaddr[0],
+	    lease->hwaddr[1],
+	    lease->hwaddr[2],
+	    lease->hwaddr[3],
+	    lease->hwaddr[4],
+	    lease->hwaddr[5],
+	    daemon->addrbuff,
+	    lease->expires,
+	    lease->hostname && strlen(lease->hostname) != 0 ? lease->hostname : ""
+	  );
+
 	  if (lease->clid && lease->clid_len != 0)
 	    {
 	      for (i = 0; i < lease->clid_len - 1; i++)
 		ourprintf(&err, "%.2x:", lease->clid[i]);
 	      ourprintf(&err, "%.2x\n", lease->clid[i]);
+
+	      for (i = 0; i < lease->clid_len; i++)
+		ourprintf3(multid_leases, &err_multid, "%.2x", lease->clid[i]);
 	    }
-	  else
+	  else {
 	    ourprintf(&err, "*\n");	  
+#if 0
+	    // single point as client-id
+	    ourprintf3(multid_leases, &err_multid, ".");
+#else
+	    // mac-address (without ':') prefixed with 01 as client-id
+	    ourprintf3(multid_leases, &err_multid, "01");
+	    for (i = 0; i <= 5; i++)
+	      ourprintf3(multid_leases, &err_multid, "%.2x", lease->hwaddr[i]);
+#endif
+	  }
+
+	  ourprintf3(
+	    multid_leases,
+	    &err_multid,
+#ifdef MULTID_LEASES_FORMAT_V2
+	    " %.2x:%.2x:%.2x:%.2x:%.2x:%.2x \"\"",
+#else
+	    " %.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
+#endif
+	    lease->hwaddr[0],
+	    lease->hwaddr[1],
+	    lease->hwaddr[2],
+	    lease->hwaddr[3],
+	    lease->hwaddr[4],
+	    lease->hwaddr[5]
+	  );
+
+	  ourprintf3(multid_leases, &err_multid, "\n");
 	}
       
 #ifdef HAVE_DHCP6  
@@ -335,6 +421,9 @@
       
       if (!err)
 	file_dirty = 0;
+
+      if (multid_leases && fclose(multid_leases) != 0)
+        err_multid = errno;
     }
   
   /* Set alarm for when the first lease expires. */
@@ -375,6 +464,11 @@
 		(unsigned int)difftime(next_event, now));
     }
 
+  if (err_multid)
+    {
+      my_syslog(MS_DHCP | LOG_ERR, "failed to write/to update %s: %s", multid_leases_filename, strerror(err_multid));
+    }
+
   send_alarm(next_event, now);
 }
 
@@ -1037,6 +1131,7 @@
 
   lease->last_interface = interface;
   lease->flags |= LEASE_CHANGED; 
+  file_dirty = 1;
 
 #ifdef HAVE_DHCP6
   slaac_add_addrs(lease, now, 0);
