First complete pass. Still missing undo, redo, save, load.