Dynamic data redistributions in data-parallel languages like HPF address the demands posed by advanced applications with different computational kernels or dynamically varying processor workloads and are a major means for improving the performance. On the other hand, redistributions can be very expensive and significantly degrade a program's performance. In this article, we present a powerful and flexible approach for avoiding unnecessary remappings by eliminating partially dead and partially redundant distribution changes. Basically, this approach evolves from extending and combining two algorithms for these optimizations for sequential programs. In contrast to the sequential setting, the data-parallel setting leads to a hierarchy of algorithms of varying power and efficiency. The flexibility resulting from this makes it easy to trade efficiency against power according to a user's requirements. The approach is demonstrated by several illustrating examples.