diff --git a/TODO b/TODO
index e69774124715ed3521f6462352afc611d5ce62e1..8e25a8b371d9463ced8cd225f86a246e0ba2d8b2 100644
--- a/TODO
+++ b/TODO
@@ -8,33 +8,19 @@ $Id$
 
 Important things to do:
 
-* Add Kobjects in constructors.
-
 * Read AL Status Code with AL Control Response (if possible?)
-
 * Coupling of EoE handlers before configuring slaves.
   (avoiding duplicate configuration)
-
-* SysFS interface
-  - Add secondary slave address
-  - Add SDO dictionary
-
 * Implement all EtherCAT commands
-
 * Determine number of frames the NIC can handle
-
-* Implement eepro100 driver
-
-* Progress bar in ecrt.
+* Implement e100 driver
 
 -------------------------------------------------------------------------------
 
 Not-so-important things to do:
 
 * Calculate bus topology
-
 * File access over EtherCAT (FoE)
-
 * Allow VLAN tagging
 
 -------------------------------------------------------------------------------
diff --git a/master/canopen.c b/master/canopen.c
index ad144d8b9500e9b29f0e63fff94651c9b62a1ce1..6edfc447127eef5949eba989bad6e01e7becc8b4 100644
--- a/master/canopen.c
+++ b/master/canopen.c
@@ -122,6 +122,12 @@ int ec_sdo_init(ec_sdo_t *sdo, /**< SDO */
     sdo->kobj.parent = &slave->sdo_kobj;
     if (kobject_set_name(&sdo->kobj, "%4X", sdo->index)) {
         EC_ERR("Failed to set kobj name.\n");
+        kobject_put(&sdo->kobj);
+        return -1;
+    }
+    if (kobject_add(&sdo->kobj)) {
+        EC_ERR("Failed to add SDO kobject.\n");
+        kobject_put(&sdo->kobj);
         return -1;
     }
 
@@ -222,6 +228,12 @@ int ec_sdo_entry_init(ec_sdo_entry_t *entry, /**< SDO entry */
     entry->kobj.parent = &sdo->kobj;
     if (kobject_set_name(&entry->kobj, "%i", entry->subindex)) {
         EC_ERR("Failed to set kobj name.\n");
+        kobject_put(&entry->kobj);
+        return -1;
+    }
+    if (kobject_add(&entry->kobj)) {
+        EC_ERR("Failed to add entry kobject.\n");
+        kobject_put(&entry->kobj);
         return -1;
     }
 
diff --git a/master/domain.c b/master/domain.c
index f15fcf6bf38209df44387bdd664709d701ef2b52..e409a97ed8acf710f5918c43e624b8e8896eb6d9 100644
--- a/master/domain.c
+++ b/master/domain.c
@@ -120,6 +120,12 @@ int ec_domain_init(ec_domain_t *domain, /**< EtherCAT domain */
     domain->kobj.parent = &master->kobj;
     if (kobject_set_name(&domain->kobj, "domain%i", index)) {
         EC_ERR("Failed to set kobj name.\n");
+        kobject_put(&domain->kobj);
+        return -1;
+    }
+    if (kobject_add(&domain->kobj)) {
+        EC_ERR("Failed to add domain kobject.\n");
+        kobject_put(&domain->kobj);
         return -1;
     }
 
diff --git a/master/fsm.c b/master/fsm.c
index f9bff44c102d95342dde74368187240d58e9d218..d48aeb3a95cf674a6de4bee1bf98a5566e9186ca 100644
--- a/master/fsm.c
+++ b/master/fsm.c
@@ -275,14 +275,6 @@ void ec_fsm_master_broadcast(ec_fsm_t *fsm /**< finite state machine */)
                 return;
             }
 
-            if (kobject_add(&slave->kobj)) {
-                EC_ERR("Failed to add kobject.\n");
-                kobject_put(&slave->kobj); // free
-                ec_master_destroy_slaves(master);
-                fsm->master_state = ec_fsm_master_error;
-                return;
-            }
-
             list_add_tail(&slave->list, &master->slaves);
         }
 
@@ -388,14 +380,6 @@ void ec_fsm_master_action_process_states(ec_fsm_t *fsm
                        slave->ring_position);
             }
 
-            if (kobject_add(&slave->sdo_kobj)) {
-                EC_ERR("Failed to add SDO kobj of slave %i.\n",
-                       slave->ring_position);
-                slave->error_flag = 1;
-                fsm->master_state = ec_fsm_master_error;
-                return;
-            }
-
             slave->sdo_dictionary_fetched = 1;
 
             // start fetching SDO dictionary
diff --git a/master/fsm_coe.c b/master/fsm_coe.c
index 589b2dd498ef1559fe0cab58f029b1bc017c120c..7d92b6a09424822bb62d55c588026f27b5eaf473 100644
--- a/master/fsm_coe.c
+++ b/master/fsm_coe.c
@@ -413,13 +413,6 @@ void ec_fsm_coe_dict_response(ec_fsm_coe_t *fsm /**< finite state machine */)
             return;
         }
 
-        if (kobject_add(&sdo->kobj)) {
-            EC_ERR("Failed to add kobject.\n");
-            kobject_put(&sdo->kobj); // free
-            fsm->state = ec_fsm_coe_error;
-            return;
-        }
-
         list_add_tail(&sdo->list, &slave->sdo_dictionary);
     }
 
@@ -776,20 +769,15 @@ void ec_fsm_coe_dict_entry_response(ec_fsm_coe_t *fsm
     entry->bit_length = EC_READ_U16(data + 12);
 
     if (data_size) {
-        if (!(entry->description = kmalloc(data_size + 1, GFP_ATOMIC))) {
+        uint8_t *desc;
+        if (!(desc = kmalloc(data_size + 1, GFP_ATOMIC))) {
             EC_ERR("Failed to allocate SDO entry name!\n");
             fsm->state = ec_fsm_coe_error;
             return;
         }
-        memcpy(entry->description, data + 16, data_size);
-        entry->description[data_size] = 0;
-    }
-
-    if (kobject_add(&entry->kobj)) {
-        EC_ERR("Failed to add kobject.\n");
-        kobject_put(&entry->kobj); // free
-        fsm->state = ec_fsm_coe_error;
-        return;
+        memcpy(desc, data + 16, data_size);
+        desc[data_size] = 0;
+        entry->description = desc;
     }
 
     list_add_tail(&entry->list, &sdo->entries);
diff --git a/master/master.c b/master/master.c
index 9f9f528b3ffb80c2e8333d3a58dc4d7bfecbb2ca..d2b954495b5a924d4f500c0a8cc34fc890476495 100644
--- a/master/master.c
+++ b/master/master.c
@@ -203,6 +203,11 @@ int ec_master_init(ec_master_t *master, /**< EtherCAT master */
         kobject_put(&master->kobj);
         return -1;
     }
+    if (kobject_add(&master->kobj)) {
+        EC_ERR("Failed to add master kobj.\n");
+        kobject_put(&master->kobj);
+        return -1;
+    }
 
     return 0;
 
@@ -1271,7 +1276,7 @@ ec_domain_t *ecrt_master_create_domain(ec_master_t *master /**< master */)
 
     if (!(domain = (ec_domain_t *) kmalloc(sizeof(ec_domain_t), GFP_KERNEL))) {
         EC_ERR("Error allocating domain memory!\n");
-        goto out_return;
+        return NULL;
     }
 
     if (list_empty(&master->domains)) index = 0;
@@ -1282,21 +1287,12 @@ ec_domain_t *ecrt_master_create_domain(ec_master_t *master /**< master */)
 
     if (ec_domain_init(domain, master, index)) {
         EC_ERR("Failed to init domain.\n");
-        goto out_return;
-    }
-
-    if (kobject_add(&domain->kobj)) {
-        EC_ERR("Failed to add domain kobject.\n");
-        goto out_put;
+        return NULL;
     }
 
     list_add_tail(&domain->list, &master->domains);
-    return domain;
 
- out_put:
-    kobject_put(&domain->kobj);
- out_return:
-    return NULL;
+    return domain;
 }
 
 /*****************************************************************************/
diff --git a/master/module.c b/master/module.c
index 7083cb0c017fab104cae3275e3e41e343e76f297..1d2ea6b1358dbe95e5f6eebe17494701927e769d 100644
--- a/master/module.c
+++ b/master/module.c
@@ -115,12 +115,6 @@ int __init ec_init_module(void)
         if (ec_master_init(master, i, ec_eoeif_count, device_number))
             goto out_free;
 
-        if (kobject_add(&master->kobj)) {
-            EC_ERR("Failed to add kobj.\n");
-            kobject_put(&master->kobj); // free master
-            goto out_free;
-        }
-
         list_add_tail(&master->list, &ec_masters);
     }
 
diff --git a/master/slave.c b/master/slave.c
index e388e45d5457694bb8438742a9dedc59bd798056..c64104a07b6f6dbd26f19df371ace3c44a0d291e 100644
--- a/master/slave.c
+++ b/master/slave.c
@@ -108,29 +108,6 @@ int ec_slave_init(ec_slave_t *slave, /**< EtherCAT slave */
     slave->ring_position = ring_position;
     slave->station_address = station_address;
 
-    // init kobject and add it to the hierarchy
-    memset(&slave->kobj, 0x00, sizeof(struct kobject));
-    kobject_init(&slave->kobj);
-    slave->kobj.ktype = &ktype_ec_slave;
-    slave->kobj.parent = &master->kobj;
-    if (kobject_set_name(&slave->kobj, "slave%03i", slave->ring_position)) {
-        EC_ERR("Failed to set kobject name.\n");
-        kobject_put(&slave->kobj);
-        return -1;
-    }
-
-    // init SDO kobject and add it to the hierarchy
-    memset(&slave->sdo_kobj, 0x00, sizeof(struct kobject));
-    kobject_init(&slave->sdo_kobj);
-    slave->sdo_kobj.ktype = &ktype_ec_slave_sdos;
-    slave->sdo_kobj.parent = &slave->kobj;
-    if (kobject_set_name(&slave->sdo_kobj, "sdos")) {
-        EC_ERR("Failed to set kobject name.\n");
-        kobject_put(&slave->sdo_kobj);
-        kobject_put(&slave->kobj);
-        return -1;
-    }
-
     slave->master = master;
 
     slave->requested_state = EC_SLAVE_STATE_UNKNOWN;
@@ -185,7 +162,42 @@ int ec_slave_init(ec_slave_t *slave, /**< EtherCAT slave */
         slave->sii_physical_layer[i] = 0xFF;
     }
 
+    // init kobject and add it to the hierarchy
+    memset(&slave->kobj, 0x00, sizeof(struct kobject));
+    kobject_init(&slave->kobj);
+    slave->kobj.ktype = &ktype_ec_slave;
+    slave->kobj.parent = &master->kobj;
+    if (kobject_set_name(&slave->kobj, "slave%03i", slave->ring_position)) {
+        EC_ERR("Failed to set kobject name.\n");
+        goto out_slave_put;
+    }
+    if (kobject_add(&slave->kobj)) {
+        EC_ERR("Failed to add slave's kobject.\n");
+        goto out_slave_put;
+    }
+
+    // init SDO kobject and add it to the hierarchy
+    memset(&slave->sdo_kobj, 0x00, sizeof(struct kobject));
+    kobject_init(&slave->sdo_kobj);
+    slave->sdo_kobj.ktype = &ktype_ec_slave_sdos;
+    slave->sdo_kobj.parent = &slave->kobj;
+    if (kobject_set_name(&slave->sdo_kobj, "sdos")) {
+        EC_ERR("Failed to set kobject name.\n");
+        goto out_sdo_put;
+    }
+    if (kobject_add(&slave->sdo_kobj)) {
+        EC_ERR("Failed to add SDOs kobject.\n");
+        goto out_sdo_put;
+    }
+
     return 0;
+
+ out_sdo_put:
+    kobject_put(&slave->sdo_kobj);
+    kobject_del(&slave->kobj);
+ out_slave_put:
+    kobject_put(&slave->kobj);
+    return -1;
 }
 
 /*****************************************************************************/
@@ -206,7 +218,7 @@ void ec_slave_destroy(ec_slave_t *slave /**< EtherCAT slave */)
     }
 
     // free SDO kobject
-    if (slave->sdo_dictionary_fetched) kobject_del(&slave->sdo_kobj);
+    kobject_del(&slave->sdo_kobj);
     kobject_put(&slave->sdo_kobj);
 
     // destroy self