change generic parameters
add comments & update interfaces