diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,10 @@
 <!-- -*- Markdown -*- -->
 
+## 0.11.3.0
+
+- add some overloaded projection instances for tuple types.
+- add #primary overloaded projection instance.
+
 ## 0.11.2.0
 
 - add insertValueList API.
diff --git a/relational-query.cabal b/relational-query.cabal
--- a/relational-query.cabal
+++ b/relational-query.cabal
@@ -1,5 +1,5 @@
 name:                relational-query
-version:             0.11.2.0
+version:             0.11.3.0
 synopsis:            Typeful, Modular, Relational, algebraic query engine
 description:         This package contiains typeful relation structure and
                      relational-algebraic query building DSL which can
@@ -14,7 +14,7 @@
 license-file:        LICENSE
 author:              Kei Hibino
 maintainer:          ex8k.hibino@gmail.com
-copyright:           Copyright (c) 2013-2017 Kei Hibino
+copyright:           Copyright (c) 2013-2018 Kei Hibino
 category:            Database
 build-type:          Simple
 cabal-version:       >=1.10
diff --git a/src/Database/Relational/Derives.hs b/src/Database/Relational/Derives.hs
--- a/src/Database/Relational/Derives.hs
+++ b/src/Database/Relational/Derives.hs
@@ -14,9 +14,8 @@
   -- * Query derivation
   specifiedKey,
 
-  unique,
-
-  primary', primary,
+  uniqueSelect,
+  primarySelect,
 
   -- * Update derivation
   updateByConstraintKey,
@@ -25,7 +24,11 @@
   updateValuesWithKey,
 
   -- * Derived objects from table
-  derivedUniqueRelation
+  derivedUniqueRelation,
+
+  -- * Deprecated
+  unique,
+  primary', primary,
   ) where
 
 import Database.Record (PersistableWidth, ToSql)
@@ -50,22 +53,31 @@
 
 -- | Query restricted with specified key.
 specifiedKey :: PersistableWidth p
-      => Pi a p        -- ^ Unique key proof object which record type is 'a' and key type is 'p'.
-      -> Relation () a -- ^ 'Relation' to add restriction.
-      -> Relation p a  -- ^ Result restricted 'Relation'
+             => Pi a p        -- ^ Projection path
+             -> Relation () a -- ^ 'Relation' to add restriction.
+             -> Relation p a  -- ^ Result restricted 'Relation'
 specifiedKey key rel = relation' $ do
   q <- query rel
   (param, ()) <- placeholder (\ph -> wheres $ Record.wpi (relationWidth rel) q key .=. ph)
   return (param, q)
 
 -- | Query restricted with specified unique key.
+uniqueSelect :: PersistableWidth p
+             => Key Unique a p -- ^ Unique key proof object which record type is 'a' and key type is 'p'.
+             -> Relation () a  -- ^ 'Relation' to add restriction.
+             -> Relation p a   -- ^ Result restricted 'Relation'
+uniqueSelect =  specifiedKey . projectionKey
+
+{-# DEPRECATED unique "use `uniqueSelect` instead of this." #-}
+-- | Deprecated.
 unique :: PersistableWidth p
-       => Key Unique a p -- ^ Unique key proof object which record type is 'a' and key type is 'p'.
-       -> Relation () a  -- ^ 'Relation' to add restriction.
-       -> Relation p a   -- ^ Result restricted 'Relation'
-unique =  specifiedKey . projectionKey
+       => Key Unique a p
+       -> Relation () a
+       -> Relation p a
+unique = uniqueSelect
 
--- | Query restricted with specified primary key.
+{-# DEPRECATED primary' "use `primarySelect` instead of this." #-}
+-- | Deprecated.
 primary' :: PersistableWidth p
          => Key Primary a p -- ^ Primary key proof object which record type is 'a' and key type is 'p'.
          -> Relation () a   -- ^ 'Relation' to add restriction.
@@ -73,11 +85,17 @@
 primary' =  specifiedKey . projectionKey
 
 -- | Query restricted with inferred primary key.
-primary :: HasConstraintKey Primary a p
-        => Relation () a -- ^ 'Relation' to add restriction.
-        -> Relation p a  -- ^ Result restricted 'Relation'
-primary =  primary' constraintKey
+primarySelect :: HasConstraintKey Primary a p
+              => Relation () a -- ^ 'Relation' to add restriction.
+              -> Relation p a  -- ^ Result restricted 'Relation'
+primarySelect =  primary' constraintKey
 
+{-# DEPRECATED primary "use `primarySelect` instead of this." #-}
+-- | Deprecated.
+primary :: HasConstraintKey Primary a p
+        => Relation () a
+        -> Relation p a
+primary = primarySelect
 
 -- | Convert from Haskell type `r` into SQL value `q` list expected by update form like
 --
diff --git a/src/Database/Relational/InternalTH/Overloaded.hs b/src/Database/Relational/InternalTH/Overloaded.hs
--- a/src/Database/Relational/InternalTH/Overloaded.hs
+++ b/src/Database/Relational/InternalTH/Overloaded.hs
@@ -1,9 +1,10 @@
 {-# LANGUAGE CPP #-}
 {-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE DataKinds #-}
 
 -- |
 -- Module      : Database.Relational.InternalTH.Overloaded
--- Copyright   : 2017 Kei Hibino
+-- Copyright   : 2017-2018 Kei Hibino
 -- License     : BSD3
 --
 -- Maintainer  : ex8k.hibino@gmail.com
@@ -15,12 +16,13 @@
   monomorphicProjection,
   polymorphicProjections,
   tupleProjection,
+  definePrimaryHasProjection,
   ) where
 
 #if __GLASGOW_HASKELL__ >= 800
 import Language.Haskell.TH
   (Name, mkName, Q, TypeQ, Dec, instanceD, funD, classP,
-   appT, tupleT, varT, litT, strTyLit, clause, normalB)
+   appT, tupleT, varT, litT, strTyLit, clause, normalB, listE)
 import Language.Haskell.TH.Lib.Extra (integralE)
 import Language.Haskell.TH.Name.CamelCase
   (ConName, conName, toVarExp, toTypeCon)
@@ -32,6 +34,7 @@
 import Database.Record.TH (columnOffsetsVarNameDefault)
 
 import Database.Relational.Pi.Unsafe (definePi)
+import Database.Relational.Constraint (unsafeDefineConstraintKey, projectionKey)
 import Database.Relational.OverloadedProjection (HasProjection (projection))
 #else
 import Language.Haskell.TH (Name, mkName, Q, TypeQ, appT, tupleT, varT, Dec)
@@ -89,11 +92,16 @@
 
 -- | Projection templates for tuple type.
 tupleProjection :: Int -> Q [Dec]
-tupleProjection n =
-    polymorphicProjections tyRec avs sels cts
+tupleProjection n = do
+    p <- polymorphicProjections tyRec avs ["fst", "snd"] cts
+    q <- polymorphicProjections tyRec avs sels cts
+    r <- polymorphicProjections tyRec avs oldSels cts -- DEPRECATED. drop in 0.12.0
+    return $ p ++ q ++ r
   where
-    sels = [ "tuplePi" ++ show n ++ "_" ++ show i
+    sels = [ "pi" ++ show i
            | i <- [ 0 .. n - 1] ]
+    oldSels = [ "tuplePi" ++ show n ++ "_" ++ show i
+              | i <- [ 0 .. n - 1] ]
     ((avs, cts), tyRec) = tupleN
     tupleN :: (([Name], [TypeQ]), TypeQ)
     --- same as tupleN of InternalTH.Base, merge after dropping GHC 7.x
@@ -101,3 +109,18 @@
       where
         ns = [ mkName $ "a" ++ show j | j <- [1 .. n] ]
         vs = map varT ns
+
+-- | Projection template for primary key.
+definePrimaryHasProjection :: TypeQ   -- ^ Record type
+                           -> TypeQ   -- ^ Key type
+                           -> [Int]   -- ^ Indexes specifies key
+                           -> Q [Dec] -- ^ Result 'HasProjection' declaration
+#if __GLASGOW_HASKELL__ >= 800
+definePrimaryHasProjection recType colType indexes =
+  [d| instance HasProjection "primary" $recType $colType  where
+        projection _ = projectionKey
+                       $ unsafeDefineConstraintKey $(listE [integralE ix | ix <- indexes])
+    |]
+#else
+definePrimaryHasProjection _ _ _ = [d| |]
+#endif
diff --git a/src/Database/Relational/OverloadedInstances.hs b/src/Database/Relational/OverloadedInstances.hs
--- a/src/Database/Relational/OverloadedInstances.hs
+++ b/src/Database/Relational/OverloadedInstances.hs
@@ -33,13 +33,3 @@
 
 $(concat <$> mapM tupleProjection [2 .. 7])
 -- Generic instances of tuple types are generated from 2 to 7 in GHC.Generics.
-
-#if __GLASGOW_HASKELL__ >= 800
-instance PersistableWidth a =>
-         HasProjection "fst" (a, b) a where
-  projection _ = definePi 0
-
-instance (PersistableWidth a, PersistableWidth b) =>
-         HasProjection "snd" (a, b) b where
-  projection _ = definePi $ runPersistableRecordWidth (persistableWidth :: PersistableRecordWidth b)
-#endif
diff --git a/src/Database/Relational/TH.hs b/src/Database/Relational/TH.hs
--- a/src/Database/Relational/TH.hs
+++ b/src/Database/Relational/TH.hs
@@ -92,7 +92,7 @@
            schemaNameMode, nameConfig, identifierQuotation),
    relationalQuerySQL, Query, relationalQuery, KeyUpdate,
    Insert, insert, InsertQuery, insertQuery,
-   HasConstraintKey(constraintKey), Primary, NotNull, primary, primaryUpdate)
+   HasConstraintKey(constraintKey), Primary, NotNull, primarySelect, primaryUpdate)
 
 import Database.Relational.InternalTH.Base (defineTuplePi, defineRecordProjections)
 import Database.Relational.Scalar (defineScalarDegree)
@@ -112,12 +112,10 @@
                                -> TypeQ   -- ^ Key type
                                -> [Int]   -- ^ Indexes specifies key
                                -> Q [Dec] -- ^ Result 'HasConstraintKey' declaration
-defineHasConstraintKeyInstance constraint recType colType indexes = do
-  -- kc <- defineHasColumnConstraintInstance constraint recType index
-  ck <- [d| instance HasConstraintKey $constraint $recType $colType  where
-              constraintKey = unsafeDefineConstraintKey $(listE [integralE ix | ix <- indexes])
-          |]
-  return ck
+defineHasConstraintKeyInstance constraint recType colType indexes =
+  [d| instance HasConstraintKey $constraint $recType $colType  where
+        constraintKey = unsafeDefineConstraintKey $(listE [integralE ix | ix <- indexes])
+    |]
 
 -- | Rule template to infer primary key.
 defineHasPrimaryKeyInstance :: TypeQ   -- ^ Record type
@@ -127,7 +125,8 @@
 defineHasPrimaryKeyInstance recType colType indexes = do
   kc <- Record.defineHasPrimaryKeyInstance recType indexes
   ck <- defineHasConstraintKeyInstance [t| Primary |] recType colType indexes
-  return $ kc ++ ck
+  pp <- Overloaded.definePrimaryHasProjection recType colType indexes
+  return $ kc ++ ck ++ pp
 
 -- | Rule template to infer primary key.
 defineHasPrimaryKeyInstanceWithConfig :: Config  -- ^ configuration parameters
@@ -344,7 +343,7 @@
   let toDef = varName toDef'
   simpleValD toDef
     [t| Query $paramType $recType |]
-    [|  relationalQuery (primary $relE) |]
+    [|  relationalQuery (primarySelect $relE) |]
 
 -- | Template of derived primary 'Update'.
 definePrimaryUpdate :: VarName -- ^ Variable name of result declaration
