diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,10 @@
 The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
 and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
 
+## 0.9.3
+### Added
+- Some support for P2WPKH-over-P2SH addresses.
+
 ## 0.9.2
 ### Removed
 - Disable unnecessary `-O2` optimisation added in previous version.
diff --git a/haskoin-core.cabal b/haskoin-core.cabal
--- a/haskoin-core.cabal
+++ b/haskoin-core.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: f8c182a15da9f3c4eb348dd84d0794720d0b89acf7981b7a317785f2e4196c96
+-- hash: 02eeb8fb9ab57329c99198da0834bf37562983ad0cae7f6b3185fa6d95dc919b
 
 name:           haskoin-core
-version:        0.9.2
+version:        0.9.3
 synopsis:       Bitcoin & Bitcoin Cash library for Haskell
 description:    Haskoin Core is a complete Bitcoin and Bitcoin Cash library of functions and data types for Haskell developers.
 category:       Bitcoin, Finance, Network
diff --git a/src/Network/Haskoin/Address.hs b/src/Network/Haskoin/Address.hs
--- a/src/Network/Haskoin/Address.hs
+++ b/src/Network/Haskoin/Address.hs
@@ -24,6 +24,7 @@
     , addrFromJSON
     , pubKeyAddr
     , pubKeyWitnessAddr
+    , pubKeyWitnessP2SHAddr
     , p2pkhAddr
     , p2wpkhAddr
     , p2shAddr
@@ -196,6 +197,12 @@
 -- | Obtain a P2WPKH address from a public key. Only on SegWit networks.
 pubKeyWitnessAddr :: PubKeyI -> Address
 pubKeyWitnessAddr = WitnessPubKeyAddress . addressHash . S.encode
+
+-- | Obtain a W2WPKH P2SH address. Only on SegWit networks.
+pubKeyWitnessP2SHAddr :: PubKeyI -> Address
+pubKeyWitnessP2SHAddr =
+    p2shAddr .
+    addressHash . encodeOutputBS . PayWitnessPKHash . addressHash . S.encode
 
 -- | Obtain a P2WPKH address from a 'Hash160'.
 p2wpkhAddr :: Hash160 -> Address
diff --git a/src/Network/Haskoin/Keys/Extended.hs b/src/Network/Haskoin/Keys/Extended.hs
--- a/src/Network/Haskoin/Keys/Extended.hs
+++ b/src/Network/Haskoin/Keys/Extended.hs
@@ -310,6 +310,12 @@
 xPubAddr :: XPubKey -> Address
 xPubAddr xkey = pubKeyAddr (wrapPubKey True (xPubKey xkey))
 
+xPubWitnessAddr :: XPubKey -> Address
+xPubWitnessAddr xkey = pubKeyWitnessAddr (wrapPubKey True (xPubKey xkey))
+
+xPubWitnessP2SHAddr :: XPubKey -> Address
+xPubWitnessP2SHAddr xkey = pubKeyWitnessP2SHAddr (wrapPubKey True (xPubKey xkey))
+
 -- | Exports an extended private key to the BIP32 key export format ('Base58').
 xPrvExport :: Network -> XPrvKey -> Base58
 xPrvExport net = encodeBase58Check . runPut . putXPrvKey net
diff --git a/test/Network/Haskoin/AddressSpec.hs b/test/Network/Haskoin/AddressSpec.hs
--- a/test/Network/Haskoin/AddressSpec.hs
+++ b/test/Network/Haskoin/AddressSpec.hs
@@ -5,27 +5,32 @@
 import           Data.Aeson.Types
 import           Data.ByteString                (ByteString)
 import qualified Data.ByteString                as BS (append, empty, pack)
+import           Data.Either                    (isRight)
+import           Data.Maybe                     (isJust, fromJust)
+import qualified Data.Serialize                 as S
 import           Data.Text                      (Text)
 import           Network.Haskoin.Address
 import           Network.Haskoin.Address.Base58
 import           Network.Haskoin.Constants
+import           Network.Haskoin.Keys           (derivePubKeyI)
 import           Network.Haskoin.Test
 import           Test.Hspec
-import           Test.HUnit                     (Assertion, assertBool)
+import           Test.HUnit                     (Assertion, assertBool,
+                                                 assertEqual)
 import           Test.QuickCheck
 
 spec :: Spec
 spec = do
     let net = btc
-    describe "btc address" $
-        it "base58 encodings" $ mapM_ runVector vectors
+    describe "btc address" . it "base58 encodings" $ mapM_ runVector vectors
     describe "btc-test address" $ props btcTest
     describe "bch address" $ props bch
     describe "bch-test address" $ props bchTest
     describe "bch-regtest address" $ props bchRegTest
-    describe "json serialization" $
-        it "encodes and decodes address" $
-            forAll arbitraryAddress (testCustom (addrFromJSON net) (addrToJSON net))
+    describe "json serialization" . it "encodes and decodes address" $
+        forAll arbitraryAddress (testCustom (addrFromJSON net) (addrToJSON net))
+    describe "witness address vectors" . it "p2sh(pwpkh)" $
+        mapM_ testCompatWitness compatWitnessVectors
 
 props :: Network -> Spec
 props net = do
@@ -45,10 +50,10 @@
 
 runVector :: (ByteString, Text, Text) -> Assertion
 runVector (bs, e, chk) = do
-    assertBool "encodeBase58" $ e == b58
-    assertBool "encodeBase58Check" $ chk == b58Chk
-    assertBool "decodeBase58" $ Just bs == decodeBase58 b58
-    assertBool "decodeBase58Check" $ Just bs == decodeBase58Check b58Chk
+    assertEqual "encodeBase58" e b58
+    assertEqual "encodeBase58Check" chk b58Chk
+    assertEqual "decodeBase58" (Just bs) (decodeBase58 b58)
+    assertEqual "decodeBase58Check" (Just bs) (decodeBase58Check b58Chk)
   where
     b58    = encodeBase58 bs
     b58Chk = encodeBase58Check bs
@@ -68,3 +73,19 @@
 
 testCustom :: Eq a => (Value -> Parser a) -> (a -> Value) -> a -> Bool
 testCustom f g x = parseMaybe f (g x) == Just x
+
+compatWitnessVectors :: [(Network, Text, Text)]
+compatWitnessVectors =
+    [ ( btcTest
+      , "cNUnpYpMsJXYCERYBciJnsWBpcYEFjdcbq6dxj4SskGhs7uHuJ7Q"
+      , "2N6PDTueBHvXzW61B4oe5SW1D3v2Z3Vpbvw")
+    ]
+
+testCompatWitness :: (Network, Text, Text) -> Assertion
+testCompatWitness (net, seckey, addr) = do
+    let seckeyM = fromWif net seckey
+    assertBool "decode seckey" (isJust seckeyM)
+    let pubkey = derivePubKeyI (fromJust seckeyM)
+    let addrM = addrToString btcTest (pubKeyWitnessP2SHAddr pubkey)
+    assertBool "address can be encoded" (isJust addrM)
+    assertEqual "witness address matches" addr (fromJust addrM)
