abstract changed, still needs more work