diff --git a/.gitignore b/.gitignore
new file mode 100644
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,26 @@
+dist
+dist-*
+cabal-dev
+*.o
+*.hi
+*.chi
+*.chs.h
+*.dyn_o
+*.dyn_hi
+.hpc
+.hsenv
+.cabal-sandbox/
+cabal.sandbox.config
+*.prof
+*.aux
+*.hp
+*.eventlog
+.stack-work/
+cabal.project.local
+TAGS
+nakadi-client.cabal
+.idea
+out
+*.iml
+nakadi-client.iml
+cabal.config
diff --git a/AUTHORS.md b/AUTHORS.md
new file mode 100644
--- /dev/null
+++ b/AUTHORS.md
@@ -0,0 +1,8 @@
+This package contains contributions by the following persons:
+
+* Moritz Schulte [@mtesseract](https://github.com/mtesseract)
+* Viktor Kocherga [@vitold](https://github.com/vitold)
+* Amr Hassan [@amrhassan](https://github.com/amrhassan)
+* Eric Torreborre [@etorreborre](https://github.com/etorreborre)
+
+Thanks to everybody for code, testing, discussions, bug reports, etc.!
diff --git a/nakadi-client.cabal b/nakadi-client.cabal
--- a/nakadi-client.cabal
+++ b/nakadi-client.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 8c95e6f774d7ddcacd71c47566a57d2e35c231b13bd9c2c23808078cfad08542
+-- hash: 0504d364a6102858824fdbf0a280623f9e9ba3e039e98308fe115e6822289122
 
 name:           nakadi-client
-version:        0.4.0.0
+version:        0.4.1.0
 synopsis:       Client library for the Nakadi Event Broker
 description:    This package implements a client library for interacting with the Nakadi event broker system developed by Zalando.
 category:       Network
@@ -20,6 +20,8 @@
 cabal-version:  >= 1.10
 
 extra-source-files:
+    .gitignore
+    AUTHORS.md
     README.md
 
 source-repository head
diff --git a/src/Network/Nakadi/Internal/Lenses.hs b/src/Network/Nakadi/Internal/Lenses.hs
--- a/src/Network/Nakadi/Internal/Lenses.hs
+++ b/src/Network/Nakadi/Internal/Lenses.hs
@@ -41,9 +41,8 @@
 makeNakadiLenses ''Cursor
 makeNakadiLenses ''EventStreamBatch
 makeNakadiLenses ''SubscriptionEventStreamBatch
-makeNakadiLenses ''Event
-makeNakadiLenses ''Metadata
-makeNakadiLenses ''MetadataEnriched
+makeNakadiLenses ''EventMetadata
+makeNakadiLenses ''EventMetadataEnriched
 makeNakadiLenses ''Partition
 makeNakadiLenses ''CursorDistanceQuery
 makeNakadiLenses ''CursorDistanceResult
diff --git a/src/Network/Nakadi/Internal/Types/Service.hs b/src/Network/Nakadi/Internal/Types/Service.hs
--- a/src/Network/Nakadi/Internal/Types/Service.hs
+++ b/src/Network/Nakadi/Internal/Types/Service.hs
@@ -232,29 +232,6 @@
 instance FromJSON EventId where
   parseJSON = parseUUID "EventId" EventId
 
--- | Metadata
-
-data Metadata = Metadata
-  { _eid        :: EventId -- ^ Event ID
-  , _occurredAt :: Timestamp -- ^ Occurred-At timestamp
-  , _parentEids :: Maybe [EventId] -- ^ Event IDs of the Events which triggered this event
-  , _partition  :: Maybe PartitionName -- ^ Partition on which this Event is stored
-  } deriving (Eq, Show, Generic)
-
-deriveJSON nakadiJsonOptions ''Metadata
-
--- | Event
-
-data Event a = Event
-  { _payload  :: a -- ^ Payload of this Event. In the Nakadi API it is
-                   -- called @data@, but it cannot be named '_data',
-                   -- as this this would cause the lense 'data' to be
-                   -- created, which is a reserved keyword
-  , _metadata :: Metadata -- ^ Meta data for this Event
-  } deriving (Eq, Show, Generic)
-
-deriveJSON nakadiJsonOptions ''Event
-
 -- | Partition Data
 
 data Partition = Partition
@@ -721,40 +698,37 @@
 
 deriveJSON nakadiJsonOptions ''EventType
 
--- | Type of enriched metadata values.
+-- | Type of published event metadata values.
 
-data MetadataEnriched = MetadataEnriched
+data EventMetadata = EventMetadata
   { _eid        :: EventId
-  , _eventType  :: EventTypeName
   , _occurredAt :: Timestamp
-  , _receivedAt :: Timestamp
-  , _version    :: SchemaVersion
   , _parentEids :: Maybe [EventId]
-  , _flowId     :: Maybe FlowId
   , _partition  :: Maybe PartitionName
   } deriving (Eq, Show, Generic)
 
-deriveJSON nakadiJsonOptions ''MetadataEnriched
+deriveJSON nakadiJsonOptions ''EventMetadata
 
--- | Type of enriched event.
+-- | Type of event metadata enriched by Nakadi
 
-data EventEnriched a = EventEnriched
-  { _payload  :: a -- Cannot be named '_data', as this this would
-                   -- cause the lense 'data' to be created, which is a
-                   -- reserved keyword.
-  , _metadata :: MetadataEnriched
+data EventMetadataEnriched = EventMetadataEnriched
+  { _eid        :: EventId
+  , _eventType  :: EventTypeName
+  , _occurredAt :: Timestamp
+  , _receivedAt :: Timestamp
+  , _version    :: SchemaVersion
+  , _parentEids :: Maybe [EventId]
+  , _flowId     :: Maybe FlowId
+  , _partition  :: Maybe PartitionName
   } deriving (Eq, Show, Generic)
 
-deriveJSON nakadiJsonOptions {
-  fieldLabelModifier = makeFieldRenamer [ ("_payload",  "data")
-                                        , ("_metadata", "metadata") ]
-  }  ''EventEnriched
+deriveJSON nakadiJsonOptions ''EventMetadataEnriched
 
 -- | EventStreamBatch
 
 data EventStreamBatch a = EventStreamBatch
   { _cursor :: Cursor -- ^ Cursor for this batch
-  , _events :: Maybe (Vector (EventEnriched a)) -- ^ Events in this batch
+  , _events :: Maybe (Vector a) -- ^ Events in this batch
   } deriving (Show, Generic)
 
 deriveJSON nakadiJsonOptions ''EventStreamBatch
@@ -763,7 +737,7 @@
 
 data SubscriptionEventStreamBatch a = SubscriptionEventStreamBatch
   { _cursor :: SubscriptionCursor -- ^ cursor for this subscription batch
-  , _events :: Maybe (Vector (EventEnriched a)) -- ^ Events for this subscription batch
+  , _events :: Maybe (Vector a) -- ^ Events for this subscription batch
   } deriving (Show, Generic)
 
 deriveJSON nakadiJsonOptions ''SubscriptionEventStreamBatch
@@ -797,9 +771,22 @@
   { _payload  :: a -- Cannot be named '_data', as this this would
                    -- cause the lense 'data' to be created, which is a
                    -- reserved keyword.
-  , _metadata :: Metadata
+  , _metadata :: EventMetadata
   , _dataType :: Text
   , _dataOp   :: DataOp
   } deriving (Eq, Show, Generic)
 
 deriveJSON nakadiJsonOptions ''DataChangeEvent
+
+-- | A DataChangeEvent enriched by Nakadi
+
+data DataChangeEventEnriched a = DataChangeEventEnriched
+  { _payload  :: a -- Cannot be named '_data', as this this would
+                   -- cause the lense 'data' to be created, which is a
+                   -- reserved keyword.
+  , _metadata :: EventMetadataEnriched
+  , _dataType :: Text
+  , _dataOp   :: DataOp
+  } deriving (Eq, Show, Generic)
+
+deriveJSON nakadiJsonOptions ''DataChangeEventEnriched
diff --git a/src/Network/Nakadi/Types/Service.hs b/src/Network/Nakadi/Types/Service.hs
--- a/src/Network/Nakadi/Types/Service.hs
+++ b/src/Network/Nakadi/Types/Service.hs
@@ -27,8 +27,6 @@
   , StreamId(..)
   , SubscriptionEventStream(..)
   , Timestamp(..)
-  , Metadata(..)
-  , Event(..)
   , EventStreamBatch(..)
   , SubscriptionEventStreamBatch(..)
   , EventId(..)
@@ -65,9 +63,10 @@
   , PartitionKeyField(..)
   , EventType(..)
   , DataChangeEvent(..)
+  , DataChangeEventEnriched(..)
   , DataOp(..)
-  , EventEnriched(..)
-  , MetadataEnriched(..)
+  , EventMetadata(..)
+  , EventMetadataEnriched(..)
   , EventTypeStatistics(..)
   , EventTypeOptions(..)
   ) where
diff --git a/tests/Network/Nakadi/EventTypes/Test.hs b/tests/Network/Nakadi/EventTypes/Test.hs
--- a/tests/Network/Nakadi/EventTypes/Test.hs
+++ b/tests/Network/Nakadi/EventTypes/Test.hs
@@ -111,11 +111,11 @@
   eventTypeDelete conf myEventTypeName `catch` (ignoreExnNotFound ())
   eventTypeCreate conf myEventType
   let event = DataChangeEvent { _payload = Foo "Hello!"
-                              , _metadata = Metadata { _eid = eid
-                                                     , _occurredAt = Timestamp now
-                                                     , _parentEids = Nothing
-                                                     , _partition = Nothing
-                                                     }
+                              , _metadata = EventMetadata { _eid = eid
+                                                          , _occurredAt = Timestamp now
+                                                          , _parentEids = Nothing
+                                                          , _partition  = Nothing
+                                                          }
                               , _dataType = "test.FOO"
                               , _dataOp = DataOpUpdate
                               }
@@ -133,18 +133,18 @@
   eventTypeDelete conf myEventTypeName `catch` (ignoreExnNotFound ())
   eventTypeCreate conf myEventType
   let event = DataChangeEvent { _payload = Foo "Hello!"
-                              , _metadata = Metadata { _eid = eid
-                                                     , _occurredAt = Timestamp now
-                                                     , _parentEids = Nothing
-                                                     , _partition = Nothing
-                                                     }
+                              , _metadata = EventMetadata { _eid = eid
+                                                          , _occurredAt = Timestamp now
+                                                          , _parentEids = Nothing
+                                                          , _partition  = Nothing
+                                                          }
                               , _dataType = "test.FOO"
                               , _dataOp = DataOpUpdate
                               }
       expectedFlowId = Just $ FlowId "12345"
   withAsync (delayedPublish conf expectedFlowId [event]) $ \asyncHandle -> do
     link asyncHandle
-    eventConsumed :: Maybe (EventStreamBatch Foo) <- runResourceT $ do
+    eventConsumed :: Maybe (EventStreamBatch (DataChangeEventEnriched Foo)) <- runResourceT $ do
       source <- eventSource conf (Just consumeParametersSingle) myEventTypeName Nothing
       runConduit $ source .| headC
     isJust eventConsumed @=? True
@@ -154,7 +154,7 @@
     case events of
       Nothing -> assertFailure "Received no events"
       Just v -> case toList v of
-        [EventEnriched _ x] ->
+        [DataChangeEventEnriched _ x _ _] ->
           x^.L.flowId @=? expectedFlowId
         _ -> assertFailure "Received not a singleton event list"
 
@@ -165,11 +165,11 @@
   eventTypeDelete conf myEventTypeName `catch` (ignoreExnNotFound ())
   eventTypeCreate conf myEventType
   let event = DataChangeEvent { _payload = Foo "Hello!"
-                              , _metadata = Metadata { _eid = eid
-                                                     , _occurredAt = Timestamp now
-                                                     , _parentEids = Nothing
-                                                     , _partition = Nothing
-                                                     }
+                              , _metadata = EventMetadata { _eid = eid
+                                                          , _occurredAt = Timestamp now
+                                                          , _parentEids = Nothing
+                                                          , _partition  = Nothing
+                                                          }
                               , _dataType = "test.FOO"
                               , _dataOp = DataOpUpdate
                               }
diff --git a/tests/Network/Nakadi/Tests/Common.hs b/tests/Network/Nakadi/Tests/Common.hs
--- a/tests/Network/Nakadi/Tests/Common.hs
+++ b/tests/Network/Nakadi/Tests/Common.hs
@@ -59,11 +59,11 @@
 myDataChangeEvent :: EventId -> UTCTime -> DataChangeEvent Foo
 myDataChangeEvent eid now =  DataChangeEvent
   { _payload = Foo "Hello!"
-  , _metadata = Metadata { _eid        = eid
-                         , _occurredAt = Timestamp now
-                         , _parentEids = Nothing
-                         , _partition  = Nothing
-                         }
+  , _metadata = EventMetadata { _eid        = eid
+                              , _occurredAt = Timestamp now
+                              , _parentEids = Nothing
+                              , _partition  = Nothing
+                              }
   , _dataType = "test.FOO"
   , _dataOp = DataOpUpdate
   }
