add some more low-level functions