diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import Distribution.Simple
-main = defaultMain
diff --git a/data-layer.cabal b/data-layer.cabal
--- a/data-layer.cabal
+++ b/data-layer.cabal
@@ -1,53 +1,35 @@
-name:                data-layer
-version:             1.0
-synopsis:            Data layering utilities. Layer is a data-type which wrapps other one, but keeping additional information. If you want to access content of simple newtype object, use Lens.Wrapper instead. 
--- description:         
-license:             Apache-2.0
-license-file:        LICENSE
-author:              Wojciech Danilo
-maintainer:          Wojciech Danilo <wojciech.danilo@gmail.com>
-stability:           experimental
-homepage:            https://github.com/wdanilo/layer
-bug-reports:         https://github.com/wdanilo/layer/issues
-copyright:           Copyright (C) 2015 Wojciech Danilo
-category:            Text
-build-type:          Simple
--- extra-source-files:  
-cabal-version:       >=1.10
-
-
-Library
-  hs-source-dirs:     src
-  ghc-options:        -Wall -O2
-  default-language:   Haskell2010
+name: data-layer
+version: 1.0.2
+cabal-version: >=1.10
+build-type: Simple
+license: Apache-2.0
+license-file: LICENSE
+copyright: Copyright (C) 2015 Wojciech Danilo
+maintainer: Wojciech Danilo <wojciech.danilo@gmail.com>
+stability: experimental
+homepage: https://github.com/wdanilo/layer
+bug-reports: https://github.com/wdanilo/layer/issues
+synopsis: Data layering utilities. Layer is a data-type which wrapps other one, but keeping additional information. If you want to access content of simple newtype object, use Lens.Wrapper instead.
+category: Text
+author: Wojciech Danilo
 
-  default-extensions: ConstraintKinds
-                      DataKinds
-                      DefaultSignatures
-                      DeriveDataTypeable
-                      DeriveFoldable
-                      DeriveFunctor
-                      DeriveGeneric
-                      DeriveTraversable
-                      DoAndIfThenElse
-                      EmptyDataDecls
-                      FlexibleContexts
-                      FlexibleInstances
-                      GeneralizedNewtypeDeriving
-                      InstanceSigs
-                      LambdaCase
-                      MultiParamTypeClasses
-                      OverloadedStrings
-                      StandaloneDeriving
-                      TemplateHaskell
-                      TupleSections
-                      TypeOperators
-                      ViewPatterns
-                      TypeFamilies
-  
-  exposed-modules:    Data.Layer
-                      Data.Layer.Coat
-                      Data.Layer.Immersed
+library
+    exposed-modules:
+        Data.Layer
+        Data.Layer.Coat
+        Data.Layer.Immersed
+    build-depends:
+        base >=4.6 && <4.9,
+        data-construction >=1.0,
+        lens >=4.12.3
+    default-language: Haskell2010
+    default-extensions: ConstraintKinds DataKinds DefaultSignatures
+                        DeriveDataTypeable DeriveFoldable DeriveFunctor DeriveGeneric
+                        DeriveTraversable DoAndIfThenElse EmptyDataDecls FlexibleContexts
+                        FlexibleInstances GeneralizedNewtypeDeriving InstanceSigs
+                        LambdaCase MultiParamTypeClasses OverloadedStrings
+                        StandaloneDeriving TemplateHaskell TupleSections TypeOperators
+                        ViewPatterns TypeFamilies
+    hs-source-dirs: src
+    ghc-options: -Wall -O2
 
-  build-depends:      base >=4.6 && <4.9
-                    , lens
diff --git a/src/Data/Layer.hs b/src/Data/Layer.hs
--- a/src/Data/Layer.hs
+++ b/src/Data/Layer.hs
@@ -17,7 +17,7 @@
     default layered :: (Unlayered l ~ Unwrapped l, Wrapped l) => Lens' l (Unlayered l)
     layered = _Wrapped'
 
-class Layered l => IsLayer l where
+class IsLayer l where
     layer :: Unlayered l -> l
 
 unlayer :: Layered l => l -> Unlayered l
@@ -35,10 +35,6 @@
     default setLayeredM :: (Layered l, Monad m) => Unlayered l -> l -> m l
     setLayeredM = (fmap . fmap) return $ set layered
 
-class LayeredM m l => IsLayerM m l where
-    layerM :: Unlayered l -> m l
-    default layerM :: (IsLayer l, Monad m) => Unlayered l -> m l
-    layerM = return . layer
 
 unlayerM :: LayeredM m l => l -> m (Unlayered l)
 unlayerM = viewLayeredM
@@ -50,8 +46,7 @@
 withLayeredM' = withLayeredM . (return .)
 
 
--- === Layer generators ===
 
-class LayerGen    m l where genLayer :: Unlayered l -> m l
 
-
+--class Cover   m l where cover   :: Unlayered l -> m l
+--class Uncover m l where uncover :: l -> m (Unlayered l)
diff --git a/src/Data/Layer/Coat.hs b/src/Data/Layer/Coat.hs
--- a/src/Data/Layer/Coat.hs
+++ b/src/Data/Layer/Coat.hs
@@ -5,6 +5,7 @@
 import Prelude
 import Control.Lens
 import Control.Monad
+import Data.Construction
 import Data.Layer
 
 
@@ -58,13 +59,13 @@
 
 -- === Coat generator ===
 
-class CoatGen m a where genCoat :: Uncoated a -> m a
+class CoatConstructor m a where constructCoat :: Uncoated a -> m a
 instance {-# OVERLAPPABLE #-} ( Monad m
-                              , Uncoated (Unlayered a) ~ Uncoated a
-                              , CoatGen m (Unlayered a)
-                              , LayerGen m a
-                              )       => CoatGen m a        where genCoat = genCoat >=> genLayer
-instance {-# OVERLAPPABLE #-} Monad m => CoatGen m (Coat a) where genCoat = return . Coat
+                              , CoatConstructor m (Destructed a)
+                              , Uncoated a ~ Uncoated (Destructed a)
+                              , Constructor m a
+                              )       => CoatConstructor m a        where constructCoat = constructCoat >=> construct
+instance {-# OVERLAPPABLE #-} Monad m => CoatConstructor m (Coat a) where constructCoat = return . Coat
 
 
 --class Destruction m a where destroy :: a -> m (Uncoated a)
diff --git a/src/Data/Layer/Immersed.hs b/src/Data/Layer/Immersed.hs
--- a/src/Data/Layer/Immersed.hs
+++ b/src/Data/Layer/Immersed.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE UndecidableInstances #-}
+
 module Data.Layer.Immersed where
 
 
