diff --git a/Network/DNS/Internal.hs b/Network/DNS/Internal.hs
--- a/Network/DNS/Internal.hs
+++ b/Network/DNS/Internal.hs
@@ -18,7 +18,7 @@
 {-|
   Types for resource records.
 -}
-data TYPE = A | AAAA | NS | TXT | MX | CNAME | SOA
+data TYPE = A | AAAA | NS | TXT | MX | CNAME | SOA | PTR | SRV
           | UNKNOWN Int deriving (Eq, Show, Read)
 
 rrDB :: [(TYPE, Int)]
@@ -27,9 +27,11 @@
   , (NS,     2)
   , (CNAME,  5)
   , (SOA,    6)
+  , (PTR,   12)
   , (MX,    15)
   , (TXT,   16)
   , (AAAA,  28)
+  , (SRV,   33)
   ]
 
 rookup                  :: (Eq b) => b -> [(a,b)] -> Maybe a
@@ -125,9 +127,10 @@
 {-|
   Raw data format for each type.
 -}
-data RDATA = RD_NS Domain | RD_CNAME Domain | RD_MX Int Domain
+data RDATA = RD_NS Domain | RD_CNAME Domain | RD_MX Int Domain | RD_PTR Domain
            | RD_SOA Domain Domain Int Int Int Int Int
            | RD_A IPv4 | RD_AAAA IPv6 | RD_TXT ByteString
+           | RD_SRV Int Int Int Domain
            | RD_OTH [Int] deriving (Eq)
 
 instance Show RDATA where
@@ -138,6 +141,8 @@
   show (RD_AAAA aaaa) = show aaaa
   show (RD_TXT txt) = BS.unpack txt
   show (RD_SOA mn _ _ _ _ _ mi) = BS.unpack mn ++ " " ++ show mi
+  show (RD_PTR dom) = BS.unpack dom
+  show (RD_SRV pri wei prt dom) = show pri ++ " " ++ show wei ++ " " ++ show prt ++ BS.unpack dom
   show (RD_OTH is) = show is
 
 ----------------------------------------------------------------
diff --git a/Network/DNS/Lookup.hs b/Network/DNS/Lookup.hs
--- a/Network/DNS/Lookup.hs
+++ b/Network/DNS/Lookup.hs
@@ -6,6 +6,8 @@
     lookupA, lookupAAAA
   , lookupMX, lookupAviaMX, lookupAAAAviaMX
   , lookupTXT
+  , lookupPTR
+  , lookupSRV
   ) where
 
 import Control.Applicative
@@ -82,3 +84,27 @@
     toTXT = maybe Nothing (Just . map unTag)
     unTag (RD_TXT x) = x
     unTag _ = error "lookupTXT"
+
+----------------------------------------------------------------
+
+{-|
+  Resolving 'Domain' and its preference by 'PTR'.
+-}
+lookupPTR :: Resolver -> Domain -> IO (Maybe [Domain])
+lookupPTR rlv dom = toPTR <$> DNS.lookup rlv dom PTR
+  where
+    toPTR = maybe Nothing (Just . map unTag)
+    unTag (RD_PTR dm) = dm
+    unTag _ = error "lookupPTR"
+
+----------------------------------------------------------------
+
+{-|
+  Resolving 'Domain' and its preference by 'SRV'.
+-}
+lookupSRV :: Resolver -> Domain -> IO (Maybe [(Int,Int,Int,Domain)])
+lookupSRV rlv dom = toSRV <$> DNS.lookup rlv dom SRV
+  where
+    toSRV = maybe Nothing (Just . map unTag)
+    unTag (RD_SRV pri wei prt dm) = (pri,wei,prt,dm)
+    unTag _ = error "lookupSRV"
diff --git a/Network/DNS/Response.hs b/Network/DNS/Response.hs
--- a/Network/DNS/Response.hs
+++ b/Network/DNS/Response.hs
@@ -126,6 +126,15 @@
     decodeRetry   = getInt32
     decodeExpire  = getInt32
     decodeMinumun = getInt32
+decodeRData PTR _ = RD_PTR <$> decodeDomain
+decodeRData SRV _ = RD_SRV <$> decodePriority
+                           <*> decodeWeight
+                           <*> decodePort
+                           <*> decodeDomain
+  where
+    decodePriority = getInt16
+    decodeWeight   = getInt16
+    decodePort     = getInt16
 
 decodeRData _  len = RD_OTH <$> getNBytes len
 
diff --git a/Test.hs b/Test.hs
--- a/Test.hs
+++ b/Test.hs
@@ -7,6 +7,7 @@
 import Test.Framework (defaultMain, testGroup, Test)
 import Test.Framework.Providers.HUnit
 import Test.HUnit hiding (Test)
+import qualified Data.ByteString.Char8 as BS
 
 tests :: [Test]
 tests = [
@@ -16,6 +17,8 @@
        , testCase "lookupTXT" test_lookupTXT
        , testCase "lookupAviaMX" test_lookupAviaMX
        , testCase "lookupAviaCNAME" test_lookupAviaCNAME
+       , testCase "lookupPTR" test_lookupPTR
+       , testCase "lookupSRV" test_lookupSRV
        ]
   ]
 
@@ -59,6 +62,22 @@
     rs <- makeResolvSeed defaultResolvConf
     withResolver rs $ \resolver ->
         DNS.lookupA resolver "ghs.google.com" ??= ["72.14.203.121"]
+
+test_lookupPTR :: IO ()
+test_lookupPTR = do
+    rs <- makeResolvSeed defaultResolvConf
+    withResolver rs $ \resolver ->
+        DNS.lookupPTR resolver rev ?= Just ["www-v4.iij.ad.jp."]
+  where
+    target = "210.130.137.80"
+    rev = BS.intercalate "." (reverse (BS.split '.' target))
+          `BS.append` ".in-addr.arpa"
+
+test_lookupSRV :: IO ()
+test_lookupSRV = do
+    rs <- makeResolvSeed defaultResolvConf
+    withResolver rs $ \resolver ->
+        DNS.lookupSRV resolver "_sip._tcp.cisco.com" ?= Just [(1,0,5060,"vcsgw.cisco.com.")]
 
 main :: IO ()
 main = defaultMain tests
diff --git a/dns.cabal b/dns.cabal
--- a/dns.cabal
+++ b/dns.cabal
@@ -1,5 +1,5 @@
 Name:                   dns
-Version:                0.2.0
+Version:                0.2.1
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
