Working implementation with 3 methods