diff --git a/empty_page.admin.inc b/empty_page.admin.inc
index 89f9995..26633f6 100644
--- a/empty_page.admin.inc
+++ b/empty_page.admin.inc
@@ -30,7 +30,8 @@ function theme_empty_page_callbacks_manage_render() {
 
   $rows = array();
   foreach ($callbacks as $cid => $callback) {
-    $rows[$cid][] = '<strong>' . $callback->path . '</strong>';
+    $template = $callback->page_template == 1 ? ' (' . str_replace('/', '-', $callback->path) . '.tpl.php)' : '';
+    $rows[$cid][] = '<strong>' . $callback->path . '</strong>' . $template;
     $rows[$cid][] = l(t('View'), $callback->path);
     if ($edit_access) {
       $rows[$cid][] = l(t('Edit'), 'admin/structure/empty-page/' . $callback->cid . '/edit');
@@ -101,6 +102,8 @@ function empty_page_admin_delete_form_submit($form, &$form_state) {
 
   // Clear menu cache.
   empty_page_clear_menu_cache();
+  // Clear theme cache.
+  empty_page_clear_theme_cache();
 
   drupal_set_message(t('Callback <em>!path</em> deleted.', array('!path' => $form_state['values']['callback']->path)));
 }
@@ -144,6 +147,12 @@ function empty_page_callbacks_form($form, &$form_state, $cid = NULL) {
     '#description' => '',
     '#default_value' => $callback ? $callback->page_title : '',
   );
+  $form['empty_page_basic']['empty_page_callback_page_template'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Use custom template'),
+    '#description' => 'Check if you want use a custom template for this callback.',
+    '#default_value' => $callback ? $callback->page_template : 0,
+  );
   $form['empty_page_basic']['buttons']['submit'] = array(
     '#type' => 'submit',
     '#value' => $callback ? t('Save') : t('Add'),
@@ -153,6 +162,23 @@ function empty_page_callbacks_form($form, &$form_state, $cid = NULL) {
 }
 
 /**
+ * The Empty Page callback for settings form.
+ */
+function empty_page_callbacks_settings_form($form, &$form_state, $cid = NULL) {
+
+  $form['empty_page_settings'] = array('#type' => 'fieldset', '#title' => 'Empty Page Settings', '#description' => '', '#collapsible' => TRUE);
+  $form['empty_page_settings']['empty_page_template_path'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Custom Template Path'),
+    '#description' => 'If the template file will not be in the default template path, you can choose a custom path for your template file.',
+    '#field_prefix' => $GLOBALS['base_url'] . '/',
+    '#default_value' => variable_get('empty_page_template_path', drupal_get_path('theme', variable_get('theme_default', NULL)) . '/templates'),
+  );
+
+  return system_settings_form($form);
+}
+
+/**
  * Form validate handler for adding / editing an Empty Page callback.
  *
  * @param array $form
@@ -188,12 +214,14 @@ function empty_page_callbacks_form_submit($form, &$form_state) {
 
   $callback->path = $form_state['values']['empty_page_callback_path'];
   $callback->page_title = $form_state['values']['empty_page_callback_page_title'];
+  $callback->page_template = $form_state['values']['empty_page_callback_page_template'];
   // TODO: Handle saving of custom perms.
   $callback->changed = REQUEST_TIME;
 
   empty_page_save_callback($callback);
 
   empty_page_clear_menu_cache();
+  empty_page_clear_theme_cache();
 
   drupal_set_message(t('Changes saved.'));
 
diff --git a/empty_page.install b/empty_page.install
index cea8669..1086c7c 100644
--- a/empty_page.install
+++ b/empty_page.install
@@ -23,7 +23,9 @@ function empty_page_install() {
  */
 function empty_page_uninstall() {
   drupal_load('module', 'empty_page');
+  variable_del('empty_page_template_path');
   empty_page_clear_menu_cache();
+  empty_page_clear_theme_cache();
 }
 
 /**
@@ -50,6 +52,11 @@ function empty_page_schema() {
         'not null' => TRUE,
         'default' => '',
       ),
+      'page_template' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+      ),
       'data' => array(
         'type' => 'text',
         'not null' => FALSE,
diff --git a/empty_page.module b/empty_page.module
index 8b50850..5cec191 100644
--- a/empty_page.module
+++ b/empty_page.module
@@ -71,11 +71,23 @@ function empty_page_menu() {
     'file' => 'empty_page.admin.inc',
   );
 
+  $items['admin/structure/empty-page/settings'] = array(
+    'title' => 'Settings',
+    'description' => 'Manage Empty Page Settings',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('empty_page_callbacks_settings_form'),
+    'access arguments' => array(EMPTY_PAGE_PERM_ADMIN_CALLBACKS),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'empty_page.admin.inc',
+    'weight' => 2,
+  );
+
   // Create the dynamic callbacks.
   foreach (empty_page_get_callbacks() as $cid => $callback) {
     $items[$callback->path] = array(
       'title' => t($callback->page_title),
       'page callback' => 'empty_page_empty',
+      'page arguments' => array($callback->path, $callback->page_template),
       'access callback' => TRUE,
       'type' => MENU_SUGGESTED_ITEM,
     );
@@ -89,20 +101,33 @@ function empty_page_menu() {
  */
 function empty_page_theme(&$existing, $type, $theme, $path) {
   $hooks = array();
+
   $hooks['empty_page_callbacks_manage_render'] = array(
     'file' => 'empty_page.admin.inc',
   );
+
+  // Create the dynamic templates.
+  foreach (empty_page_get_callbacks() as $cid => $callback) {
+    if ($callback->page_template == 1) {
+
+      $hooks[str_replace(array('/', '-'), '_', $callback->path)] = array(
+        'render element' => 'elements',
+        'path' => variable_get('empty_page_template_path', drupal_get_path('theme', variable_get('theme_default', NULL)) . '/templates'),
+        'template' => str_replace('/', '-', $callback->path),
+      );
+    }
+  }
+
   return $hooks;
 }
 
 /**
- * An Empty Page callback's empty content.
+ * An Empty or theme Page callback's content.
  *
  * @return string $output
  */
-function empty_page_empty() {
-  // Return a space so that an empty page can be used for 40x pages.
-  return ' ';
+function empty_page_empty($path = '', $template = 0) {
+  return $template == 1 ? theme(str_replace(array('/', '-'), '_', $path)) : ' ';
 }
 
 
@@ -121,7 +146,7 @@ function empty_page_empty() {
 function empty_page_get_callbacks() {
   $callbacks = array();
   $results = db_select('empty_page')
-    ->fields('empty_page', array('cid', 'path', 'page_title', 'data', 'changed', 'created'))
+    ->fields('empty_page', array('cid', 'path', 'page_title', 'page_template', 'data', 'changed', 'created'))
     ->orderBy('changed', 'DESC')
     ->execute();
   foreach ($results as $callback) {
@@ -138,7 +163,7 @@ function empty_page_get_callbacks() {
  */
 function empty_page_get_callback($cid) {
   $callback = db_select('empty_page')
-    ->fields('empty_page', array('cid', 'path', 'page_title', 'data', 'changed', 'created'))
+    ->fields('empty_page', array('cid', 'path', 'page_title', 'page_template', 'data', 'changed', 'created'))
     ->condition('cid', $cid)
     ->execute()
     ->fetchObject();
@@ -157,6 +182,7 @@ function empty_page_save_callback($callback) {
       ->fields(array(
         'path' => $callback->path,
         'page_title' => $callback->page_title,
+        'page_template' => $callback->page_template,
         'changed' => REQUEST_TIME,
       ))
       ->condition('cid', $callback->cid)
@@ -168,6 +194,7 @@ function empty_page_save_callback($callback) {
       ->fields(array(
         'path' => $callback->path,
         'page_title' => $callback->page_title,
+        'page_template' => $callback->page_template,
         'created' => REQUEST_TIME,
         'changed' => REQUEST_TIME,
       ))
@@ -198,3 +225,11 @@ function empty_page_clear_menu_cache() {
   // Rebuild menu.
   menu_rebuild();
 }
+
+/**
+ * Helper function for cleaning / rebuilding theme registry.
+ */
+function empty_page_clear_theme_cache() {
+  // Rebuild theme hooks.
+  drupal_theme_rebuild();
+}
