major frontend refactor, closes #96