diff --git a/media_derivatives.install b/media_derivatives.install
index bfb43c8..f17217b 100644
--- a/media_derivatives.install
+++ b/media_derivatives.install
@@ -281,7 +281,7 @@ function media_derivatives_schema() {
  * Implements hook_uninstall().
  */
 function media_derivatives_uninstall() {
-
+  variable_del('media_derivatives_background_process');
 }
 
 /**
diff --git a/media_derivatives.module b/media_derivatives.module
index 7f6f0db..c4b8a3f 100644
--- a/media_derivatives.module
+++ b/media_derivatives.module
@@ -35,6 +35,36 @@ include_once('plugins/media_derivatives.events.inc');
 
 
 /**
+ * Implements hook_menu().
+ */
+function media_derivatives_menu() {
+  $items = array();
+  
+  $items['admin/config/media/media-derivatives/settings'] = array(
+    'title' => 'Settings',
+    'description' => 'Configure Media derivatives settings.',
+    'page callback' => 'drupal_get_form', 
+    'page arguments' => array('media_derivatives_settings_form'), 
+    'access arguments' => array('administer media_derivatives'), 
+    'type' => MENU_LOCAL_TASK, 
+  );
+  
+  return $items;
+}
+
+/**
+ * Implements hook_permission().
+ */
+function media_derivatives_permission() {
+  return array(
+    'administer media_derivatives' => array(
+      'title' => t('Administer Media derivatives'), 
+      'description' => t('Perform administration tasks for Media derivatives API.'),
+    ),
+  );
+}
+
+/**
  * Implements hook_file_delete().
  */
 function media_derivatives_file_delete($file) {
@@ -800,7 +830,15 @@ function media_derivatives_schedule_derivative($derivative) {
   else if ($action) {
     $derivative->scheduled_time = time();
     media_derivatives_save($derivative);
-    media_derivatives_start_encode($derivative);
+    
+    // Start processing using background_process.module
+    if (module_exists('background_process') && variable_get('media_derivatives_background_process', TRUE)) {
+      $handle = background_process_start('media_derivatives_start_encode', $derivative);
+      drupal_set_message(t('Processing of derivative passed to background_process (preset:  %der_name, source FID: %fid).', array('%der_name' => $derivative->preset_name, '%der_name' => $derivative->source_fid)), 'status');
+    }
+    else {
+      media_derivatives_start_encode($derivative);
+    }
   }
   
 }
@@ -839,4 +877,22 @@ function media_derivatives_disable() {
   cache_clear_all('media_derivatives_schedulers', 'cache');
   cache_clear_all('media_derivatives_supported_fields', 'cache');
   cache_clear_all('media_derivatives_field_types', 'cache');
-}
\ No newline at end of file
+}
+
+/**
+ * Settings form.
+ */
+function media_derivatives_settings_form($form, &$form_state) {
+  $form = array();
+  
+  if (module_exists('background_process')) {
+    $form['media_derivatives_background_process'] = array(
+      '#title' => t('Process using Background process'),
+      '#description' => t('Process derivatives using <a href="@url">Background process</a> module.', array('@url' => 'http://drupal.org/project/background_process')),
+      '#type' => 'checkbox',
+      '#default_value' => variable_get('media_derivatives_background_process', TRUE),
+    );
+  }
+  
+  return system_settings_form($form);
+}
