Rewrited from scratch