Frank Qu's implementation