refactored basic implementations