simplified to bilinear
refactored modules