diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,13 +1,17 @@
 # Changelog for zipper-extra
 
+## v0.1.3.0
+
+* Add `seekOn` and `seekOnThrow` and related exceptions.
+
 ## v0.1.2.0
 
-Add `zipper'`, `MonadThrow` version of regular `zipper`.
+* Add `zipper'`, `MonadThrow` version of regular `zipper`.
 
 ## v0.1.1.0
 
-Add paginate' and exception handling for pagination failure.
+* Add paginate' and exception handling for pagination failure.
 
 ## v0.1.0.0
 
-Reexport `Control.Comonad.Store.Zipper` with some utility functions.
+* Reexport `Control.Comonad.Store.Zipper` with some utility functions.
diff --git a/src/Control/Comonad/Zipper/Extra.hs b/src/Control/Comonad/Zipper/Extra.hs
--- a/src/Control/Comonad/Zipper/Extra.hs
+++ b/src/Control/Comonad/Zipper/Extra.hs
@@ -11,11 +11,17 @@
 , zipperPreviousMaybe
 , zipperWithin
 , zipper'
+, ZipperException(..)
+, elemIndexThrow
+, ElemNotFoundException(..)
+, seekOn
+, seekOnThrow
 ) where
 
 import Control.Monad.Catch
 import Control.Comonad.Store
 import Control.Comonad.Store.Zipper
+import Data.List
 import Data.List.Split
 import Data.Typeable
 
@@ -60,3 +66,28 @@
 -- | Like `zipper` but lifted to `MonadThrow`.
 zipper' :: (MonadThrow m, Traversable t) => t a -> m (Zipper t a)
 zipper' xs = maybe (throwM EmptyZipper) return $ zipper xs
+
+data ElemNotFoundException a = ElemNotFoundException a [a]
+    deriving (Show, Eq, Typeable)
+
+instance (Typeable a, Show a) => Exception (ElemNotFoundException a) where
+  displayException (ElemNotFoundException x xs) = "Elem " <> show x <> " not found in " <> show xs
+
+-- | Lifted version of `Data.List.elemIndex` that throws an `ElemNotFoundException` if the target does not exist.
+elemIndexThrow :: (MonadThrow m, Eq a, Typeable a, Show a) => a -> [a] -> m Int
+elemIndexThrow x xs = case elemIndex x xs of
+  Nothing -> throwM $ ElemNotFoundException x xs
+  Just a -> return a
+
+-- | Seek on a property of the elements of the zipper. Finds the index of the element to search for
+--   and moves the tape to that position.
+seekOn :: Eq b => (a -> b) -> b -> Zipper [] a -> Maybe (Zipper [] a)
+seekOn f x ys = do
+  k <- elemIndex x (f <$> unzipper ys)
+  return $ seek k ys
+
+-- | Lifted version of `seekOn` which throws an `ElemNotFoundException` if the target does not exist.
+seekOnThrow :: (MonadThrow m, Eq b, Typeable b, Show b) => (a -> b) -> b -> Zipper [] a -> m (Zipper [] a)
+seekOnThrow f x ys = do
+  k <- elemIndexThrow x (f <$> unzipper ys)
+  return $ seek k ys
diff --git a/zipper-extra.cabal b/zipper-extra.cabal
--- a/zipper-extra.cabal
+++ b/zipper-extra.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: efbea88d20acdb5ae2f378dea5468ec8ea1e03c4b193105398ed5499d4d25184
+-- hash: b0aba807b4c0f0eef767d30ec62bf9c0df2baee33ef15205c7b9e6a864ffcae4
 
 name:           zipper-extra
-version:        0.1.2.1
+version:        0.1.3.0
 synopsis:       Zipper utils that weren't in Control.Comonad.Store.Zipper
 description:    Adds some utility functions for and reexports Control.Comonad.Store.Zipper
 category:       Comonads
