diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,5 @@
+# Revision history for mu-haskell
+
+## 0.1.0.0 -- YYYY-mm-dd
+
+* First version. Released on an unsuspecting world.
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright © 2019-2020 47 Degrees. <http://47deg.com>
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/mu-rpc.cabal b/mu-rpc.cabal
new file mode 100644
--- /dev/null
+++ b/mu-rpc.cabal
@@ -0,0 +1,35 @@
+cabal-version:       >=1.10
+name:                mu-rpc
+version:             0.1.0.0
+synopsis:            Protocol-independent declaration of services and servers
+description:         Protocol-independent declaration of services and servers for mu-haskell
+license:             Apache-2.0
+license-file:        LICENSE
+author:              Alejandro Serrano, Flavio Corpa
+maintainer:          alejandro.serrano@47deg.com
+copyright:           Copyright © 2019-2020 <http://47deg.com 47 Degrees>
+category:            Network
+build-type:          Simple
+extra-source-files:  CHANGELOG.md
+homepage:            https://higherkindness.io/mu-haskell/
+bug-reports:         https://github.com/higherkindness/mu-haskell/issues
+
+source-repository head
+  type:     git
+  location: https://github.com/higherkindness/mu-haskell
+
+library
+  exposed-modules:     Mu.Rpc,
+                       Mu.Server,
+                       Mu.Rpc.Examples
+  build-depends:       base >=4.12 && <5
+                     , conduit
+                     , mtl
+                     , mu-schema
+                     , sop-core
+                     , template-haskell
+                     , text
+  hs-source-dirs:      src
+  default-language:    Haskell2010
+  ghc-options:         -Wall
+                       -fprint-potential-instances
diff --git a/src/Mu/Rpc.hs b/src/Mu/Rpc.hs
new file mode 100644
--- /dev/null
+++ b/src/Mu/Rpc.hs
@@ -0,0 +1,92 @@
+{-# language ConstraintKinds           #-}
+{-# language DataKinds                 #-}
+{-# language ExistentialQuantification #-}
+{-# language GADTs                     #-}
+{-# language PolyKinds                 #-}
+{-# language TypeFamilies              #-}
+{-# language TypeOperators             #-}
+{-# language UndecidableInstances      #-}
+{-|
+Description : Protocol-independent declaration of services
+
+This module defines a type-level language to describe
+RPC-like microservices independently of the transport
+and protocol.
+-}
+module Mu.Rpc (
+  Service', Service(..)
+, ServiceAnnotation, Package, FindPackageName
+, Method(..), (:-->:)
+, TypeRef(..), Argument(..), Return(..)
+) where
+
+import           Data.Kind
+import           GHC.TypeLits
+import qualified Language.Haskell.TH as TH
+
+import           Mu.Schema
+import           Mu.Schema.Registry
+
+-- | Services whose names are given by type-level strings.
+type Service' = Service Symbol Symbol
+-- | Annotations for services. At this moment, such
+--   annotations can be of any type.
+type ServiceAnnotation = Type
+
+-- | A service is a set of methods.
+data Service serviceName methodName
+  = Service serviceName [ServiceAnnotation] [Method methodName]
+
+-- | An annotation to define a package name.
+--   This is used by some handlers, like gRPC.
+data Package (s :: Symbol)
+
+-- | Find the 'Package' for a service, to be found
+--   as part of the annotations.
+type family FindPackageName (anns :: [ServiceAnnotation]) :: Symbol where
+  FindPackageName '[] = TypeError ('Text "Cannot find package name for the service")
+  FindPackageName (Package s ': rest) = s
+  FindPackageName (other     ': rest) = FindPackageName rest
+
+-- | A method is defined by its name, arguments, and return type.
+data Method methodName
+  = Method methodName [ServiceAnnotation] [Argument] Return
+
+-- | Look up a method in a service definition using its name.
+--   Useful to declare handlers like @HandlerIO (MyService :-->: "MyMethod")@.
+type family (:-->:) (s :: Service snm mnm) (m :: mnm) :: Method mnm where
+  'Service sname anns methods :-->: m = LookupMethod methods m
+
+type family LookupMethod (s :: [Method mnm]) (m :: snm) :: Method snm where
+  LookupMethod '[] m = TypeError ('Text "could not find method " ':<>: 'ShowType m)
+  LookupMethod ('Method m anns args r ': ms) m = 'Method m anns args r
+  LookupMethod (other                 ': ms) m = LookupMethod ms m
+
+-- | Defines how to handle the type
+data TypeRef where
+  ViaSchema   :: Schema typeName fieldName -> typeName -> TypeRef
+  -- | Registry subject, type to convert to, and preferred serialization version
+  ViaRegistry :: Registry -> Type -> Nat -> TypeRef
+  -- | To be used only during TH generation!
+  ViaTH       :: TH.Type -> TypeRef
+
+-- | Defines the way in which arguments are handled.
+data Argument where
+  -- | Use a single value.
+  ArgSingle :: TypeRef -> Argument
+  -- | Consume a stream of values.
+  ArgStream :: TypeRef -> Argument
+
+-- | Defines the different possibilities for returning
+--   information from a method.
+data Return where
+  -- | Fire and forget.
+  RetNothing :: Return
+  -- | Return a single value.
+  RetSingle :: TypeRef -> Return
+  -- | Return a value or an error
+  --   (this can be found in Avro IDL).
+  RetThrows :: TypeRef -> TypeRef -> Return
+  -- | Return a stream of values
+  --   (this can be found in gRPC).
+  RetStream :: TypeRef -> Return
diff --git a/src/Mu/Rpc/Examples.hs b/src/Mu/Rpc/Examples.hs
new file mode 100644
--- /dev/null
+++ b/src/Mu/Rpc/Examples.hs
@@ -0,0 +1,89 @@
+{-# language DataKinds             #-}
+{-# language DeriveAnyClass        #-}
+{-# language DeriveGeneric         #-}
+{-# language FlexibleContexts      #-}
+{-# language FlexibleInstances     #-}
+{-# language GADTs                 #-}
+{-# language MultiParamTypeClasses #-}
+{-# language OverloadedStrings     #-}
+{-# language PartialTypeSignatures #-}
+{-# language PolyKinds             #-}
+{-# language ScopedTypeVariables   #-}
+{-# language StandaloneDeriving    #-}
+{-# language TypeFamilies          #-}
+{-# language TypeOperators         #-}
+{-# language ViewPatterns          #-}
+{-# OPTIONS_GHC -fno-warn-partial-type-signatures #-}
+{-|
+Description : Examples for service and server definitions
+
+Look at the source code of this module.
+-}
+module Mu.Rpc.Examples where
+
+import           Data.Conduit
+import           Data.Conduit.Combinators as C
+import           Data.Functor.MaybeLike
+import qualified Data.Text                as T
+import           GHC.Generics
+
+import           Mu.Rpc
+import           Mu.Schema
+import           Mu.Server
+
+-- Defines the service from gRPC Quickstart
+-- https://grpc.io/docs/quickstart/python/
+
+type QuickstartSchema
+  = '[ 'DRecord "HelloRequest"
+               '[ 'FieldDef "name" ('TPrimitive T.Text) ]
+     , 'DRecord "HelloResponse"
+                '[ 'FieldDef "message" ('TPrimitive T.Text) ]
+     , 'DRecord "HiRequest"
+               '[ 'FieldDef "number" ('TPrimitive Int) ]
+     ]
+
+type QuickStartService
+  = 'Service "Greeter" '[Package "helloworld"]
+      '[ 'Method "SayHello" '[]
+                 '[ 'ArgSingle ('ViaSchema QuickstartSchema "HelloRequest") ]
+                 ('RetSingle ('ViaSchema QuickstartSchema "HelloResponse"))
+       , 'Method "SayHi" '[]
+                 '[ 'ArgSingle ('ViaSchema QuickstartSchema "HiRequest")]
+                 ('RetStream ('ViaSchema QuickstartSchema "HelloResponse"))
+       , 'Method "SayManyHellos" '[]
+                 '[ 'ArgStream ('ViaSchema QuickstartSchema "HelloRequest")]
+                 ('RetStream ('ViaSchema QuickstartSchema "HelloResponse")) ]
+
+newtype HelloRequest f = HelloRequest { name :: f T.Text } deriving (Generic)
+deriving instance Functor f => ToSchema f QuickstartSchema "HelloRequest" (HelloRequest f)
+deriving instance Functor f => FromSchema f QuickstartSchema "HelloRequest" (HelloRequest f)
+
+newtype HelloResponse f = HelloResponse { message :: f T.Text } deriving (Generic)
+deriving instance Functor f => ToSchema f QuickstartSchema "HelloResponse" (HelloResponse f)
+deriving instance Functor f => FromSchema f QuickstartSchema "HelloResponse" (HelloResponse f)
+
+newtype HiRequest f = HiRequest { number :: f Int } deriving (Generic)
+deriving instance Functor f => ToSchema f QuickstartSchema "HiRequest" (HiRequest f)
+deriving instance Functor f => FromSchema f QuickstartSchema "HiRequest" (HiRequest f)
+
+quickstartServer :: forall m f.
+                    (MonadServer m, Applicative f, MaybeLike f)
+                 => ServerT f QuickStartService m _
+quickstartServer
+  = Server (sayHello :<|>: sayHi :<|>: sayManyHellos :<|>: H0)
+  where sayHello :: HelloRequest f -> m (HelloResponse f)
+        sayHello (HelloRequest nm)
+          = return (HelloResponse (("hi, " <>) <$> nm))
+        sayHi :: HiRequest f
+              -> ConduitT (HelloResponse f) Void m ()
+              -> m ()
+        sayHi (HiRequest (likeMaybe -> Just n)) sink
+          = runConduit $ C.replicate n (HelloResponse $ pure "hi!") .| sink
+        sayHi (HiRequest _) sink
+          = runConduit $ return () .| sink
+        sayManyHellos :: ConduitT () (HelloRequest f) m ()
+                      -> ConduitT (HelloResponse f) Void m ()
+                      -> m ()
+        sayManyHellos source sink
+          = runConduit $ source .| C.mapM sayHello .| sink
diff --git a/src/Mu/Server.hs b/src/Mu/Server.hs
new file mode 100644
--- /dev/null
+++ b/src/Mu/Server.hs
@@ -0,0 +1,146 @@
+{-# language ConstraintKinds           #-}
+{-# language DataKinds                 #-}
+{-# language ExistentialQuantification #-}
+{-# language FlexibleContexts          #-}
+{-# language FlexibleInstances         #-}
+{-# language GADTs                     #-}
+{-# language MultiParamTypeClasses     #-}
+{-# language PolyKinds                 #-}
+{-# language RankNTypes                #-}
+{-# language TypeFamilies              #-}
+{-# language TypeOperators             #-}
+{-# language UndecidableInstances      #-}
+{-|
+Description : Protocol-independent declaration of servers.
+
+A server (represented by 'ServerT') is a sequence
+of handlers (represented by 'HandlersT'), one for each
+operation in the corresponding Mu service declaration.
+
+In general, you should declare a server as:
+
+> server :: MonadServer m => ServerT w MyService m _
+> server = Server (h1 :<|>: h2 :<|>: ... :<|>: H0)
+
+where each of @h1@, @h2@, ... handles each method in
+@MyService@ /in the order they were declared/.
+The @_@ in the type allows GHC to fill in the boring
+and long type you would need to write there otherwise.
+
+/Implementation note/: exceptions raised in handlers
+produce an error to be sent as response to the client.
+We recommend you to catch exceptions and return custom
+'ServerError's instead.
+-}
+module Mu.Server (
+  -- * Servers and handlers
+  MonadServer, ServerT(..), HandlersT(..)
+  -- ** Simple servers using only IO
+, ServerErrorIO, ServerIO
+  -- * Errors which might be raised
+, serverError, ServerError(..), ServerErrorCode(..)
+  -- ** Useful when you do not want to deal with errors
+, alwaysOk
+) where
+
+import           Control.Monad.Except
+import           Data.Conduit
+import           Data.Kind
+
+import           Mu.Rpc
+import           Mu.Schema
+
+-- | Constraint for monads that can be used as servers
+type MonadServer m = (MonadError ServerError m, MonadIO m)
+-- | Simplest monad which satisfies 'MonadServer'.
+type ServerErrorIO = ExceptT ServerError IO
+-- | Simple 'ServerT' which uses only 'IO' and errors.
+type ServerIO w srv = ServerT w srv ServerErrorIO
+
+-- | Stop the current handler,
+--   returning an error to the client.
+serverError :: (MonadError ServerError m)
+            => ServerError -> m a
+serverError = throwError
+
+-- | Wrapper for handlers which do not use errors.
+--   Remember that any exception raised in 'IO'
+--   is propagated to the client.
+alwaysOk :: (MonadIO m)
+         => IO a -> m a
+alwaysOk = liftIO
+
+-- | Errors raised in a handler.
+data ServerError
+  = ServerError ServerErrorCode String
+
+-- | Possible types of errors.
+--   Some of these are handled in a special way
+--   by different transpoprt layers.
+data ServerErrorCode
+  = Unknown
+  | Unavailable
+  | Unimplemented
+  | Unauthenticated
+  | Internal
+  | Invalid
+  | NotFound
+  deriving (Eq, Show)
+
+-- | Definition of a complete server for a service.
+data ServerT (w :: Type -> Type) (s :: Service snm mnm) (m :: Type -> Type) (hs :: [Type]) where
+  Server :: HandlersT w methods m hs -> ServerT w ('Service sname anns methods) m hs
+
+infixr 5 :<|>:
+-- | 'HandlersT' is a sequence of handlers.
+--   Note that the handlers for your service
+--   must appear __in the same order__ as they
+--   are defined.
+--
+--   In general you can choose any type you want
+--   for your handlers, due to the following restrictions:
+--
+--   * Haskell types must be convertible to the
+--     corresponding schema type. In other words,
+--     they must implement 'FromSchema' if they are
+--     inputs, and 'ToSchema' if they are outputs.
+--   * Normal returns are represented by returning
+--     the corresponding Haskell type.
+--   * Input streams turn into @Conduit () t m ()@,
+--     where @t@ is the Haskell type for that schema type.
+--   * Output streams turn into an __additional argument__
+--     of type @Conduit t Void m ()@. This stream should
+--     be connected to a source to get the elements.
+data HandlersT (w :: Type -> Type) (methods :: [Method mnm]) (m :: Type -> Type) (hs :: [Type]) where
+  H0 :: HandlersT w '[] m '[]
+  (:<|>:) :: Handles w args ret m h => h -> HandlersT w ms m hs
+          -> HandlersT w ('Method name anns args ret ': ms) m (h ': hs)
+
+-- Define a relation for handling
+class Handles (w :: Type -> Type) (args :: [Argument]) (ret :: Return)
+              (m :: Type -> Type) (h :: Type)
+class ToRef (w :: Type -> Type) (ref :: TypeRef) (t :: Type)
+class FromRef (w :: Type -> Type) (ref :: TypeRef) (t :: Type)
+
+-- Type references
+instance ToSchema w sch sty t => ToRef w ('ViaSchema sch sty) t
+instance ToRef w ('ViaRegistry subject t last) t
+instance FromSchema w sch sty t => FromRef w ('ViaSchema sch sty) t
+instance FromRef w ('ViaRegistry subject t last) t
+
+-- Arguments
+instance (FromRef w ref t, Handles w args ret m h,
+          handler ~ (t -> h))
+         => Handles w ('ArgSingle ref ': args) ret m handler
+instance (MonadError ServerError m, FromRef w ref t, Handles w args ret m h,
+          handler ~ (ConduitT () t m () -> h))
+         => Handles w ('ArgStream ref ': args) ret m handler
+-- Result with exception
+instance (MonadError ServerError m, handler ~ m ())
+         => Handles w '[] 'RetNothing m handler
+instance (MonadError ServerError m, ToRef w eref e, ToRef w vref v, handler ~ m (Either e v))
+         => Handles w '[] ('RetThrows eref vref) m handler
+instance (MonadError ServerError m, ToRef w ref v, handler ~ m v)
+         => Handles w '[] ('RetSingle ref) m handler
+instance (MonadError ServerError m, ToRef w ref v, handler ~ (ConduitT v Void m () -> m ()))
+         => Handles w '[] ('RetStream ref) m handler
