Share tags2

Supersedes #11351.
The user needs to be passed in, either through the constructor or the method, but Id prefer getDisplayName($userName), but I'm unsure if it is a good idea to do this in the backend. IMHO this belongs to the frontend