(Work in Progress: API is likely to change)