diff --git a/panels_ipe/js/views/BlockPicker.js b/panels_ipe/js/views/BlockPicker.js
index 60e7a2e..8405da4 100644
--- a/panels_ipe/js/views/BlockPicker.js
+++ b/panels_ipe/js/views/BlockPicker.js
@@ -253,6 +253,10 @@
     displayBlockPluginForm: function (e) {
       var self = this;
 
+      // Before we modify any HTML, calculate our current size so that we can
+      // limit the form's height.
+      var max_height = this.calculateTopMaxHeight();
+
       // Get the current plugin_id.
       var plugin_id = $(e.currentTarget).data('plugin-id');
 
@@ -296,11 +300,33 @@
       // Remove our throbber on load.
       ajax.options.complete = function () {
         self.$('.ipe-block-picker-top .ipe-icon-loading').remove();
+
+        // If our form is bigger than the window, we'll need to size it appropriately.
+        if (max_height < self.$('#panels-ipe-block-plugin-form-wrapper').outerHeight()) {
+          self.$('#panels-ipe-block-plugin-form-wrapper').css('max-height', max_height);
+          self.$('#panels-ipe-block-plugin-form-wrapper').css('overflow-y', 'scroll');
+        }
+
         self.$('#panels-ipe-block-plugin-form-wrapper').hide().fadeIn();
       };
 
       // Make the Drupal AJAX request.
       ajax.execute();
+    },
+
+    /**
+     * Calculates the maximum height of our top picker.
+     *
+     * @return {int}
+     *   The calculated max height.
+     */
+    calculateTopMaxHeight: function() {
+      // Calculate the combined height of (known) floating elements.
+      var used_height = $('#toolbar-item-administration-tray:visible').outerHeight() +
+        $('#toolbar-bar').outerHeight() +
+        this.$('.ipe-block-picker-bottom').outerHeight();
+      // 175 (px) is an arbitrary offset, just to give padding on top.
+      return $(window).height() - used_height - 175;
     }
 
   });
