diff --git a/ChangeLog.md b/ChangeLog.md
new file mode 100644
--- /dev/null
+++ b/ChangeLog.md
@@ -0,0 +1,16 @@
+# Changelog for horizon-spec-lens
+
+## 0.1
+
+* lens classes and instances for `horizon-spec-0.6.*`.
+* Add `HasPackageSet` class.
+* Add `HasPackages` class.
+* Add `HasPackageSet` instances for `Overlay`,
+  `PackageSetExportSettings`, `OverlayExportSettings`,
+  `HorizonExport`.
+* Add `HasPackages` instances for `Overlay`,
+  `PackageSetExportSettings`, `OverlayExportSettings`,
+  `HorizonExport`.
+* Add `Ixed` and `At` instances for `PackageList`, `Overlay`,
+  `PackageSetExportSettings`, `OverlayExportSettings`,
+  `HorizonExport`.
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,19 @@
+Copyright 2022 Homotopic.Tech Ltd
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,17 @@
+# horizon-spec-lens
+
+horizon-spec-lens contains lenses for 
+[horizon-spec](https://gitlab.homotopic.tech/horizon/horizon-spec).
+
+## Building
+
+```
+nix build
+```
+
+## Development
+
+```
+nix develop
+cabal test all
+```
diff --git a/horizon-spec-lens.cabal b/horizon-spec-lens.cabal
new file mode 100644
--- /dev/null
+++ b/horizon-spec-lens.cabal
@@ -0,0 +1,48 @@
+cabal-version:      3.0
+name:               horizon-spec-lens
+version:            0.1
+synopsis:           Horizon Stable Package Set Lenses
+description:
+  This package contains the lenses for the Horizon stable package set types (https://horizon-haskell.net). This is a schema used to define package sets sourcing from hackage and git.
+
+category:           Package Management
+author:             Daniel Firth
+maintainer:         dan.firth@homotopic.tech
+copyright:          2022 Daniel Firth
+homepage:           https://horizon-haskell.net
+license:            MIT
+license-file:       LICENSE
+build-type:         Simple
+extra-source-files:
+  ChangeLog.md
+  README.md
+
+source-repository head
+  type:     git
+  location: https://gitlab.homotopic.tech/horizon/horizon-spec-lens
+
+library
+  exposed-modules:    Horizon.Spec.Lens
+  hs-source-dirs:     src
+  default-extensions:
+    DataKinds
+    DeriveGeneric
+    DerivingStrategies
+    GADTs
+    GeneralizedNewtypeDeriving
+    LambdaCase
+    StandaloneKindSignatures
+    TypeApplications
+    TypeFamilies
+
+  ghc-options:
+    -Weverything -Wno-all-missed-specialisations -Wno-implicit-prelude
+    -Wno-missing-safe-haskell-mode -Wno-prepositive-qualified-module
+    -Wno-safe -Wno-unsafe
+
+  build-depends:
+    , base          >=4.7 && <5
+    , horizon-spec  >=0.6 && <0.7
+    , lens          >=5.0 && <5.3
+
+  default-language:   Haskell2010
diff --git a/src/Horizon/Spec/Lens.hs b/src/Horizon/Spec/Lens.hs
new file mode 100644
--- /dev/null
+++ b/src/Horizon/Spec/Lens.hs
@@ -0,0 +1,60 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+module Horizon.Spec.Lens (HasPackageSet, HasPackages) where
+
+import           Control.Lens as L (At, Index, IxValue, Ixed, Lens', at, ix,
+                                    lens)
+import           Data.Kind    (Constraint, Type)
+import           Horizon.Spec (HaskellPackage,
+                               HorizonExport (MakeOverlay, MakePackageSet),
+                               Name, Overlay (MkOverlay), OverlayExportSettings,
+                               PackageList (MkPackageList), PackageSet,
+                               PackageSetExportSettings, fromOverlay, overlay,
+                               packageSet, packages)
+
+type HasPackageSet :: Type -> Constraint
+class HasPackageSet x where
+  packageSetL :: L.Lens' x PackageSet
+
+instance HasPackageSet Overlay where
+  packageSetL = L.lens fromOverlay (\(MkOverlay _) ys -> MkOverlay ys)
+
+instance HasPackageSet PackageSetExportSettings where
+  packageSetL = L.lens packageSet (\x y -> x { packageSet = y })
+
+instance HasPackageSet OverlayExportSettings where
+  packageSetL = L.lens overlay (\x y -> x { overlay = y }) . packageSetL @Overlay
+
+instance HasPackageSet HorizonExport where
+  packageSetL f = \case
+    MakePackageSet x -> MakePackageSet <$> packageSetL f x
+    MakeOverlay x    -> MakeOverlay <$> packageSetL f x
+
+type HasPackages :: Type -> Constraint
+class HasPackages x where
+  packagesL :: L.Lens' x PackageList
+
+instance HasPackages PackageSet where
+  packagesL = L.lens packages (\x y -> x { packages = y })
+
+instance HasPackages HorizonExport where
+  packagesL = packageSetL . packagesL @PackageSet
+
+type instance L.IxValue PackageList = HaskellPackage
+
+type instance L.Index PackageList = Name
+
+type instance L.IxValue HorizonExport = HaskellPackage
+
+type instance L.Index HorizonExport = Name
+
+instance L.Ixed PackageList where
+  ix k f (MkPackageList xs) = MkPackageList <$> L.ix k f xs
+
+instance L.At PackageList where
+  at k f (MkPackageList xs) = MkPackageList <$> L.at k f xs
+
+instance L.Ixed HorizonExport where
+  ix k = packagesL @HorizonExport . L.ix @PackageList k
+
+instance L.At HorizonExport where
+  at k = packagesL @HorizonExport . L.at @PackageList k
