Full implementaion