First try, still needs a couple TODO