diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,6 @@
+# Changelog for aeson-modern-tojson
+
+## Unreleased changes
+
+## 0.1.0.0
+ * Library creation
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,13 @@
+Copyright (c) 2021, Gautier DI FOLCO
+
+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,11 @@
+# aeson-modern-tojson
+Provide a newtype to be used with DerivingVia to correctly derive [ToJSON](https://hackage.haskell.org/package/aeson-1.5.6.0/docs/Data-Aeson.html#g:7).
+
+As simple as:
+
+
+```
+data W = W Int Int
+deriving stock (Generic)
+deriving (ToJSON) via (ModernToJSON W)
+```
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/aeson-modern-tojson.cabal b/aeson-modern-tojson.cabal
new file mode 100644
--- /dev/null
+++ b/aeson-modern-tojson.cabal
@@ -0,0 +1,63 @@
+cabal-version: 1.12
+
+-- This file has been generated from package.yaml by hpack version 0.34.4.
+--
+-- see: https://github.com/sol/hpack
+
+name:           aeson-modern-tojson
+version:        0.1.0.0
+synopsis:       Provide a handy way for derving ToJSON proprely.
+description:    Provide a newtype to be used with DerivingVia to correctly derive <https://hackage.haskell.org/package/aeson-1.5.6.0/docs/Data-Aeson.html#g:7 ToJSON>.
+                .
+                As simple as:
+                .
+                .
+                @
+                data W = W Int Int
+                  deriving stock (Generic)
+                  deriving (ToJSON) via (ModernToJSON W)
+                @
+category:       Text, Web, JSON
+homepage:       https://github.com/blackheaven/aeson-modern-tojson#readme
+bug-reports:    https://github.com/blackheaven/aeson-modern-tojson/issues
+author:         Gautier DI FOLCO
+maintainer:     gautier.difolco@gmail.com
+copyright:      Gautier DI FOLCO
+license:        ISC
+license-file:   LICENSE
+build-type:     Simple
+extra-source-files:
+    README.md
+    ChangeLog.md
+    LICENSE
+
+source-repository head
+  type: git
+  location: https://github.com/blackheaven/aeson-modern-tojson
+
+library
+  exposed-modules:
+      Data.Aeson.ToJSON.Deriving
+  other-modules:
+      Paths_aeson_modern_tojson
+  hs-source-dirs:
+      src
+  build-depends:
+      aeson >=1.0.0.0 && <2
+    , base >=4.7 && <5
+  default-language: Haskell2010
+
+test-suite aeson-modern-tojson-test
+  type: exitcode-stdio-1.0
+  main-is: Data/Aeson/ToJSON/DerivingSpec.hs
+  other-modules:
+      Paths_aeson_modern_tojson
+  hs-source-dirs:
+      test
+  ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wpartial-fields -Wredundant-constraints
+  build-depends:
+      aeson >=1.0.0.0 && <2
+    , aeson-modern-tojson
+    , base >=4.7 && <5
+    , inspection-testing >=0.4.4.0 && <1.0
+  default-language: Haskell2010
diff --git a/src/Data/Aeson/ToJSON/Deriving.hs b/src/Data/Aeson/ToJSON/Deriving.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Aeson/ToJSON/Deriving.hs
@@ -0,0 +1,46 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+-- |
+-- Module:      Data.Time.Format.Typed
+-- Copyright:   (c) 20021 Gautier DI FOLCO
+-- License:     ISC
+-- Maintainer:  Gautier DI FOLCO <gautier.difolco@gmail.com>
+-- Stability:   experimental
+-- Portability: GHC
+--
+-- Provide a newtype to be used with DerivingVia to correctly derive <https://hackage.haskell.org/package/aeson-1.5.6.0/docs/Data-Aeson.html#g:7 ToJSON>.
+--
+-- As simple as:
+--
+--
+-- @
+-- data W = W Int Int
+--   deriving stock (Generic)
+--   deriving (ToJSON) via (ModernToJSON W)
+-- @
+module Data.Aeson.ToJSON.Deriving
+  ( ModernToJSON (..),
+    ToJSON (..),
+  )
+where
+
+import Data.Aeson
+import GHC.Generics
+
+newtype ModernToJSON a = ModernToJSON {unModernToJSON :: a}
+  deriving stock (Eq, Show, Generic)
+
+instance
+  ( Generic a,
+    ToJSON a,
+    GToJSON' Value Zero (Rep a),
+    GToJSON' Encoding Zero (Rep a)
+  ) =>
+  ToJSON (ModernToJSON a)
+  where
+  toJSON = genericToJSON defaultOptions . unModernToJSON
+  toEncoding = genericToEncoding defaultOptions . unModernToJSON
diff --git a/test/Data/Aeson/ToJSON/DerivingSpec.hs b/test/Data/Aeson/ToJSON/DerivingSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/Data/Aeson/ToJSON/DerivingSpec.hs
@@ -0,0 +1,28 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# OPTIONS_GHC -dsuppress-idinfo -dsuppress-coercions -dsuppress-type-applications
+-dsuppress-module-prefixes -dsuppress-type-signatures -dsuppress-uniques -O #-}
+
+module Data.Aeson.ToJSON.DerivingSpec (main) where
+
+import Data.Aeson
+import Data.Aeson.ToJSON.Deriving
+import GHC.Generics
+import Test.Inspection (inspect, (===))
+
+data W = W Int Int
+  deriving stock (Generic)
+  deriving (ToJSON) via (ModernToJSON W)
+
+toEncodingDerived :: W -> Encoding
+toEncodingDerived = toEncoding
+
+toEncodingTarget :: W -> Encoding
+toEncodingTarget = genericToEncoding defaultOptions
+
+main :: IO ()
+main = pure ()
+
+inspect $ 'toEncodingDerived === 'toEncodingTarget
