I really don't know that much about Berlin, except that they take a very different
approach than Crust. In berlin almost everything is handled in the server. This
to increase the network transparency. Crust does the total opposite - it tries to
put as much as possible in the client (i.e., in the client library).

When it comes to X: it has too many levels between the user and the hardware, which
creates a lot of overhead. For example, look at the Gnome program-to-hardware
interface: