diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
 # Changelog for the [`clash-ghc`](http://hackage.haskell.org/package/clash-ghc) package
 
+## 0.6.23 *August 18th 2015*
+* Fixes bugs:
+  * Type families are not being reduced correctly  [#167](https://github.com/clash-lang/clash-compiler/issues/167)
+  * (System)Verilog: Fix primitives for {Signed,Unsigned} rotateL# and rotateR# [#169](https://github.com/clash-lang/clash-compiler/issues/169)
+
 ## 0.6.22 *August 3rd 2016*
 * Fixes bugs:
   * Bug in DEC transformation overwrites case-alternatives
diff --git a/clash-ghc.cabal b/clash-ghc.cabal
--- a/clash-ghc.cabal
+++ b/clash-ghc.cabal
@@ -1,5 +1,5 @@
 Name:                 clash-ghc
-Version:              0.6.22
+Version:              0.6.23
 Synopsis:             CAES Language for Synchronous Hardware
 Description:
   CλaSH (pronounced ‘clash’) is a functional hardware description language that
@@ -94,13 +94,13 @@
                       unbound-generics          >= 0.1      && < 0.4,
                       unordered-containers      >= 0.2.1.0  && < 0.3,
 
-                      clash-lib                 >= 0.6.20   && < 0.7,
-                      clash-systemverilog       >= 0.6.8    && < 0.7,
+                      clash-lib                 >= 0.6.21   && < 0.7,
+                      clash-systemverilog       >= 0.6.9    && < 0.7,
                       clash-vhdl                >= 0.6.16   && < 0.7,
-                      clash-verilog             >= 0.6.8    && < 0.7,
-                      clash-prelude             >= 0.10.11  && < 0.11,
+                      clash-verilog             >= 0.6.9    && < 0.7,
+                      clash-prelude             >= 0.10.13  && < 0.11,
                       ghc-typelits-extra        >= 0.1.3    && < 0.2,
-                      ghc-typelits-natnormalise >= 0.4.3    && < 0.5,
+                      ghc-typelits-natnormalise >= 0.4.3    && < 0.6,
                       deepseq                   >= 1.3.0.2  && < 1.5,
                       time                      >= 1.4.0.1  && < 1.7
 
diff --git a/src-ghc/CLaSH/GHC/GHC2Core.hs b/src-ghc/CLaSH/GHC/GHC2Core.hs
--- a/src-ghc/CLaSH/GHC/GHC2Core.hs
+++ b/src-ghc/CLaSH/GHC/GHC2Core.hs
@@ -46,6 +46,7 @@
 import qualified Unbound.Generics.LocallyNameless     as Unbound
 
 -- GHC API
+import CoAxiom    (CoAxiom (co_ax_branches), CoAxBranch (cab_lhs,cab_rhs), brListMapM)
 import Coercion   (Coercion (..),Role(..),coercionType,coercionKind,mkCoercionType)
 import CoreFVs    (exprSomeFreeVars)
 import CoreSyn    (AltCon (..), Bind (..), CoreExpr,
@@ -74,7 +75,7 @@
 import TyCon      (AlgTyConRhs (..), TyCon,
                    algTyConRhs, isAlgTyCon, isFamilyTyCon,
                    isFunTyCon, isNewTyCon,
-                   isPrimTyCon, isTupleTyCon,
+                   isPrimTyCon, isTupleTyCon, isClosedSynFamilyTyCon_maybe,
 #if __GLASGOW_HASKELL__ >= 711
                    expandSynTyCon_maybe,
 #else
@@ -161,8 +162,12 @@
         mkFunTyCon = do
           tcName <- coreToName tyConName tyConUnique qualfiedNameString tc
           tcKind <- coreToType (tyConKind tc)
-          let instances = familyInstances fiEnvs tc
-          substs <- mapM famInstToSubst instances
+          substs <- case isClosedSynFamilyTyCon_maybe tc of
+            Nothing -> let instances = familyInstances fiEnvs tc
+                       in  mapM famInstToSubst instances
+            Just cx -> let bx = co_ax_branches cx
+                       in  brListMapM (\b -> (,) <$> mapM coreToType (cab_lhs b)
+                                                 <*> coreToType (cab_rhs b)) bx
           return
             C.FunTyCon
             { C.tyConName  = tcName
diff --git a/src-ghc/CLaSH/GHC/GenerateBindings.hs b/src-ghc/CLaSH/GHC/GenerateBindings.hs
--- a/src-ghc/CLaSH/GHC/GenerateBindings.hs
+++ b/src-ghc/CLaSH/GHC/GenerateBindings.hs
@@ -32,7 +32,7 @@
 import           CLaSH.Annotations.TopEntity (TopEntity)
 import           CLaSH.Core.FreeVars     (termFreeIds)
 import           CLaSH.Core.Term         (Term (..), TmName)
-import           CLaSH.Core.Type         (Type, TypeView (..), coreView, mkFunTy, splitFunForallTy)
+import           CLaSH.Core.Type         (Type, TypeView (..), mkFunTy, splitFunForallTy, tyView)
 import           CLaSH.Core.TyCon        (TyCon, TyConName)
 import           CLaSH.Core.TysPrim      (tysPrimMap)
 import           CLaSH.Core.Subst        (substTms)
@@ -143,7 +143,7 @@
                        $ first (span (\l -> case l of Left _ -> True
                                                       _      -> False))
                        $ splitFunForallTy ty
-    newExpr = case coreView tcm dictTy of
+    newExpr = case tyView dictTy of
       (TyConApp _ _) -> runFreshM $ flip State.evalStateT (0 :: Int) $ do
                           (dcId,dcVar) <- mkInternalVar "dict" dictTy
                           selE         <- mkSelectorCase "mkClassSelector" tcm dcVar 1 sel
diff --git a/src-ghc/CLaSH/GHC/NetlistTypes.hs b/src-ghc/CLaSH/GHC/NetlistTypes.hs
--- a/src-ghc/CLaSH/GHC/NetlistTypes.hs
+++ b/src-ghc/CLaSH/GHC/NetlistTypes.hs
@@ -20,8 +20,7 @@
 import CLaSH.Core.DataCon               (DataCon (..))
 import CLaSH.Core.Pretty                (showDoc)
 import CLaSH.Core.TyCon                 (TyCon (..), TyConName, tyConDataCons)
-import CLaSH.Core.Type                  (Type (..), TypeView (..), findFunSubst,
-                                         tyView)
+import CLaSH.Core.Type                  (Type (..), TypeView (..), tyView)
 import CLaSH.Core.Util                  (tyNatSize)
 import CLaSH.Netlist.Util               (coreTypeToHWType)
 import CLaSH.Netlist.Types              (HWType(..))
@@ -110,14 +109,6 @@
           (TyConApp (name2String -> "GHC.Types.Char") []) -> return String
           _ -> fail $ "Can't translate type: " ++ showDoc ty
 
-        _ -> case m ! tc of
-               -- TODO: Remove this conversion
-               -- The current problem is that type-functions are not reduced by the GHC -> Core
-               -- transformation process, and so end up here. Once a fix has been found for
-               -- this problem remove this dirty hack.
-               FunTyCon {tyConSubst = tcSubst} -> case findFunSubst tcSubst args of
-                 Just ty' -> ExceptT $ return $ coreTypeToHWType go m ty'
-                 _ -> ExceptT Nothing
-               _ -> ExceptT Nothing
+        _ -> ExceptT Nothing
 
     go _ _ = Nothing
