diff --git a/Data/Factual/Query/CrosswalkQuery.hs b/Data/Factual/Query/CrosswalkQuery.hs
deleted file mode 100644
--- a/Data/Factual/Query/CrosswalkQuery.hs
+++ /dev/null
@@ -1,49 +0,0 @@
--- | This module exports the type used to create crosswalk queries.
-module Data.Factual.Query.CrosswalkQuery
-  (
-   -- * CrosswalkQuery type
-   CrosswalkQuery(..)
-  ) where
-
-import Data.Factual.Query
-import Data.Factual.Utils
-import Network.HTTP.Base (urlEncode)
-
--- | A crosswalk query can be formed by specifying a factual id and
---   (optionally) a list of namespaces to only include when attempting to find
---   the ids for various namespaces, or by specifying a namespace and namespace
---   id in order to find the factual id. An optional limit can be set as well.
-data CrosswalkQuery = CrosswalkQuery { factualId :: Maybe String
-                                     , limit :: Maybe Int
-                                     , namespace :: Maybe String
-                                     , namespaceId :: Maybe String
-                                     , only :: [String]
-                                     } deriving (Eq, Show)
-
--- A crosswalk query is a member of the Query typeclass so it can generate a
--- path to be queried.
-instance Query CrosswalkQuery where
-  toPath query = "/places/crosswalk?"
-               ++ joinAndFilter [ factualIdString $ factualId query
-                                , limitString $ limit query
-                                , namespaceString $ namespace query
-                                , namespaceIdString $ namespaceId query
-                                , onlyString $ only query ]
-
--- The following helper functions are used to generate the separate parts of
--- the query path.
-factualIdString :: Maybe String -> String
-factualIdString (Just id) = "factual_id=" ++ urlEncode id
-factualIdString Nothing   = ""
-
-namespaceString :: Maybe String -> String
-namespaceString (Just namespace) = "namespace=" ++ urlEncode namespace
-namespaceString Nothing          = ""
-
-namespaceIdString :: Maybe String -> String
-namespaceIdString (Just id) = "namespace_id=" ++ urlEncode id
-namespaceIdString Nothing   = ""
-
-onlyString :: [String] -> String
-onlyString []   = ""
-onlyString strs = "only=" ++ urlEncode (join "," strs)
diff --git a/Data/Factual/Shared/Table.hs b/Data/Factual/Shared/Table.hs
--- a/Data/Factual/Shared/Table.hs
+++ b/Data/Factual/Shared/Table.hs
@@ -12,6 +12,7 @@
            | RestaurantsUS
            | HotelsUS
            | Global
+           | Crosswalk
            | HealthCareProviders
            | WorldGeographies
            | ProductsCPG
@@ -26,6 +27,7 @@
   show RestaurantsUS       = "/t/restaurants-us"
   show HotelsUS            = "/t/hotels-us"
   show Global              = "/t/global"
+  show Crosswalk           = "/t/crosswalk"
   show HealthCareProviders = "/t/health-care-providers-us"
   show WorldGeographies    = "/t/world-geographies"
   show ProductsCPG         = "/t/products-cpg"
diff --git a/Network/Factual/API.hs b/Network/Factual/API.hs
--- a/Network/Factual/API.hs
+++ b/Network/Factual/API.hs
@@ -121,7 +121,7 @@
 extractJSON = fromJust . decode . rspPayload
 
 headersList :: [(String, String)]
-headersList = [("X-Factual-Lib", "factual-haskell-driver-0.3.3")]
+headersList = [("X-Factual-Lib", "factual-haskell-driver-0.4.0")]
 
 basePath :: String
 basePath = "http://api.v3.factual.com"
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -9,13 +9,13 @@
   * Restaurants US
   * Hotels US
   * Global Places
+  * Crosswalk
   * Healthcare Providers
   * World Geographies
   * Products CPG
   * Products Crosswalk
   * Monetize
   * Custom Tables
-* Crosswalk Queries
 * Facets Queries
 * Geocode Queries
 * Geopulse Queries
@@ -56,11 +56,11 @@
 can always run the unit tests:
 
     *Main> runUnitTests
-    Cases: 47  Tried: 47  Errors: 0  Failures: 0
-    Counts {cases = 47, tried = 47, errors = 0, failures = 0}
+    Cases: 43  Tried: 43  Errors: 0  Failures: 0
+    Counts {cases = 43, tried = 43, errors = 0, failures = 0}
     *Main> runIntegrationTests "mykey" "mysecret"
-    Cases: 10  Tried: 10  Errors: 0  Failures: 0
-    Counts {cases = 10, tried = 10, errors = 0, failures = 0}
+    Cases: 9  Tried: 9  Errors: 0  Failures: 0
+    Counts {cases = 9, tried = 9, errors = 0, failures = 0}
 
 # Documentation
 
@@ -79,9 +79,16 @@
 secret. Note that compiling the source code generates .o and .hi
 files in the source directories.
 
-# Writes
+# Notes
 
+## Writes
+
 Although there is code in the current version to support API writes,
 these features have not yet been implemented in the Factual API. Please
 refrain from attempting to use these features until they have been
 officially announced.
+
+## Crosswalk deprecation
+
+The Crosswalk API endpoint has been migrated into a regular read table.
+For more information see the [Factual V3 documentation](http://developer.factual.com/display/docs/Places+API+-+Crosswalk).
diff --git a/examples/CrosswalkExample.hs b/examples/CrosswalkExample.hs
deleted file mode 100644
--- a/examples/CrosswalkExample.hs
+++ /dev/null
@@ -1,22 +0,0 @@
-module Main where
-
-import System.Environment (getArgs)
-import Network.Factual.API
-import Data.Factual.Query.CrosswalkQuery
-import Data.Factual.Response
-
-main :: IO()
-main = do
-  args <- getArgs
-  let oauthKey = head args
-  let oauthSecret = last args
-  let token = generateToken oauthKey oauthSecret
-  let query = CrosswalkQuery { factualId = Just "97598010-433f-4946-8fd5-4a6dd1639d77"
-                             , limit = Nothing
-                             , namespace = Nothing
-                             , namespaceId = Nothing
-                             , only = ["loopt"] }
-  result <- makeRequest token query
-  putStrLn $ "Status: " ++ status result
-  putStrLn $ "Version: " ++ show (version result)
-  putStrLn $ "Data: " ++ show (response result)
diff --git a/factual-api.cabal b/factual-api.cabal
--- a/factual-api.cabal
+++ b/factual-api.cabal
@@ -1,5 +1,5 @@
 name:            factual-api
-version:         0.3.3
+version:         0.4.0
 license:         BSD3
 license-file:    LICENSE.txt
 category:        API, Web
@@ -27,7 +27,6 @@
   exposed-modules:
     Network.Factual.API
     Data.Factual.Query
-    Data.Factual.Query.CrosswalkQuery
     Data.Factual.Query.FacetsQuery
     Data.Factual.Query.GeocodeQuery
     Data.Factual.Query.GeopulseQuery
diff --git a/test/Tests.hs b/test/Tests.hs
--- a/test/Tests.hs
+++ b/test/Tests.hs
@@ -8,7 +8,6 @@
 import Data.Factual.Response
 import qualified Data.Map as M
 import qualified Data.Factual.Write as W
-import qualified Data.Factual.Query.CrosswalkQuery as C
 import qualified Data.Factual.Query.FacetsQuery as F
 import qualified Data.Factual.Query.GeopulseQuery as G
 import qualified Data.Factual.Write.Submit as S
@@ -22,6 +21,7 @@
                      , TestLabel "Restaurants table test" restaurantsTablePathTest
                      , TestLabel "Hotels table test" hotelsTablePathTest
                      , TestLabel "Global table test" globalTablePathTest
+                     , TestLabel "Crosswalk table test" crosswalkProductsTablePathTest
                      , TestLabel "Healthcare table test" healthcareTablePathTest
                      , TestLabel "World Geographies table test" worldGeographiesTablePathTest
                      , TestLabel "CPG table test" cpgTablePathTest
@@ -55,11 +55,6 @@
                      , TestLabel "Include count test" includeCountTest
                      , TestLabel "Schema query test" schemaQueryTest
                      , TestLabel "Resolve query test" resolveQueryTest
-                     , TestLabel "Factual ID test" factualIdTest
-                     , TestLabel "Crosswalk limit test" limitCWPathTest
-                     , TestLabel "Namespace test" namespaceTest
-                     , TestLabel "Namespace ID test" namespaceIdTest
-                     , TestLabel "Only test" onlyTest
                      , TestLabel "Facets test" facetsTest
                      , TestLabel "Submit path test" submitPathTest
                      , TestLabel "Submit body test" submitBodyTest
@@ -69,7 +64,6 @@
 integrationTests key secret = TestList [ TestLabel "Read test" (readIntegrationTest token)
                                        , TestLabel "Schema test" (schemaIntegrationTest token)
                                        , TestLabel "Resolve test" (resolveIntegrationTest token)
-                                       , TestLabel "Crosswalk test" (crosswalkIntegrationTest token)
                                        , TestLabel "Raw read test" (rawIntegrationTest token)
                                        , TestLabel "Facets test" (facetsIntegrationTest token)
                                        , TestLabel "Geopulse test" (geopulseIntegrationTest token)
@@ -98,6 +92,11 @@
   let path = toPath $ blankReadQuery { table = Global }
   assertEqual "Correct path for global table" expected path)
 
+crosswalkTablePathTest = TestCase (do
+  let expected = "/t/crosswalk?include_count=false"
+  let path = toPath $ blankReadQuery { table = Crosswalk }
+  assertEqual "Correct path for crosswalk table" expected path)
+
 healthcareTablePathTest = TestCase (do
   let expected = "/t/health-care-providers-us?include_count=false"
   let path = toPath $ blankReadQuery { table = HealthCareProviders }
@@ -263,31 +262,6 @@
   let path = toPath $ ResolveQuery [ResolveStr "field1" "value1", ResolveNum "field2" 32.1]
   assertEqual "Correct path for a resolve query" expected path)
 
-factualIdTest = TestCase (do
-  let expected = "/places/crosswalk?factual_id=1234"
-  let path = toPath $ blankCrosswalkQuery { C.factualId = Just "1234" }
-  assertEqual "Correct path for a factual id" expected path)
-
-limitCWPathTest = TestCase (do
-  let expected = "/places/crosswalk?limit=1234"
-  let path = toPath $ blankCrosswalkQuery { C.limit = Just 1234 }
-  assertEqual "Correct path for a limit in a crosswalk query" expected path)
-
-namespaceTest = TestCase (do
-  let expected = "/places/crosswalk?namespace=yelp"
-  let path = toPath $ blankCrosswalkQuery { C.namespace = Just "yelp" }
-  assertEqual "Correct path for a namespace" expected path)
-
-namespaceIdTest = TestCase (do
-  let expected = "/places/crosswalk?namespace_id=5432"
-  let path = toPath $ blankCrosswalkQuery { C.namespaceId = Just "5432" }
-  assertEqual "Correct path for a namespace id" expected path)
-
-onlyTest = TestCase (do
-  let expected = "/places/crosswalk?only=yelp%2Cloopd"
-  let path = toPath $ blankCrosswalkQuery { C.only = ["yelp", "loopd"] }
-  assertEqual "Correct path for a only" expected path)
-
 facetsTest = TestCase (do
   let expected = "/t/places/facets?q=starbucks&select=locality%2Cregion&filters=%7B%22country%22%3A%22US%22%7D&limit=10&min_count=2&include_count=false"
   let path = toPath $ F.FacetsQuery { F.table        = Places
@@ -345,16 +319,6 @@
   result <- makeRequest token query
   assertEqual "Valid resolve query" "ok" (status result))
 
-crosswalkIntegrationTest :: Token -> Test
-crosswalkIntegrationTest token = TestCase (do
-  let query = C.CrosswalkQuery { C.factualId = Just "97598010-433f-4946-8fd5-4a6dd1639d77"
-                               , C.limit = Nothing
-                               , C.namespace = Nothing
-                               , C.namespaceId = Nothing
-                               , C.only = ["loopt"] }
-  result <- makeRequest token query
-  assertEqual "Valid crosswalk query" "ok" (status result))
-
 rawIntegrationTest :: Token -> Test
 rawIntegrationTest token = TestCase (do
   result <- makeRawRequest token "/t/places?q=starbucks"
@@ -414,13 +378,6 @@
                            , filters = []
                            , geo = Nothing
                            , includeCount = False }
-
-blankCrosswalkQuery :: C.CrosswalkQuery
-blankCrosswalkQuery = C.CrosswalkQuery { C.factualId = Nothing
-                                       , C.limit = Nothing
-                                       , C.namespace = Nothing
-                                       , C.namespaceId = Nothing
-                                       , C.only = [] }
 
 submitWrite :: S.Submit
 submitWrite = S.Submit { S.table     = Places
