diff --git a/dresdner-verkehrsbetriebe.cabal b/dresdner-verkehrsbetriebe.cabal
--- a/dresdner-verkehrsbetriebe.cabal
+++ b/dresdner-verkehrsbetriebe.cabal
@@ -1,5 +1,5 @@
 name: dresdner-verkehrsbetriebe
-version: 0.1.0
+version: 0.1.1
 synopsis: Library and program for querying DVB (Dresdner Verkehrsbetriebe AG)
 license: MIT
 license-file: LICENSE
@@ -13,6 +13,8 @@
   exposed-modules:
       Network.Transportation.Germany.DVB
     , Network.Transportation.Germany.DVB.Route
+  other-modules:
+      Network.Transportation.Germany.DVB.Route.JSON
   build-depends:
       base >= 4.7 && < 4.8
     , HTTP >= 4000.2 && < 4000.3
diff --git a/src/Network/Transportation/Germany/DVB/Route/JSON.hs b/src/Network/Transportation/Germany/DVB/Route/JSON.hs
new file mode 100644
--- /dev/null
+++ b/src/Network/Transportation/Germany/DVB/Route/JSON.hs
@@ -0,0 +1,98 @@
+-- |
+-- Module: Network.Transportation.Germany.DVB.Route.JSON
+-- Copyright: (C) 2015 Braden Walters
+-- License: MIT (see LICENSE file)
+-- Maintainer: Braden Walters <vc@braden-walters.info>
+-- Stability: experimental
+-- Portability: ghc
+
+{-# LANGUAGE OverloadedStrings #-}
+
+module Network.Transportation.Germany.DVB.Route.JSON
+( Route(..)
+, Trip(..)
+, Leg(..)
+, LegMode(..)
+, Stop(..)
+, StopRef(..)
+) where
+
+import Control.Applicative
+import Control.Monad
+import Data.Aeson
+import qualified Data.Foldable as F
+import qualified Data.HashMap.Strict as HMS
+
+-- |Parsing JSON type for routes.
+data Route = Route { routeTrips :: [Trip] }
+
+instance FromJSON Route where
+  parseJSON (Object obj) = Route <$>
+                           obj .: "trips"
+  parseJSON _ = mzero
+
+-- |Parsing JSON type for trips.
+data Trip = Trip
+  { tripDuration :: String
+  , tripLegs :: [Leg]
+  }
+
+instance FromJSON Trip where
+  parseJSON (Object obj) = Trip <$>
+                           obj .: "duration" <*>
+                           obj .: "legs"
+  parseJSON _ = mzero
+
+-- |Parsing JSON type for trip legs.
+data Leg = Leg
+  { legMode :: LegMode
+  , legStops :: [Stop]
+  }
+
+instance FromJSON Leg where
+  parseJSON (Object obj) = Leg <$>
+                           maybe mzero parseJSON (HMS.lookup "mode" obj) <*>
+                           (F.concat <$> (obj .:? "stopSeq"))
+  parseJSON _ = mzero
+
+-- |Parsing JSON type for the mode object in trip legs.
+data LegMode = LegMode
+  { legModeNumber :: String
+  , legModeDesc :: String
+  }
+
+instance FromJSON LegMode where
+  parseJSON (Object obj) = LegMode <$>
+                           obj .: "number" <*>
+                           obj .: "desc"
+  parseJSON _ = mzero
+
+-- |Parsing JSON type for stops in trips.
+data Stop = Stop
+  { stopName :: String
+  , stopPlatformName :: String
+  , stopRef :: StopRef
+  }
+
+instance FromJSON Stop where
+  parseJSON (Object obj) = Stop <$>
+                           obj .: "nameWO" <*>
+                           obj .: "platformName" <*>
+                           maybe mzero parseJSON (HMS.lookup "ref" obj)
+  parseJSON _ = mzero
+
+-- |Parsing JSON type for the ref object in stops in trips.
+data StopRef = StopRef
+  { stopRefArrivalTime :: Maybe String
+  , stopRefArrivalDelayMins :: Maybe String
+  , stopRefDepartureTime :: Maybe String
+  , stopRefDepartureDelayMins :: Maybe String
+  }
+
+instance FromJSON StopRef where
+  parseJSON (Object obj) = StopRef <$>
+                           obj .:? "arrDateTime" <*>
+                           obj .:? "arrDelay" <*>
+                           obj .:? "depDateTime" <*>
+                           obj .:? "depDelay"
+  parseJSON _ = mzero
