diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,13 @@
+Copyright (c) kqr 2016
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,38 @@
+# udp-conduit
+
+Simple fire-and-forget style conduit parts (sources/sinks) for UDP traffic.
+
+Here's an example that sends a message to UDP port 8888 on localhost:
+
+    import Conduit
+    import Conduit.UDP
+    import Data.Text
+
+    message :: Text
+    message = "hello, world!\n"
+
+    main :: IO ()
+    main =
+        runConduitRes (yield message .| encodeUtf8C .| udpSink "127.0.0.1" 8888)
+
+Here's an example where we continuously receive messages on port 5666 on localhost:
+
+    import Conduit
+    import Conduit.UDP
+
+    main :: IO ()
+    main =
+        runConduitRes (udpSource "127.0.0.1" 5666 .| decodeUtf8C .| stdoutC)
+
+Now, here's an example where we receive messages on port 8001, transform them to
+upper-case, and then send them on to port 8002.
+
+    import Conduit
+    import Conduit.UDP
+    import Data.Char (toUpper)
+
+    main :: IO ()
+    main =
+        runConduitRes (udpSource "127.0.0.1" 8001 .| omapCE toUpper .| udpSink "127.0.0.1" 8002)
+
+Fun, huh? And simple!
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/src/Conduit/UDP.hs b/src/Conduit/UDP.hs
new file mode 100644
--- /dev/null
+++ b/src/Conduit/UDP.hs
@@ -0,0 +1,52 @@
+module Conduit.UDP where
+import Data.Void (Void)
+import Data.IOData (IOData)
+import Data.MonoTraversable (MonoFoldable)
+import System.IO (IOMode(ReadMode, WriteMode), Handle)
+import Network.Socket (Socket, SockAddr(SockAddrInet), PortNumber, setSocketOption, socketToHandle)
+import qualified Network.Socket as Socket
+import Conduit (ConduitM, MonadResource, sinkIOHandle, sourceIOHandle)
+
+
+data SocketType
+    = SourceSocket
+    | SinkSocket
+
+ioMode :: SocketType -> IOMode
+ioMode socketType =
+    case socketType of
+        SourceSocket -> ReadMode
+        SinkSocket -> WriteMode
+
+socketMode :: SocketType -> Socket -> SockAddr -> IO ()
+socketMode socketType =
+    case socketType of
+        SourceSocket -> Socket.bind
+        SinkSocket -> Socket.connect
+
+
+udpSink
+    :: (MonadResource m, IOData a)
+    => Prelude.String
+    -> PortNumber
+    -> ConduitM a Void m ()
+udpSink host port =
+    sinkIOHandle (udpHandle host port SinkSocket)
+
+
+udpSource
+    :: (MonadResource m, IOData a, MonoFoldable a)
+    => Prelude.String
+    -> PortNumber
+    -> ConduitM () a m ()
+udpSource host port =
+    sourceIOHandle (udpHandle host port SourceSocket)
+
+
+udpHandle :: Prelude.String -> PortNumber -> SocketType -> IO Handle
+udpHandle host port socketType = do
+    socket <- Socket.socket Socket.AF_INET Socket.Datagram Socket.defaultProtocol
+    setSocketOption socket Socket.ReusePort 1
+    address <- Socket.inet_addr host
+    socketMode socketType socket (SockAddrInet port address)
+    socketToHandle socket (ioMode socketType)
diff --git a/udp-conduit.cabal b/udp-conduit.cabal
new file mode 100644
--- /dev/null
+++ b/udp-conduit.cabal
@@ -0,0 +1,31 @@
+name:                udp-conduit
+version:             0.1.0.0
+synopsis:            Simple fire-and-forget conduit UDP wrappers
+description:
+    `udp-conduit` provides simple wrappers to get fire-and-forget UDP sinks
+    and sources.
+homepage:            https://github.com/kqr/udp-conduit#readme
+license:             ISC
+license-file:        LICENSE
+author:              kqr
+maintainer:          k@rdw.se
+copyright:           (c) 2016 kqr
+category:            Data, Conduit
+build-type:          Simple
+extra-source-files:  README.md
+cabal-version:       >=1.10
+
+library
+  hs-source-dirs:      src
+  ghc-options:         -Wall
+  exposed-modules:     Conduit.UDP
+  build-depends:       base >= 4.7 && < 5
+                     , mono-traversable
+                     , chunked-data
+                     , network
+                     , conduit-combinators
+  default-language:    Haskell2010
+
+source-repository head
+  type:     git
+  location: https://github.com/kqr/udp-conduit
