Add initial version. TO BE CONTINUED AND POLISHED.