diff --git a/system/options.nix b/system/options.nix
index 91cd0c78a7d..099e99f77e7 100644
--- a/system/options.nix
+++ b/system/options.nix
@@ -479,39 +479,6 @@ in
 
     };
 
-    udev = {
-
-      addFirmware = mkOption {
-        default = [];
-        example = ["/mnt/big-storage/firmware/"];
-        description = "
-          To specify firmware that is not too spread to ensure 
-          a package, or have an interactive process of extraction
-          and cannot be redistributed.
-        ";
-        merge = pkgs.lib.mergeListOption;
-      };
-
-      addUdevPkgs = mkOption {
-        default = [];
-        description = "
-          List of packages containing udev rules.
-        ";
-        merge = pkgs.lib.mergeListOption;
-      };
-      
-      sndMode = mkOption {
-        default = "0600";
-        example = "0666";
-        description = "
-          Permissions for /dev/snd/*, in case you have multiple 
-          logged in users or if the devices belong to root for 
-          some reason.
-        ";
-      };
-    };
-
-
     samba = {
 
       enable = mkOption {
@@ -1015,6 +982,7 @@ in
     (import ../upstart-jobs/apache-httpd) # Apache httpd (new style).
     (import ../upstart-jobs/vsftpd.nix)
     (import ../upstart-jobs/cupsd.nix) # CUPS printing daemon
+    (import ../upstart-jobs/udev.nix) # The udev daemon creates devices nodes and runs programs when hardware events occur.
 
     # nix
     (import ../upstart-jobs/nix.nix) # nix options and daemon
diff --git a/upstart-jobs/default.nix b/upstart-jobs/default.nix
index e185b5a444b..43230ec505a 100644
--- a/upstart-jobs/default.nix
+++ b/upstart-jobs/default.nix
@@ -77,16 +77,6 @@ let
       inherit config;
     })
 
-    # The udev daemon creates devices nodes and runs programs when
-    # hardware events occur.
-    (import ../upstart-jobs/udev.nix {
-      inherit modprobe config;
-      inherit (pkgs) stdenv writeText substituteAll udev procps;
-      inherit (pkgs.lib) cleanSource;
-      firmwareDirs = config.services.udev.addFirmware;
-      extraUdevPkgs = config.services.udev.addUdevPkgs;
-    })
-      
     # Makes LVM logical volumes available. 
     (import ../upstart-jobs/lvm.nix {
       inherit modprobe;
diff --git a/upstart-jobs/udev.nix b/upstart-jobs/udev.nix
index 4662adde222..4765f29176e 100644
--- a/upstart-jobs/udev.nix
+++ b/upstart-jobs/udev.nix
@@ -1,18 +1,66 @@
-{ stdenv, writeText, substituteAll, cleanSource, udev, procps, firmwareDirs, modprobe
-, extraUdevPkgs ? []
-, config
-}:
+{pkgs, config, ...}:
+
+###### interface
+let
+  inherit (pkgs.lib) mkOption mkIf;
+
+  options = {
+    services = {
+      udev = {
+
+        addFirmware = mkOption {
+          default = [];
+          example = ["/mnt/big-storage/firmware/"];
+          description = "
+            To specify firmware that is not too spread to ensure 
+            a package, or have an interactive process of extraction
+            and cannot be redistributed.
+          ";
+          merge = pkgs.lib.mergeListOption;
+        };
+
+        addUdevPkgs = mkOption {
+          default = [];
+          description = "
+            List of packages containing udev rules.
+          ";
+          merge = pkgs.lib.mergeListOption;
+        };
+        
+        sndMode = mkOption {
+          default = "0600";
+          example = "0666";
+          description = "
+            Permissions for /dev/snd/*, in case you have multiple 
+            logged in users or if the devices belong to root for 
+            some reason.
+          ";
+        };
+      };
+    };
+  };
+in
+
+###### implementation
 
 let
 
+  inherit (pkgs) substituteAll stdenv writeText udev procps;
+
   cfg = config.services.udev;
 
+
   firmwareLoader = substituteAll {
     src = ./udev-firmware-loader.sh;
     path = "${stdenv.coreutils}/bin";
     isExecutable = true;
     inherit firmwareDirs;
   };
+
+  firmwareDirs = config.services.udev.addFirmware;
+  extraUdevPkgs = config.services.udev.addUdevPkgs;
+
+  modprobe = config.system.sbin.modprobe;
     
   nixRules = writeText "90-nix.rules" ''
   
@@ -86,55 +134,64 @@ let
 in
 
 {
-  name = "udev";
-  
-  job = ''
-    start on startup
-    stop on shutdown
 
-    env UDEV_CONFIG_FILE=${conf}
+  require = [
+    options
+  ];
 
-    start script
-        echo "" > /proc/sys/kernel/hotplug
+  services = {
+    extraJobs = [{
+      name = "udev";
+      
+      job = ''
+        start on startup
+        stop on shutdown
 
-        # Get rid of possible old udev processes.
-        ${procps}/bin/pkill -u root "^udevd$" || true
+        env UDEV_CONFIG_FILE=${conf}
 
-        # Do the loading of additional stage 2 kernel modules.
-        # Maybe this isn't the best place...
-        for i in ${toString config.boot.kernelModules}; do
-            echo "Loading kernel module $i..."
-            ${modprobe}/sbin/modprobe $i || true
-        done
+        start script
+            echo "" > /proc/sys/kernel/hotplug
 
-        # Start udev.
-        ${udev}/sbin/udevd --daemon
+            # Get rid of possible old udev processes.
+            ${procps}/bin/pkill -u root "^udevd$" || true
 
-        # Let udev create device nodes for all modules that have already
-        # been loaded into the kernel (or for which support is built into
-        # the kernel).
-        if ! test -e ${devicesCreated}; then
-            ${udev}/sbin/udevadm trigger
-            ${udev}/sbin/udevadm settle # wait for udev to finish
-            touch ${devicesCreated}
-        fi
+            # Do the loading of additional stage 2 kernel modules.
+            # Maybe this isn't the best place...
+            for i in ${toString config.boot.kernelModules}; do
+                echo "Loading kernel module $i..."
+                ${modprobe}/sbin/modprobe $i || true
+            done
 
-        # Kill udev, let Upstart restart and monitor it.  (This is nasty,
-        # but we have to run `udevadm trigger' first.  Maybe we can use
-        # Upstart's `binary' keyword, but it isn't implemented yet.)
-        if ! ${procps}/bin/pkill -u root "^udevd$"; then
-            echo "couldn't stop udevd"
-        fi
+            # Start udev.
+            ${udev}/sbin/udevd --daemon
 
-        while ${procps}/bin/pgrep -u root "^udevd$"; do
-            sleep 1
-        done
+            # Let udev create device nodes for all modules that have already
+            # been loaded into the kernel (or for which support is built into
+            # the kernel).
+            if ! test -e ${devicesCreated}; then
+                ${udev}/sbin/udevadm trigger
+                ${udev}/sbin/udevadm settle # wait for udev to finish
+                touch ${devicesCreated}
+            fi
 
-        initctl emit new-devices
-    end script
+            # Kill udev, let Upstart restart and monitor it.  (This is nasty,
+            # but we have to run `udevadm trigger' first.  Maybe we can use
+            # Upstart's `binary' keyword, but it isn't implemented yet.)
+            if ! ${procps}/bin/pkill -u root "^udevd$"; then
+                echo "couldn't stop udevd"
+            fi
 
-    respawn ${udev}/sbin/udevd
-  '';
+            while ${procps}/bin/pgrep -u root "^udevd$"; do
+                sleep 1
+            done
 
-  passthru = {inherit udevRules;};
+            initctl emit new-devices
+        end script
+
+        respawn ${udev}/sbin/udevd
+      '';
+
+      passthru = {inherit udevRules;};
+    }];
+  };
 }