diff --git a/rbtools/api/decode.py b/rbtools/api/decode.py
index d17ea5e5cf494363c4af729867d1c7d961f6727d..caf49c99a27adff2ae22167e96ee464bade38ca8 100644
--- a/rbtools/api/decode.py
+++ b/rbtools/api/decode.py
@@ -30,12 +30,24 @@ DECODER_MAP['application/json'] = JsonDecoder
 
 def PlainTextDecoder(payload):
     return {
-        'text': payload,
+        'resource': {
+            'text': payload,
+        },
     }
 
 DECODER_MAP['text/plain'] = PlainTextDecoder
 
 
+def PatchDecoder(payload):
+    return {
+        'resource': {
+            'diff': payload,
+        },
+    }
+
+DECODER_MAP['text/x-patch'] = PatchDecoder
+
+
 def decode_response(payload, mime_type):
     """Decode a Web API response.
 
diff --git a/rbtools/api/resource.py b/rbtools/api/resource.py
index 2b957a7a794700201a55fb8b35c0d1bb31c98f08..ffb10658fe9846ad9596b3c865477e23ff76a615 100644
--- a/rbtools/api/resource.py
+++ b/rbtools/api/resource.py
@@ -249,9 +249,136 @@ class RootResource(ResourceItem):
 RESOURCE_MAP['application/vnd.reviewboard.org.root'] = RootResource
 
 
+class DiffListResource(ResourceList):
+    """The Diff List resource specific base class.
+
+    Provides additional functionality to assist in the uploading of
+    new diffs.
+    """
+    def upload_diff(self, diff, parent_diff=None, base_dir=None, **kwargs):
+        """Uploads a new diff.
+
+        The diff and parent_diff arguments should be strings containing
+        the diff output.
+        """
+        request = HttpRequest(self.url, method='POST', query_args=kwargs)
+        request.add_file('path', 'diff', diff)
+
+        if parent_diff:
+            request.add_file('parent_diff_path', 'parent_diff', parent_diff)
+
+        if base_dir:
+            request.add_field("basedir", base_dir)
+
+        return request
+
+RESOURCE_MAP['application/vnd.reviewboard.org.diffs'] = DiffListResource
+
+
 class DiffResource(ResourceItem):
-    def get_patch(self):
-        """ Returns unified diff content."""
-        pass
+    """The Diff resource specific base class.
+
+    Provides the 'get_patch' method for retrieving the content of the
+    actual diff file itself.
+    """
+    def get_patch(self, **kwargs):
+        """Retrieves the actual diff file contents."""
+        request = HttpRequest(self.url, query_args=kwargs)
+        request.headers['Accept'] = 'text/x-patch'
+        return request
 
 RESOURCE_MAP['application/vnd.reviewboard.org.diff'] = DiffResource
+
+
+class FileDiffResource(ResourceItem):
+    """The File Diff resource specific base class."""
+    def get_patch(self, **kwargs):
+        """Retrieves the actual diff file contents."""
+        request = HttpRequest(self.url, query_args=kwargs)
+        request.headers['Accept'] = 'text/x-patch'
+        return request
+
+    def get_diff_data(self, **kwargs):
+        """Retrieves the actual raw diff data for the file."""
+        request = HttpRequest(self.url, query_args=kwargs)
+        request.headers['Accept'] = \
+            'application/vnd.reviewboard.org.diff.data+json'
+        return request
+
+RESOURCE_MAP['application/vnd.reviewboard.org.file'] = FileDiffResource
+
+
+class FileAttachmentListResource(ResourceList):
+    """The File Attachment List resource specific base class."""
+    def upload_attachment(self, filename, content, caption=None, **kwargs):
+        """Uploads a new attachment.
+
+        The content argument should contain the body of the file to be
+        uploaded, in string format.
+        """
+        request = HttpRequest(self.url, method='POST', query_args=kwargs)
+        request.add_file('path', filename, content)
+
+        if caption:
+            request.add_field('caption', caption)
+
+        return request
+
+RESOURCE_MAP['application/vnd.reviewboard.org.file-attachments'] = \
+    FileAttachmentListResource
+
+
+class DraftFileAttachmentListResource(FileAttachmentListResource):
+    """The Draft File Attachment List resource specific base class."""
+    pass
+
+RESOURCE_MAP['application/vnd.reviewboard.org.draft-file-attachments'] = \
+    DraftFileAttachmentListResource
+
+
+class ScreenshotListResource(ResourceList):
+    """The Screenshot List resource specific base class."""
+    def upload_screenshot(self, filename, content, caption=None, **kwargs):
+        """Uploads a new screenshot.
+
+        The content argument should contain the body of the screenshot
+        to be uploaded, in string format.
+        """
+        request = HttpRequest(self.url, method='POST', query_args=kwargs)
+        request.add_file('path', filename, content)
+
+        if caption:
+            request.add_field('caption', caption)
+
+        return request
+
+RESOURCE_MAP['application/vnd.reviewboard.org.screenshots'] = \
+    ScreenshotListResource
+
+
+class DraftScreenshotListResource(ScreenshotListResource):
+    """The Draft Screenshot List resource specific base class."""
+    pass
+
+RESOURCE_MAP['application/vnd.reviewboard.org.draft-screenshots'] = \
+    DraftScreenshotListResource
+
+
+class ReviewRequestResource(ResourceItem):
+    """The Review Request resource specific base class."""
+    def submit(self, description=None, changenum=None):
+        """Submit a review request"""
+        data = {
+            'status': 'submitted',
+        }
+
+        if description:
+            data['description'] = description
+
+        if changenum:
+            data['changenum'] = changenum
+
+        return self.update(data=data)
+
+RESOURCE_MAP['application/vnd.reviewboard.org.review-request'] = \
+    ReviewRequestResource
