Add extensive documentation