refactored push/pull