Two types of message passing exist in PVM: (1) internal (between daemons and other daemons or user tasks), and (2) user (between two or more user processes enrolled into PVM).
User messages are identified by source address and a single user-controlled tag, which can be used by a task to filter incoming messages from multiple destinations. The lack of contexts prior to PVM 3.4 made safe message passing for libraries extremely difficult. Although the user could use a set of reserved tags, no guarantee existed for these tags being unique across the virtual machine, since they were user chosen and not system allocated.