diff --git a/Hastodon.cabal b/Hastodon.cabal
--- a/Hastodon.cabal
+++ b/Hastodon.cabal
@@ -1,5 +1,5 @@
 Name: Hastodon
-Version: 0.2.0
+Version: 0.3.1
 Synopsis: mastodon client module for Haskell
 Category: Web
 Description: mastodon client module for Haskell
@@ -22,7 +22,9 @@
   Build-Depends: base >= 4.5 && < 5,
                  aeson,
                  bytestring,
+                 mime-types,
                  http-types,
+                 http-client,
                  http-conduit,
                  MissingH,
                  text
diff --git a/Web/Hastodon.hs b/Web/Hastodon.hs
--- a/Web/Hastodon.hs
+++ b/Web/Hastodon.hs
@@ -38,6 +38,7 @@
   , postAuthorizeRequest
   , postRejectRequest
   , getInstance
+  , postMediaFile
   , getMutes
   , getNotifications
   , getNotificationById
@@ -50,6 +51,7 @@
   , getRebloggedBy
   , getFavoritedBy
   , postStatus
+  , postStatusWithMediaIds
   , postReblog
   , postUnreblog
   , postFavorite
@@ -68,6 +70,8 @@
 import Data.String.Utils
 import Network.HTTP.Simple
 import Network.HTTP.Types.Header
+import Network.HTTP.Client.MultipartFormData
+import Network.Mime
 
 --
 -- Utility
@@ -98,6 +102,7 @@
 pAuthorizeRequest  = "/api/v1/follow_requests/:id/authorize"
 pRejectRequest     = "/api/v1/follow_requests/:id/reject"
 pInstance          = "/api/v1/instance"
+pMedia             = "/api/v1/media"
 pMutes             = "/api/v1/mutes"
 pNotifications     = "/api/v1/notifications"
 pNotificationById  = "/api/v1/notifications/:id"
@@ -119,6 +124,8 @@
 pUnfavorite        = "/api/v1/statuses/:id/unfavourite"
 pTaggedTimeline    = "/api/v1/timelines/tag/:hashtag"
 
+type HastodonId = String
+
 data HastodonClient = HastodonClient {
   host :: String,
   token :: String
@@ -133,7 +140,7 @@
     OAuthResponse <$> (v .: T.pack "access_token")
 
 data Account = Account {
-  accountId :: Int,
+  accountId :: HastodonId,
   accountUsername :: String,
   accountAcct :: String,
   accountDisplayName :: String,
@@ -177,10 +184,10 @@
                 <*> (v .:? T.pack "website")
 
 data Attachment = Attachment {
-  attachmentId :: Int,
+  attachmentId :: HastodonId,
   attachmentType :: String,
   attachmentUrl :: String,
-  attachmentRemoteUrl :: String,
+  attachmentRemoteUrl :: Maybe String,
   attachmentPreviewUrl :: String,
   attachmentTextUrl :: Maybe String
 } deriving (Show)
@@ -189,7 +196,7 @@
     Attachment <$> (v .:  T.pack "id")
                <*> (v .:  T.pack "type")
                <*> (v .:  T.pack "url")
-               <*> (v .:  T.pack "remote_url")
+               <*> (v .:? T.pack "remote_url")
                <*> (v .:  T.pack "preview_url")
                <*> (v .:? T.pack "text_url")
 
@@ -232,7 +239,7 @@
   mentionUrl :: String,
   mentionUsername :: String,
   mentionAcct :: String,
-  mentionId :: Int
+  mentionId :: HastodonId
 } deriving (Show)
 instance FromJSON Mention where
   parseJSON (Object v) =
@@ -242,7 +249,7 @@
             <*> (v .: T.pack "id")
 
 data Notification = Notification {
-  notificationId :: Int,
+  notificationId :: HastodonId,
   notificationType :: String,
   notificationCreatedAt :: String,
   notificationAccount :: Account,
@@ -257,7 +264,7 @@
                  <*> (v .:? T.pack "status")
 
 data OAuthClient = OAuthClient {
-  oauthClientId :: Int,
+  oauthClientId :: HastodonId,
   oauthClientRedirectUri :: String,
   oauthClientClientId :: String,
   oauthClientClientSecret :: String
@@ -270,7 +277,7 @@
                 <*> (v .: T.pack "client_secret")
 
 data Relationship = Relationship {
-  relationshipId :: Int,
+  relationshipId :: HastodonId,
   relationshipFollowing :: Bool,
   relationshipFollowed_by :: Bool,
   relationshipBlocking :: Bool,
@@ -287,7 +294,7 @@
                  <*> (v .: T.pack "requested")
 
 data Report = Report {
-  reportId :: Int,
+  reportId :: HastodonId,
   reportActionToken :: String
 } deriving (Show)
 instance FromJSON Report where
@@ -307,7 +314,7 @@
             <*> (v .: T.pack "hashtags")
 
 data Status = Status {
-  statusId :: Int,
+  statusId :: HastodonId,
   statusUri :: String,
   statusUrl :: String,
   statusAccount :: Account,
@@ -332,7 +339,7 @@
   parseJSON (Object v) =
     Status <$> (v .:  T.pack "id")
            <*> (v .:  T.pack "uri")
-           <*> (v .:  T.pack "url")
+           <*> (maybe "" id <$> (v .:?  T.pack "url"))
            <*> (v .:  T.pack "account")
            <*> (v .:? T.pack "in_reply_to_id")
            <*> (v .:? T.pack "in_reply_to_account_id")
@@ -359,7 +366,6 @@
   parseJSON (Object v) =
     Tag <$> (v .: T.pack "name")
         <*> (v .: T.pack "url")
-
 -- 
 -- helpers
 -- 
@@ -520,6 +526,17 @@
   res <- getHastodonResponseJSON pInstance client
   return (getResponseBody res :: Either JSONException Instance)
 
+postMediaFile :: HastodonClient -> String -> String -> IO (Either JSONException Attachment)
+postMediaFile client filename description = do
+  initReq <- mkHastodonRequest pMedia client
+  let file = partFileSource (T.pack "file") filename
+  let mimetype = defaultMimeLookup (T.pack filename)
+  req <- formDataBody [file { partContentType = Just mimetype },
+                       partBS (T.pack "description") (utf8ToChar8 description)
+                      ] initReq
+  res <- httpJSONEither req
+  return (getResponseBody res :: Either JSONException Attachment)
+
 getMutes :: HastodonClient -> IO (Either JSONException [Account])
 getMutes client = do
   res <- getHastodonResponseJSON pMutes client
@@ -576,6 +593,13 @@
 postStatus :: HastodonClient -> String ->  IO (Either JSONException Status)
 postStatus client status = do
   res <- postAndGetHastodonResponseJSON pStatuses [(Char8.pack "status", utf8ToChar8 status)] client
+  return (getResponseBody res :: Either JSONException Status)
+
+postStatusWithMediaIds :: HastodonClient -> String -> [HastodonId] -> IO (Either JSONException Status)
+postStatusWithMediaIds client status mediaIds = do
+  let unpackedMediaIds = [(Char8.pack "media_ids[]",utf8ToChar8 media)|media <- mediaIds] -- Rails array parameter convention?
+  let body = (Char8.pack "status",utf8ToChar8 status):unpackedMediaIds
+  res <- postAndGetHastodonResponseJSON pStatuses body client
   return (getResponseBody res :: Either JSONException Status)
 
 postReblog :: HastodonClient -> Int ->  IO (Either JSONException Status)
