Full api refactor, made it more fluent