diff --git a/modules/services/networking/dhclient.nix b/modules/services/networking/dhclient.nix
index 5d82854fef50..fe118fb320e3 100644
--- a/modules/services/networking/dhclient.nix
+++ b/modules/services/networking/dhclient.nix
@@ -116,12 +116,16 @@ in
 
     powerManagement.resumeCommands =
       ''
-        export PATH=${config.system.build.upstart}/sbin:$PATH
-        initctl restart wpa_supplicant
-        initctl restart dhclient
+        ${config.system.build.upstart}/sbin/restart dhclient
+      '';
+
+    networking.interfaceMonitor.commands =
+      ''
+        if [ "$status" = up ]; then
+          ${config.system.build.upstart}/sbin/restart dhclient
+        fi
       '';
 
   };
 
 }
-
diff --git a/modules/services/networking/ifplugd.nix b/modules/services/networking/ifplugd.nix
index e4e4fd9216a5..3e2bf9d6997e 100644
--- a/modules/services/networking/ifplugd.nix
+++ b/modules/services/networking/ifplugd.nix
@@ -6,6 +6,8 @@ let
 
   inherit (pkgs) ifplugd;
 
+  cfg = config.networking.interfaceMonitor;
+
   # The ifplugd action script, which is called whenever the link
   # status changes (i.e., a cable is plugged in or unplugged).  We do
   # nothing when a cable is unplugged.  When a cable is plugged in, we
@@ -14,10 +16,9 @@ let
   plugScript = pkgs.writeScript "ifplugd.action"
     ''
       #! ${pkgs.stdenv.shell}
-      if test "$2" = up; then
-        initctl stop dhclient
-        initctl start dhclient
-      fi
+      iface="$1"
+      status="$2"
+      ${cfg.commands}
     '';
 
 in
@@ -30,21 +31,33 @@ in
 
     networking.interfaceMonitor.enable = mkOption {
       default = false;
-      description = "
+      description = ''
         If <literal>true</literal>, monitor Ethernet interfaces for
         cables being plugged in or unplugged.  When this occurs, the
         <command>dhclient</command> service is restarted to
         automatically obtain a new IP address.  This is useful for
         roaming users (laptops).
-      ";
+      '';
     };
 
     networking.interfaceMonitor.beep = mkOption {
       default = false;
-      description = "
+      description = ''
         If <literal>true</literal>, beep when an Ethernet cable is
         plugged in or unplugged.
-      ";
+      '';
+    };
+
+    networking.interfaceMonitor.commands = mkOption {
+      default = false;
+      description = ''
+        Shell commands to be executed when the link status of an
+        interface changes.  On invocation, the shell variable
+        <varname>iface</varname> contains the name of the interface,
+        while the variable <varname>status</varname> contains either
+        <literal>up</literal> or <literal>down</literal> to indicate
+        the new status.
+      '';
     };
 
   };
@@ -52,7 +65,7 @@ in
 
   ###### implementation
 
-  config = mkIf config.networking.interfaceMonitor.enable {
+  config = mkIf cfg.enable {
 
     jobs.ifplugd =
       { description = "Network interface connectivity monitor";
@@ -68,7 +81,7 @@ in
           '';
       };
 
-    environment.systemPackages = [ifplugd];
+    environment.systemPackages = [ ifplugd ];
 
   };
 
diff --git a/modules/services/networking/wpa_supplicant.nix b/modules/services/networking/wpa_supplicant.nix
index 7e29747dcc2b..bf4cd6ae29a7 100644
--- a/modules/services/networking/wpa_supplicant.nix
+++ b/modules/services/networking/wpa_supplicant.nix
@@ -63,6 +63,11 @@ in
           + (optionalString (config.networking.WLANInterface != null) "-i ${config.networking.WLANInterface}");
       };
   
+    powerManagement.resumeCommands =
+      ''
+        ${config.system.build.upstart}/sbin/restart wpa_supplicant
+      '';
+
   };
 
 }