diff --git a/boxes-admin-display-form.tpl.php b/boxes-admin-display-form.tpl.php
new file mode 100644
index 0000000..b428f44
--- /dev/null
+++ b/boxes-admin-display-form.tpl.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * @file
+ * Default theme implementation to configure blocks.
+ *
+ * Available variables:
+ * - $block_regions: An array of regions. Keyed by name with the title as value.
+ * - $block_listing: An array of blocks keyed by region and then delta.
+ * - $form_submit: Form submit button.
+ *
+ * Each $block_listing[$region] contains an array of blocks for that region.
+ *
+ * Each $data in $block_listing[$region] contains:
+ * - $data->region_title: Region title for the listed block.
+ * - $data->block_title: Block title.
+ * - $data->region_select: Drop-down menu for assigning a region.
+ * - $data->weight_select: Drop-down menu for setting weights.
+ * - $data->configure_link: Block configuration link.
+ * - $data->delete_link: For deleting user added blocks.
+ *
+ * @see template_preprocess_block_admin_display_form()
+ * @see theme_block_admin_display()
+ *
+ * @ingroup themeable
+ */
+?>
+<?php
+  // Add table javascript.
+  drupal_add_js('misc/tableheader.js');
+?>
+<table id="boxes" class="sticky-enabled">
+  <thead>
+    <tr>
+      <th><?php print t('Box'); ?></th>
+      <th><?php print t('Machine name'); ?></th>
+      <th colspan="2"><?php print t('Operations'); ?></th>
+    </tr>
+  </thead>
+  <tbody>
+    <?php $row = 0; ?>
+    <?php foreach ($block_listing as $delta => $data): ?>
+      <tr class="<?php print $row % 2 == 0 ? 'odd' : 'even'; ?>">
+        <td class="block"><?php print $data->block_title; ?></td>
+        <td><?php print $data->block_delta; ?></td>
+        <td><?php print $data->configure_link; ?></td>
+        <td><?php print $data->delete_link; ?></td>
+      </tr>
+      <?php $row++; ?>
+    <?php endforeach; ?>
+  </tbody>
+</table>
diff --git a/boxes.admin.inc b/boxes.admin.inc
index bea69c7..132af8e 100644
--- a/boxes.admin.inc
+++ b/boxes.admin.inc
@@ -1,5 +1,61 @@
 <?php
 
+function boxes_admin_display_form($form, &$form_state) {
+  $boxes = boxes_box_load();
+
+  // Sort boxes alphabetically by descriptions
+  usort($boxes, function ($a, $b) {
+    return strcasecmp($a->description, $b->description);
+  });
+
+  $form['boxes'] = array();
+  $form['#tree'] = TRUE;
+
+  foreach ($boxes as $key => $box) {
+    $form['boxes'][$key]['module'] = array(
+      '#type' => 'value',
+      '#value' => $box->plugin_key,
+    );
+    $form['boxes'][$key]['delta'] = array(
+      '#markup' => check_plain($box->delta),
+    );
+    $form['boxes'][$key]['info'] = array(
+      '#markup' => check_plain($box->description),
+    );
+    $form['boxes'][$key]['configure'] = array(
+      '#type' => 'link',
+      '#title' => t('configure'),
+      '#href' => 'admin/structure/block/manage/boxes/' . $box->delta . '/configure',
+      '#options' => array(
+        'query' => array(
+          'destination' => 'admin/structure/boxes'
+        )
+      )
+    );
+    $delete = FALSE;
+    if (($box->export_type & EXPORT_IN_DATABASE) && ($box->export_type & EXPORT_IN_CODE)) {
+      $delete = t('revert');
+    }
+    elseif (!($box->export_type & EXPORT_IN_CODE)) {
+      $delete = t('delete');
+    }
+    if ($delete) {
+      $form['boxes'][$key]['delete'] = array(
+        '#title' => $delete,
+        '#type' => 'link',
+        '#href' => 'admin/structure/block/manage/boxes/' . $box->delta . '/delete',
+        '#options' => array(
+          'query' => array(
+            'destination' => 'admin/structure/boxes'
+          )
+        )
+      );
+    }
+  }
+
+  return $form;
+}
+
 /**
  * Generate form for creating new boxes.
  */
@@ -17,6 +73,8 @@ function boxes_add_form($form, $form_state, $plugin_key) {
     '#weight' => -20,
   );
   $form['submit']['#attributes']['class'] = array();
+  $form['#submit'][] = 'boxes_box_form_submit';
+
   return $form;
 }
 
@@ -33,16 +91,6 @@ function boxes_validate_delta($element, &$form_state) {
 }
 
 /**
- * Submit handler for box_add_form.
- */
-function boxes_add_form_submit($form, &$form_state) {
-  $box = boxes_factory($form_state['values']['plugin_key'], $form_state['values']);
-  $box->save();
-  drupal_set_message(t('%name has been created.', array('%name' => $box->description)));
-  $form_state['redirect'] = 'admin/structure/block';
-}
-
-/**
  * Box deletion form.
  */
 function boxes_delete_form($form, $form_state, $box) {
@@ -51,10 +99,10 @@ function boxes_delete_form($form, $form_state, $box) {
     '#value' => $box->delta,
   );
   if (($box->export_type & EXPORT_IN_DATABASE) && ($box->export_type & EXPORT_IN_CODE)) {
-    return confirm_form($form, t('Are you sure you want to revert the block %name?', array('%name' => $box->title)), 'admin/structure/block', '', t('Revert'), t('Cancel'));
+    return confirm_form($form, t('Are you sure you want to revert the box %name?', array('%name' => $box->description)), 'admin/structure/block', '', t('Revert'), t('Cancel'));
   }
   elseif (!($box->export_type & EXPORT_IN_CODE)) {
-    return confirm_form($form, t('Are you sure you want to delete the block %name?', array('%name' => $box->title)), 'admin/structure/block', '', t('Delete'), t('Cancel'));
+    return confirm_form($form, t('Are you sure you want to delete the box %name?', array('%name' => $box->description)), 'admin/structure/block', '', t('Delete'), t('Cancel'));
   }
   drupal_not_found();
   die;
@@ -64,7 +112,16 @@ function boxes_delete_form($form, $form_state, $box) {
  * Submit handler for boxes_delete_form
  */
 function boxes_delete_form_submit($form, &$form_state) {
-  boxes_box_load($form_state['values']['delta'])->delete();
+  $box = boxes_box_load($form_state['values']['delta']);
+
+  if (($box->export_type & EXPORT_IN_DATABASE) && ($box->export_type & EXPORT_IN_CODE)) {
+    drupal_set_message(t('The box %name has been reverted.', array('%name' => $box->description)));
+  }
+  elseif (!($box->export_type & EXPORT_IN_CODE)) {
+    drupal_set_message(t('The box %name has been removed.', array('%name' => $box->description)));
+  }
+
+  $box->delete();
   $form_state['redirect'] = 'admin/structure/block';
 }
 
@@ -121,3 +178,26 @@ function boxes_settings($form, $form_state) {
   );
   return system_settings_form($form);
 }
+
+/**
+ * Processes variables for boxes-admin-display-form.tpl.php.
+ *
+ * The $variables array contains the following arguments:
+ * - $form
+ *
+ * @see boxes-admin-display.tpl.php
+ * @see theme_boxes_admin_display()
+ */
+function template_preprocess_boxes_admin_display_form(&$variables) {
+  // Add each box in the form to the appropriate place in the listing.
+  foreach (element_children($variables['form']['boxes']) as $i) {
+    $box = &$variables['form']['boxes'][$i];
+
+    $variables['block_listing'][$i] = new stdClass();
+    $variables['block_listing'][$i]->block_title = drupal_render($box['info']);
+    $variables['block_listing'][$i]->block_delta = drupal_render($box['delta']);
+    $variables['block_listing'][$i]->configure_link = drupal_render($box['configure']);
+    $variables['block_listing'][$i]->delete_link = !empty($box['delete']) ? drupal_render($box['delete']) : '';
+    $variables['block_listing'][$i]->printed = FALSE;
+  }
+}
diff --git a/boxes.module b/boxes.module
index 0474e3d..e23cf91 100644
--- a/boxes.module
+++ b/boxes.module
@@ -17,6 +17,7 @@ function boxes_menu() {
   $items = array();
   ctools_include('plugins');
   $plugins = ctools_get_plugins('boxes', 'plugins');
+
   foreach ($plugins as $key => $info) {
     if (isset($info['title'])) {
       $items['admin/structure/block/box-add/' . $key] = array(
@@ -29,6 +30,30 @@ function boxes_menu() {
       );
     }
   }
+
+  $items['admin/structure/boxes'] = array(
+    'title' => 'Boxes',
+    'description' => 'Create and maintain boxes.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('boxes_admin_display_form'),
+    'access callback' => 'boxes_access_edit',
+    //'type' => MENU_LOCAL_TASK,
+    'file' => 'boxes.admin.inc',
+  );
+
+  foreach ($plugins as $key => $info) {
+    if (isset($info['title'])) {
+      $items['admin/structure/boxes/box-add/' . $key] = array(
+        'title' => 'Add ' . strtolower($info['title']),
+        'page callback' => 'drupal_get_form',
+        'page arguments' => array('boxes_add_form', 4),
+        'access arguments' => array('administer boxes'),
+        'type' => MENU_LOCAL_ACTION,
+        'file' => 'boxes.admin.inc',
+      );
+    }
+  }
+
   $items['admin/structure/block/manage/boxes/%boxes_box/delete'] = array(
     'title' => 'Delete box',
     'page callback' => 'drupal_get_form',
@@ -37,6 +62,7 @@ function boxes_menu() {
     'type' => MENU_CALLBACK,
     'file' => 'boxes.admin.inc',
   );
+
   $items['admin/config/user-interface/boxes'] = array(
     'title' => 'Boxes',
     'page callback' => 'drupal_get_form',
@@ -44,14 +70,29 @@ function boxes_menu() {
     'access arguments' => array('administer boxes'),
     'file' => 'boxes.admin.inc',
   );
+
   return $items;
 }
 
 /**
+ * Implements hook_menu_alter().
+ */
+function boxes_menu_alter(&$items) {
+  // Allow edit boxes blocks without full access to block module
+  $items['admin/structure/block/manage/%/%']['access callback'] = 'boxes_access_edit';
+  $items['admin/structure/block/manage/%/%']['access arguments'] = array(4);
+}
+
+/**
  * Access check for whether current user is able to edit boxes.
  */
-function boxes_access_edit() {
-  return user_access('administer boxes') || user_access('edit boxes');
+function boxes_access_edit($plugin = 'boxes') {
+  if ($plugin == 'boxes') {
+    return user_access('administer blocks') || user_access('administer boxes') || user_access('edit boxes');
+  }
+  else {
+    return user_access('administer blocks');
+  }
 }
 
 /**
@@ -87,10 +128,26 @@ function boxes_theme($existing, $type, $theme, $path) {
       'path' => drupal_get_path('module', 'boxes'),
       'file' => 'boxes.admin.inc',
     ),
+    'boxes_admin_display_form' => array(
+      'template' => 'boxes-admin-display-form',
+      'file' => 'boxes.admin.inc',
+      'render element' => 'form',
+    ),
   );
 }
 
 /**
+ * Implements hook_help().
+ */
+function boxes_help($path, $arg) {
+  switch ($path) {
+    case 'admin/structure/boxes':
+      $output = '<p>' . t('This page provides an overview of all available boxes. Click the <em>configure</em> link next to each box to configure its content.') . '</p>';
+      return $output;
+  }
+}
+
+/**
  * Implements hook_block_info().
  */
 function boxes_block_info() {
@@ -445,7 +502,7 @@ function boxes_box_form($form, &$form_state) {
   );
   $form['submit'] = array(
     '#type' => 'submit',
-    '#value' => t('Save'),
+    '#value' => t('Save box'),
     '#attributes' => array('class' => array('boxes-ajax', 'use-ajax-submit')),
   );
   $form['cancel'] = array(
@@ -494,25 +551,19 @@ function boxes_box_form_cancel_submit($form, &$form_state) {
 /**
  * Implements hook_form_alter().
  */
-function boxes_form_alter(&$form, &$form_state, $form_id) {
-  $path = implode('/', array_slice(arg(), 0, 5));
-  if (($form_id != 'block_admin_configure' || $path != 'admin/structure/block/manage/boxes') &&
-      ($form_id != 'boxes_add_form' || arg(3) != 'box-add')) {
-    return;
-  }
+function boxes_form_boxes_add_form_alter(&$form, &$form_state) {
+  if (arg(3) == 'box-add') {
 
-  // Use the Box form submit handler.
-  array_unshift($form['#submit'], 'boxes_box_form_submit');
+    // Properly redirect to the correct admin page when a ?destination parameter
+    // is not already provided (Eg, by contextual links).
+    if (!empty($form['#action']) && (strpos($form['#action'], '?destination=') == FALSE)) {
+      $form['#action'] .= '?destination=' . implode('/', array(arg(0), arg(1), arg(2)));
+    }
 
-  // Properly redirect to the correct admin page when a ?destination parameter
-  // is not already provided (Eg, by contextual links).
-  if (!empty($form['#action']) && (strpos($form['#action'], '?destination=') == FALSE)) {
-    $form['#action'] .= '?destination=admin/structure/block';
+    // Cancel behavior is different here
+    unset($form['cancel']['#attributes']);
+    $form['cancel']['#submit'] = array('boxes_block_cancel_submit');
   }
-
-  // Cancel behavior is different here
-  unset($form['cancel']['#attributes']);
-  $form['cancel']['#submit'] = array('boxes_block_cancel_submit');
 }
 
 /**
@@ -522,6 +573,7 @@ function boxes_box_form_submit($form, $form_state) {
   if ($form_state['clicked_button']['#value'] == t('Cancel')) {
     return;
   }
+
   $box = boxes_factory($form_state['values']['plugin_key'], $form_state['values']);
 
   // if options_submit is defined let the box process the submit
@@ -538,6 +590,10 @@ function boxes_box_form_submit($form, $form_state) {
   else {
     $box->save();
   }
+
+  if ($form['#form_id'] == 'boxes_add_form') {
+    drupal_set_message(t('The box has been created.'));
+  }
 }
 
 /**
@@ -561,6 +617,22 @@ function boxes_form_block_admin_configure_alter(&$form, &$form_state) {
       );
     }
 
+    // Hide block specific fields when user doesn't have access
+    if (!user_access('administer blocks')) {
+      $form['regions']['#access'] = FALSE;
+      $form['visibility_title']['#access'] = FALSE;
+      $form['visibility']['#access'] = FALSE;
+    }
+
+    // Use the Box form submit handler.
+    array_unshift($form['#submit'], 'boxes_box_form_submit');
+
+    // Properly redirect to the correct admin page when a ?destination parameter
+    // is not already provided (Eg, by contextual links).
+    if (!empty($form['#action']) && (strpos($form['#action'], '?destination=') == FALSE)) {
+      $form['#action'] .= '?destination=admin/structure/block';
+    }
+
     // Cancel behavior is different on admin/structure page
     unset($form['settings']['cancel']);
     $form['actions']['cancel'] = array(
@@ -568,6 +640,8 @@ function boxes_form_block_admin_configure_alter(&$form, &$form_state) {
       '#value' => t('Cancel'),
       '#submit' => array('boxes_block_cancel_submit'),
     );
+
+    $form['actions']['submit']['#value'] = t('Save box');
   }
 }
 
@@ -590,7 +664,8 @@ function boxes_block_cancel_submit($form, &$form_state) {
  */
 function boxes_block_delete_submit($form, &$form_state) {
   // $form_state['redirect'] will not work here since we are using $form['#action'] with destination
-  $_GET['destination'] = 'admin/structure/block/manage/boxes/' . $form_state['values']['delta'] . '/delete';
+  $destination = drupal_get_destination();
+  $_GET['destination'] = 'admin/structure/block/manage/boxes/' . $form_state['values']['delta'] . '/delete?destination=' . $destination['destination'];
 }
 
 /**
@@ -762,7 +837,7 @@ function boxes_context_block_info_alter(&$blocks) {
  * Provides spaces integration for per-space overrides of a given box.
  */
 function boxes_boxes_box_load_alter(&$box, $delta) {
-  if (!$delta) {
+  if ($box && !$delta) {
     $delta = $box->delta;
   }
   if (module_exists('spaces') && $space = spaces_get_space()) {
