Co-authored-by: Adam Shiervani <adam.shiervani@gmail.com>
Reimplement #141 since we've changed everything since