return 0;
 }
 
+static BLOCKING_NOTIFIER_HEAD(acpi_bus_notify_list);
+int register_acpi_bus_notifier(struct notifier_block *nb)
+{
+       return blocking_notifier_chain_register(&acpi_bus_notify_list, nb);
+}
+EXPORT_SYMBOL_GPL(register_acpi_bus_notifier);
+
+void unregister_acpi_bus_notifier(struct notifier_block *nb)
+{
+       blocking_notifier_chain_unregister(&acpi_bus_notify_list, nb);
+}
+EXPORT_SYMBOL_GPL(unregister_acpi_bus_notifier);
+
 /**
  * acpi_bus_notify
  * ---------------
        int result = 0;
        struct acpi_device *device = NULL;
 
+       blocking_notifier_call_chain(&acpi_bus_notify_list,
+               type, (void *)handle);
 
        if (acpi_bus_get_device(handle, &device))
                return;
 
        }
 }
 
+static int acpi_dock_notifier_call(struct notifier_block *this,
+       unsigned long event, void *data)
+{
+       struct dock_station *dock_station;
+       acpi_handle handle = (acpi_handle)data;
+
+       if (event != ACPI_NOTIFY_BUS_CHECK && event != ACPI_NOTIFY_DEVICE_CHECK
+          && event != ACPI_NOTIFY_EJECT_REQUEST)
+               return 0;
+       list_for_each_entry(dock_station, &dock_stations, sibiling) {
+               if (dock_station->handle == handle) {
+                       dock_notify(handle, event, dock_station);
+                       return 0 ;
+               }
+       }
+       return 0;
+}
+
+static struct notifier_block dock_acpi_notifier = {
+       .notifier_call = acpi_dock_notifier_call,
+};
+
 /**
  * find_dock_devices - find devices on the dock station
  * @handle: the handle of the device we are examining
 static int dock_add(acpi_handle handle)
 {
        int ret;
-       acpi_status status;
        struct dock_dependent_device *dd;
        struct dock_station *dock_station;
        struct platform_device *dock_device;
        }
        add_dock_dependent_device(dock_station, dd);
 
-       /* register for dock events */
-       status = acpi_install_notify_handler(dock_station->handle,
-                                            ACPI_SYSTEM_NOTIFY,
-                                            dock_notify, dock_station);
-
-       if (ACPI_FAILURE(status)) {
-               printk(KERN_ERR PREFIX "Error installing notify handler\n");
-               ret = -ENODEV;
-               goto dock_add_err;
-       }
-
        dock_station_count++;
        list_add(&dock_station->sibiling, &dock_stations);
        return 0;
 
-dock_add_err:
-       kfree(dd);
 dock_add_err_unregister:
        device_remove_file(&dock_device->dev, &dev_attr_docked);
        device_remove_file(&dock_device->dev, &dev_attr_undock);
 static int dock_remove(struct dock_station *dock_station)
 {
        struct dock_dependent_device *dd, *tmp;
-       acpi_status status;
        struct platform_device *dock_device = dock_station->dock_device;
 
        if (!dock_station_count)
                                 list)
            kfree(dd);
 
-       /* remove dock notify handler */
-       status = acpi_remove_notify_handler(dock_station->handle,
-                                           ACPI_SYSTEM_NOTIFY,
-                                           dock_notify);
-       if (ACPI_FAILURE(status))
-               printk(KERN_ERR "Error removing notify handler\n");
-
        /* cleanup sysfs */
        device_remove_file(&dock_device->dev, &dev_attr_docked);
        device_remove_file(&dock_device->dev, &dev_attr_undock);
                return 0;
        }
 
+       register_acpi_bus_notifier(&dock_acpi_notifier);
        printk(KERN_INFO PREFIX "%s: %d docks/bays found\n",
                ACPI_DOCK_DRIVER_DESCRIPTION, dock_station_count);
        return 0;
 {
        struct dock_station *dock_station;
 
+       unregister_acpi_bus_notifier(&dock_acpi_notifier);
        list_for_each_entry(dock_station, &dock_stations, sibiling)
                dock_remove(dock_station);
 }