diff --git a/NEWS b/NEWS
index 0079161956cf907f25e049537723ffd2a227a965..f5ef366a9a6454f8623c7d603d7d96d1e3477615 100644
--- a/NEWS
+++ b/NEWS
@@ -13,8 +13,8 @@ Changes in version 1.2.0:
   ecrt_master_release().
 * Removed ecrt_master_prepare(). Its functionality was moved into
   ecrt_master_activate().
-* Removed ecdev_start() and ecdev_stop(). Their functionality was moved into
-  ecdev_register() and ecdev_unregister, respectively.
+* Renamed ecdev_start() and ecdev_stop() to ecdev_open() and ecdev_close().
+  These two functions now take a pointer to ec_device_t as their arguments.
 * The data_ptr parameter of ecrt_domain_register_pdo(),
   ecrt_domain_register_pdo_list() and ecrt_domain_register_pdo_range() may
   not be NULL any more.
diff --git a/devices/8139too-2.6.13-ethercat.c b/devices/8139too-2.6.13-ethercat.c
index 05705c98aad95b2812499367b2a60b5a64541a47..17841b03f373780017ed4e1ab654b507e50c37cf 100644
--- a/devices/8139too-2.6.13-ethercat.c
+++ b/devices/8139too-2.6.13-ethercat.c
@@ -2907,12 +2907,24 @@ static int __init rtl8139_init_module (void)
 			printk(KERN_ERR "Failed to register EtherCAT device!\n");
 			goto out_pci;
 		}
+
+		printk(KERN_INFO "Opening EtherCAT device...\n");
+		if (ecdev_open(rtl_ec_dev)) {
+			printk(KERN_ERR "Failed to open EtherCAT device!\n");
+			goto out_unregister;
+		}
+
+		printk(KERN_INFO "EtherCAT device ready.\n");
 	} else {
 		printk(KERN_WARNING "No EtherCAT device registered!\n");
 	}
 
 	return 0;
 
+    out_unregister:
+	printk(KERN_INFO "Unregistering EtherCAT device...\n");
+	ecdev_unregister(ec_device_master_index, rtl_ec_dev);
+	rtl_ec_dev = NULL;
     out_pci:
 	pci_unregister_driver(&rtl8139_pci_driver);
     out_return:
@@ -2929,7 +2941,9 @@ static void __exit rtl8139_cleanup_module (void)
 	printk(KERN_INFO "Cleaning up RTL8139-EtherCAT module...\n");
 
 	if (rtl_ec_net_dev) {
-		printk(KERN_INFO "Unregistering device...\n");
+		printk(KERN_INFO "Closing EtherCAT device...\n");
+		ecdev_close(rtl_ec_dev);
+		printk(KERN_INFO "Unregistering EtherCAT device...\n");
 		ecdev_unregister(ec_device_master_index, rtl_ec_dev);
 		rtl_ec_dev = NULL;
 	}
diff --git a/devices/8139too-2.6.17-ethercat.c b/devices/8139too-2.6.17-ethercat.c
index 41beaf0ef6d885f75326ba2c08ef3b37c0ccf697..18aa9ec547a5b7fdd7ba78c5848c13f41ee88007 100644
--- a/devices/8139too-2.6.17-ethercat.c
+++ b/devices/8139too-2.6.17-ethercat.c
@@ -2905,12 +2905,24 @@ static int __init rtl8139_init_module (void)
 			printk(KERN_ERR "Failed to register EtherCAT device!\n");
 			goto out_pci;
 		}
+
+		printk(KERN_INFO "Opening EtherCAT device...\n");
+		if (ecdev_open(rtl_ec_dev)) {
+			printk(KERN_ERR "Failed to open EtherCAT device!\n");
+			goto out_unregister;
+		}
+
+		printk(KERN_INFO "EtherCAT device ready.\n");
 	} else {
 		printk(KERN_WARNING "No EtherCAT device registered!\n");
 	}
 
 	return 0;
 
+    out_unregister:
+	printk(KERN_INFO "Unregistering EtherCAT device...\n");
+	ecdev_unregister(ec_device_master_index, rtl_ec_dev);
+	rtl_ec_dev = NULL;
     out_pci:
 	pci_unregister_driver(&rtl8139_pci_driver);
     out_return:
@@ -2927,7 +2939,9 @@ static void __exit rtl8139_cleanup_module (void)
 	printk(KERN_INFO "Cleaning up RTL8139-EtherCAT module...\n");
 
 	if (rtl_ec_net_dev) {
-		printk(KERN_INFO "Unregistering device...\n");
+		printk(KERN_INFO "Closing EtherCAT device...\n");
+		ecdev_close(rtl_ec_dev);
+		printk(KERN_INFO "Unregistering EtherCAT device...\n");
 		ecdev_unregister(ec_device_master_index, rtl_ec_dev);
 		rtl_ec_dev = NULL;
 	}
diff --git a/devices/ecdev.h b/devices/ecdev.h
index 0d58163fa70a2f2c32b96f1fb419535212f61d4c..ae3e86e5c14467e9fab003de06b3a02ad7de1fd5 100644
--- a/devices/ecdev.h
+++ b/devices/ecdev.h
@@ -74,6 +74,8 @@ void ecdev_unregister(unsigned int master_index, ec_device_t *device);
 /*****************************************************************************/
 // Device methods
 
+int ecdev_open(ec_device_t *device);
+int ecdev_close(ec_device_t *device);
 void ecdev_receive(ec_device_t *device, const void *data, size_t size);
 void ecdev_link_state(ec_device_t *device, uint8_t newstate);
 
diff --git a/master/module.c b/master/module.c
index f18092b228aa4f18ffd97c8bcd66a8a04c83d5b9..e170de496b866bdae83fe6b64babcc793c273c13 100644
--- a/master/module.c
+++ b/master/module.c
@@ -311,19 +311,9 @@ ec_device_t *ecdev_register(unsigned int master_index, /**< master index */
         goto out_free;
     }
 
-    if (ec_device_open(master->device)) {
-        EC_ERR("Failed to open device!\n");
-        goto out_clear;
-    }
-
     up(&master->device_sem);
-
-    ec_master_enter_idle_mode(master);
-
     return master->device;
 
- out_clear:
-    ec_device_clear(master->device);
  out_free:
     kfree(master->device);
     master->device = NULL;
@@ -352,11 +342,6 @@ void ecdev_unregister(unsigned int master_index, /**< master index */
 
     if (!(master = ec_find_master(master_index))) return;
 
-    ec_master_leave_idle_mode(master);
-
-    if (ec_device_close(master->device))
-        EC_WARN("Failed to close device!\n");
-
     down(&master->device_sem);
 
     if (!master->device || master->device != device) {
@@ -372,6 +357,41 @@ void ecdev_unregister(unsigned int master_index, /**< master index */
     up(&master->device_sem);
 }
 
+/*****************************************************************************/
+
+/**
+   Opens the network device and makes the master enter IDLE mode.
+   \return 0 on success, else < 0
+   \ingroup DeviceInterface
+*/
+
+int ecdev_open(ec_device_t *device /**< EtherCAT device */)
+{
+    if (ec_device_open(device)) {
+        EC_ERR("Failed to open device!\n");
+        return -1;
+    }
+
+    ec_master_enter_idle_mode(device->master);
+    return 0;
+}
+
+/*****************************************************************************/
+
+/**
+   Makes the master leave IDLE mode and closes the network device.
+   \return 0 on success, else < 0
+   \ingroup DeviceInterface
+*/
+
+void ecdev_close(ec_device_t *device /**< EtherCAT device */)
+{
+    ec_master_leave_idle_mode(device->master);
+
+    if (ec_device_close(device))
+        EC_WARN("Failed to close device!\n");
+}
+
 /******************************************************************************
  *  Realtime interface
  *****************************************************************************/
@@ -465,6 +485,8 @@ module_exit(ec_cleanup_module);
 
 EXPORT_SYMBOL(ecdev_register);
 EXPORT_SYMBOL(ecdev_unregister);
+EXPORT_SYMBOL(ecdev_open);
+EXPORT_SYMBOL(ecdev_close);
 EXPORT_SYMBOL(ecrt_request_master);
 EXPORT_SYMBOL(ecrt_release_master);