When one is using arrays of fundamental types such as doubles, using MPI is reasonably straight-forward. When one needs to use MPI to transmit complicated data structures, pointers, and other opaque types whose internals may be not known by the programmer, using MPI becomes significantly more difficult. The MPI standard has facilities to dynamically define new message types in order to pass such between nodes using MPI_Datatype along with a number of functions to register and deregister such types. This talk will introduce how to properly use MPI_Datatype to transmit non-trivial, custom opaque data structures between MPI nodes using C++. Since using such MPI calls is rather low-level, the talk will also introduce how to exploit the features of C++ to more easily accomplish the same at a higher-level.