modified into inperfect when fairloss