diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Changelog for the [`clash-lib`](http://hackage.haskell.org/package/clash-lib) package
 
+## 0.6.12 *March 14th 2016*
+* Fixes bugs:
+  * Not all lambda's in a function position removed due to bad eta-expansion [#132](https://github.com/clash-lang/clash-compiler/issues/132)
+
 ## 0.6.11 *March 11th 2016*
 * New features:
   * Add support for HDL synthesis tool specific HDL generation
diff --git a/clash-lib.cabal b/clash-lib.cabal
--- a/clash-lib.cabal
+++ b/clash-lib.cabal
@@ -1,5 +1,5 @@
 Name:                 clash-lib
-Version:              0.6.11
+Version:              0.6.12
 Synopsis:             CAES Language for Synchronous Hardware - As a Library
 Description:
   CλaSH (pronounced ‘clash’) is a functional hardware description language that
diff --git a/src/CLaSH/Normalize/Transformations.hs b/src/CLaSH/Normalize/Transformations.hs
--- a/src/CLaSH/Normalize/Transformations.hs
+++ b/src/CLaSH/Normalize/Transformations.hs
@@ -764,6 +764,25 @@
   e' <- etaExpansionTL (LamBody bndr:ctx) e
   return $ Lam (bind bndr e')
 
+etaExpansionTL ctx (Letrec b) = do
+  (xesR,e) <- unbind b
+  let xes   = unrec xesR
+      bndrs = map fst xes
+  e' <- etaExpansionTL (LetBody bndrs:ctx) e
+  e'' <- stripLambda e'
+  case e'' of
+    (bs@(_:_),e2) -> do
+      let e3 = Letrec (bind xesR e2)
+      changed (mkLams e3 bs)
+    _ -> return (Letrec (bind xesR e'))
+  where
+    stripLambda :: Term -> RewriteMonad NormalizeState ([Id],Term)
+    stripLambda (Lam b') = do
+      (bndr,e)   <- unbind b'
+      (bndrs,e') <- stripLambda e
+      return (bndr:bndrs,e')
+    stripLambda e = return ([],e)
+
 etaExpansionTL ctx e
   = do
     tcm <- Lens.view tcCache
