#define MAX_CHANNELS   64
 #define STRING_SIZE    80
 
-static struct class *most_class;
-static struct device core_dev;
 static struct ida mdev_id;
 static int dummy_num_buffers;
 
+static struct mostcore {
+       struct device dev;
+       struct device_driver drv;
+       struct bus_type bus;
+       struct class *class;
+       struct list_head mod_list;
+} mc;
+
+#define to_driver(d) container_of(d, struct mostcore, drv);
+
 struct pipe {
        struct most_aim *aim;
        int refs;
                return 1;
 }
 
-/**
- * Instantiation of the MOST bus
- */
-static struct bus_type most_bus = {
-       .name = "most",
-       .match = most_match,
-};
-
-/**
- * Instantiation of the core driver
- */
-static struct device_driver mostcore = {
-       .name = "mostcore",
-       .bus = &most_bus,
-};
-
 static inline void trash_mbo(struct mbo *mbo)
 {
        unsigned long flags;
                return -EINVAL;
        }
        aim->dev.init_name = aim->name;
-       aim->dev.bus = &most_bus;
-       aim->dev.parent = &core_dev;
+       aim->dev.bus = &mc.bus;
+       aim->dev.parent = &mc.dev;
        aim->dev.groups = aim_attr_groups;
        aim->dev.release = release_aim;
        ret = device_register(&aim->dev);
        list_add_tail(&inst->list, &instance_list);
        snprintf(name, STRING_SIZE, "mdev%d", id);
        iface->dev.init_name = name;
-       iface->dev.bus = &most_bus;
-       iface->dev.parent = &core_dev;
+       iface->dev.bus = &mc.bus;
+       iface->dev.parent = &mc.dev;
        iface->dev.groups = interface_attr_groups;
        iface->dev.release = release_interface;
        if (device_register(&iface->dev)) {
        INIT_LIST_HEAD(&instance_list);
        ida_init(&mdev_id);
 
-       err = bus_register(&most_bus);
+       mc.bus.name = "most",
+       mc.bus.match = most_match,
+       mc.drv.name = "most_core",
+       mc.drv.bus = &mc.bus,
+
+       err = bus_register(&mc.bus);
        if (err) {
                pr_info("Cannot register most bus\n");
                return err;
        }
-
-       most_class = class_create(THIS_MODULE, "most");
-       if (IS_ERR(most_class)) {
+       mc.class = class_create(THIS_MODULE, "most");
+       if (IS_ERR(mc.class)) {
                pr_info("No udev support.\n");
-               err = PTR_ERR(most_class);
+               err = PTR_ERR(mc.class);
                goto exit_bus;
        }
 
-       err = driver_register(&mostcore);
+       err = driver_register(&mc.drv);
        if (err) {
                pr_info("Cannot register core driver\n");
                goto exit_class;
        }
-
-       core_dev.init_name = "most_bus";
-       core_dev.release = release_most_sub;
-       if (device_register(&core_dev)) {
+       mc.dev.init_name = "most_bus";
+       mc.dev.release = release_most_sub;
+       if (device_register(&mc.dev)) {
                err = -ENOMEM;
                goto exit_driver;
        }
        return 0;
 
 exit_driver:
-       driver_unregister(&mostcore);
+       driver_unregister(&mc.drv);
 exit_class:
-       class_destroy(most_class);
+       class_destroy(mc.class);
 exit_bus:
-       bus_unregister(&most_bus);
+       bus_unregister(&mc.bus);
        return err;
 }
 
 static void __exit most_exit(void)
 {
        pr_info("exit core module\n");
-       device_unregister(&core_dev);
-       driver_unregister(&mostcore);
-       class_destroy(most_class);
-       bus_unregister(&most_bus);
+       device_unregister(&mc.dev);
+       driver_unregister(&mc.drv);
+       class_destroy(mc.class);
+       bus_unregister(&mc.bus);
        ida_destroy(&mdev_id);
 }