separate for future appengine use