Need testing(almost ok all)
Almost done