potentially good data model, will polish and rebase soon