diff --git a/hs-inspector.cabal b/hs-inspector.cabal
--- a/hs-inspector.cabal
+++ b/hs-inspector.cabal
@@ -2,7 +2,7 @@
 --  http://haskell.org/cabal/users-guide/
 
 name:                hs-inspector
-version:             0.2.1.0
+version:             0.3.0.0
 license:             MIT
 license-file:        LICENSE
 author:              Franco Leonardo Bulgarelli
@@ -21,8 +21,9 @@
   hs-source-dirs:
       src
   exposed-modules:
-    Language.Haskell.Inspector
+    Language.Haskell.Inspector.Smell
     Language.Haskell.Explorer
+    Language.Haskell.Inspector
   build-depends:
     base                      >= 4     && < 5,
     haskell-src               >= 1     && < 1.1
diff --git a/src/Language/Haskell/Inspector.hs b/src/Language/Haskell/Inspector.hs
--- a/src/Language/Haskell/Inspector.hs
+++ b/src/Language/Haskell/Inspector.hs
@@ -14,22 +14,33 @@
 -- | Inspection that tells whether a binding uses the composition operator '.'
 -- in its definition
 hasComposition :: Inspection
-hasComposition = testAnyWithBindingExpr f
+hasComposition = isBindingEO f
   where f (O (HsQVarOp (UnQual (HsSymbol ".")))) = True
         f _ = False
 
 -- | Inspection that tells whether a binding uses guards
 -- in its definition
 hasGuards :: Inspection
-hasGuards = testAnyWithBindingRhs f
+hasGuards = isBindingRhs f
   where f (HsGuardedRhss _) = True
         f _ = False
 
+-- | Inspection that tells whether a binding uses ifs
+-- in its definition
+hasIf :: Inspection
+hasIf = isBindingEO f
+  where f (E (HsIf _ _ _)) = True
+        f _ = False
 
+-- | Inspection that tells whether a binding uses ifs or guards
+-- in its definition
+hasConditional :: Inspection
+hasConditional target code = hasIf target code || hasGuards target code
+
 -- | Inspection that tells whether a binding uses a lambda expression
 -- in its definition
 hasLambda :: Inspection
-hasLambda = testAnyWithBindingExpr f
+hasLambda = isBindingEO f
   where f (E (HsLambda _ _ _)) = True
         f _ = False
 
@@ -38,11 +49,10 @@
 hasDirectRecursion :: Inspection
 hasDirectRecursion binding = hasUsage binding binding
 
-
 -- | Inspection that tells whether a binding uses the the given target binding
 -- in its definition
 hasUsage :: String -> Inspection
-hasUsage target = testAnyWithBindingExpr f
+hasUsage target = isBindingEO f
   where f (O (HsQVarOp name)) = isTarget name
         f (E (HsVar    name)) = isTarget name
         f _ = False
@@ -57,7 +67,7 @@
 -- | Inspection that tells whether a binding uses lists comprehensions
 -- in its definition
 hasComprehension :: Inspection
-hasComprehension = testAnyWithBindingExpr f
+hasComprehension = isBindingEO f
   where f (E (HsListComp _ _)) = True
         f _ = False
 
@@ -68,10 +78,12 @@
 isParseable :: Code -> Bool
 isParseable = testWithCode (const True)
 
-testAnyWithBindingExpr f = testAnyWithBindingRhs testExprs
-  where testExprs rhs = exploreExprs f $ topExprs rhs
+-- ===================================================
 
-testAnyWithBindingRhs f = testWithBindingRhs (any f)
+isBindingEO f = isBindingRhs isExpr
+  where isExpr rhs = exploreExprs f $ topExprs rhs
+
+isBindingRhs f = testWithBindingRhs (any f)
 
 testWithBindingRhs :: ([HsRhs] -> Bool) -> Binding -> Code -> Bool
 testWithBindingRhs f binding  = orFalse . withBindingRhs f binding
diff --git a/src/Language/Haskell/Inspector/Smell.hs b/src/Language/Haskell/Inspector/Smell.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/Inspector/Smell.hs
@@ -0,0 +1,34 @@
+module Language.Haskell.Inspector.Smell where
+
+import Language.Haskell.Explorer
+import Language.Haskell.Syntax
+import Language.Haskell.Inspector
+
+hasRedundantBooleanComparison :: Inspection
+hasRedundantBooleanComparison = isBindingEO f
+  where f (E (HsInfixApp x (HsQVarOp (UnQual (HsSymbol c))) y)) = any isBooleanLiteral [x, y] && isComp c
+        f _ = False
+
+        isComp c = c == "==" || c == "/="
+
+hasRedundantIf :: Inspection
+hasRedundantIf = isBindingEO f
+  where f (E (HsIf _ x y)) = all isBooleanLiteral [x, y]
+        f _            = False
+
+
+hasRedundantGuards :: Inspection
+hasRedundantGuards = isBindingRhs f -- TODO not true when condition is a pattern
+  where f (HsGuardedRhss [
+            HsGuardedRhs _ _ x,
+            HsGuardedRhs _ (HsVar (UnQual (HsIdent "otherwise"))) y]) = all isBooleanLiteral [x, y]
+        f _ = False
+
+hasRedundantLambda :: Inspection
+hasRedundantLambda = isBindingEO f
+  where f (E (HsLambda _ [HsPVar (HsIdent x)] (HsApp _ (HsVar (UnQual (HsIdent y)))))) = x == y
+        f _ = False -- TODO consider parenthesis and symbols
+
+isBooleanLiteral (HsCon (UnQual (HsIdent "True")))  = True
+isBooleanLiteral (HsCon (UnQual (HsIdent "False"))) = True
+isBooleanLiteral _                                  = False
