Initial skeleton. Need to do some design to improve it.