Very similar structure, but has different functionalities. Think these two classes can be combined, but it's better to do it in another PR.