diff --git a/hw-kafka-avro.cabal b/hw-kafka-avro.cabal
--- a/hw-kafka-avro.cabal
+++ b/hw-kafka-avro.cabal
@@ -1,5 +1,5 @@
 name:                hw-kafka-avro
-version:             1.3.0
+version:             1.4.0
 synopsis:            Avro support for Kafka infrastructure
 description:         Please see README.md
 homepage:            https://github.com/haskell-works/hw-kafka-avro#readme
@@ -41,6 +41,7 @@
                        semigroups,
                        servant,
                        servant-client,
+                       tagged,
                        text,
                        transformers,
                        unordered-containers
diff --git a/src/Kafka/Avro/Decode.hs b/src/Kafka/Avro/Decode.hs
--- a/src/Kafka/Avro/Decode.hs
+++ b/src/Kafka/Avro/Decode.hs
@@ -1,17 +1,22 @@
+{-# LANGUAGE ScopedTypeVariables #-}
 module Kafka.Avro.Decode
 (
   DecodeError(..)
 , decodeWithSchema, extractSchemaId
 ) where
 
+import           Control.Arrow             (left)
 import           Control.Monad.IO.Class    (MonadIO)
-import           Data.Avro                 as A (FromAvro, Result (..))
+import           Data.Avro                 as A (FromAvro, HasAvroSchema (..), Result (..), fromAvro)
 import qualified Data.Avro                 as A (decodeWithSchema)
+import qualified Data.Avro.Decode          as A (decodeAvro)
+import qualified Data.Avro.Deconflict      as A (deconflict)
 import           Data.Avro.Schema          (Schema)
 import           Data.Bits                 (shiftL)
 import           Data.ByteString.Lazy      (ByteString)
 import qualified Data.ByteString.Lazy      as BL hiding (zipWith)
 import           Data.Int
+import           Data.Tagged               (Tagged, untag)
 import           Kafka.Avro.SchemaRegistry
 
 data DecodeError = DecodeRegistryError SchemaRegistryError
@@ -31,12 +36,19 @@
   case schemaData of
     Left err -> return $ Left err
     Right (sid, payload) -> do
-      res <- leftMap DecodeRegistryError <$> loadSchema sr sid
-      return $ res >>= decode payload
+      res <- left DecodeRegistryError <$> loadSchema sr sid
+      return $ res >>= flip decodeWithDeconflict payload
   where
     schemaData = maybe (Left BadPayloadNoSchemaId) Right (extractSchemaId bs)
-    decode p s = resultToEither s (A.decodeWithSchema s p)
 
+decodeWithDeconflict :: forall a. (FromAvro a) => Schema -> ByteString -> Either DecodeError a
+decodeWithDeconflict writerSchema bs =
+  let readerSchema = untag (schema :: Tagged a Schema)
+  in left (DecodeError readerSchema) $ do
+    raw <- A.decodeAvro writerSchema bs
+    val <- A.deconflict writerSchema readerSchema raw
+    resultToEither readerSchema (fromAvro val)
+
 extractSchemaId :: ByteString -> Maybe (SchemaId, ByteString)
 extractSchemaId bs = do
   (_ , b0) <- BL.uncons bs
@@ -48,11 +60,9 @@
   let int  =  sum $ zipWith shiftL ints [0, 8, 16, 24]
   return (SchemaId int, b4)
 
-leftMap :: (e -> e') -> Either e r -> Either e' r
-leftMap _ (Right r) = Right r
-leftMap f (Left e)  = Left (f e)
-
-resultToEither :: Schema -> A.Result a -> Either DecodeError a
+resultToEither :: Schema -> A.Result a -> Either String a
 resultToEither sc res = case res of
   Success a -> Right a
-  Error msg -> Left $ DecodeError sc msg
+  Error msg -> Left msg
+
+
