diff --git a/Data/PrimitiveArray/Index/Class.hs b/Data/PrimitiveArray/Index/Class.hs
--- a/Data/PrimitiveArray/Index/Class.hs
+++ b/Data/PrimitiveArray/Index/Class.hs
@@ -3,6 +3,7 @@
 
 import           Control.Applicative
 import           Control.DeepSeq (NFData(..))
+import           Control.Lens hiding (Index, (:>))
 import           Control.Monad.Except
 import           Control.Monad (liftM2)
 import           Data.Aeson
@@ -16,9 +17,11 @@
 import           Data.Vector.Unboxed.Deriving
 import           Data.Vector.Unboxed (Unbox(..))
 import           GHC.Generics
+import           GHC.TypeNats
 import qualified Data.Vector.Fusion.Stream.Monadic as SM
 import           Test.QuickCheck
 import           Text.Printf
+import           Data.Type.Equality
 
 
 
@@ -53,8 +56,6 @@
   arbitrary     = liftM2 (:.) arbitrary arbitrary
   shrink (a:.b) = [ (a':.b) | a' <- shrink a ] ++ [ (a:.b') | b' <- shrink b ]
 
-
-
 infixr 3 :>
 
 -- | A different version of strict pairs. Makes for simpler type inference in
@@ -255,4 +256,37 @@
 --  {-# INLINE size #-}
 --  inBounds (hs:>h) (zs:>z) = inBounds hs zs && inBounds h z
 --  {-# INLINE inBounds #-}
+
+
+
+-- * Somewhat experimental lens support.
+--
+-- The problem here is that tuples are n-ary, while inductive tuples are
+-- binary, recursive.
+
+instance Field1 (Z:.a) (Z:.a') a a' where
+  {-# Inline _1 #-}
+  _1 = lens (\(Z:.a) → a) (\(Z:._) a → (Z:.a))
+
+instance Field1 (Z:.a:.b) (Z:.a':.b) a a' where
+  {-# Inline _1 #-}
+  _1 = lens (\(Z:.a:.b) → a) (\(Z:._:.b) a → (Z:.a:.b))
+
+instance Field1 (Z:.a:.b:.c) (Z:.a':.b:.c) a a' where
+  {-# Inline _1 #-}
+  _1 = lens (\(Z:.a:.b:.c) → a) (\(Z:._:.b:.c) a → (Z:.a:.b:.c))
+
+
+instance Field2 (Z:.a:.b) (Z:.a:.b') b b' where
+  {-# Inline _2 #-}
+  _2 = lens (\(Z:.a:.b) → b) (\(Z:.a:._) b → (Z:.a:.b))
+
+instance Field2 (Z:.a:.b:.c) (Z:.a:.b':.c) b b' where
+  {-# Inline _2 #-}
+  _2 = lens (\(Z:.a:.b:.c) → b) (\(Z:.a:._:.c) b → (Z:.a:.b:.c))
+
+
+instance Field3 (Z:.a:.b:.c) (Z:.a:.b:.c') c c' where
+  {-# Inline _3 #-}
+  _3 = lens (\(Z:.a:.b:.c) → c) (\(Z:.a:.b:._) c → (Z:.a:.b:.c))
 
diff --git a/Data/PrimitiveArray/Index/Point.hs b/Data/PrimitiveArray/Index/Point.hs
--- a/Data/PrimitiveArray/Index/Point.hs
+++ b/Data/PrimitiveArray/Index/Point.hs
@@ -47,13 +47,8 @@
 pointLC = PointL
 {-# Inline pointLC #-}
 
--- | A point in a right-linear grammars.
 
-newtype PointR t = PointR {fromPointR :: Int}
-  deriving (Eq,Ord,Read,Show,Generic)
 
-
-
 derivingUnbox "PointL"
   [t| forall t . PointL t -> Int    |]
   [| \ (PointL i) -> i |]
@@ -92,20 +87,20 @@
 deriving instance Show    (LimitType (PointL t))
 
 instance IndexStream z => IndexStream (z:.PointL I) where
-  streamUp   (ls:..LtPointL lf) (hs:..LtPointL ht) = SM.flatten (streamUpMk   lf) (streamUpStep   ht) $ streamUp ls hs
-  streamDown (ls:..LtPointL lf) (hs:..LtPointL ht) = SM.flatten (streamDownMk ht) (streamDownStep lf) $ streamDown ls hs
+  streamUp   (ls:..LtPointL lf) (hs:..LtPointL ht) = SM.flatten (streamUpMk   lf) (streamUpStep   PointL ht) $ streamUp ls hs
+  streamDown (ls:..LtPointL lf) (hs:..LtPointL ht) = SM.flatten (streamDownMk ht) (streamDownStep PointL lf) $ streamDown ls hs
   {-# Inline [0] streamUp #-}
   {-# Inline [0] streamDown #-}
 
 instance IndexStream z => IndexStream (z:.PointL O) where
-  streamUp   (ls:..LtPointL lf) (hs:..LtPointL ht) = SM.flatten (streamDownMk ht) (streamDownStep lf) $ streamUp   ls hs
-  streamDown (ls:..LtPointL lf) (hs:..LtPointL ht) = SM.flatten (streamUpMk   lf) (streamUpStep   ht) $ streamDown ls hs
+  streamUp   (ls:..LtPointL lf) (hs:..LtPointL ht) = SM.flatten (streamDownMk ht) (streamDownStep PointL lf) $ streamUp   ls hs
+  streamDown (ls:..LtPointL lf) (hs:..LtPointL ht) = SM.flatten (streamUpMk   lf) (streamUpStep   PointL ht) $ streamDown ls hs
   {-# Inline [0] streamUp #-}
   {-# Inline [0] streamDown #-}
 
 instance IndexStream z => IndexStream (z:.PointL C) where
-  streamUp   (ls:..LtPointL lf) (hs:..LtPointL ht) = SM.flatten (streamUpMk   lf) (streamUpStep   ht) $ streamUp ls hs
-  streamDown (ls:..LtPointL lf) (hs:..LtPointL ht) = SM.flatten (streamDownMk ht) (streamDownStep lf) $ streamDown ls hs
+  streamUp   (ls:..LtPointL lf) (hs:..LtPointL ht) = SM.flatten (streamUpMk   lf) (streamUpStep   PointL ht) $ streamUp ls hs
+  streamDown (ls:..LtPointL lf) (hs:..LtPointL ht) = SM.flatten (streamDownMk ht) (streamDownStep PointL lf) $ streamDown ls hs
   {-# Inline [0] streamUp #-}
   {-# Inline [0] streamDown #-}
 
@@ -114,17 +109,17 @@
 streamUpMk (I# lf) z = return $ SP z lf
 {-# Inline [0] streamUpMk #-}
 
-streamUpStep (I# ht) (SP z k)
+streamUpStep wrapper (I# ht) (SP z k)
   | 1# <- k ># ht = return $ SM.Done
-  | otherwise     = return $ SM.Yield (z:.PointL (I# k)) (SP z (k +# 1#))
+  | otherwise     = return $ SM.Yield (z:.wrapper (I# k)) (SP z (k +# 1#))
 {-# Inline [0] streamUpStep #-}
 
 streamDownMk (I# ht) z = return $ SP z ht
 {-# Inline [0] streamDownMk #-}
 
-streamDownStep (I# lf) (SP z k)
+streamDownStep wrapper (I# lf) (SP z k)
   | 1# <- k <# lf = return $ SM.Done
-  | otherwise     = return $ SM.Yield (z:.PointL (I# k)) (SP z (k -# 1#))
+  | otherwise     = return $ SM.Yield (z:.wrapper (I# k)) (SP z (k -# 1#))
 {-# Inline [0] streamDownStep #-}
 
 instance IndexStream (Z:.PointL t) => IndexStream (PointL t) where
@@ -147,28 +142,88 @@
 
 
 
--- -- * @PointR@
--- --
--- -- TODO complete instances
--- 
--- derivingUnbox "PointR"
---   [t| forall t . PointR t -> Int    |]
---   [| \ (PointR i) -> i |]
---   [| \ i -> PointR i   |]
--- 
--- instance Binary    (PointR t)
--- instance Serialize (PointR t)
--- instance FromJSON  (PointR t)
--- instance ToJSON    (PointR t)
--- instance Hashable  (PointR t)
--- 
--- instance NFData (PointR t) where
---   rnf (PointR l) = rnf l
---   {-# Inline rnf #-}
--- 
--- instance Index (PointR t) where
---   linearIndex l (PointR z) = undefined
---   {-# INLINE linearIndex #-}
---   size = undefined
---   {-# INLINE size #-}
+-- * @PointR@
+
+-- | A point in a right-linear grammars.
+
+newtype PointR t = PointR {fromPointR :: Int}
+  deriving (Eq,Ord,Read,Show,Generic)
+
+
+
+derivingUnbox "PointR"
+  [t| forall t . PointR t -> Int    |]
+  [| \ (PointR i) -> i |]
+  [| \ i -> PointR i   |]
+
+instance Binary       (PointR t)
+instance Serialize    (PointR t)
+instance FromJSON     (PointR t)
+instance FromJSONKey  (PointR t)
+instance ToJSON       (PointR t)
+instance ToJSONKey    (PointR t)
+instance Hashable     (PointR t)
+
+instance NFData (PointR t) where
+  rnf (PointR l) = rnf l
+  {-# Inline rnf #-}
+
+instance Index (PointR t) where
+  newtype LimitType (PointR t) = LtPointR Int
+  linearIndex _ (PointR z) = z
+  {-# INLINE linearIndex #-}
+  size (LtPointR h) = h + 1
+  {-# INLINE size #-}
+  inBounds (LtPointR h) (PointR x) = 0<=x && x<=h
+  {-# INLINE inBounds #-}
+  zeroBound = PointR 0
+  {-# Inline [0] zeroBound #-}
+  zeroBound' = LtPointR 0
+  {-# Inline [0] zeroBound' #-}
+  totalSize (LtPointR h) = [fromIntegral $ h + 1]
+  {-# Inline [0] totalSize #-}
+
+deriving instance Eq      (LimitType (PointR t))
+deriving instance Generic (LimitType (PointR t))
+deriving instance Read    (LimitType (PointR t))
+deriving instance Show    (LimitType (PointR t))
+
+instance IndexStream z => IndexStream (z:.PointR I) where
+  streamUp   (ls:..LtPointR lf) (hs:..LtPointR ht) = SM.flatten (streamDownMk ht) (streamDownStep PointR lf) $ streamUp ls hs
+  streamDown (ls:..LtPointR lf) (hs:..LtPointR ht) = SM.flatten (streamUpMk   lf) (streamUpStep   PointR ht) $ streamDown ls hs
+  {-# Inline [0] streamUp #-}
+  {-# Inline [0] streamDown #-}
+
+instance IndexStream z => IndexStream (z:.PointR O) where
+  streamUp   (ls:..LtPointR lf) (hs:..LtPointR ht) = SM.flatten (streamUpMk   lf) (streamUpStep   PointR ht) $ streamUp   ls hs
+  streamDown (ls:..LtPointR lf) (hs:..LtPointR ht) = SM.flatten (streamDownMk ht) (streamDownStep PointR lf) $ streamDown ls hs
+  {-# Inline [0] streamUp #-}
+  {-# Inline [0] streamDown #-}
+
+--instance IndexStream z => IndexStream (z:.PointR C) where
+--  streamUp   (ls:..LtPointR lf) (hs:..LtPointR ht) = SM.flatten (streamUpMkR   lf) (streamUpStepR   ht) $ streamUp ls hs
+--  streamDown (ls:..LtPointR lf) (hs:..LtPointR ht) = SM.flatten (streamDownMkR ht) (streamDownStepR lf) $ streamDown ls hs
+--  {-# Inline [0] streamUp #-}
+--  {-# Inline [0] streamDown #-}
+
+instance IndexStream (Z:.PointR t) => IndexStream (PointR t) where
+  streamUp l h = SM.map (\(Z:.i) -> i) $ streamUp (ZZ:..l) (ZZ:..h)
+  {-# INLINE streamUp #-}
+  streamDown l h = SM.map (\(Z:.i) -> i) $ streamDown (ZZ:..l) (ZZ:..h)
+  {-# INLINE streamDown #-}
+
+-- arbitrarily set maximum here to
+
+arbMaxPointR = 100
+
+instance Arbitrary (PointR t) where
+  arbitrary = do
+    b <- choose (0,arbMaxPointR)
+    return $ PointR b
+  shrink (PointR j)
+    | j<arbMaxPointR = [PointR $ j+1]
+    | otherwise = []
+
+--instance Monad m => Serial m (PointR t) where
+--  series = PointR . TS.getNonNegative <$> series
 
diff --git a/PrimitiveArray.cabal b/PrimitiveArray.cabal
--- a/PrimitiveArray.cabal
+++ b/PrimitiveArray.cabal
@@ -1,16 +1,16 @@
+Cabal-version:  2.2
 Name:           PrimitiveArray
-Version:        0.9.0.0
-License:        BSD3
+Version:        0.9.1.0
+License:        BSD-3-Clause
 License-file:   LICENSE
 Maintainer:     choener@bioinf.uni-leipzig.de
-author:         Christian Hoener zu Siederdissen, 2011-2018
-copyright:      Christian Hoener zu Siederdissen, 2011-2018
+author:         Christian Hoener zu Siederdissen, 2011-2019
+copyright:      Christian Hoener zu Siederdissen, 2011-2019
 homepage:       https://github.com/choener/PrimitiveArray
 bug-reports:    https://github.com/choener/PrimitiveArray/issues
 Stability:      Experimental
 Category:       Data
 Build-type:     Simple
-Cabal-version:  >=1.10.0
 tested-with:    GHC == 8.4.4
 Synopsis:       Efficient multidimensional arrays
 Description:
@@ -54,36 +54,14 @@
 
 
 
-Library
-  Exposed-modules:
-    Data.PrimitiveArray
-    Data.PrimitiveArray.Checked
-    Data.PrimitiveArray.Class
-    Data.PrimitiveArray.Dense
---    Data.PrimitiveArray.FillTables
-    Data.PrimitiveArray.Index
-    Data.PrimitiveArray.Index.BitSet0
-    Data.PrimitiveArray.Index.BitSet1
-    Data.PrimitiveArray.Index.BitSetClasses
---    Data.PrimitiveArray.Index.BS0
---    Data.PrimitiveArray.Index.BS2
-    Data.PrimitiveArray.Index.Class
---    Data.PrimitiveArray.Index.EdgeBoundary
-    Data.PrimitiveArray.Index.Int
-    Data.PrimitiveArray.Index.IOC
-    Data.PrimitiveArray.Index.PhantomInt
-    Data.PrimitiveArray.Index.Point
---    Data.PrimitiveArray.Index.Set
-    Data.PrimitiveArray.Index.Subword
---    Data.PrimitiveArray.Index.TernarySet
-    Data.PrimitiveArray.Index.Unit
-    Data.PrimitiveArray.ScoreMatrix
+common deps
   build-depends: base                     >= 4.7      &&  < 5.0
                , aeson                    >= 0.8
                , binary                   >= 0.7
                , bits                     >= 0.4
                , cereal                   >= 0.4
                , cereal-vector            >= 0.2
+               , containers
                , deepseq                  >= 1.3
                , hashable                 >= 1.2
                , lens                     >= 4.0
@@ -92,20 +70,26 @@
                , primitive                >= 0.5.4
                , QuickCheck               >= 2.7
                , smallcheck               >= 1.1
+               , tasty                    >= 0.11
+               , tasty-quickcheck         >= 0.8
+               , tasty-smallcheck         >= 0.8
+               , tasty-th                 >= 0.1
                , text                     >= 1.0
                , vector                   >= 0.11
                , vector-binary-instances  >= 0.2
                , vector-th-unbox          >= 0.2
                --
-               , DPutils                  == 0.0.2.*
+               , DPutils                  == 0.1.0.*
                , OrderedBits              == 0.0.1.*
   default-extensions: BangPatterns
                     , CPP
+                    , DataKinds
                     , DefaultSignatures
                     , DeriveDataTypeable
                     , DeriveGeneric
                     , FlexibleContexts
                     , FlexibleInstances
+                    , FunctionalDependencies
                     , GADTs
                     , GeneralizedNewtypeDeriving
                     , MultiParamTypeClasses
@@ -115,6 +99,7 @@
                     , ScopedTypeVariables
                     , StandaloneDeriving
                     , TemplateHaskell
+                    , TypeApplications
                     , TypeFamilies
                     , TypeOperators
                     , UndecidableInstances
@@ -132,7 +117,38 @@
 
 
 
+Library
+  import:
+    deps
+  Exposed-modules:
+    Data.PrimitiveArray
+    Data.PrimitiveArray.Checked
+    Data.PrimitiveArray.Class
+    Data.PrimitiveArray.Dense
+--    Data.PrimitiveArray.FillTables
+    Data.PrimitiveArray.Index
+    Data.PrimitiveArray.Index.BitSet0
+    Data.PrimitiveArray.Index.BitSet1
+    Data.PrimitiveArray.Index.BitSetClasses
+--    Data.PrimitiveArray.Index.BS0
+--    Data.PrimitiveArray.Index.BS2
+    Data.PrimitiveArray.Index.Class
+--    Data.PrimitiveArray.Index.EdgeBoundary
+    Data.PrimitiveArray.Index.Int
+    Data.PrimitiveArray.Index.IOC
+    Data.PrimitiveArray.Index.PhantomInt
+    Data.PrimitiveArray.Index.Point
+--    Data.PrimitiveArray.Index.Set
+    Data.PrimitiveArray.Index.Subword
+--    Data.PrimitiveArray.Index.TernarySet
+    Data.PrimitiveArray.Index.Unit
+    Data.PrimitiveArray.ScoreMatrix
+
+
+
 test-suite properties
+  import:
+    deps
   type:
     exitcode-stdio-1.0
   main-is:
@@ -142,25 +158,10 @@
     SmallCheck
     Common
   ghc-options:
-    -O2 -threaded -rtsopts -with-rtsopts=-N
+    -threaded -rtsopts -with-rtsopts=-N
   hs-source-dirs:
     tests
-  default-language:
-    Haskell2010
-  default-extensions: CPP
-                    , ScopedTypeVariables
-                    , TemplateHaskell
-                    , UnicodeSyntax
-  build-depends: base
-               , containers
-               , QuickCheck
-               , smallcheck
-               , tasty              >= 0.11
-               , tasty-quickcheck   >= 0.8
-               , tasty-smallcheck   >= 0.8
-               , tasty-th           >= 0.1
-               --
-               , PrimitiveArray
+  build-depends: PrimitiveArray
 
 
 
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,8 @@
+0.9.1.0
+-------
+
+- Arbitrary instance(s), field lenses that are probably not a good idea (don't use them!)
+
 0.9.0.0
 -------
 
