  Multitier programming languages reduce the complexity of developing
distributed systems by developing the distributed system in a single coherent
code base. The compiler or the runtime separate the code for the components of
the distributed system, enabling abstraction over low level implementation
details such as data representation, serialization and network protocols. Our
ScalaLoci language allows developers to declare the different components and
their architectural relation at the type level, allowing static reasoning about
about distribution and remote communication and guaranteeing static type safety
across components. The compiler splits the multitier program into the
component-specific code and automatically generates the communication
boilerplate. Communication between components can be modeled by declaratively
specifying data flows between components using reactive programming.
  In this paper, we report on the implementation of our design and our
experience with embedding our language features into Scala as a host language.
We show how a combination of Scala's advanced type level programming and its
macro system can be used to enrich the language with new abstractions. We
comment on the challenges we encountered and the solutions we developed for our
current implementation and outline suggestions for an improved macro system to
support the such use cases of embedding of domain-specific abstractions.
