add some alternate implementations