More implementations and better structure