Storage virtualization is becoming more and more important due to the increasing gap between application requirements and the limited functionality offered by storage systems. In this work we propose Violin, a virtualization framework that allows easy extensions of block-level storage stacks. Violin allows developers to provide new virtualization functions and storage administrators to combine these functions in storage hierarchies with rich semantics. Violin makes it easy to develop such new functions by providing support for (i) hierarchy awareness and arbitrary mapping of blocks between virtual devices, (ii) explicit control over both the request and completion path of I/O requests, and (iii) persistent metadata management. To demonstrate the effectiveness of our approach we evaluate Violin in three ways: (i) We loosely compare the complexity of providing new virtual modules in Violin with the traditional approach of writing monolithic drivers. In many cases, adding new modules i...