The ZMQShell uses a ZMQDisplayHook object defined in IPython/zmq/zmqshell.py, which inherits from the DisplayHook in core. But there's also a DisplayHook defined separately in IPython/zmq/displayhook.py, which seems to be used by the parallel engine.
This is a little confusing - the two classes should probably both be in IPython/zmq/displayhook.py, and could also have clearer names - perhaps ZMQDisplayHook and ZMQRichDisplayHook.
The hook in zmq.displayhook is a generic one that could be used any time you want to forward display over zeromq. The hook in zmq.zmqshell is a subclass that adds the extra bits an InteractiveShell expects.
I don't see a reason not to put them both in zmq.displayhook. I wouldn't choose RichDisplayHook as the name for the InteractiveShell-bound one. Maybe ZMQDisplayHook and ZMQShellDisplayHook, since the latter is for use in the ZMQShell?
this was closed by PR #527