return r;
 }
 
-int tv_property_process(struct dvb_frontend *fe, tv_property_t *tvp)
+static int dvb_frontend_ioctl_legacy(struct inode *inode, struct file *file,
+                       unsigned int cmd, void *parg);
+static int dvb_frontend_ioctl_properties(struct inode *inode, struct file *file,
+                       unsigned int cmd, void *parg);
+
+int tv_property_process(struct dvb_frontend *fe, tv_property_t *tvp,
+       struct inode *inode, struct file *file)
 {
        int r = 0;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
        printk("%s()\n", __FUNCTION__);
        tv_property_dump(tvp);
 
                 */
                fe->tv_property_cache.state = TV_SEQ_COMPLETE;
                printk("%s() Finalised property cache\n", __FUNCTION__);
-               r = tv_property_cache_submit(fe);
+               r |= tv_property_cache_submit(fe);
+               r |= dvb_frontend_ioctl_legacy(inode, file, FE_SET_FRONTEND,
+                       &fepriv->parameters);
                break;
        case TV_SET_FREQUENCY:
                fe->tv_property_cache.frequency = tvp->u.data;
        case TV_GET_ISDB_LAYERC_SEGMENT_WIDTH:
                tvp->u.data = fe->tv_property_cache.isdb_layerc_segment_width;
                break;
-
+       case TV_SET_VOLTAGE:
+               fe->tv_property_cache.voltage = tvp->u.data;
+               r = dvb_frontend_ioctl_legacy(inode, file, FE_SET_VOLTAGE,
+                       &fe->tv_property_cache.voltage);
+               break;
+       case TV_GET_VOLTAGE:
+               tvp->u.data = fe->tv_property_cache.voltage;
+               break;
+       case TV_SET_TONE:
+               fe->tv_property_cache.sectone = tvp->u.data;
+               r = dvb_frontend_ioctl_legacy(inode, file, FE_SET_TONE,
+                       (void *)fe->tv_property_cache.sectone);
+               break;
+       case TV_GET_TONE:
+               tvp->u.data = fe->tv_property_cache.sectone;
+               break;
        }
 
-       return 0;
+       return r;
 }
 
 static int dvb_frontend_ioctl(struct inode *inode, struct file *file,
        struct dvb_frontend *fe = dvbdev->priv;
        struct dvb_frontend_private *fepriv = fe->frontend_priv;
        int err = -EOPNOTSUPP;
-       tv_property_t* tvp;
 
        dprintk ("%s\n", __func__);
 
        if (down_interruptible (&fepriv->sem))
                return -ERESTARTSYS;
 
+       if ((cmd == FE_SET_PROPERTY) || (cmd == FE_GET_PROPERTY))
+               err = dvb_frontend_ioctl_properties(inode, file, cmd, parg);
+       else
+               err = dvb_frontend_ioctl_legacy(inode, file, cmd, parg);
+
+       up(&fepriv->sem);
+       return err;
+}
+
+static int dvb_frontend_ioctl_properties(struct inode *inode, struct file *file,
+                       unsigned int cmd, void *parg)
+{
+       struct dvb_device *dvbdev = file->private_data;
+       struct dvb_frontend *fe = dvbdev->priv;
+       int err = -EOPNOTSUPP;
+       tv_property_t *tvp;
+
+       dprintk("%s\n", __func__);
+
        if(cmd == FE_SET_PROPERTY) {
                printk("%s() FE_SET_PROPERTY\n", __FUNCTION__);
 
                /* TODO: ioctl userdata out of range check here */
                tvp = parg;
                while(tvp->cmd != TV_SEQ_UNDEFINED) {
-                       tv_property_process(fe, tvp);
+                       tv_property_process(fe, tvp, inode, file);
                        if( (tvp->cmd == TV_SEQ_TERMINATE) || (tvp->cmd == TV_SEQ_COMPLETE) )
                                break;
                        tvp++;
 
                if(fe->tv_property_cache.state == TV_SEQ_COMPLETE) {
                        printk("%s() Property cache is full, tuning\n", __FUNCTION__);
-                       cmd = FE_SET_FRONTEND;
                }
                err = 0;
        }
 
+       return err;
+}
+
+static int dvb_frontend_ioctl_legacy(struct inode *inode, struct file *file,
+                       unsigned int cmd, void *parg)
+{
+       struct dvb_device *dvbdev = file->private_data;
+       struct dvb_frontend *fe = dvbdev->priv;
+       struct dvb_frontend_private *fepriv = fe->frontend_priv;
+       int err = -EOPNOTSUPP;
+
        switch (cmd) {
        case FE_GET_INFO: {
                struct dvb_frontend_info* info = parg;
                break;
        };
 
-       up (&fepriv->sem);
        return err;
 }