diff --git a/reviewboard/static/rb/js/models/baseResourceModel.js b/reviewboard/static/rb/js/models/baseResourceModel.js
index 800c388c578992d5198cc1bb7bc38a969d71d0a9..80f230fcf30828b60cbb588c8ebe1ab37f4e5fed 100644
--- a/reviewboard/static/rb/js/models/baseResourceModel.js
+++ b/reviewboard/static/rb/js/models/baseResourceModel.js
@@ -65,7 +65,8 @@ RB.BaseResource = Backbone.Model.extend({
                     if (link) {
                         baseURL = link.href;
 
-                        return this.isNew() ? baseURL : baseURL + this.id;
+                        return this.isNew() ? baseURL
+                                            : (baseURL + this.id + '/');
                     }
                 }
             }
@@ -472,13 +473,23 @@ RB.BaseResource = Backbone.Model.extend({
      * a more meaningful error callback.
      */
     sync: function(method, model, options) {
+        var data,
+            contentType;
+
         options = options || {};
 
+        if (method === 'read') {
+            data = options.data;
+        } else {
+            data = options.form ? null
+                                : (options.attrs || model.toJSON(options));
+            contentType = 'application/x-www-form-urlencoded';
+        }
+
         return Backbone.sync.call(this, method, model, _.defaults({}, options, {
             /* Use form data instead of a JSON payload. */
-            contentType: 'application/x-www-form-urlencoded',
-            data: options.form ? null
-                               : (options.attrs || model.toJSON(options)),
+            contentType: contentType,
+            data: data,
             processData: true,
 
             error: function(xhr, textStatus, errorThrown) {
diff --git a/reviewboard/static/rb/js/models/tests/baseResourceModelTests.js b/reviewboard/static/rb/js/models/tests/baseResourceModelTests.js
index 4125d855c1ccacd4338793275971aa71cc6cd376..5964a9072de87a953cce3fe99b9135a0e405f551 100644
--- a/reviewboard/static/rb/js/models/tests/baseResourceModelTests.js
+++ b/reviewboard/static/rb/js/models/tests/baseResourceModelTests.js
@@ -302,6 +302,73 @@ describe('models/BaseResource', function() {
                 expect(model.get('loaded')).toBe(true);
             });
         });
+
+        describe('Request payload', function() {
+            beforeEach(function() {
+                model.set({
+                    id: 123,
+                    links: {
+                        self: {
+                            href: '/api/foo/'
+                        }
+                    }
+                });
+            });
+
+            describe('GET', function() {
+                it('No contentType sent', function() {
+                    spyOn(Backbone, 'sync')
+                        .andCallFake(function(method, model, options) {
+                            expect(options.contentType).toBe(undefined);
+                        });
+
+                    model.fetch();
+
+                    expect(Backbone.sync).toHaveBeenCalled();
+                });
+
+                it('No model data sent', function() {
+                    spyOn(Backbone, 'sync')
+                        .andCallFake(function(method, model, options) {
+                            expect(options.data).toBe(undefined);
+                        });
+
+                    model.toJSON = function() {
+                        return {
+                            a: 1,
+                            b: 2
+                        };
+                    };
+
+                    model.fetch();
+
+                    expect(Backbone.sync).toHaveBeenCalled();
+                });
+
+                it('Query attributes sent', function() {
+                    spyOn(Backbone, 'sync')
+                        .andCallFake(function(method, model, options) {
+                            expect(options.data).not.toBe(undefined);
+                            expect(options.data.foo).toBe('bar');
+                        });
+
+                    model.toJSON = function() {
+                        return {
+                            a: 1,
+                            b: 2
+                        };
+                    };
+
+                    model.fetch({
+                        data: {
+                            foo: 'bar'
+                        }
+                    });
+
+                    expect(Backbone.sync).toHaveBeenCalled();
+                });
+            });
+        });
     });
 
     describe('ready', function() {
@@ -818,6 +885,13 @@ describe('models/BaseResource', function() {
             expect(model.url()).toBe(url);
         });
 
+        it('With parentObject and model ID', function() {
+            model.set('parentObject', parentObject);
+            model.id = 123;
+
+            expect(model.url()).toBe('/api/foos/123/');
+        });
+
         it('With parentObject, no links', function() {
             model.set('parentObject', parentObject);
 
