diff --git a/inc/class-wp-revisions-control-bulk-actions.php b/inc/class-wp-revisions-control-bulk-actions.php
new file mode 100644
index 0000000000000000000000000000000000000000..b8563ba4fa2322c113f685db9e696fdab12a2376
--- /dev/null
+++ b/inc/class-wp-revisions-control-bulk-actions.php
@@ -0,0 +1,105 @@
+<?php
+/**
+ * Bulk actions.
+ *
+ * @package WP_Revisions_Control
+ */
+
+/**
+ * Class WP_Revisions_Control_Bulk_Actions.
+ */
+class WP_Revisions_Control_Bulk_Actions {
+	/**
+	 * Supported post types.
+	 *
+	 * @var array
+	 */
+	protected $post_types;
+
+	/**
+	 * Custom bulk actions.
+	 *
+	 * @var array
+	 */
+	protected $actions;
+
+	/**
+	 * Constructor.
+	 *
+	 * @param array $post_types Supported post types.
+	 */
+	public function __construct( $post_types ) {
+		if ( empty( $post_types ) || ! is_array( $post_types ) ) {
+			return;
+		}
+
+		$this->post_types = $post_types;
+		$this->register_actions();
+
+		add_action( 'load-edit.php', array( $this, 'setup' ) );
+	}
+
+	/**
+	 * Register custom actions.
+	 */
+	protected function register_actions() {
+		$actions     = array();
+		$action_base = 'wp_rev_ctl_bulk_';
+
+		$actions[ $action_base . 'purge_excess' ] = __( 'Purge excess revisions', 'wp_revisions_control' );
+		$actions[ $action_base . 'purge_all' ]    = __( 'Purge ALL revisions', 'wp_revisions_control' );
+
+		$this->actions = $actions;
+	}
+
+	/**
+	 * Register various hooks.
+	 */
+	public function setup() {
+		$screen = get_current_screen();
+
+		if ( null === $screen ) {
+			return;
+		}
+
+		$post_types = array_keys( $this->post_types );
+
+		if ( ! in_array( $screen->post_type, $post_types, true ) ) {
+			return;
+		}
+
+		if ( 'edit' !== $screen->base ) {
+			return;
+		}
+
+		add_filter( 'bulk_actions-' . $screen->id, array( $this, 'add_actions' ) );
+		add_filter( 'handle_bulk_actions-' . $screen->id, array( $this, 'handle_action' ), 10, 3 );
+	}
+
+	/**
+	 * Add our actions.
+	 *
+	 * @param string[] $actions Array of available actions.
+	 * @return array
+	 */
+	public function add_actions( $actions ) {
+		return array_merge( $actions, $this->actions );
+	}
+
+	/**
+	 * Handle our bulk actions.
+	 *
+	 * @param string $redirect_to Redirect URL.
+	 * @param string $action      Bulk action being taken.
+	 * @param array  $ids         Object IDs to manipulate.
+	 * @return string
+	 */
+	public function handle_action( $redirect_to, $action, $ids ) {
+		if ( ! array_key_exists( $action, $this->actions ) ) {
+			return $redirect_to;
+		}
+
+		// TODO: implement and add a query string to trigger a message.
+		return $redirect_to;
+	}
+}
diff --git a/inc/class-wp-revisions-control.php b/inc/class-wp-revisions-control.php
index 7386ff034471a51a07265af4409485d378cf2df6..2d556ad9ab9c35672ae16997c22d2817ddc8d0b0 100644
--- a/inc/class-wp-revisions-control.php
+++ b/inc/class-wp-revisions-control.php
@@ -125,12 +125,14 @@ class WP_Revisions_Control {
 	 * Plugin title is intentionally not translatable.
 	 */
 	public function action_admin_init() {
+		$post_types = $this->get_post_types();
+
 		// Plugin setting section.
 		register_setting( $this->settings_page, $this->settings_section, array( $this, 'sanitize_options' ) );
 
 		add_settings_section( $this->settings_section, 'WP Revisions Control', array( $this, 'settings_section_intro' ), $this->settings_page );
 
-		foreach ( $this->get_post_types() as $post_type => $name ) {
+		foreach ( $post_types as $post_type => $name ) {
 			add_settings_field( $this->settings_section . '-' . $post_type, $name, array( $this, 'field_post_type' ), $this->settings_page, $this->settings_section, array( 'post_type' => $post_type ) );
 		}
 
@@ -138,6 +140,9 @@ class WP_Revisions_Control {
 		add_action( 'add_meta_boxes', array( $this, 'action_add_meta_boxes' ), 10, 2 );
 		add_action( 'wp_ajax_' . $this->settings_section . '_purge', array( $this, 'ajax_purge' ) );
 		add_action( 'save_post', array( $this, 'action_save_post' ) );
+
+		// Bulk actions.
+		new WP_Revisions_Control_Bulk_Actions( $post_types );
 	}
 
 	/**
diff --git a/wp-revisions-control.php b/wp-revisions-control.php
index 1b09aca69b2c8dcfd30a41d5711e2e2f5a7e3dc3..0bf1b26e5805c169f0c8325dde2a9ca10d19c0b1 100644
--- a/wp-revisions-control.php
+++ b/wp-revisions-control.php
@@ -30,4 +30,5 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
+require_once __DIR__ . '/inc/class-wp-revisions-control-bulk-actions.php';
 require_once __DIR__ . '/inc/class-wp-revisions-control.php';