Nowadays distributed computer systems are widely used and their technology has reached a certain degree of maturity. However, even with substantial research efforts on this topic, understanding the behavior of a distributed program still remains to be a challengeable work. This is caused mainly by distributed program``s nondeterminism which complicates the design, understanding, and analysis of distributed programs. {\em{Causal order}} algorithm ensures that every transmitted message is delivered in causal order. It provides a built-in message synchronization and relieves the programmer from inconsistencies due to transmission delays in a distributed computation. It should be noted that control information should be transmitted with each message in order to enforce causal order. Hence, it is important to reduce this communication overhead because the impact of the overhead increases proportionally with the number of recipients. To reduce communication overhead, we analyze all valid communication patterns and group them into 5 abstract communication patterns. From these abstract communication patterns, we identify redundant information which is not strictly required in preserving causal order. Efficient causal order algorithms should transmit redundant information as small as possible. We classify redundant information into two categories: first order redundant information and second order redundant information. First order redundant information is control information which is not strictly necessary for enforcing causal order and is classified into four types: information regarding {\em{just delivered, already delivered, just replaced}}, and {\em{already replaced}} messages. Elimination of first order redundant information results in retaining only causal dependents that are explicitly required for preserving causal order. But, if control information which is not included in the first order redundant information is sent more than once to a certain process, then ...