too much to write here, will do later