diff --git a/DigitalOcean.cabal b/DigitalOcean.cabal
--- a/DigitalOcean.cabal
+++ b/DigitalOcean.cabal
@@ -1,5 +1,5 @@
 name:                DigitalOcean
-version:             0.1.0.0
+version:             0.1.1.0
 synopsis:            A client library for the DigitalOcean API
 license:             AGPL-3
 license-file:        LICENSE
@@ -9,7 +9,8 @@
 build-type:          Simple
 cabal-version:       >=1.10
 extra-source-files:  README.md,
-                     examples/SSHKeyInfo.hs
+                     examples/SSHKeyInfo.hs,
+                     examples/CreateDroplet.hs
 
 library
   exposed-modules:     Net.DigitalOcean,
@@ -25,10 +26,8 @@
   ghc-options:         -Wall
   build-depends:       base >=4.7 && <4.8,
                        text >= 1.2.0.3 && < 1.3,
-                       -- Require Control.Monad.Except
-                       mtl >= 2.2.1,
                        -- Transative dependencies I don't want to constrain
-                       lens, wreq, aeson, containers, random,
+                       lens, wreq, aeson, containers, mtl,
                        bytestring, unordered-containers, vector,
                        transformers, exceptions
   hs-source-dirs:      src
diff --git a/examples/CreateDroplet.hs b/examples/CreateDroplet.hs
new file mode 100644
--- /dev/null
+++ b/examples/CreateDroplet.hs
@@ -0,0 +1,32 @@
+module Main where
+
+import qualified Data.Text as T
+import qualified Net.DigitalOcean as DO
+import System.Environment (getArgs)
+import Text.Printf (printf)
+import Control.Lens
+
+main :: IO ()
+main = do
+  auth <- fmap head getArgs
+
+  putStrLn . show . getSSHKey . DO.Config . T.pack $ auth
+
+getSSHKey :: T.Text -> DO.Config -> IO DO.SSHKey
+getSSHKey keyName c =
+  DO.getSSHKeys c >>= \keys ->
+  case find (\k -> k ^. DO.keyName == keyName) keys of
+    Just k -> return k
+    Nothing -> error "No key found"
+
+createDroplet c =
+  let region = "nyc3"
+      sshKeyName = "Milo"
+      image = "ubuntu-14-04-x64"
+      size = "512mb"
+      dropletName = "test"
+
+  sshKey <- getSSHKey sshKeyName c
+  let dco = (DO.defaultDCO dropletName region size image)
+            & DO.dcoSSHKeys ?~ [sshKey ^. DO.keyFingerprint]
+  DO.createDroplet dco c
diff --git a/src/Net/DigitalOcean/Droplets.hs b/src/Net/DigitalOcean/Droplets.hs
--- a/src/Net/DigitalOcean/Droplets.hs
+++ b/src/Net/DigitalOcean/Droplets.hs
@@ -114,7 +114,7 @@
   parseJSON _ = error "network must be object"
 
 data Kernel = Kernel
-              { _krnId :: !T.Text
+              { _krnId :: !Int
               , _krnName :: !T.Text
               , _krnVersion :: !T.Text
               } deriving (Show, Eq)
@@ -139,8 +139,8 @@
                , _drpBackupIds :: ![T.Text]
                , _drpSnapshotIds :: ![T.Text]
                , _drpFeatures :: ![T.Text]
-               , _drpRegion :: Region
-               , _drpImage :: Image
+               , _drpRegion :: Maybe Region
+               , _drpImage :: Maybe Image
                , _drpNetworks :: [Network]
                , _drpKernel :: Kernel
                } deriving (Show, Eq)
diff --git a/src/Net/DigitalOcean/Images.hs b/src/Net/DigitalOcean/Images.hs
--- a/src/Net/DigitalOcean/Images.hs
+++ b/src/Net/DigitalOcean/Images.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE FlexibleInstances #-}
 module Net.DigitalOcean.Images (
   Image(..)
   , getImages
@@ -14,6 +15,7 @@
   ) where
 import qualified Data.Text as T
 import qualified Data.Map as M
+import qualified Data.HashMap.Strict as HM
 import qualified Network.Wreq as W
 import Data.Aeson(FromJSON(..), Value(..), (.:))
 import Control.Applicative
@@ -50,6 +52,13 @@
                          x .: "created_at" <*>
                          x .: "min_disk_size"
   parseJSON _ = fail "image must be object"
+
+
+instance FromJSON (Maybe Image) where
+  parseJSON xs@(Object x)
+    | HM.null x = return Nothing
+    | otherwise = fmap Just . parseJSON $ xs
+  parseJSON _ = return Nothing
 
 imagesEndpoint :: String
 imagesEndpoint = "/v2/images/"
diff --git a/src/Net/DigitalOcean/Regions.hs b/src/Net/DigitalOcean/Regions.hs
--- a/src/Net/DigitalOcean/Regions.hs
+++ b/src/Net/DigitalOcean/Regions.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE FlexibleInstances #-}
 module Net.DigitalOcean.Regions (
   Region(..)
   , getRegions
@@ -6,7 +7,8 @@
   , rgnName, rgnSlug, rgnSizes, rgnFeatures, rgnAvailable
   ) where
 import qualified Data.Text as T
-import Data.Aeson(FromJSON(..), Value(..), (.:))
+import qualified Data.HashMap.Strict as HM
+import Data.Aeson(FromJSON(..), Value(..), (.:), fromJSON)
 import Control.Applicative
 import Control.Lens hiding (Action)
 
@@ -22,7 +24,7 @@
               , _rgnSlug :: !T.Text
               , _rgnSizes :: ![T.Text]
               , _rgnFeatures :: ![T.Text]
-              , _rgnAvailable :: !Bool
+              , _rgnAvailable :: Maybe Bool
               } deriving (Show, Eq)
 makeLenses ''Region
 
@@ -34,6 +36,12 @@
                          x .: "features" <*>
                          x .: "available"
   parseJSON _ = fail "region must be object"
+
+instance FromJSON (Maybe Region) where
+  parseJSON xs@(Object x)
+    | HM.null x = return Nothing
+    | otherwise = fmap Just . parseJSON $ xs
+  parseJSON _ = return Nothing
 
 -- | Returns a list of all the visible Digital Ocean regions
 --
