return 0;
 }
 
-static void dvbsky_exit(struct dvb_usb_device *d)
+static int dvbsky_frontend_detach(struct dvb_usb_adapter *adap)
 {
+       struct dvb_usb_device *d = adap_to_d(adap);
        struct dvbsky_state *state = d_to_priv(d);
-       struct dvb_usb_adapter *adap = &d->adapter[0];
+
+       dev_dbg(&d->udev->dev, "%s: adap=%d\n", __func__, adap->id);
 
        dvb_module_release(state->i2c_client_tuner);
        dvb_module_release(state->i2c_client_demod);
        dvb_module_release(state->i2c_client_ci);
 
-       adap->fe[0] = NULL;
+       return 0;
 }
 
 /* DVB USB Driver stuff */
 
        .i2c_algo         = &dvbsky_i2c_algo,
        .frontend_attach  = dvbsky_s960_attach,
+       .frontend_detach  = dvbsky_frontend_detach,
        .init             = dvbsky_init,
        .get_rc_config    = dvbsky_get_rc_config,
        .streaming_ctrl   = dvbsky_streaming_ctrl,
        .identify_state   = dvbsky_identify_state,
-       .exit             = dvbsky_exit,
        .read_mac_address = dvbsky_read_mac_addr,
 
        .num_adapters = 1,
 
        .i2c_algo         = &dvbsky_i2c_algo,
        .frontend_attach  = dvbsky_s960c_attach,
+       .frontend_detach  = dvbsky_frontend_detach,
        .init             = dvbsky_init,
        .get_rc_config    = dvbsky_get_rc_config,
        .streaming_ctrl   = dvbsky_streaming_ctrl,
        .identify_state   = dvbsky_identify_state,
-       .exit             = dvbsky_exit,
        .read_mac_address = dvbsky_read_mac_addr,
 
        .num_adapters = 1,
 
        .i2c_algo         = &dvbsky_i2c_algo,
        .frontend_attach  = dvbsky_t680c_attach,
+       .frontend_detach  = dvbsky_frontend_detach,
        .init             = dvbsky_init,
        .get_rc_config    = dvbsky_get_rc_config,
        .streaming_ctrl   = dvbsky_streaming_ctrl,
        .identify_state   = dvbsky_identify_state,
-       .exit             = dvbsky_exit,
        .read_mac_address = dvbsky_read_mac_addr,
 
        .num_adapters = 1,
 
        .i2c_algo         = &dvbsky_i2c_algo,
        .frontend_attach  = dvbsky_t330_attach,
+       .frontend_detach  = dvbsky_frontend_detach,
        .init             = dvbsky_init,
        .get_rc_config    = dvbsky_get_rc_config,
        .streaming_ctrl   = dvbsky_streaming_ctrl,
        .identify_state   = dvbsky_identify_state,
-       .exit             = dvbsky_exit,
        .read_mac_address = dvbsky_read_mac_addr,
 
        .num_adapters = 1,
 
        .i2c_algo         = &dvbsky_i2c_algo,
        .frontend_attach  = dvbsky_mygica_t230c_attach,
+       .frontend_detach  = dvbsky_frontend_detach,
        .init             = dvbsky_init,
        .get_rc_config    = dvbsky_get_rc_config,
        .streaming_ctrl   = dvbsky_streaming_ctrl,
        .identify_state   = dvbsky_identify_state,
-       .exit             = dvbsky_exit,
 
        .num_adapters = 1,
        .adapter = {