change reason: divede into many parts in order to maintain easily