diff --git a/commerce_pdm.admin.inc b/commerce_pdm.admin.inc
deleted file mode 100644
index 57a79fe..0000000
--- a/commerce_pdm.admin.inc
+++ /dev/null
@@ -1,712 +0,0 @@
-<?php
-
-// Constant value for the title of the orphaned products table row.
-define('COMMERCE_PDM_ORPHANS_ROW_TITLE', t('Products not assigned to any display node'));
-
-/**
- * Display manager page.
- */
-function commerce_pdm_product_display_manager_page() {
-
-  $output = array();
-
-  $output['filters'] = drupal_get_form('commerce_pdm_product_display_manager_filters');
-
-  $output['admin'] = drupal_get_form('commerce_pdm_product_display_manager_form');
-
-  return $output;
-}
-
-/**
- * Creates the display manager form.
- */
-function commerce_pdm_product_display_manager_filters($form, &$form_state) {
-
-  // Enable language column if translation module is enabled
-  // or if we have any product display node with language.
-  $multilanguage = (module_exists('translation') || db_query("SELECT COUNT(*) FROM {node} WHERE language <> :language", array(':language' => LANGUAGE_NONE))->fetchField());
-
-  // Add filters to the form.
-  $form['filter'] = product_manager_filter_form();
-  $form['#submit'] = array('product_manager_filter_form_submit');
-
-  return $form;
-}
-
-/**
- * Return form for products and product displays administration filters.
- */
-function product_manager_filter_form() {
-
-  $session = isset($_SESSION['products_overview_filter']) ? $_SESSION['products_overview_filter'] : array();
-  $filters = product_manager_filters();
-
-  $i = 0;
-  $form['filters'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Show only items where'),
-    '#theme' => 'exposed_filters__node',
-  );
-  foreach ($session as $filter) {
-    list($type, $value) = $filter;
-    if ($type == 'term') {
-      // Load term name from DB rather than search and parse options array.
-      $value = module_invoke('taxonomy', 'term_load', $value);
-      $value = $value->name;
-    }
-    elseif ($type == 'language') {
-      $value = $value == LANGUAGE_NONE ? t('Language neutral') : module_invoke('locale', 'language_name', $value);
-    }
-    else {
-      $value = $filters[$type]['options'][$value];
-    }
-    $t_args = array('%property' => $filters[$type]['title'], '%value' => $value);
-    if ($i++) {
-      $form['filters']['current'][] = array('#markup' => t('and where %property is %value', $t_args));
-    }
-    else {
-      $form['filters']['current'][] = array('#markup' => t('where %property is %value', $t_args));
-    }
-    if (in_array($type, array('type', 'language'))) {
-      // Remove the option if it is already being filtered on.
-      unset($filters[$type]);
-    }
-  }
-
-  $form['filters']['status'] = array(
-    '#type' => 'container',
-    '#attributes' => array('class' => array('clearfix')),
-    '#prefix' => ($i ? '<div class="additional-filters">' . t('and where') . '</div>' : ''),
-  );
-  $form['filters']['status']['filters'] = array(
-    '#type' => 'container',
-    '#attributes' => array('class' => array('filters')),
-  );
-  foreach ($filters as $key => $filter) {
-    $form['filters']['status']['filters'][$key] = array(
-      '#type' => 'select',
-      '#options' => $filter['options'],
-      '#title' => $filter['title'],
-      '#default_value' => '[any]',
-    );
-  }
-
-  $form['filters']['status']['actions'] = array(
-    '#type' => 'actions',
-    '#attributes' => array('class' => array('container-inline')),
-  );
-  $form['filters']['status']['actions']['submit'] = array(
-    '#type' => 'submit',
-    '#value' => count($session) ? t('Refine') : t('Filter'),
-  );
-
-  if (!empty($filters['language'])) {
-    $form['filters']['status']['#suffix'] = '<small>' . t('Note that the product language will not be filtered, only the language of the product display node.') . '</small>';
-  }
-
-  if (count($session)) {
-    $form['filters']['status']['actions']['undo'] = array('#type' => 'submit', '#value' => t('Undo'));
-    $form['filters']['status']['actions']['reset'] = array('#type' => 'submit', '#value' => t('Reset'));
-  }
-
-  drupal_add_js('misc/form.js');
-
-  return $form;
-}
-
-/**
- * product_manager_filters.
- */
-function product_manager_filters() {
-
-  $filters = array();
-  // Regular filters
-  $filters['status'] = array(
-    'title' => t('status'),
-    'options' => array(
-      '[any]' => t('any'),
-      'status-1' => t('published'),
-      'status-0' => t('not published'),
-      'promote-1' => t('promoted'),
-      'promote-0' => t('not promoted'),
-      'sticky-1' => t('sticky'),
-      'sticky-0' => t('not sticky'),
-    ),
-  );
-  // Include translation states if we have this module enabled
-  if (module_exists('translation')) {
-    $filters['status']['options'] += array(
-      'translate-0' => t('Up to date translation'),
-      'translate-1' => t('Outdated translation'),
-    );
-  }
-
-  $options = array();
-  foreach (commerce_product_types() as $type => $product) {
-    $options[$product['type']] = $product['name'];
-  }
-  $filters['product_type'] = array(
-    'title' => t('product type'),
-    'options' => array(
-      '[any]' => t('any'),
-    ) + $options,
-  );
-
-  $options = array();
-  $product_display_types = _commerce_pdm_get_product_display_types(FALSE);
-  foreach ($product_display_types as $node_type) {
-    $options[$node_type['machine_name']] = $node_type['name'];
-  }
-  $filters['display_node_type'] = array(
-    'title' => t('product display type'),
-    'options' => array(
-      '[any]' => t('any'),
-    ) + $options,
-  );
-
-  // Language filter if there is a list of languages
-  if ($languages = module_invoke('locale', 'language_list')) {
-    $languages = array(LANGUAGE_NONE => t('Language neutral')) + $languages;
-    $filters['language'] = array(
-      'title' => t('language'),
-      'options' => array(
-        '[any]' => t('any'),
-      ) + $languages,
-    );
-  }
-
-  return $filters;
-}
-
-/**
- * Process result from product display administration filter form.
- */
-function product_manager_filter_form_submit($form, &$form_state) {
-
-  $filters = product_manager_filters();
-  switch ($form_state['values']['op']) {
-    case t('Filter'):
-    case t('Refine'):
-      // Apply every filter that has a choice selected other than 'any'.
-      foreach ($filters as $filter => $options) {
-        if (isset($form_state['values'][$filter]) && $form_state['values'][$filter] != '[any]') {
-          // Flatten the options array to accommodate hierarchical/nested options.
-          $flat_options = form_options_flatten($filters[$filter]['options']);
-          // Only accept valid selections offered on the dropdown, block bad input.
-          if (isset($flat_options[$form_state['values'][$filter]])) {
-            $_SESSION['products_overview_filter'][] = array($filter, $form_state['values'][$filter]);
-          }
-        }
-      }
-      break;
-    case t('Undo'):
-      array_pop($_SESSION['products_overview_filter']);
-      break;
-    case t('Reset'):
-      $_SESSION['products_overview_filter'] = array();
-      break;
-  }
-}
-
-/**
- * Creates the display manager form.
- *
- * @todo Typically, node entities are used as product displays. But there are no restrictions to
- *   turn any other entity type like terms, users, files, media,... into product displays too.
- *   PDM currently assumes all product displays are nodes.
- *   See: http://drupal.org/node/1376938
- */
-function commerce_pdm_product_display_manager_form($form, &$form_state) {
-
-  $form = array('#tree' => TRUE);
-  $session = isset($_SESSION['products_overview_filter']) ? $_SESSION['products_overview_filter'] : array();
-
-  $current_path = $_GET['q'];
-  $product_display_types = _commerce_pdm_get_product_display_types(FALSE);
-
-  // Skip the rest if no product displays where found.
-  if (empty($product_display_types)) {
-    return array('no_product_displays' => array(
-      '#markup' => '<div style="margin-bottom:20px;">' . t('The store does not yet contain any product display nodes.') . '</div>',
-    ));
-  }
-  $product_fields = _commerce_pdm_get_product_reference_fields();
-
-  // Fetch the products & display nodes as a UNION query
-  $union = FALSE;
-  $base_query = NULL;
-  foreach ($product_fields as $product_field) {
-    $nodes_query = db_select('node', 'n');
-    $nodes_query->leftJoin('field_data_' . $product_field, 'pr', 'pr.entity_id = n.nid');
-    $nodes_query->leftJoin('commerce_product', 'cp', 'cp.product_id = pr.' . $product_field . '_product_id');
-    $nodes_query->fields('cp', array('type', 'product_id', 'sku', 'title', 'language'));
-    $nodes_query->fields('n', array('nid', 'title' => 'title', 'language', 'type', 'status', 'promote', 'sticky', 'translate'));
-    $nodes_query->fields('pr', array('delta'));
-
-    $display_types = array();
-    foreach ($product_display_types as $product_display_type) {
-      $display_types[] = $product_display_type['machine_name'];
-    }
-    $nodes_query->condition('n.type', $display_types, 'IN');
-
-    if ($union) {
-      $base_query->union($nodes_query, 'ALL');
-    }
-    else {
-      $base_query = $nodes_query;
-      $union = TRUE;
-    }
-  }
-
-  // Add filter conditions to the union query
-  $union = db_select($base_query, 'u');
-  $union->fields('u');
-
-  foreach ($session as $index => $filter) {
-    list($key, $value) = $filter;
-    switch ($key) {
-      case 'status':
-        // Note: no exploitable hole as $key/$value have already been checked when submitted
-        list($key, $value) = explode('-', $value, 2);
-        $union->condition('u.' . $key, $value);
-        break;
-      case 'display_node_type':
-        $union->condition('u.n_type', $value);
-        break;
-      case 'product_type':
-        $union->condition('u.type', $value);
-        break;
-      case 'language':
-        $union->condition('u.n_language', $value);
-        break;
-    }
-  }
-
-  $nodes_query_result = $union->extend('PagerDefault')->limit(25)->execute();
-
-  $product_list = array();
-  foreach ($nodes_query_result as $record) {
-    // Create the Product Display when first time.
-    if (!isset($product_list[$record->nid])) {
-      $object = new stdClass();
-      $object->nid = $record->nid;
-      $object->title = $record->n_title;
-      $object->type = $record->n_type;
-      $object->product_type = $record->type;
-      $object->language = $record->n_language;
-      $object->children = array();
-      $product_list[$record->nid] = $object;
-    }
-
-    if (!is_null($record->product_id)) {
-      // Add the product to the list.
-      $product_object = new stdClass();
-      $product_object->product_id = $record->product_id;
-      $product_object->sku = $record->sku;
-      $product_object->type = $record->type;
-      $product_object->title = $record->title;
-      $product_object->language = $record->language;
-      $product_list[$record->nid]->children[$record->delta] = $product_object;
-    }
-  }
-
-  if (count($product_list) > 0) {
-    // Add all display nodes and their referenced products to the form.
-    foreach ($product_list as $node_obj) {
-      $form[] = array(
-        'title' => array(
-          '#type' => 'item',
-          '#markup' => $node_obj->title,
-        ),
-        'language' => array(
-          '#type' => 'item',
-          '#markup' => $node_obj->language,
-        ),
-        'edit_link' => array(
-          '#type' => 'link',
-          '#title' => t('Edit'),
-          '#href' => 'node/' . $node_obj->nid . '/edit',
-              '#options' => array('query' => array('destination' => $current_path)),
-        ),
-        'delete_link' => array(
-          '#type' => 'link',
-          '#title' => t('Delete'),
-          '#href' => 'node/' . $node_obj->nid . '/delete',
-          '#options' => array('query' => array('destination' => $current_path)),
-        ),
-        'nid' => array(
-          '#type' => 'hidden',
-          '#value' => $node_obj->nid,
-        ),
-        '#type' => $node_obj->product_type,
-      );
-
-      if (!empty($node_obj->children)) {
-
-        foreach ($node_obj->children as $delta => $related_product) {
-
-          $form[] = array(
-            'title' => array(
-              '#type' => 'item',
-              '#markup' => $related_product->title,
-            ),
-            'language' => array(
-              '#type' => 'item',
-              '#markup' => $related_product->language,
-            ),
-            'edit_link' => array(
-              '#type' => 'link',
-              '#title' => t('Edit'),
-              '#href' => 'admin/commerce/products/' . $related_product->product_id . '/edit',
-              '#options' => array('query' => array('destination' => $current_path)),
-            ),
-            'clone_link' => array(
-              '#type' => 'link',
-              '#title' => t('Clone'),
-              '#href' => 'admin/commerce/products/clone/' . str_replace("_", "-", $related_product->type) . '/' . $related_product->product_id,
-              '#options' => array('query' => array('pdid' => $node_obj->nid, 'destination' => $current_path)),
-            ),
-            'delete_link' => array(
-              '#type' => 'link',
-              '#title' => t('Delete'),
-              '#href' => 'admin/commerce/products/' . $related_product->product_id . '/delete',
-              '#options' => array('query' => array('destination' => $current_path)),
-            ),
-            'pid' => array(
-              '#type' => 'hidden',
-              '#default_value' => $related_product->product_id,
-            ),
-            'delta' => array(
-              '#type' => 'weight',
-              '#title' => t('Delta'),
-              '#title_display' => 'invisible',
-              '#default_value' => $delta,
-            ),
-          );
-
-          $referenced_product_ids[] = $related_product->product_id;
-        }
-      }
-    }
-
-    // Load all products currently not referenced.
-    $orphans_query = db_select('commerce_product', 'cp');
-    $orphans_query->fields('cp', array('product_id', 'sku', 'title', 'language', 'type'));
-    foreach ($product_fields as $field_name) {
-      $orphans_query->leftJoin('field_data_' . $field_name, 'fd_' . $field_name, 'cp.product_id = fd_' . $field_name . '.' . $field_name . '_product_id');
-      $orphans_query->condition('fd_' . $field_name . '.entity_id', NULL);
-    }
-
-    // Add only the product type filter here
-    foreach ($session as $index => $filter) {
-      list($key, $value) = $filter;
-      switch ($key) {
-        case 'product_type':
-          $orphans_query->condition('cp.type', $value);
-          break;
-      }
-    }
-
-    $orphans_result = $orphans_query->execute();
-
-    $form[] = array(
-      'title' => array(
-        '#type' => 'item',
-        '#markup' => COMMERCE_PDM_ORPHANS_ROW_TITLE
-      ),
-      'nid' => array(
-        '#type' => 'hidden',
-        '#value' => 0,
-      ),
-      'language' => array(
-        '#type' => 'item',
-        '#markup' => '',
-      ),
-    );
-
-    // Add all orphan products to the table.
-    if ($orphans_result->rowCount() > 0) {
-      foreach ($orphans_result as $orphan_key => $orphan_product) {
-        $form[] = array(
-          'title' => array(
-            '#type' => 'item',
-            '#markup' => $orphan_product->title,
-          ),
-          'language' => array(
-            '#type' => 'item',
-            '#markup' => $orphan_product->language,
-          ),
-          'edit_link' => array(
-            '#type' => 'link',
-            '#title' => t('Edit'),
-            '#href' => 'admin/commerce/products/' . $orphan_product->product_id . '/edit',
-            '#options' => array('query' => array('destination' => $current_path)),
-          ),
-          'delete_link' => array(
-            '#type' => 'link',
-            '#title' => t('Delete'),
-            '#href' => 'admin/commerce/products/' . $orphan_product->product_id . '/delete',
-            '#options' => array('query' => array('destination' => $current_path)),
-          ),
-          'pid' => array(
-            '#type' => 'hidden',
-            '#default_value' => $orphan_product->product_id,
-          ),
-          'orphan' => array(
-            '#type' => 'hidden',
-            '#default_value' => TRUE,
-          ),
-          'delta' => array(
-            '#type' => 'weight',
-            '#title' => t('Delta'),
-            '#title_display' => 'invisible',
-          ),
-        );
-      }
-    }
-  }
-
-  $form['submit'] = array(
-    '#type' => 'submit',
-    '#value' => t('Save'),
-  );
-
-  // Adds JavaScript and CSS used by form.
-  $form['#after_build'][] = '_commerce_pdm_product_display_manager_form_attach';
-
-  // Turns it into a table.
-  $form['#languages'] = module_invoke('locale', 'language_list');
-  $form['#theme'] = 'commerce_pdm_product_display_manager_table';
-  $form['pager'] = array('#theme' => 'pager');
-
-  return $form;
-}
-
-/**
- * Creates a batch operation that will update all display nodes.
- */
-function commerce_pdm_product_display_manager_form_validate($form, &$form_state) {
-
-  $hierarchy = array();
-  $current_display_node = NULL;
-  foreach ($form_state['input'] as $input) {
-    if (is_array($input)) {
-      if (isset($input['nid'])) {
-        if ($current_display_node) {
-          $hierarchy[] = $current_display_node;
-        }
-        $current_display_node = array('nid' => $input['nid'], 'products' => array());
-      }
-      else {
-        $current_display_node['products'][] = $input['pid'];
-      }
-    }
-  }
-
-  foreach ($hierarchy as $key => $display_node) {
-
-
-    $node = node_load($display_node['nid']);
-    if (!_commerce_pdm_get_number_reference_values_allowed($node, count($display_node['products']))) {
-      form_set_error($key . '[nid]', t('Display node with title %note_title cannot contain the specified number of product references, field limit is set to %field_limit.',
-        array('%note_title' => $node->title, '%field_limit' => _commerce_pdm_get_num_allowed_references($node))));
-    }
-  }
-}
-
-/**
- * Creates a batch operation that will update all display nodes.
- */
-function commerce_pdm_product_display_manager_form_submit($form, &$form_state) {
-
-  $hierarchy = array();
-  $current_display_node = NULL;
-  foreach ($form_state['input'] as $input) {
-    if (is_array($input)) {
-      if (isset($input['nid'])) {
-        if ($current_display_node) {
-          $hierarchy[] = $current_display_node;
-        }
-        $current_display_node = array('nid' => $input['nid'], 'products' => array());
-      }
-      else {
-        $current_display_node['products'][] = $input['pid'];
-      }
-    }
-  }
-
-  // Create a skeleton for the update batch.
-  $batch = array(
-    'title' => t('Updating display nodes'),
-    'operations' => array(),
-    'finished' => '_commerce_pdm_display_nodes_updated',
-    'file' => drupal_get_path('module', 'commerce_pdm') . '/commerce_pdm.admin.inc',
-  );
-
-  // Add operations.
-  foreach ($hierarchy as $product_display_hierarchy) {
-    $batch['operations'][] = array(
-      '_commerce_pdm_update_display_node',
-      array($product_display_hierarchy),
-    );
-  }
-
-  // Initialize the update batch process.
-  batch_set($batch);
-}
-
-/**
- * Displays the display manager form as a draggable table.
- */
-function theme_commerce_pdm_product_display_manager_table($variables) {
-  $form = &$variables['form'];
-  $output = '';
-
-  drupal_add_tabledrag('commerce_pdm_product_display_manager', 'order', 'sibling', 'delta');
-
-  $output .= drupal_render($form['filter']);
-
-  $links = array(
-    array(
-      'title' => t('Add product'),
-      'href' => 'admin/commerce/products/add'
-    ),
-  );
-  $output .= theme('links', array('links' => $links, 'attributes' => array('class' => array('action-links'))));
-
-  $header = array (
-    t('Product display title / product title'), t('Language'), t('Edit'), t('Delete'), t('Delta'),
-  );
-
-  $rows = array();
-	foreach (element_children($form) as $key) {
-    $form_element = &$form[$key];
-
-    if (isset($form_element['title'])) {
-      if (isset($form_element['nid'])) {  // It's a display node.
-        $form_element['nid']['#attributes']['class'] = 'display-nid';
-
-        $row = array();
-        $row[] = drupal_render($form_element['title']) . drupal_render($form_element['nid']);
-        $row[] = drupal_render($form_element['language']);
-        $row[] = ($form_element['title']['#markup'] == COMMERCE_PDM_ORPHANS_ROW_TITLE) ? '' : drupal_render($form_element['edit_link']) .
-          ' - ' . l(t('Add @type', array('@type' => $form_element['#type'])), 'admin/commerce/products/add/' . str_replace("_", "-", $form_element['#type']), array('query' => array('pdid' => $form_element['nid']['#value'], drupal_get_destination())));
-        $row[] = ($form_element['title']['#markup'] == COMMERCE_PDM_ORPHANS_ROW_TITLE) ? '' : drupal_render($form_element['delete_link']);
-        $row[] = '';
-
-        $row_class = ($form_element['title']['#markup'] == COMMERCE_PDM_ORPHANS_ROW_TITLE) ? 'orphans' : '';
-        $rows[] = array('data' => $row, 'class' => array('display-node', $row_class));
-      }
-      else if (!isset($form_element['orphan'])) {  // It's referenced product.
-        $form_element['delta']['#attributes']['class'] = array('delta');
-
-        $row = array();
-        $row[] = theme('indentation', array('size' => 1)) . drupal_render($form_element['title']);
-        $row[] = drupal_render($form_element['language']);
-        $row[] = drupal_render($form_element['edit_link']) . ' - ' . drupal_render($form_element['clone_link']);
-        $row[] = drupal_render($form_element['delete_link']);
-        $row[] = drupal_render($form_element['delta']);
-
-        $rows[] = array('data' => $row, 'class' => array('draggable', 'tabledrag-leaf', 'product'));
-      }
-      else {  // It's an orphan product.
-        $form_element['delta']['#attributes']['class'] = array('delta');
-
-        $row = array();
-        $row[] = theme('indentation', array('size' => 1)) . drupal_render($form_element['title']);
-        $row[] = drupal_render($form_element['language']);
-        $row[] = drupal_render($form_element['edit_link']);
-        $row[] = drupal_render($form_element['delete_link']);
-        $row[] = drupal_render($form_element['delta']);
-
-        $rows[] = array('data' => $row, 'class' => array('draggable', 'tabledrag-leaf', 'product-orphan'));
-      }
-		}
-	}
-
-  if (!empty($rows)) {
-    $rows[0]['class'][] = 'first';
-  }
-
-  $output .= theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'commerce_pdm_product_display_manager')));
-  $output .= drupal_render_children($form);
-
-  return $output;
-}
-
-/*
-function commerce_pdm_form_commerce_product_ui_product_delete_form_alter(&$form, &$form_state, $form_id) {
-
-}
-function commerce_pdm_form_node_delete_confirm_alter(&$form, &$form_state, $form_id) {
-
-}
-*/
-
-/**
- * Updates any given display node to reference to specified products.
- */
-function _commerce_pdm_update_display_node($update_data, &$context) {
-  $node = node_load($update_data['nid']);
-  $context['message'] = t('Updating product display node %node_title', array('%node_title' => $node->title));
-
-  $reference_field_name = _commerce_pdm_get_node_reference_field_name($node);
-  $new_field_values = array();
-  foreach($update_data['products'] as $product_id) {
-    $new_field_values[] = array('product_id' => $product_id);
-  }
-
-  $original_field_values = field_get_items('node', $node, $reference_field_name);
-  if ($new_field_values != $original_field_values) {
-    $field_language = field_language('node', $node, $reference_field_name);
-    if (!isset($original_field_values)) {
-      $node->{$reference_field_name} = array($field_language => array());
-    }
-    $node->{$reference_field_name}[$field_language] = $new_field_values;
-    node_save($node);
-  }
-}
-
-/**
- * The display node's update batch is complete.
- */
-function _commerce_pdm_display_nodes_updated($success, $results, $operations) {
-  if ($success) {
-    $message = t('Products and their display nodes has been updated successfully.');
-  }
-  else {
-    $message = t('There was an error updating your products and their display nodes.');
-  }
-
-  drupal_set_message($message);
-}
-
-/**
- * Helper function to return all products that are referenced by a node.
- */
-function _commerce_pdm_get_products_referenced($nid) {
-  $product_fields = _commerce_pdm_get_product_reference_fields();
-  $out = array();
-  foreach ($product_fields as $field) {
-    $result = db_query(
-      'SELECT ' . $field . '_product_id FROM {field_data_' . $field . '} df WHERE df.entity_id = :eid ORDER BY df.delta',
-      array(
-        ':eid' => $nid,
-      )
-    );
-
-    foreach ($result as $product_obj) {
-      $out[] = $product_obj->{$field . '_product_id'};
-    }
-  }
-  return array_values($out);
-}
-
-/**
- *  Add necessary css and JavaScript files to the display manager form.
- */
-function _commerce_pdm_product_display_manager_form_attach($form_element) {
-  drupal_add_css(drupal_get_path('module', 'commerce_pdm') . '/commerce_pdm_product_display_manager_form.css');
-  drupal_add_js(drupal_get_path('module', 'commerce_pdm') . '/commerce_pdm_product_display_manager_form.js');
-  return $form_element;
-}
diff --git a/commerce_pdm.info b/commerce_pdm.info
deleted file mode 100644
index 9f11128..0000000
--- a/commerce_pdm.info
+++ /dev/null
@@ -1,9 +0,0 @@
-name = Commerce (Product Display Manager)
-description = Simplifies managing the relationship between products and product display nodes.
-package = Commerce (contrib)
-core = 7.x
-
-files[] = commerce_pdm.admin.inc
-
-dependencies[] = commerce
-dependencies[] = commerce_product_ui
diff --git a/commerce_pdm.module b/commerce_pdm.module
deleted file mode 100644
index d2a375f..0000000
--- a/commerce_pdm.module
+++ /dev/null
@@ -1,800 +0,0 @@
-<?php
-
-/**
- *  Implements hook_permission();
- */
-function commerce_pdm_permission() {
-  return array(
-    'access product display manager' => array(
-      'title' => t('Access the product display manager.'),
-    ),
-  );
-}
-
-/**
- * Implements hook_menu().
- */
-function commerce_pdm_menu() {
-
-  $items = array(
-    'node/%node/products' => array(
-      'title' => t('Products'),
-      'type' => MENU_LOCAL_TASK,
-      'page callback' => 'drupal_get_form',
-      'page arguments' => array('commerce_pdm_display_node_products_form', 1),
-      'access callback' => 'commerce_pdm_access_products_tab',
-      'access arguments' => array(1),
-    ),
-    'admin/commerce/products/display_manager' => array(
-      'title' => t('Display manager'),
-      'type' => MENU_LOCAL_TASK,
-      'page callback' => 'commerce_pdm_product_display_manager_page',
-      'access arguments' => array('access product display manager'),
-      'file' => 'commerce_pdm.admin.inc',
-    ),
-    'commerce_pqr/autocomplete' => array(
-      'title' => 'Autocomplete for existing display nodes',
-      'page callback' => '_commerce_pdm_existing_displays_autocomplete',
-      'access arguments' => array('access content'),
-      'type' => MENU_CALLBACK,
-    ),
-    // Ajax callback path for returning info about a node.
-    'commerce_pdm/get_node_info/%' => array(
-      'page callback' => '_commerce_pdm_get_node_info',
-      'page arguments' => array(2),
-      'access arguments' => array('access content'),  // ToDo: Checkup permission
-      'type' => MENU_CALLBACK,
-    ),
-  );
-
-  // Create clone callbacks. These products based on other products in the same
-  // Product Display, prepopulating the values of the base product.
-  foreach (commerce_product_types() as $type => $product_type) {
-    $items['admin/commerce/products/clone/' . strtr($type, array('_' => '-')) . '/%commerce_product'] = array(
-      'title' => 'Create @name',
-      'title arguments' => array('@name' => $product_type['name']),
-      'description' => $product_type['description'],
-      'page callback' => 'commerce_pdm_product_ui_product_form_wrapper',
-      'page arguments' => array(commerce_product_new($type), 5),
-      'access callback' => 'commerce_product_access',
-      'access arguments' => array('create', $type),
-      'file' => 'commerce_pdm_product_clone.inc',
-    );
-  }
-
-  return $items;
-}
-
-/**
- *  Implements hook_help().
- */
-function commerce_pdm_help($path, $args) {
-  if ($path == 'admin/commerce/products/display_manager') {
-    return t('Drag products into display nodes as desired.', array());
-  }
-}
-
-/**
- * Implements hook_theme().
- */
-function commerce_pdm_theme($existing, $type, $theme, $path) {
-  return array(
-    'commerce_pdm_display_node_products_table' => array(
-      'render element' => 'form',
-    ),
-    'commerce_pdm_product_display_manager_table' => array(
-      'render element' => 'form',
-      'file' => 'commerce_pdm.admin.inc',
-    ),
-    'commerce_pdm_product_references_table' => array(
-      'render element' => 'form_elements',
-    ),
-  );
-}
-
-/**
- * Checks if the node is a products display node and that user has access to it.
- */
-function commerce_pdm_access_products_tab($node) {
-  return user_access('access product display manager') && _commerce_pdm_get_node_reference_field_name($node) !== FALSE;
-}
-
-/**
- * Return a form in the shape of a table listing all products referenced by this node.
- */
-function commerce_pdm_display_node_products_form($form, &$form_state, $node) {
-  $form = array();
-
-  $reference_field_name = _commerce_pdm_get_node_reference_field_name($node);
-  $items = field_get_items('node', $node, $reference_field_name);
-  if (!empty($items)) {
-    foreach ($items as $item) {
-      $products_query = db_select('commerce_product', 'cp');
-      $products_query->fields('cp', array('product_id', 'sku', 'title'));
-      $products_query->condition('cp.product_id', $item['product_id']);
-      $product_data = $products_query->execute()->fetch();
-
-      $form[] = array(
-        'sku' => array(
-          '#type' => 'item',
-          '#markup' => $product_data->sku,
-          //'#href' => 'admin/commerce/products/' . $product_data->product_id,
-        ),
-        'title' => array(
-          '#type' => 'item',
-          '#markup' => $product_data->title,
-        ),
-        'edit' => array(
-          '#type' => 'link',
-          '#href' => 'admin/commerce/products/' . $product_data->product_id . '/edit',
-          '#title' => t('Edit'),
-        ),
-      );
-    }
-
-    $form['#theme'] = 'commerce_pdm_display_node_products_table';
-  }
-  else {
-    $form['no_products'] = array(
-      '#markup' => t('This product display node is currently not referencing any products'),
-    );
-  }
-
-  return $form;
-}
-
-/**
- * Creates a table out of commerce_pdm_display_node_products_form.
- */
-function theme_commerce_pdm_display_node_products_table($variables) {
-  $form = $variables['form'];
-  $header = array('SKU', 'Title', 'Edit');
-  $rows = array();
-
-  foreach (element_children($form) as $row_key) {
-    if (is_numeric($row_key)) {
-      $row_data = $form[$row_key];
-      $row = array();
-      $row[] = drupal_render($row_data['sku']);
-      $row[] = drupal_render($row_data['title']);
-      $row[] = drupal_render($row_data['edit']);
-      $rows[] = array('data' => $row);
-    }
-  }
-
-  $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'commerce_pdm_display_node_products_table')));
-  return $output;
-}
-
-/**
- * Implements hook_form_FORM_ID_alter().
- *
- * Adding inputs to specify a default setting to use for product referencing
- * whenever a product with this specific type is being created.
- */
-function commerce_pdm_form_commerce_product_ui_product_type_form_alter(&$form, &$form_state, $form_id) {
-
-  $product_type_machine = $form_state['product_type']['type'];
-
-  // Need to save this for later, the source is gone at submission.
-  // If the type is about to be created, this value exists in the submit function.
-  $form_state['#product_display_type_machine'] = $product_type_machine;
-  $default_type_new = variable_get('commerce_pdm_default_new_' . $product_type_machine, '');
-
-  $form['quick_reference'] = array(
-    '#type' => 'fieldset',
-    '#title' => t("Quick reference default"),
-    '#weight' => $form['actions']['#weight'],
-    '#collapsible' => TRUE,
-    '#collapsed' => FALSE,
-  );
-
-  $options = _commerce_pdm_get_product_display_types(TRUE);
-  if (!empty($options)) {
-    $form['quick_reference']['commerce_pdm_product_display_type'] = array(
-      '#type' => 'select',
-      '#title' => t("Type"),
-      '#description' => t("Choose the default product display type."),
-      '#default_value' => $default_type_new,
-      '#options' => $options,
-    );
-  }
-  else {
-    $form['quick_reference']['commerce_pdm_product_display_type'] = array(
-      '#markup' => t('The store does not yet contain any product display nodes.'),
-    );
-  }
-
-  $form['actions']['submit']['#submit'][] = 'commerce_pdm_form_commerce_product_ui_product_type_form_submit';
-}
-
-/**
- * Submit callback for commerce_product_ui_product_type_form().
- *
- * @see commerce_pdm_form_commerce_product_ui_product_type_form_alter().
- * Save default values for this product type.
- */
-function commerce_pdm_form_commerce_product_ui_product_type_form_submit($form, &$form_state) {
-  $form_values = $form_state['values'];
-  // Get the product type machine name from the storage if existing
-  // See alter function for more information.
-  $product_type = !empty($form_state['#product_display_type_machine'])
-    ? $form_state['#product_display_type_machine']
-    : $form_values['product_type']['type'];
-
-  variable_set('commerce_pdm_default_new_' . $product_type, $form_values['commerce_pdm_product_display_type']);
-}
-
-/**
- * Implements hook_form_FORM_ID_alter().
- *
- * Adding inputs to let the user add the created product as a
- * reference to a Product Display Node.
- */
-function commerce_pdm_form_commerce_product_ui_product_form_alter(&$form, &$form_state, $form_id) {
-
-  $display_type_options = _commerce_pdm_get_product_display_types(TRUE);
-
-  $product_type_machine = $form_state['commerce_product']->type;
-
-  if (empty($display_type_options)) {
-
-    $form['quick_reference'] = array(
-      '#type' => 'fieldset',
-      '#title' => t('Referenced by'),
-      '#weight' => $form['actions']['#weight'],
-      '#collapsible' => TRUE,
-      '#collapsed' => FALSE,
-    );
-    $form['quick_reference']['info'] = array(
-      '#markup' => t('The store does not yet contain any product display nodes to add this product to.'),
-    );
-
-  }
-  else {
-
-    // Store the value for the after_build function.
-    //$form['#commerce_pdm_reference_product_type'] = $product_type_machine;
-    $form['quick_reference'] = array(
-      '#type' => 'fieldset',
-      '#title' => t('Referenced by'),
-      '#description' => t('Changes made here are only temporary, the product must be saved for these changes to take effect.'),
-      '#weight' => $form['actions']['#weight'],
-      '#theme' => 'commerce_pdm_product_references_table',
-      '#collapsible' => TRUE,
-      '#collapsed' => FALSE,
-      '#tree' => TRUE,
-    );
-
-    if (!isset($form_state['commerce_product']->is_new)) {  // Editing an existing product
-      $referenced_from = _commerce_pdm_get_nodes_referencing($form_state['commerce_product']->product_id);
-      $existing_references = array();
-      if (!empty($referenced_from)) {
-        foreach ($referenced_from as $reference) {
-          $existing_references[] = $reference;
-        }
-        $form_state['#existing_references'] = $existing_references;
-      }
-
-      foreach ($existing_references as $key => $existing_reference) {
-        $form['quick_reference'][$key] = _commerce_pdm_get_product_reference_form_inputs($existing_reference);
-      }
-    }
-    // Make sure the Product Reference received from url gets attached in the
-    // new product, which will always be an existing Product Display node.
-    elseif (isset($_GET['pdid'])) {
-      $pdid = $_GET['pdid'];
-      $form_state['#existing_references'] = array($pdid);
-      $form['quick_reference'][0] = _commerce_pdm_get_product_reference_form_inputs($pdid);
-      $form['quick_reference'][0]['attach']['#default_value'] = 1;
-    }
-
-    // Add an empty row to use as template in JavaScript.
-    $form['quick_reference']['commerce_pdm_product_reference_row_template'] = _commerce_pdm_get_product_reference_form_inputs();
-
-    $form['quick_reference']['add_new_reference']['links'] = array(
-      'create_new' => array(
-        '#type' => 'link',
-        '#title' => t('New display node'),
-        '#href' => '',
-        '#attributes' => array('rel' => array('create_new')),
-      ),
-      'existing' => array(
-        '#type' => 'link',
-        '#title' => t('Existing display node'),
-        '#href' => '',
-        '#attributes' => array('rel' => array('use_existing')),
-      ),
-    );
-
-    $default_type_new = variable_get('commerce_pdm_default_new_' . $product_type_machine, NULL);
-
-    $form['quick_reference']['add_new_reference']['actions'] = array(
-      'commerce_pdm_product_display_type' => array(
-        '#type' => 'select',
-        '#title' => t("Type:"),
-        '#options' => $display_type_options,
-        '#default_value' => $default_type_new ? $default_type_new : '',
-        '#prefix' => '<div class="commerce-pdm-product-form-reference-add-actions add-action hidden"><div class="actions"><div class="add-new">',
-      ),
-      'commerce_pdm_product_display_title' => array(
-        '#type' => 'textfield',
-        '#title' => t("Title of new display node:"),
-        '#suffix' => '</div>',
-      ),
-      'commerce_pdm_product_display_existing' => array(
-        '#type' => 'textfield',
-        '#title' => t("Display node ID:"),
-        '#autocomplete_path' => 'commerce_pqr/autocomplete',
-        '#default_value' => '',
-        '#prefix' => '<div class="existing add-action">',
-      ),
-      'commerce_pdm_product_display_add' => array(
-        '#type' => 'link',
-        '#title' => t('Add'),
-        '#href' => '',
-        '#attributes' => array('class' => array('add')),
-        '#prefix' => '</div>',
-      ),
-      'commerce_pdm_product_display_cancel' => array(
-        '#type' => 'link',
-        '#title' => t('Cancel'),
-        '#href' => '',
-        '#attributes' => array('class' => array('cancel')),
-        '#suffix' => '</div></div>',
-      ),
-    );
-
-    // Add JavaScript used by form.
-    $form['#after_build'] = array('_commerce_pdm_product_form_reference_attach');
-
-    //$form['#validate'][] = 'commerce_pdm_product_form_reference_validate';
-    $form['actions']['submit']['#submit'][] = 'commerce_pdm_product_form_reference_submit';
-
-  }
-}
-
-
-/**
- * Validate callback for commerce_product_ui_product_form().
- *
- * @see commerce_pdm_form_commerce_product_ui_product_form_alter()
- */
-function commerce_pdm_product_form_reference_validate(&$form, &$form_state) {
-
-}
-
-/**
- * Submit callback for commerce_product_ui_product_form().
- *
- * @see commerce_pdm_form_commerce_product_ui_product_form_alter().
- * Add a reference to the created product to either a new node or an existing one.
- */
-function commerce_pdm_product_form_reference_submit(&$form, &$form_state) {
-
-  $product_id = $form_state['build_info']['args'][0]->product_id;
-
-  foreach ($form_state['input']['quick_reference'] as $element) {
-    if (isset($element['title']) && !empty($element['title'])) {
-
-      if ($element['attach'] xor $element['deleted']) {
-
-        if ($element['new_type'] != FALSE) {
-          $node = _commerce_pdm_create_display_node($element['new_type'], $element['title']);
-        }
-        else {
-          $node = node_load($element['nid']);
-        }
-
-        $reference_field_name = _commerce_pdm_get_node_reference_field_name($node);
-        $field_language = field_language('node', $node, $reference_field_name);
-        if ($element['deleted'] == TRUE) {
-          foreach ($node->{$reference_field_name}[$field_language] as $field_value_key => $field_value) {
-            if ($field_value['product_id'] == $product_id) {
-              array_splice($node->{$reference_field_name}[$field_language], $field_value_key, 1);
-              break;
-            }
-          }
-        }
-        else {
-          if (!isset($node->{$reference_field_name}[$field_language])) {
-            $node->{$reference_field_name}[$field_language] = array();
-          }
-          $node->{$reference_field_name}[$field_language][] = array('product_id' => $product_id);
-        }
-
-        node_save($node);
-
-      }
-    }
-  }
-}
-
-/**
- *  Delete related variables from the database.
- */
-function commerce_pdm_commerce_product_type_delete($type, $skipreset) {
-  variable_del('commerce_pdm_default_new_' . $type['type']);
-}
-
-/**
- *
- */
-function theme_commerce_pdm_product_references_table($variables) {
-  $form_elements = $variables['form_elements'];
-  $header = array(t('Title'), t('Node ID'), t('Delete reference'));
-
-  $rows = array();
-  foreach(element_children($form_elements) as $row_key) {
-    if ($row_key !== 'add_new_reference') {
-      $row = array();
-      $row[] = drupal_render($form_elements[$row_key]['title']);
-      $row[] = drupal_render($form_elements[$row_key]['nid']);
-      $row[] = drupal_render($form_elements[$row_key]['attach'])
-        . drupal_render($form_elements[$row_key]['delete'])
-        . drupal_render($form_elements[$row_key]['undo_delete'])
-        . drupal_render($form_elements[$row_key]['deleted'])
-        . drupal_render($form_elements[$row_key]['new_type']);
-
-      $row_classes = ($row_key === 'commerce_pdm_product_reference_row_template' ? array('hidden reference-row-template') : array());
-      $rows[] = array('data' => $row, 'class' => $row_classes);
-    }
-  }
-
-  $row = array();
-  $row[] = '<div class="commerce-pdm-product-form-reference-add-links">';
-  $row[0] .= t('Add a reference to:') . '&nbsp;&nbsp;';
-  $row[0] .= drupal_render($form_elements['add_new_reference']['links']['create_new']);
-  $row[0] .= '&nbsp;&nbsp;&#124;&nbsp;&nbsp;';
-  $row[0] .= drupal_render($form_elements['add_new_reference']['links']['existing']);
-  $row[0] .= '</div>';
-  $row[0] .= drupal_render($form_elements['add_new_reference']['actions']);
-  $row[0] .= '<div class="commerce-pdm-product-form-reference-error-message" style="display:none;"></div>';
-  $row[0] = array('data' => $row[0], 'colspan' => 3);
-  $rows[] = array('data' => $row, 'class' => array('add-new'));
-
-  $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'commerce_pdm_product_referenced_by')));
-  return $output;
-}
-
-
-
-/**
- *
- */
-function _commerce_pdm_get_product_reference_form_inputs($existing_reference = '') {
-  if ($existing_reference != '') {
-    $node_obj = db_query('SELECT n.title FROM {node} n WHERE nid = :nid', array(':nid' => $existing_reference))->fetchObject();
-    $node_title = $node_obj->title;
-  }
-  else {
-    $node_title = '';
-  }
-
-  $inputs = array(
-    // If this is a new reference that will be attached to a reference field.
-    'attach' => array(
-      '#type' => 'hidden',
-      '#default_value' => 0,
-      '#attributes' => array(
-        'class' => array('commerce-pdm-reference-attach'),
-      ),
-    ),
-    // The title of the node or the node to be created.
-    'title' => array(
-      '#type' => 'textfield',
-      '#value' => $node_title,
-      '#default_value' => $node_title,
-      '#attributes' => array(
-        'class' => array('commerce-pdm-reference-title'),
-        'readonly' => 'readonly',
-      )
-    ),
-    // The node ID of the node, this will be set to New if the node is to be created.
-    'nid' => array(
-      '#type' => 'textfield',
-      '#value' => $existing_reference,
-      '#default_value' => $existing_reference,
-      '#attributes' => array(
-        'class' => array('commerce-pdm-reference-nid'),
-        'val' => $existing_reference, // Just for the JavaScript check.
-        'readonly' => 'readonly',
-      ),
-    ),
-    // The delete link.
-    'delete' => array(
-      '#type' => 'link',
-      '#title' => t('Delete'),
-      '#href' => '',
-      '#attributes' => array(
-        'class' => array('commerce-pdm-reference-delete')
-      ),
-    ),
-    // The undo delete link.
-    'undo_delete' => array(
-      '#type' => 'link',
-      '#title' => t('Undo delete'),
-      '#href' => '',
-      '#attributes' => array(
-        'class' => array('commerce-pdm-reference-undo-delete', 'hidden'),
-      ),
-    ),
-    // If the reference to this product should be removed from the node.
-    'deleted' => array(
-      '#type' => 'hidden',
-      '#default_value' => 0,
-      '#attributes' => array(
-        'class' => array('commerce-pdm-reference-deleted')
-      ),
-    ),
-    // The node type to create the new node of.
-    'new_type' => array(
-      '#type' => 'hidden',
-      '#default_value' => 0,
-      '#attributes' => array(
-        'class' => array('commerce-pdm-reference-new-type')
-      ),
-    ),
-  );
-
-  return $inputs;
-}
-
-/**
- * Helper function to see witch node types are valid product display node types.
- *
- * @param $json_format
- *   If every element in the returned array should be keyed by display
- *   nodes bundle name. This is for the product_display_type select box in
- *   the form.
- *
- * @return
- *   An array of elements containing machine_name => human name.
- */
-function _commerce_pdm_get_product_display_types($json_format) {
-
-  $fields = array();
-
-  $product_reference_fields = _commerce_pdm_get_product_reference_fields();
-
-  // Only create output if product reference fields where found.
-  if (!empty($product_reference_fields)) {
-
-    $select_node_bundles = db_select('field_config_instance', 'fci');
-    $select_node_bundles->join('node_type', 'nt', 'nt.type = fci.bundle');
-    $select_node_bundles
-      ->fields('fci', array('bundle'))
-      ->fields('nt', array('name'));
-
-    $conditions = db_or();
-    foreach ($product_reference_fields as $field_name) {
-      $conditions->condition('fci.field_name', $field_name);
-    }
-    $select_node_bundles->condition($conditions);
-
-    $select_node_bundles_result = $select_node_bundles->execute();
-
-    foreach ($select_node_bundles_result as $bundle) {
-      $fields[$bundle->bundle] = $bundle->name;
-    }
-
-  }
-
-  $output = array();
-
-  foreach ($fields as $bundle => $bundle_name) {
-    if ($json_format) {
-      $output[$bundle] = $bundle_name;
-    }
-    else {
-      $output[] = array('machine_name' => $bundle, 'name' => $bundle_name);
-    }
-  }
-
-  return $output;
-}
-
-/**
- * Helper function to return all product reference fields in the drupal installation.
- */
- function _commerce_pdm_get_product_reference_fields() {
-  $product_reference_fields = array();
-  foreach (field_info_fields() as $field) {
-    // Do not include the commerce_product field, why?
-    if ($field['type'] == 'commerce_product_reference' && $field['field_name'] != 'commerce_product') {
-      $product_reference_fields[] = $field['field_name'];
-    }
-  }
-  return $product_reference_fields;
-}
-
-/**
- * Get the NID's of a nodes referencing to a product.
- *
- * If no node is referencing to it, return an empty array.
- */
-function _commerce_pdm_get_nodes_referencing($product_id) {
-  $product_fields = _commerce_pdm_get_product_reference_fields();
-  $entities = array();
-  foreach ($product_fields as $field) {
-    $result = db_query(
-      'SELECT entity_id FROM {field_data_' . $field . '} df WHERE df.' . $field . '_product_id = :pid',
-      array(
-        ':pid' => $product_id,
-      )
-    );
-
-    foreach ($result as $reference) {
-      $entities[] = $reference->entity_id;
-    }
-  }
-  return $entities;
-}
-
-/**
- * Helper function to get the name of the product reference field in a node.
- */
-function _commerce_pdm_get_node_reference_field_name($node) {
-  $field_name_out = FALSE;
-
-  foreach (_commerce_pdm_get_product_reference_fields() as $field_name) {
-    if (isset($node->{$field_name})) {
-      $field_name_out = $field_name;
-      break;
-    }
-  }
-
-  return $field_name_out;
-}
-
-/**
- * Menu callback; Retrieve a JSON object containing autocomplete suggestions.
- *
- * Return titles of existing product display nodes.
- */
-function _commerce_pdm_existing_displays_autocomplete($typed) {
-
-  $output = array();
-  $product_display_types = _commerce_pdm_get_product_display_types(FALSE);
-
-  if (!empty($product_display_types)) {
-
-    $query_conditions = db_or();
-    foreach ($product_display_types as $display_type) {
-      $query_conditions->condition('n.type', $display_type['machine_name']);
-    }
-    $query = db_select('node', 'n')
-      ->fields('n', array('nid', 'title', 'type'))
-      ->condition($query_conditions)
-      ->condition('n.title', '%' . $typed . '%', 'LIKE')
-      ->addTag('node_access');
-
-    $query_result = $query->execute();
-
-    foreach ($query_result as $result) {
-      $output[$result->nid] = $result->title . ' (' . $result->type . ')';
-    }
-
-  }
-
-  drupal_json_output($output);
-}
-
-/**
- * Ajax callback function returning information about a node.
- *
- * @param nid
- *  The node ID of whitch I should return information about.
- *
- * @return
- *  Return the results through drupal_json_output().
- */
-function _commerce_pdm_get_node_info($nid) {
-  $result = array();
-
-  if($node = node_load($nid)) {
-    $field_name = _commerce_pdm_get_node_reference_field_name($node);
-    if (!_commerce_pdm_get_number_reference_values_allowed($node, count($node->{$field_name}[LANGUAGE_NONE]) + 1)) {
-      $result['success'] = FALSE;
-      $result['message'] = 'node_full';
-    }
-    else {
-      $result['success'] = TRUE;
-      $result['data']['title'] = $node->title;
-      $result['data']['nid'] = $node->nid;
-    }
-  }
-  else {
-    $result['success'] = FALSE;
-    $result['message'] = 'not_found';
-  }
-
-  return drupal_json_output($result);
-}
-
-/**
- * Helper function to see if the specified number of values is allowed to exist
- * in the specified node's product reference field.
- */
-function _commerce_pdm_get_number_reference_values_allowed($node, $num_values) {
-  $node = is_object($node) ? $node : node_load($node);
-  $field_name = _commerce_pdm_get_node_reference_field_name($node);
-  $allowed_values = _commerce_pdm_get_num_allowed_references($node);
-
-  if (isset($node->{$field_name}[LANGUAGE_NONE])) {
-    if ($allowed_values != -1 && $num_values > $allowed_values) {
-      return FALSE;
-    }
-  }
-
-  return TRUE;
-}
-
-/**
- * Returns the maximum number of values the product reference field in the
- * specified node can contain.
- */
-function _commerce_pdm_get_num_allowed_references($node) {
-  $node = is_object($node) ? $node : node_load($node);
-  $field_name = _commerce_pdm_get_node_reference_field_name($node);
-  $field_settings = field_info_field($field_name);
-  return (int) $field_settings['cardinality'];
-}
-
-/**
- * Creates a display node and returns the result as a json object.
- *
- * @param type
- *  The node type of whitch to create a node from.
- *
- * @param title
- *  Set the title of the new node to this.
- *
- * @return
- *  Return the results through drupal_json_output().
- */
-function _commerce_pdm_create_display_node($type, $title) {
-  global $user;
-
-  $node = new stdClass();
-  $node->is_new = TRUE;
-  $node->type = $type;
-
-  // Prepare the object with the bundle default settings
-  node_object_prepare($node);
-
-  // Additional entity properties
-  $node->uid = $user->uid;
-  $node->title = $title;
-  $node->format = filter_fallback_format();
-
-  node_save($node);
-
-  // Attach fields to it.
-  field_attach_load('node', array($node->nid => $node));
-
-  return $node;
-}
-
-/**
- * Add JavaScript and CSS used by the product reference table in the product form.
- */
-function _commerce_pdm_product_form_reference_attach($form_element) {
-  drupal_add_js(drupal_get_path('module', 'commerce_pdm') . '/commerce_pdm_product_form_reference.js');
-  drupal_add_css(drupal_get_path('module', 'commerce_pdm') . '/commerce_pdm_product_form_reference.css');
-
-  // Add translated messages for the product reference table.
-  drupal_add_js(array(
-    'commerce_pdm_product_form' => array(
-      'already_has_reference' => t('The product is already referenced by the specified display node.'),
-      'node_not_found' => t('Could not find any node with the specified node ID.'),
-      'title_missing' => t('You have to enter a title for the new display node.'),
-      'not_created' => t('The new display node could not be created.'),
-      'node_full' => t('The display node cannot reference to more products, limit reached.'),
-      'added_new' => t('Added!'),
-      'added_existing' => t('Added!'),
-    )
-  ), 'setting');
-
-  return $form_element;
-}
diff --git a/commerce_pdm_product_clone.inc b/commerce_pdm_product_clone.inc
deleted file mode 100644
index 7d11b80..0000000
--- a/commerce_pdm_product_clone.inc
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-/**
- * Menu callback to clone a product.
- */
-function commerce_pdm_product_ui_product_form_wrapper($product, $base_product) {
-
-  // Override the base product values indicating this is a new one.
-  $clone = clone($base_product);
-  $clone->is_new = $product->is_new;
-  $clone->created = $product->created;
-  $clone->changed = $product->changed;
-  $clone->status = $product->status;
-  $clone->uid = $product->uid;
-  $clone->product_id = $product->product_id;
-  $clone->revision_id = $product->revision_id;
-
-  module_load_include('inc', 'commerce_product_ui', 'includes/commerce_product_ui.products');
-
-  return commerce_product_ui_product_form_wrapper($clone);
-
-}
diff --git a/commerce_pdm_product_display_manager_form.css b/commerce_pdm_product_display_manager_form.css
deleted file mode 100644
index a1b5454..0000000
--- a/commerce_pdm_product_display_manager_form.css
+++ /dev/null
@@ -1,27 +0,0 @@
-#commerce_pdm_product_display_manager tr.display-node {
-  font-weight: bold;
-  border-top: 1px solid #7f7f7f;
-}
-
-#commerce_pdm_product_display_manager tr.display-node.orphans {
-  font-weight: bold;
-  font-style: italic;
-  border-top: 3px solid black;
-
-}
-
-#commerce_pdm_product_display_manager tr.display-node.orphans td {
-  opacity:0.75;
-}
-
-#commerce_pdm_product_display_manager tr.display-node.first {
-  border-top: 0;
-}
-
-#commerce_pdm_product_display_manager tr.product-orphan {
-  font-style: italic;
-}
-
-#commerce_pdm_product_display_manager tr.product-orphan td {
-  opacity:0.75;
-}
diff --git a/commerce_pdm_product_display_manager_form.js b/commerce_pdm_product_display_manager_form.js
deleted file mode 100644
index 9ee78a8..0000000
--- a/commerce_pdm_product_display_manager_form.js
+++ /dev/null
@@ -1,28 +0,0 @@
-Drupal.behaviors.commerce_pdm_product_display_manager_form = {
-  attach: function(context, settings) {
-
-    (function ($) {
-
-      if (typeof Drupal.tableDrag == 'undefined' || typeof Drupal.tableDrag.commerce_pdm_product_display_manager == 'undefined') {
-        return;
-      }
-
-      // Add drop listener for rows to set their css classes.
-      Drupal.tableDrag.commerce_pdm_product_display_manager.onDrop = function () {
-
-        $parent = $(this.oldRowElement).prevAll('tr.display-node:first');
-        if ($parent.hasClass('orphans')) {
-          $(this.oldRowElement).removeClass('product');
-          $(this.oldRowElement).addClass('product-orphan');
-        }
-        else {
-          $(this.oldRowElement).addClass('product');
-          $(this.oldRowElement).removeClass('product-orphan');
-        }
-
-      }
-
-    })(jQuery);
-
-  }
-};
diff --git a/commerce_pdm_product_form_reference.css b/commerce_pdm_product_form_reference.css
deleted file mode 100644
index a0b96c6..0000000
--- a/commerce_pdm_product_form_reference.css
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- *  The long names are created by the $form['#tree'] property.
- */
-
-#commerce_pdm_product_referenced_by {
-  margin-top: 10px;
-}
-
-#commerce_pdm_product_referenced_by .hidden {
-  display: none !important;
-}
-
-#commerce_pdm_product_referenced_by div.commerce-pdm-product-form-reference-add-links {
-  font-weight: bold !important;
-}
-
-#commerce_pdm_product_referenced_by tr.add-new {
-  border-top: 1px solid black;
-}
-
-#commerce_pdm_product_referenced_by
-div.commerce-pdm-product-form-reference-add-actions
-div.actions div.form-item,
-#commerce_pdm_product_referenced_by div.commerce-pdm-product-form-reference-add-links,
-#commerce_pdm_product_referenced_by #edit-quick-reference-add-new-reference-actions-commerce-pdm-product-display-cancel,
-#edit-quick-reference-add-new-reference-actions-commerce-pdm-product-display-add,
-#commerce_pdm_product_referenced_by tr.add-new label {
-  float: left;
-}
-
-
-#commerce_pdm_product_referenced_by tr.add-new label {
-  margin-right: 5px;
-}
-
-div.form-item-quick-reference-add-new-reference-actions-commerce-pdm-product-display-title,
-#edit-quick-reference-add-new-reference-actions-commerce-pdm-product-display-cancel,
-#edit-quick-reference-add-new-reference-actions-commerce-pdm-product-display-add {
-  margin-left: 15px !important;
-}
-
-#commerce_pdm_product_referenced_by tr.deleted input {
-  text-decoration: line-through;
-  opacity: 0.5;
-}
-
-#commerce_pdm_product_referenced_by div.commerce-pdm-product-form-reference-error-message {
-  float: left;
-  margin-left: 15px !important;
-}
-
-/**
- * Make it look like regular text.
- */
-#commerce_pdm_product_referenced_by input.commerce-pdm-reference-title,
-#commerce_pdm_product_referenced_by input.commerce-pdm-reference-nid {
-  border: 0 !important;
-  background-color: transparent !important;
-  color: inherit !important;
-}
diff --git a/commerce_pdm_product_form_reference.js b/commerce_pdm_product_form_reference.js
deleted file mode 100644
index 64cfe46..0000000
--- a/commerce_pdm_product_form_reference.js
+++ /dev/null
@@ -1,250 +0,0 @@
-Drupal.behaviors.commerce_pdm_form_commerce_product_ui_product_form_alter = {
-  attach: function(context, settings) {
-
-    (function ($) {
-
-      var COMMERCE_PDM_TYPE_MESSAGE_INFORMATION = 'commercePdmTypeMessageInfomration';
-      var COMMERCE_PDM_TYPE_MESSAGE_ERROR = 'commercePdmTypeMessageError';
-
-      // Declare all used elements as understandable variables.
-      $table = $('table#commerce_pdm_product_referenced_by');
-      $newTitleInput = $table.find('input#edit-quick-reference-add-new-reference-actions-commerce-pdm-product-display-title');
-      $newTypeSelect = $table.find('select#edit-quick-reference-add-new-reference-actions-commerce-pdm-product-display-type');
-      $existingNidInput = $table.find('input#edit-quick-reference-add-new-reference-actions-commerce-pdm-product-display-existing');
-      $addButton = $table.find('a#edit-quick-reference-add-new-reference-actions-commerce-pdm-product-display-add');
-
-      /**
-       *
-       */
-      $addButton.bind('click', function(e) {
-        if (!$table.find('div.add-new').hasClass('hidden')) {
-          addNew();
-        }
-        else {
-          addExisting();
-        }
-
-        return false;
-      })
-
-      /**
-       *
-       */
-      $newTitleInput.bind('keypress', function(e) {
-        if (e.keyCode == 13) {
-          addNew();
-          return false;
-        }
-      });
-
-      /**
-       *
-       */
-      $existingNidInput.bind('keypress', function(e) {
-        // Accept only when the ENTER key has been presses and the autocomplete
-        // list is hidden.
-        if (e.keyCode == 13 && $(this).siblings('#autocomplete').length == 0) {
-          addExisting();
-          return false;
-        }
-      });
-
-      /**
-       *
-       */
-      function addExisting() {
-        // Display throbber.
-        $existingNidInput.css('background-position', '100% -16px');
-        $.ajax({
-          url: Drupal.settings.basePath + 'commerce_pdm/get_node_info/' + $existingNidInput.val(),
-          dataTypeString: 'json',
-          complete: function() {
-            // Hide throbber.
-            $existingNidInput.css('background-position', '100% 4px');
-          },
-          success: function(result) {
-            if (result.success) {
-              if ($('input.commerce-pdm-reference-nid[val="' + result.data.nid + '"]').length == 0) {
-                addReferencedRow(result.data.title, result.data.nid, 0);
-                displayMessage(Drupal.settings.commerce_pdm_product_form.added_existing, COMMERCE_PDM_TYPE_MESSAGE_INFORMATION);
-              }
-              else { // This product is already referenced by that display node.
-                displayMessage(Drupal.settings.commerce_pdm_product_form.already_has_reference, COMMERCE_PDM_TYPE_MESSAGE_ERROR);
-              }
-            }
-            else {
-              if (result.message == 'node_full') {
-                displayMessage(Drupal.settings.commerce_pdm_product_form.node_full, COMMERCE_PDM_TYPE_MESSAGE_ERROR);
-              }
-              else {
-                displayMessage(Drupal.settings.commerce_pdm_product_form.node_not_found, COMMERCE_PDM_TYPE_MESSAGE_ERROR);
-              }
-            }
-          }
-        });
-      }
-
-      /**
-       *
-       */
-      function addNew() {
-        if ($newTitleInput.val().length > 0) {
-          var displayNodeType = $newTypeSelect.val();
-          var displatNodeTitle = $newTitleInput.val();
-
-          displayMessage(Drupal.settings.commerce_pdm_product_form.added_new, COMMERCE_PDM_TYPE_MESSAGE_INFORMATION);
-          addReferencedRow(displatNodeTitle, 'New (' + displayNodeType + ')', displayNodeType);
-        }
-        else {
-          displayMessage(Drupal.settings.commerce_pdm_product_form.title_missing, COMMERCE_PDM_TYPE_MESSAGE_ERROR);
-        }
-      }
-
-      /**
-       *
-       */
-      function addReferencedRow(title, nid, newType) {
-        var numRows =  $table .find('tr').length - 3;
-        var $template = $table.find('tr.reference-row-template');
-        var $new_row = $template.clone();
-
-        $new_row.find('input.commerce-pdm-reference-attach').val(1);
-
-        var $titleInput = $new_row.find('input#edit-quick-reference-commerce-pdm-product-reference-row-template-title');
-        var $titleDiv = $new_row.find('div.form-item-quick-reference-commerce-pdm-product-reference-row-template-title');
-        var $nidInput = $new_row.find('input#edit-quick-reference-commerce-pdm-product-reference-row-template-nid');
-        var $nidDiv = $new_row.find('div.form-item-quick-reference-commerce-pdm-product-reference-row-template-nid');
-        var $attachInput = $new_row.find('input.commerce-pdm-reference-attach');
-        var $newTypeInput = $new_row.find('input.commerce-pdm-reference-new-type');
-        var $newType = $new_row.find('input.commerce-pdm-reference-new-type');
-        var $deleted = $new_row.find('input.commerce-pdm-reference-deleted');
-
-        $new_row.find('a, input').attr('id', '');
-
-        $titleInput.attr('id', 'edit-quick-reference-' + numRows + '-title');
-        $titleInput.attr('name', 'quick_reference[' + numRows  + '][title]');
-        $titleDiv.removeClass('form-item-quick-reference-commerce-pdm-product-reference-row-template-title');
-        $titleDiv.addClass('form-item-quick-reference-' + numRows + '-title');
-
-        $nidInput.attr('id', 'edit-quick-reference-' + numRows + '-nid');
-        $nidInput.attr('name', 'quick_reference[' + numRows  + '][nid]');
-        $nidInput.attr('val', nid);  // Because we need to check this later and value is not set???
-        $nidDiv.removeClass('form-item-quick-reference-commerce-pdm-product-reference-row-template-nid');
-        $nidDiv.addClass('form-item-quick-reference-' + numRows + '-nid');
-
-        $newType.attr('name', 'quick_reference[' + numRows + '][new_type]');
-        $deleted.attr('name', 'quick_reference[' + numRows + '][deleted]');
-        $attachInput.attr('name', 'quick_reference[' + numRows + '][attach]');
-
-        $new_row.removeClass('hidden').removeClass('reference-row-template');
-
-        $titleInput.val(title);
-        $nidInput.val(nid);
-        $newTypeInput.val(newType);
-        $new_row.find('input.commerce-pdm-new-reference').val(newType);
-
-        $new_row.removeClass('odd').removeClass('even');
-        $alternateRowClass = numRows % 2 ? 'even' : 'odd';
-        $new_row.addClass($alternateRowClass);
-
-        $template.before($new_row);
-        $new_row.hide();
-        $new_row.fadeIn(250);
-
-        resetReferenceAddingRow();
-      }
-
-      /**
-       *
-       */
-      function resetReferenceAddingRow() {
-        $newTitleInput.val('');
-        $existingNidInput.val('');
-        toggleActionsVisible();
-      }
-
-      /**
-       *
-       */
-      function displayMessage(msg, messageType) {
-        $messageContainer = $('table#commerce_pdm_product_referenced_by div.commerce-pdm-product-form-reference-error-message');
-        $messageContainer.css('color', (messageType == COMMERCE_PDM_TYPE_MESSAGE_INFORMATION) ? 'green' : 'red');
-        $messageContainer.text(msg);
-        $messageContainer.fadeIn(250).delay(1750).fadeOut(250);
-      }
-
-      /**
-       *
-       */
-      $('table#commerce_pdm_product_referenced_by a.commerce-pdm-reference-delete').live('click', function() {
-        $(this).parents('tr').addClass('deleted');
-        $(this).siblings('input.commerce-pdm-reference-deleted').val(1);
-
-        $(this).addClass('hidden');
-        $(this).siblings('a.commerce-pdm-reference-undo-delete').removeClass('hidden');
-
-        return false;
-      });
-
-      /**
-       *
-       */
-      $('table#commerce_pdm_product_referenced_by a.commerce-pdm-reference-undo-delete').live('click', function() {
-        $(this).parents('tr').removeClass('deleted');
-        $(this).siblings('input.commerce-pdm-reference-deleted').val(0);
-
-        $(this).addClass('hidden');
-        $(this).siblings('a.commerce-pdm-reference-delete').removeClass('hidden');
-
-        return false;
-      });
-
-      /**
-       *
-       */
-      $('fieldset#edit-quick-reference div.commerce-pdm-product-form-reference-add-links a').bind('click', function(e) {
-        var $add_new = $('fieldset#edit-quick-reference div.commerce-pdm-product-form-reference-add-actions div.add-new');
-        var $existing = $('fieldset#edit-quick-reference div.commerce-pdm-product-form-reference-add-actions div.existing');
-        if ($(this).attr('rel') == 'use_existing') {
-          $add_new.addClass('hidden');
-          $existing.removeClass('hidden');
-        }
-        else {
-          $add_new.removeClass('hidden');
-          $existing.addClass('hidden');
-        }
-
-        toggleActionsVisible();
-
-        return false;
-      });
-
-      /**
-       *
-       */
-      $table.find('a#edit-quick-reference-add-new-reference-actions-commerce-pdm-product-display-cancel').bind('click', function(e) {
-        resetReferenceAddingRow();
-        return false;
-      });
-
-      /**
-       *
-       */
-      function toggleActionsVisible() {
-        var $links = $('fieldset#edit-quick-reference div.commerce-pdm-product-form-reference-add-links');
-        var $actions = $('fieldset#edit-quick-reference div.commerce-pdm-product-form-reference-add-actions');
-
-        if ($links.hasClass('hidden')) {
-          $links.removeClass('hidden');
-          $actions.addClass('hidden');
-        }
-        else {
-          $links.addClass('hidden');
-          $actions.removeClass('hidden');
-        }
-      }
-
-    })(jQuery);
-
-  }
-};
diff --git a/commerce_product_display_manager.admin.inc b/commerce_product_display_manager.admin.inc
new file mode 100644
index 0000000..7b8d323
--- /dev/null
+++ b/commerce_product_display_manager.admin.inc
@@ -0,0 +1,712 @@
+<?php
+
+// Constant value for the title of the orphaned products table row.
+define('PDM_ORPHANS_ROW_TITLE', t('Products not assigned to any display node'));
+
+/**
+ * Display manager page.
+ */
+function commerce_product_display_manager_product_display_manager_page() {
+
+  $output = array();
+
+  $output['filters'] = drupal_get_form('commerce_product_display_manager_product_display_manager_filters');
+
+  $output['admin'] = drupal_get_form('commerce_product_display_manager_product_display_manager_form');
+
+  return $output;
+}
+
+/**
+ * Creates the display manager form.
+ */
+function commerce_product_display_manager_product_display_manager_filters($form, &$form_state) {
+
+  // Enable language column if translation module is enabled
+  // or if we have any product display node with language.
+  $multilanguage = (module_exists('translation') || db_query("SELECT COUNT(*) FROM {node} WHERE language <> :language", array(':language' => LANGUAGE_NONE))->fetchField());
+
+  // Add filters to the form.
+  $form['filter'] = product_manager_filter_form();
+  $form['#submit'] = array('product_manager_filter_form_submit');
+
+  return $form;
+}
+
+/**
+ * Return form for products and product displays administration filters.
+ */
+function product_manager_filter_form() {
+
+  $session = isset($_SESSION['products_overview_filter']) ? $_SESSION['products_overview_filter'] : array();
+  $filters = product_manager_filters();
+
+  $i = 0;
+  $form['filters'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Show only items where'),
+    '#theme' => 'exposed_filters__node',
+  );
+  foreach ($session as $filter) {
+    list($type, $value) = $filter;
+    if ($type == 'term') {
+      // Load term name from DB rather than search and parse options array.
+      $value = module_invoke('taxonomy', 'term_load', $value);
+      $value = $value->name;
+    }
+    elseif ($type == 'language') {
+      $value = $value == LANGUAGE_NONE ? t('Language neutral') : module_invoke('locale', 'language_name', $value);
+    }
+    else {
+      $value = $filters[$type]['options'][$value];
+    }
+    $t_args = array('%property' => $filters[$type]['title'], '%value' => $value);
+    if ($i++) {
+      $form['filters']['current'][] = array('#markup' => t('and where %property is %value', $t_args));
+    }
+    else {
+      $form['filters']['current'][] = array('#markup' => t('where %property is %value', $t_args));
+    }
+    if (in_array($type, array('type', 'language'))) {
+      // Remove the option if it is already being filtered on.
+      unset($filters[$type]);
+    }
+  }
+
+  $form['filters']['status'] = array(
+    '#type' => 'container',
+    '#attributes' => array('class' => array('clearfix')),
+    '#prefix' => ($i ? '<div class="additional-filters">' . t('and where') . '</div>' : ''),
+  );
+  $form['filters']['status']['filters'] = array(
+    '#type' => 'container',
+    '#attributes' => array('class' => array('filters')),
+  );
+  foreach ($filters as $key => $filter) {
+    $form['filters']['status']['filters'][$key] = array(
+      '#type' => 'select',
+      '#options' => $filter['options'],
+      '#title' => $filter['title'],
+      '#default_value' => '[any]',
+    );
+  }
+
+  $form['filters']['status']['actions'] = array(
+    '#type' => 'actions',
+    '#attributes' => array('class' => array('container-inline')),
+  );
+  $form['filters']['status']['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => count($session) ? t('Refine') : t('Filter'),
+  );
+
+  if (!empty($filters['language'])) {
+    $form['filters']['status']['#suffix'] = '<small>' . t('Note that the product language will not be filtered, only the language of the product display node.') . '</small>';
+  }
+
+  if (count($session)) {
+    $form['filters']['status']['actions']['undo'] = array('#type' => 'submit', '#value' => t('Undo'));
+    $form['filters']['status']['actions']['reset'] = array('#type' => 'submit', '#value' => t('Reset'));
+  }
+
+  drupal_add_js('misc/form.js');
+
+  return $form;
+}
+
+/**
+ * product_manager_filters.
+ */
+function product_manager_filters() {
+
+  $filters = array();
+  // Regular filters
+  $filters['status'] = array(
+    'title' => t('status'),
+    'options' => array(
+      '[any]' => t('any'),
+      'status-1' => t('published'),
+      'status-0' => t('not published'),
+      'promote-1' => t('promoted'),
+      'promote-0' => t('not promoted'),
+      'sticky-1' => t('sticky'),
+      'sticky-0' => t('not sticky'),
+    ),
+  );
+  // Include translation states if we have this module enabled
+  if (module_exists('translation')) {
+    $filters['status']['options'] += array(
+      'translate-0' => t('Up to date translation'),
+      'translate-1' => t('Outdated translation'),
+    );
+  }
+
+  $options = array();
+  foreach (commerce_product_types() as $type => $product) {
+    $options[$product['type']] = $product['name'];
+  }
+  $filters['product_type'] = array(
+    'title' => t('product type'),
+    'options' => array(
+      '[any]' => t('any'),
+    ) + $options,
+  );
+
+  $options = array();
+  $product_display_types = _commerce_product_display_manager_get_product_display_types(FALSE);
+  foreach ($product_display_types as $node_type) {
+    $options[$node_type['machine_name']] = $node_type['name'];
+  }
+  $filters['display_node_type'] = array(
+    'title' => t('product display type'),
+    'options' => array(
+      '[any]' => t('any'),
+    ) + $options,
+  );
+
+  // Language filter if there is a list of languages
+  if ($languages = module_invoke('locale', 'language_list')) {
+    $languages = array(LANGUAGE_NONE => t('Language neutral')) + $languages;
+    $filters['language'] = array(
+      'title' => t('language'),
+      'options' => array(
+        '[any]' => t('any'),
+      ) + $languages,
+    );
+  }
+
+  return $filters;
+}
+
+/**
+ * Process result from product display administration filter form.
+ */
+function product_manager_filter_form_submit($form, &$form_state) {
+
+  $filters = product_manager_filters();
+  switch ($form_state['values']['op']) {
+    case t('Filter'):
+    case t('Refine'):
+      // Apply every filter that has a choice selected other than 'any'.
+      foreach ($filters as $filter => $options) {
+        if (isset($form_state['values'][$filter]) && $form_state['values'][$filter] != '[any]') {
+          // Flatten the options array to accommodate hierarchical/nested options.
+          $flat_options = form_options_flatten($filters[$filter]['options']);
+          // Only accept valid selections offered on the dropdown, block bad input.
+          if (isset($flat_options[$form_state['values'][$filter]])) {
+            $_SESSION['products_overview_filter'][] = array($filter, $form_state['values'][$filter]);
+          }
+        }
+      }
+      break;
+    case t('Undo'):
+      array_pop($_SESSION['products_overview_filter']);
+      break;
+    case t('Reset'):
+      $_SESSION['products_overview_filter'] = array();
+      break;
+  }
+}
+
+/**
+ * Creates the display manager form.
+ *
+ * @todo Typically, node entities are used as product displays. But there are no restrictions to
+ *   turn any other entity type like terms, users, files, media,... into product displays too.
+ *   PDM currently assumes all product displays are nodes.
+ *   See: http://drupal.org/node/1376938
+ */
+function commerce_product_display_manager_product_display_manager_form($form, &$form_state) {
+
+  $form = array('#tree' => TRUE);
+  $session = isset($_SESSION['products_overview_filter']) ? $_SESSION['products_overview_filter'] : array();
+
+  $current_path = $_GET['q'];
+  $product_display_types = _commerce_product_display_manager_get_product_display_types(FALSE);
+
+  // Skip the rest if no product displays where found.
+  if (empty($product_display_types)) {
+    return array('no_product_displays' => array(
+      '#markup' => '<div style="margin-bottom:20px;">' . t('The store does not yet contain any product display nodes.') . '</div>',
+    ));
+  }
+  $product_fields = _commerce_product_display_manager_get_product_reference_fields();
+
+  // Fetch the products & display nodes as a UNION query
+  $union = FALSE;
+  $base_query = NULL;
+  foreach ($product_fields as $product_field) {
+    $nodes_query = db_select('node', 'n');
+    $nodes_query->leftJoin('field_data_' . $product_field, 'pr', 'pr.entity_id = n.nid');
+    $nodes_query->leftJoin('commerce_product', 'cp', 'cp.product_id = pr.' . $product_field . '_product_id');
+    $nodes_query->fields('cp', array('type', 'product_id', 'sku', 'title', 'language'));
+    $nodes_query->fields('n', array('nid', 'title' => 'title', 'language', 'type', 'status', 'promote', 'sticky', 'translate'));
+    $nodes_query->fields('pr', array('delta'));
+
+    $display_types = array();
+    foreach ($product_display_types as $product_display_type) {
+      $display_types[] = $product_display_type['machine_name'];
+    }
+    $nodes_query->condition('n.type', $display_types, 'IN');
+
+    if ($union) {
+      $base_query->union($nodes_query, 'ALL');
+    }
+    else {
+      $base_query = $nodes_query;
+      $union = TRUE;
+    }
+  }
+
+  // Add filter conditions to the union query
+  $union = db_select($base_query, 'u');
+  $union->fields('u');
+
+  foreach ($session as $index => $filter) {
+    list($key, $value) = $filter;
+    switch ($key) {
+      case 'status':
+        // Note: no exploitable hole as $key/$value have already been checked when submitted
+        list($key, $value) = explode('-', $value, 2);
+        $union->condition('u.' . $key, $value);
+        break;
+      case 'display_node_type':
+        $union->condition('u.n_type', $value);
+        break;
+      case 'product_type':
+        $union->condition('u.type', $value);
+        break;
+      case 'language':
+        $union->condition('u.n_language', $value);
+        break;
+    }
+  }
+
+  $nodes_query_result = $union->extend('PagerDefault')->limit(25)->execute();
+
+  $product_list = array();
+  foreach ($nodes_query_result as $record) {
+    // Create the Product Display when first time.
+    if (!isset($product_list[$record->nid])) {
+      $object = new stdClass();
+      $object->nid = $record->nid;
+      $object->title = $record->n_title;
+      $object->type = $record->n_type;
+      $object->product_type = $record->type;
+      $object->language = $record->n_language;
+      $object->children = array();
+      $product_list[$record->nid] = $object;
+    }
+
+    if (!is_null($record->product_id)) {
+      // Add the product to the list.
+      $product_object = new stdClass();
+      $product_object->product_id = $record->product_id;
+      $product_object->sku = $record->sku;
+      $product_object->type = $record->type;
+      $product_object->title = $record->title;
+      $product_object->language = $record->language;
+      $product_list[$record->nid]->children[$record->delta] = $product_object;
+    }
+  }
+
+  if (count($product_list) > 0) {
+    // Add all display nodes and their referenced products to the form.
+    foreach ($product_list as $node_obj) {
+      $form[] = array(
+        'title' => array(
+          '#type' => 'item',
+          '#markup' => $node_obj->title,
+        ),
+        'language' => array(
+          '#type' => 'item',
+          '#markup' => $node_obj->language,
+        ),
+        'edit_link' => array(
+          '#type' => 'link',
+          '#title' => t('Edit'),
+          '#href' => 'node/' . $node_obj->nid . '/edit',
+              '#options' => array('query' => array('destination' => $current_path)),
+        ),
+        'delete_link' => array(
+          '#type' => 'link',
+          '#title' => t('Delete'),
+          '#href' => 'node/' . $node_obj->nid . '/delete',
+          '#options' => array('query' => array('destination' => $current_path)),
+        ),
+        'nid' => array(
+          '#type' => 'hidden',
+          '#value' => $node_obj->nid,
+        ),
+        '#type' => $node_obj->product_type,
+      );
+
+      if (!empty($node_obj->children)) {
+
+        foreach ($node_obj->children as $delta => $related_product) {
+
+          $form[] = array(
+            'title' => array(
+              '#type' => 'item',
+              '#markup' => $related_product->title,
+            ),
+            'language' => array(
+              '#type' => 'item',
+              '#markup' => $related_product->language,
+            ),
+            'edit_link' => array(
+              '#type' => 'link',
+              '#title' => t('Edit'),
+              '#href' => 'admin/commerce/products/' . $related_product->product_id . '/edit',
+              '#options' => array('query' => array('destination' => $current_path)),
+            ),
+            'clone_link' => array(
+              '#type' => 'link',
+              '#title' => t('Clone'),
+              '#href' => 'admin/commerce/products/clone/' . str_replace("_", "-", $related_product->type) . '/' . $related_product->product_id,
+              '#options' => array('query' => array('pdid' => $node_obj->nid, 'destination' => $current_path)),
+            ),
+            'delete_link' => array(
+              '#type' => 'link',
+              '#title' => t('Delete'),
+              '#href' => 'admin/commerce/products/' . $related_product->product_id . '/delete',
+              '#options' => array('query' => array('destination' => $current_path)),
+            ),
+            'pid' => array(
+              '#type' => 'hidden',
+              '#default_value' => $related_product->product_id,
+            ),
+            'delta' => array(
+              '#type' => 'weight',
+              '#title' => t('Delta'),
+              '#title_display' => 'invisible',
+              '#default_value' => $delta,
+            ),
+          );
+
+          $referenced_product_ids[] = $related_product->product_id;
+        }
+      }
+    }
+
+    // Load all products currently not referenced.
+    $orphans_query = db_select('commerce_product', 'cp');
+    $orphans_query->fields('cp', array('product_id', 'sku', 'title', 'language', 'type'));
+    foreach ($product_fields as $field_name) {
+      $orphans_query->leftJoin('field_data_' . $field_name, 'fd_' . $field_name, 'cp.product_id = fd_' . $field_name . '.' . $field_name . '_product_id');
+      $orphans_query->condition('fd_' . $field_name . '.entity_id', NULL);
+    }
+
+    // Add only the product type filter here
+    foreach ($session as $index => $filter) {
+      list($key, $value) = $filter;
+      switch ($key) {
+        case 'product_type':
+          $orphans_query->condition('cp.type', $value);
+          break;
+      }
+    }
+
+    $orphans_result = $orphans_query->execute();
+
+    $form[] = array(
+      'title' => array(
+        '#type' => 'item',
+        '#markup' => PDM_ORPHANS_ROW_TITLE
+      ),
+      'nid' => array(
+        '#type' => 'hidden',
+        '#value' => 0,
+      ),
+      'language' => array(
+        '#type' => 'item',
+        '#markup' => '',
+      ),
+    );
+
+    // Add all orphan products to the table.
+    if ($orphans_result->rowCount() > 0) {
+      foreach ($orphans_result as $orphan_key => $orphan_product) {
+        $form[] = array(
+          'title' => array(
+            '#type' => 'item',
+            '#markup' => $orphan_product->title,
+          ),
+          'language' => array(
+            '#type' => 'item',
+            '#markup' => $orphan_product->language,
+          ),
+          'edit_link' => array(
+            '#type' => 'link',
+            '#title' => t('Edit'),
+            '#href' => 'admin/commerce/products/' . $orphan_product->product_id . '/edit',
+            '#options' => array('query' => array('destination' => $current_path)),
+          ),
+          'delete_link' => array(
+            '#type' => 'link',
+            '#title' => t('Delete'),
+            '#href' => 'admin/commerce/products/' . $orphan_product->product_id . '/delete',
+            '#options' => array('query' => array('destination' => $current_path)),
+          ),
+          'pid' => array(
+            '#type' => 'hidden',
+            '#default_value' => $orphan_product->product_id,
+          ),
+          'orphan' => array(
+            '#type' => 'hidden',
+            '#default_value' => TRUE,
+          ),
+          'delta' => array(
+            '#type' => 'weight',
+            '#title' => t('Delta'),
+            '#title_display' => 'invisible',
+          ),
+        );
+      }
+    }
+  }
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Save'),
+  );
+
+  // Adds JavaScript and CSS used by form.
+  $form['#after_build'][] = '_commerce_product_display_manager_product_display_manager_form_attach';
+
+  // Turns it into a table.
+  $form['#languages'] = module_invoke('locale', 'language_list');
+  $form['#theme'] = 'commerce_product_display_manager_product_display_manager_table';
+  $form['pager'] = array('#theme' => 'pager');
+
+  return $form;
+}
+
+/**
+ * Creates a batch operation that will update all display nodes.
+ */
+function commerce_product_display_manager_product_display_manager_form_validate($form, &$form_state) {
+
+  $hierarchy = array();
+  $current_display_node = NULL;
+  foreach ($form_state['input'] as $input) {
+    if (is_array($input)) {
+      if (isset($input['nid'])) {
+        if ($current_display_node) {
+          $hierarchy[] = $current_display_node;
+        }
+        $current_display_node = array('nid' => $input['nid'], 'products' => array());
+      }
+      else {
+        $current_display_node['products'][] = $input['pid'];
+      }
+    }
+  }
+
+  foreach ($hierarchy as $key => $display_node) {
+
+
+    $node = node_load($display_node['nid']);
+    if (!_commerce_product_display_manager_get_number_reference_values_allowed($node, count($display_node['products']))) {
+      form_set_error($key . '[nid]', t('Display node with title %note_title cannot contain the specified number of product references, field limit is set to %field_limit.',
+        array('%note_title' => $node->title, '%field_limit' => _commerce_product_display_manager_get_num_allowed_references($node))));
+    }
+  }
+}
+
+/**
+ * Creates a batch operation that will update all display nodes.
+ */
+function commerce_product_display_manager_product_display_manager_form_submit($form, &$form_state) {
+
+  $hierarchy = array();
+  $current_display_node = NULL;
+  foreach ($form_state['input'] as $input) {
+    if (is_array($input)) {
+      if (isset($input['nid'])) {
+        if ($current_display_node) {
+          $hierarchy[] = $current_display_node;
+        }
+        $current_display_node = array('nid' => $input['nid'], 'products' => array());
+      }
+      else {
+        $current_display_node['products'][] = $input['pid'];
+      }
+    }
+  }
+
+  // Create a skeleton for the update batch.
+  $batch = array(
+    'title' => t('Updating display nodes'),
+    'operations' => array(),
+    'finished' => '_commerce_product_display_manager_display_nodes_updated',
+    'file' => drupal_get_path('module', 'commerce_product_display_manager') . '/commerce_product_display_manager.admin.inc',
+  );
+
+  // Add operations.
+  foreach ($hierarchy as $product_display_hierarchy) {
+    $batch['operations'][] = array(
+      '_commerce_product_display_manager_update_display_node',
+      array($product_display_hierarchy),
+    );
+  }
+
+  // Initialize the update batch process.
+  batch_set($batch);
+}
+
+/**
+ * Displays the display manager form as a draggable table.
+ */
+function theme_commerce_product_display_manager_product_display_manager_table($variables) {
+  $form = &$variables['form'];
+  $output = '';
+
+  drupal_add_tabledrag('commerce_product_display_manager_product_display_manager', 'order', 'sibling', 'delta');
+
+  $output .= drupal_render($form['filter']);
+
+  $links = array(
+    array(
+      'title' => t('Add product'),
+      'href' => 'admin/commerce/products/add'
+    ),
+  );
+  $output .= theme('links', array('links' => $links, 'attributes' => array('class' => array('action-links'))));
+
+  $header = array (
+    t('Product display title / product title'), t('Language'), t('Edit'), t('Delete'), t('Delta'),
+  );
+
+  $rows = array();
+	foreach (element_children($form) as $key) {
+    $form_element = &$form[$key];
+
+    if (isset($form_element['title'])) {
+      if (isset($form_element['nid'])) {  // It's a display node.
+        $form_element['nid']['#attributes']['class'] = 'display-nid';
+
+        $row = array();
+        $row[] = drupal_render($form_element['title']) . drupal_render($form_element['nid']);
+        $row[] = drupal_render($form_element['language']);
+        $row[] = ($form_element['title']['#markup'] == PDM_ORPHANS_ROW_TITLE) ? '' : drupal_render($form_element['edit_link']) .
+          ' - ' . l(t('Add @type', array('@type' => $form_element['#type'])), 'admin/commerce/products/add/' . str_replace("_", "-", $form_element['#type']), array('query' => array('pdid' => $form_element['nid']['#value'], drupal_get_destination())));
+        $row[] = ($form_element['title']['#markup'] == PDM_ORPHANS_ROW_TITLE) ? '' : drupal_render($form_element['delete_link']);
+        $row[] = '';
+
+        $row_class = ($form_element['title']['#markup'] == PDM_ORPHANS_ROW_TITLE) ? 'orphans' : '';
+        $rows[] = array('data' => $row, 'class' => array('display-node', $row_class));
+      }
+      else if (!isset($form_element['orphan'])) {  // It's referenced product.
+        $form_element['delta']['#attributes']['class'] = array('delta');
+
+        $row = array();
+        $row[] = theme('indentation', array('size' => 1)) . drupal_render($form_element['title']);
+        $row[] = drupal_render($form_element['language']);
+        $row[] = drupal_render($form_element['edit_link']) . ' - ' . drupal_render($form_element['clone_link']);
+        $row[] = drupal_render($form_element['delete_link']);
+        $row[] = drupal_render($form_element['delta']);
+
+        $rows[] = array('data' => $row, 'class' => array('draggable', 'tabledrag-leaf', 'product'));
+      }
+      else {  // It's an orphan product.
+        $form_element['delta']['#attributes']['class'] = array('delta');
+
+        $row = array();
+        $row[] = theme('indentation', array('size' => 1)) . drupal_render($form_element['title']);
+        $row[] = drupal_render($form_element['language']);
+        $row[] = drupal_render($form_element['edit_link']);
+        $row[] = drupal_render($form_element['delete_link']);
+        $row[] = drupal_render($form_element['delta']);
+
+        $rows[] = array('data' => $row, 'class' => array('draggable', 'tabledrag-leaf', 'product-orphan'));
+      }
+		}
+	}
+
+  if (!empty($rows)) {
+    $rows[0]['class'][] = 'first';
+  }
+
+  $output .= theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'commerce_product_display_manager_product_display_manager')));
+  $output .= drupal_render_children($form);
+
+  return $output;
+}
+
+/*
+function commerce_product_display_manager_form_commerce_product_ui_product_delete_form_alter(&$form, &$form_state, $form_id) {
+
+}
+function commerce_product_display_manager_form_node_delete_confirm_alter(&$form, &$form_state, $form_id) {
+
+}
+*/
+
+/**
+ * Updates any given display node to reference to specified products.
+ */
+function _commerce_product_display_manager_update_display_node($update_data, &$context) {
+  $node = node_load($update_data['nid']);
+  $context['message'] = t('Updating product display node %node_title', array('%node_title' => $node->title));
+
+  $reference_field_name = _commerce_product_display_manager_get_node_reference_field_name($node);
+  $new_field_values = array();
+  foreach($update_data['products'] as $product_id) {
+    $new_field_values[] = array('product_id' => $product_id);
+  }
+
+  $original_field_values = field_get_items('node', $node, $reference_field_name);
+  if ($new_field_values != $original_field_values) {
+    $field_language = field_language('node', $node, $reference_field_name);
+    if (!isset($original_field_values)) {
+      $node->{$reference_field_name} = array($field_language => array());
+    }
+    $node->{$reference_field_name}[$field_language] = $new_field_values;
+    node_save($node);
+  }
+}
+
+/**
+ * The display node's update batch is complete.
+ */
+function _commerce_product_display_manager_display_nodes_updated($success, $results, $operations) {
+  if ($success) {
+    $message = t('Products and their display nodes has been updated successfully.');
+  }
+  else {
+    $message = t('There was an error updating your products and their display nodes.');
+  }
+
+  drupal_set_message($message);
+}
+
+/**
+ * Helper function to return all products that are referenced by a node.
+ */
+function _commerce_product_display_manager_get_products_referenced($nid) {
+  $product_fields = _commerce_product_display_manager_get_product_reference_fields();
+  $out = array();
+  foreach ($product_fields as $field) {
+    $result = db_query(
+      'SELECT ' . $field . '_product_id FROM {field_data_' . $field . '} df WHERE df.entity_id = :eid ORDER BY df.delta',
+      array(
+        ':eid' => $nid,
+      )
+    );
+
+    foreach ($result as $product_obj) {
+      $out[] = $product_obj->{$field . '_product_id'};
+    }
+  }
+  return array_values($out);
+}
+
+/**
+ *  Add necessary css and JavaScript files to the display manager form.
+ */
+function _commerce_product_display_manager_product_display_manager_form_attach($form_element) {
+  drupal_add_css(drupal_get_path('module', 'commerce_product_display_manager') . '/commerce_product_display_manager_product_display_manager_form.css');
+  drupal_add_js(drupal_get_path('module', 'commerce_product_display_manager') . '/commerce_product_display_manager_product_display_manager_form.js');
+  return $form_element;
+}
diff --git a/commerce_product_display_manager.info b/commerce_product_display_manager.info
new file mode 100644
index 0000000..1ff73a9
--- /dev/null
+++ b/commerce_product_display_manager.info
@@ -0,0 +1,9 @@
+name = Commerce (Product Display Manager)
+description = Simplifies managing the relationship between products and product display nodes.
+package = Commerce (contrib)
+core = 7.x
+
+files[] = commerce_product_display_manager.admin.inc
+
+dependencies[] = commerce
+dependencies[] = commerce_product_ui
diff --git a/commerce_product_display_manager.module b/commerce_product_display_manager.module
new file mode 100644
index 0000000..92e9aa5
--- /dev/null
+++ b/commerce_product_display_manager.module
@@ -0,0 +1,800 @@
+<?php
+
+/**
+ *  Implements hook_permission();
+ */
+function commerce_product_display_manager_permission() {
+  return array(
+    'access product display manager' => array(
+      'title' => t('Access the product display manager.'),
+    ),
+  );
+}
+
+/**
+ * Implements hook_menu().
+ */
+function commerce_product_display_manager_menu() {
+
+  $items = array(
+    'node/%node/products' => array(
+      'title' => t('Products'),
+      'type' => MENU_LOCAL_TASK,
+      'page callback' => 'drupal_get_form',
+      'page arguments' => array('commerce_product_display_manager_display_node_products_form', 1),
+      'access callback' => 'commerce_product_display_manager_access_products_tab',
+      'access arguments' => array(1),
+    ),
+    'admin/commerce/products/display_manager' => array(
+      'title' => t('Display manager'),
+      'type' => MENU_LOCAL_TASK,
+      'page callback' => 'commerce_product_display_manager_product_display_manager_page',
+      'access arguments' => array('access product display manager'),
+      'file' => 'commerce_product_display_manager.admin.inc',
+    ),
+    'commerce_pqr/autocomplete' => array(
+      'title' => 'Autocomplete for existing display nodes',
+      'page callback' => '_commerce_product_display_manager_existing_displays_autocomplete',
+      'access arguments' => array('access content'),
+      'type' => MENU_CALLBACK,
+    ),
+    // Ajax callback path for returning info about a node.
+    'commerce_product_display_manager/get_node_info/%' => array(
+      'page callback' => '_commerce_product_display_manager_get_node_info',
+      'page arguments' => array(2),
+      'access arguments' => array('access content'),  // ToDo: Checkup permission
+      'type' => MENU_CALLBACK,
+    ),
+  );
+
+  // Create clone callbacks. These products based on other products in the same
+  // Product Display, prepopulating the values of the base product.
+  foreach (commerce_product_types() as $type => $product_type) {
+    $items['admin/commerce/products/clone/' . strtr($type, array('_' => '-')) . '/%commerce_product'] = array(
+      'title' => 'Create @name',
+      'title arguments' => array('@name' => $product_type['name']),
+      'description' => $product_type['description'],
+      'page callback' => 'commerce_product_display_manager_product_ui_product_form_wrapper',
+      'page arguments' => array(commerce_product_new($type), 5),
+      'access callback' => 'commerce_product_access',
+      'access arguments' => array('create', $type),
+      'file' => 'commerce_product_display_manager_product_clone.inc',
+    );
+  }
+
+  return $items;
+}
+
+/**
+ *  Implements hook_help().
+ */
+function commerce_product_display_manager_help($path, $args) {
+  if ($path == 'admin/commerce/products/display_manager') {
+    return t('Drag products into display nodes as desired.', array());
+  }
+}
+
+/**
+ * Implements hook_theme().
+ */
+function commerce_product_display_manager_theme($existing, $type, $theme, $path) {
+  return array(
+    'commerce_product_display_manager_display_node_products_table' => array(
+      'render element' => 'form',
+    ),
+    'commerce_product_display_manager_product_display_manager_table' => array(
+      'render element' => 'form',
+      'file' => 'commerce_product_display_manager.admin.inc',
+    ),
+    'commerce_product_display_manager_product_references_table' => array(
+      'render element' => 'form_elements',
+    ),
+  );
+}
+
+/**
+ * Checks if the node is a products display node and that user has access to it.
+ */
+function commerce_product_display_manager_access_products_tab($node) {
+  return user_access('access product display manager') && _commerce_product_display_manager_get_node_reference_field_name($node) !== FALSE;
+}
+
+/**
+ * Return a form in the shape of a table listing all products referenced by this node.
+ */
+function commerce_product_display_manager_display_node_products_form($form, &$form_state, $node) {
+  $form = array();
+
+  $reference_field_name = _commerce_product_display_manager_get_node_reference_field_name($node);
+  $items = field_get_items('node', $node, $reference_field_name);
+  if (!empty($items)) {
+    foreach ($items as $item) {
+      $products_query = db_select('commerce_product', 'cp');
+      $products_query->fields('cp', array('product_id', 'sku', 'title'));
+      $products_query->condition('cp.product_id', $item['product_id']);
+      $product_data = $products_query->execute()->fetch();
+
+      $form[] = array(
+        'sku' => array(
+          '#type' => 'item',
+          '#markup' => $product_data->sku,
+          //'#href' => 'admin/commerce/products/' . $product_data->product_id,
+        ),
+        'title' => array(
+          '#type' => 'item',
+          '#markup' => $product_data->title,
+        ),
+        'edit' => array(
+          '#type' => 'link',
+          '#href' => 'admin/commerce/products/' . $product_data->product_id . '/edit',
+          '#title' => t('Edit'),
+        ),
+      );
+    }
+
+    $form['#theme'] = 'commerce_product_display_manager_display_node_products_table';
+  }
+  else {
+    $form['no_products'] = array(
+      '#markup' => t('This product display node is currently not referencing any products'),
+    );
+  }
+
+  return $form;
+}
+
+/**
+ * Creates a table out of commerce_product_display_manager_display_node_products_form.
+ */
+function theme_commerce_product_display_manager_display_node_products_table($variables) {
+  $form = $variables['form'];
+  $header = array('SKU', 'Title', 'Edit');
+  $rows = array();
+
+  foreach (element_children($form) as $row_key) {
+    if (is_numeric($row_key)) {
+      $row_data = $form[$row_key];
+      $row = array();
+      $row[] = drupal_render($row_data['sku']);
+      $row[] = drupal_render($row_data['title']);
+      $row[] = drupal_render($row_data['edit']);
+      $rows[] = array('data' => $row);
+    }
+  }
+
+  $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'commerce_product_display_manager_display_node_products_table')));
+  return $output;
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * Adding inputs to specify a default setting to use for product referencing
+ * whenever a product with this specific type is being created.
+ */
+function commerce_product_display_manager_form_commerce_product_ui_product_type_form_alter(&$form, &$form_state, $form_id) {
+
+  $product_type_machine = $form_state['product_type']['type'];
+
+  // Need to save this for later, the source is gone at submission.
+  // If the type is about to be created, this value exists in the submit function.
+  $form_state['#product_display_type_machine'] = $product_type_machine;
+  $default_type_new = variable_get('commerce_product_display_manager_default_new_' . $product_type_machine, '');
+
+  $form['quick_reference'] = array(
+    '#type' => 'fieldset',
+    '#title' => t("Quick reference default"),
+    '#weight' => $form['actions']['#weight'],
+    '#collapsible' => TRUE,
+    '#collapsed' => FALSE,
+  );
+
+  $options = _commerce_product_display_manager_get_product_display_types(TRUE);
+  if (!empty($options)) {
+    $form['quick_reference']['commerce_product_display_manager_product_display_type'] = array(
+      '#type' => 'select',
+      '#title' => t("Type"),
+      '#description' => t("Choose the default product display type."),
+      '#default_value' => $default_type_new,
+      '#options' => $options,
+    );
+  }
+  else {
+    $form['quick_reference']['commerce_product_display_manager_product_display_type'] = array(
+      '#markup' => t('The store does not yet contain any product display nodes.'),
+    );
+  }
+
+  $form['actions']['submit']['#submit'][] = 'commerce_product_display_manager_form_commerce_product_ui_product_type_form_submit';
+}
+
+/**
+ * Submit callback for commerce_product_ui_product_type_form().
+ *
+ * @see commerce_product_display_manager_form_commerce_product_ui_product_type_form_alter().
+ * Save default values for this product type.
+ */
+function commerce_product_display_manager_form_commerce_product_ui_product_type_form_submit($form, &$form_state) {
+  $form_values = $form_state['values'];
+  // Get the product type machine name from the storage if existing
+  // See alter function for more information.
+  $product_type = !empty($form_state['#product_display_type_machine'])
+    ? $form_state['#product_display_type_machine']
+    : $form_values['product_type']['type'];
+
+  variable_set('commerce_product_display_manager_default_new_' . $product_type, $form_values['commerce_product_display_manager_product_display_type']);
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * Adding inputs to let the user add the created product as a
+ * reference to a Product Display Node.
+ */
+function commerce_product_display_manager_form_commerce_product_ui_product_form_alter(&$form, &$form_state, $form_id) {
+
+  $display_type_options = _commerce_product_display_manager_get_product_display_types(TRUE);
+
+  $product_type_machine = $form_state['commerce_product']->type;
+
+  if (empty($display_type_options)) {
+
+    $form['quick_reference'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Referenced by'),
+      '#weight' => $form['actions']['#weight'],
+      '#collapsible' => TRUE,
+      '#collapsed' => FALSE,
+    );
+    $form['quick_reference']['info'] = array(
+      '#markup' => t('The store does not yet contain any product display nodes to add this product to.'),
+    );
+
+  }
+  else {
+
+    // Store the value for the after_build function.
+    //$form['#commerce_product_display_manager_reference_product_type'] = $product_type_machine;
+    $form['quick_reference'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Referenced by'),
+      '#description' => t('Changes made here are only temporary, the product must be saved for these changes to take effect.'),
+      '#weight' => $form['actions']['#weight'],
+      '#theme' => 'commerce_product_display_manager_product_references_table',
+      '#collapsible' => TRUE,
+      '#collapsed' => FALSE,
+      '#tree' => TRUE,
+    );
+
+    if (!isset($form_state['commerce_product']->is_new)) {  // Editing an existing product
+      $referenced_from = _commerce_product_display_manager_get_nodes_referencing($form_state['commerce_product']->product_id);
+      $existing_references = array();
+      if (!empty($referenced_from)) {
+        foreach ($referenced_from as $reference) {
+          $existing_references[] = $reference;
+        }
+        $form_state['#existing_references'] = $existing_references;
+      }
+
+      foreach ($existing_references as $key => $existing_reference) {
+        $form['quick_reference'][$key] = _commerce_product_display_manager_get_product_reference_form_inputs($existing_reference);
+      }
+    }
+    // Make sure the Product Reference received from url gets attached in the
+    // new product, which will always be an existing Product Display node.
+    elseif (isset($_GET['pdid'])) {
+      $pdid = $_GET['pdid'];
+      $form_state['#existing_references'] = array($pdid);
+      $form['quick_reference'][0] = _commerce_product_display_manager_get_product_reference_form_inputs($pdid);
+      $form['quick_reference'][0]['attach']['#default_value'] = 1;
+    }
+
+    // Add an empty row to use as template in JavaScript.
+    $form['quick_reference']['commerce_product_display_manager_product_reference_row_template'] = _commerce_product_display_manager_get_product_reference_form_inputs();
+
+    $form['quick_reference']['add_new_reference']['links'] = array(
+      'create_new' => array(
+        '#type' => 'link',
+        '#title' => t('New display node'),
+        '#href' => '',
+        '#attributes' => array('rel' => array('create_new')),
+      ),
+      'existing' => array(
+        '#type' => 'link',
+        '#title' => t('Existing display node'),
+        '#href' => '',
+        '#attributes' => array('rel' => array('use_existing')),
+      ),
+    );
+
+    $default_type_new = variable_get('commerce_product_display_manager_default_new_' . $product_type_machine, NULL);
+
+    $form['quick_reference']['add_new_reference']['actions'] = array(
+      'commerce_product_display_manager_product_display_type' => array(
+        '#type' => 'select',
+        '#title' => t("Type:"),
+        '#options' => $display_type_options,
+        '#default_value' => $default_type_new ? $default_type_new : '',
+        '#prefix' => '<div class="commerce-pdm-product-form-reference-add-actions add-action hidden"><div class="actions"><div class="add-new">',
+      ),
+      'commerce_product_display_manager_product_display_title' => array(
+        '#type' => 'textfield',
+        '#title' => t("Title of new display node:"),
+        '#suffix' => '</div>',
+      ),
+      'commerce_product_display_manager_product_display_existing' => array(
+        '#type' => 'textfield',
+        '#title' => t("Display node ID:"),
+        '#autocomplete_path' => 'commerce_pqr/autocomplete',
+        '#default_value' => '',
+        '#prefix' => '<div class="existing add-action">',
+      ),
+      'commerce_product_display_manager_product_display_add' => array(
+        '#type' => 'link',
+        '#title' => t('Add'),
+        '#href' => '',
+        '#attributes' => array('class' => array('add')),
+        '#prefix' => '</div>',
+      ),
+      'commerce_product_display_manager_product_display_cancel' => array(
+        '#type' => 'link',
+        '#title' => t('Cancel'),
+        '#href' => '',
+        '#attributes' => array('class' => array('cancel')),
+        '#suffix' => '</div></div>',
+      ),
+    );
+
+    // Add JavaScript used by form.
+    $form['#after_build'] = array('_commerce_product_display_manager_product_form_reference_attach');
+
+    //$form['#validate'][] = 'commerce_product_display_manager_product_form_reference_validate';
+    $form['actions']['submit']['#submit'][] = 'commerce_product_display_manager_product_form_reference_submit';
+
+  }
+}
+
+
+/**
+ * Validate callback for commerce_product_ui_product_form().
+ *
+ * @see commerce_product_display_manager_form_commerce_product_ui_product_form_alter()
+ */
+function commerce_product_display_manager_product_form_reference_validate(&$form, &$form_state) {
+
+}
+
+/**
+ * Submit callback for commerce_product_ui_product_form().
+ *
+ * @see commerce_product_display_manager_form_commerce_product_ui_product_form_alter().
+ * Add a reference to the created product to either a new node or an existing one.
+ */
+function commerce_product_display_manager_product_form_reference_submit(&$form, &$form_state) {
+
+  $product_id = $form_state['build_info']['args'][0]->product_id;
+
+  foreach ($form_state['input']['quick_reference'] as $element) {
+    if (isset($element['title']) && !empty($element['title'])) {
+
+      if ($element['attach'] xor $element['deleted']) {
+
+        if ($element['new_type'] != FALSE) {
+          $node = _commerce_product_display_manager_create_display_node($element['new_type'], $element['title']);
+        }
+        else {
+          $node = node_load($element['nid']);
+        }
+
+        $reference_field_name = _commerce_product_display_manager_get_node_reference_field_name($node);
+        $field_language = field_language('node', $node, $reference_field_name);
+        if ($element['deleted'] == TRUE) {
+          foreach ($node->{$reference_field_name}[$field_language] as $field_value_key => $field_value) {
+            if ($field_value['product_id'] == $product_id) {
+              array_splice($node->{$reference_field_name}[$field_language], $field_value_key, 1);
+              break;
+            }
+          }
+        }
+        else {
+          if (!isset($node->{$reference_field_name}[$field_language])) {
+            $node->{$reference_field_name}[$field_language] = array();
+          }
+          $node->{$reference_field_name}[$field_language][] = array('product_id' => $product_id);
+        }
+
+        node_save($node);
+
+      }
+    }
+  }
+}
+
+/**
+ *  Delete related variables from the database.
+ */
+function commerce_product_display_manager_commerce_product_type_delete($type, $skipreset) {
+  variable_del('commerce_product_display_manager_default_new_' . $type['type']);
+}
+
+/**
+ *
+ */
+function theme_commerce_product_display_manager_product_references_table($variables) {
+  $form_elements = $variables['form_elements'];
+  $header = array(t('Title'), t('Node ID'), t('Delete reference'));
+
+  $rows = array();
+  foreach(element_children($form_elements) as $row_key) {
+    if ($row_key !== 'add_new_reference') {
+      $row = array();
+      $row[] = drupal_render($form_elements[$row_key]['title']);
+      $row[] = drupal_render($form_elements[$row_key]['nid']);
+      $row[] = drupal_render($form_elements[$row_key]['attach'])
+        . drupal_render($form_elements[$row_key]['delete'])
+        . drupal_render($form_elements[$row_key]['undo_delete'])
+        . drupal_render($form_elements[$row_key]['deleted'])
+        . drupal_render($form_elements[$row_key]['new_type']);
+
+      $row_classes = ($row_key === 'commerce_product_display_manager_product_reference_row_template' ? array('hidden reference-row-template') : array());
+      $rows[] = array('data' => $row, 'class' => $row_classes);
+    }
+  }
+
+  $row = array();
+  $row[] = '<div class="commerce-pdm-product-form-reference-add-links">';
+  $row[0] .= t('Add a reference to:') . '&nbsp;&nbsp;';
+  $row[0] .= drupal_render($form_elements['add_new_reference']['links']['create_new']);
+  $row[0] .= '&nbsp;&nbsp;&#124;&nbsp;&nbsp;';
+  $row[0] .= drupal_render($form_elements['add_new_reference']['links']['existing']);
+  $row[0] .= '</div>';
+  $row[0] .= drupal_render($form_elements['add_new_reference']['actions']);
+  $row[0] .= '<div class="commerce-pdm-product-form-reference-error-message" style="display:none;"></div>';
+  $row[0] = array('data' => $row[0], 'colspan' => 3);
+  $rows[] = array('data' => $row, 'class' => array('add-new'));
+
+  $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'commerce_product_display_manager_product_referenced_by')));
+  return $output;
+}
+
+
+
+/**
+ *
+ */
+function _commerce_product_display_manager_get_product_reference_form_inputs($existing_reference = '') {
+  if ($existing_reference != '') {
+    $node_obj = db_query('SELECT n.title FROM {node} n WHERE nid = :nid', array(':nid' => $existing_reference))->fetchObject();
+    $node_title = $node_obj->title;
+  }
+  else {
+    $node_title = '';
+  }
+
+  $inputs = array(
+    // If this is a new reference that will be attached to a reference field.
+    'attach' => array(
+      '#type' => 'hidden',
+      '#default_value' => 0,
+      '#attributes' => array(
+        'class' => array('commerce-pdm-reference-attach'),
+      ),
+    ),
+    // The title of the node or the node to be created.
+    'title' => array(
+      '#type' => 'textfield',
+      '#value' => $node_title,
+      '#default_value' => $node_title,
+      '#attributes' => array(
+        'class' => array('commerce-pdm-reference-title'),
+        'readonly' => 'readonly',
+      )
+    ),
+    // The node ID of the node, this will be set to New if the node is to be created.
+    'nid' => array(
+      '#type' => 'textfield',
+      '#value' => $existing_reference,
+      '#default_value' => $existing_reference,
+      '#attributes' => array(
+        'class' => array('commerce-pdm-reference-nid'),
+        'val' => $existing_reference, // Just for the JavaScript check.
+        'readonly' => 'readonly',
+      ),
+    ),
+    // The delete link.
+    'delete' => array(
+      '#type' => 'link',
+      '#title' => t('Delete'),
+      '#href' => '',
+      '#attributes' => array(
+        'class' => array('commerce-pdm-reference-delete')
+      ),
+    ),
+    // The undo delete link.
+    'undo_delete' => array(
+      '#type' => 'link',
+      '#title' => t('Undo delete'),
+      '#href' => '',
+      '#attributes' => array(
+        'class' => array('commerce-pdm-reference-undo-delete', 'hidden'),
+      ),
+    ),
+    // If the reference to this product should be removed from the node.
+    'deleted' => array(
+      '#type' => 'hidden',
+      '#default_value' => 0,
+      '#attributes' => array(
+        'class' => array('commerce-pdm-reference-deleted')
+      ),
+    ),
+    // The node type to create the new node of.
+    'new_type' => array(
+      '#type' => 'hidden',
+      '#default_value' => 0,
+      '#attributes' => array(
+        'class' => array('commerce-pdm-reference-new-type')
+      ),
+    ),
+  );
+
+  return $inputs;
+}
+
+/**
+ * Helper function to see witch node types are valid product display node types.
+ *
+ * @param $json_format
+ *   If every element in the returned array should be keyed by display
+ *   nodes bundle name. This is for the product_display_type select box in
+ *   the form.
+ *
+ * @return
+ *   An array of elements containing machine_name => human name.
+ */
+function _commerce_product_display_manager_get_product_display_types($json_format) {
+
+  $fields = array();
+
+  $product_reference_fields = _commerce_product_display_manager_get_product_reference_fields();
+
+  // Only create output if product reference fields where found.
+  if (!empty($product_reference_fields)) {
+
+    $select_node_bundles = db_select('field_config_instance', 'fci');
+    $select_node_bundles->join('node_type', 'nt', 'nt.type = fci.bundle');
+    $select_node_bundles
+      ->fields('fci', array('bundle'))
+      ->fields('nt', array('name'));
+
+    $conditions = db_or();
+    foreach ($product_reference_fields as $field_name) {
+      $conditions->condition('fci.field_name', $field_name);
+    }
+    $select_node_bundles->condition($conditions);
+
+    $select_node_bundles_result = $select_node_bundles->execute();
+
+    foreach ($select_node_bundles_result as $bundle) {
+      $fields[$bundle->bundle] = $bundle->name;
+    }
+
+  }
+
+  $output = array();
+
+  foreach ($fields as $bundle => $bundle_name) {
+    if ($json_format) {
+      $output[$bundle] = $bundle_name;
+    }
+    else {
+      $output[] = array('machine_name' => $bundle, 'name' => $bundle_name);
+    }
+  }
+
+  return $output;
+}
+
+/**
+ * Helper function to return all product reference fields in the drupal installation.
+ */
+ function _commerce_product_display_manager_get_product_reference_fields() {
+  $product_reference_fields = array();
+  foreach (field_info_fields() as $field) {
+    // Do not include the commerce_product field, why?
+    if ($field['type'] == 'commerce_product_reference' && $field['field_name'] != 'commerce_product') {
+      $product_reference_fields[] = $field['field_name'];
+    }
+  }
+  return $product_reference_fields;
+}
+
+/**
+ * Get the NID's of a nodes referencing to a product.
+ *
+ * If no node is referencing to it, return an empty array.
+ */
+function _commerce_product_display_manager_get_nodes_referencing($product_id) {
+  $product_fields = _commerce_product_display_manager_get_product_reference_fields();
+  $entities = array();
+  foreach ($product_fields as $field) {
+    $result = db_query(
+      'SELECT entity_id FROM {field_data_' . $field . '} df WHERE df.' . $field . '_product_id = :pid',
+      array(
+        ':pid' => $product_id,
+      )
+    );
+
+    foreach ($result as $reference) {
+      $entities[] = $reference->entity_id;
+    }
+  }
+  return $entities;
+}
+
+/**
+ * Helper function to get the name of the product reference field in a node.
+ */
+function _commerce_product_display_manager_get_node_reference_field_name($node) {
+  $field_name_out = FALSE;
+
+  foreach (_commerce_product_display_manager_get_product_reference_fields() as $field_name) {
+    if (isset($node->{$field_name})) {
+      $field_name_out = $field_name;
+      break;
+    }
+  }
+
+  return $field_name_out;
+}
+
+/**
+ * Menu callback; Retrieve a JSON object containing autocomplete suggestions.
+ *
+ * Return titles of existing product display nodes.
+ */
+function _commerce_product_display_manager_existing_displays_autocomplete($typed) {
+
+  $output = array();
+  $product_display_types = _commerce_product_display_manager_get_product_display_types(FALSE);
+
+  if (!empty($product_display_types)) {
+
+    $query_conditions = db_or();
+    foreach ($product_display_types as $display_type) {
+      $query_conditions->condition('n.type', $display_type['machine_name']);
+    }
+    $query = db_select('node', 'n')
+      ->fields('n', array('nid', 'title', 'type'))
+      ->condition($query_conditions)
+      ->condition('n.title', '%' . $typed . '%', 'LIKE')
+      ->addTag('node_access');
+
+    $query_result = $query->execute();
+
+    foreach ($query_result as $result) {
+      $output[$result->nid] = $result->title . ' (' . $result->type . ')';
+    }
+
+  }
+
+  drupal_json_output($output);
+}
+
+/**
+ * Ajax callback function returning information about a node.
+ *
+ * @param nid
+ *  The node ID of whitch I should return information about.
+ *
+ * @return
+ *  Return the results through drupal_json_output().
+ */
+function _commerce_product_display_manager_get_node_info($nid) {
+  $result = array();
+
+  if($node = node_load($nid)) {
+    $field_name = _commerce_product_display_manager_get_node_reference_field_name($node);
+    if (!_commerce_product_display_manager_get_number_reference_values_allowed($node, count($node->{$field_name}[LANGUAGE_NONE]) + 1)) {
+      $result['success'] = FALSE;
+      $result['message'] = 'node_full';
+    }
+    else {
+      $result['success'] = TRUE;
+      $result['data']['title'] = $node->title;
+      $result['data']['nid'] = $node->nid;
+    }
+  }
+  else {
+    $result['success'] = FALSE;
+    $result['message'] = 'not_found';
+  }
+
+  return drupal_json_output($result);
+}
+
+/**
+ * Helper function to see if the specified number of values is allowed to exist
+ * in the specified node's product reference field.
+ */
+function _commerce_product_display_manager_get_number_reference_values_allowed($node, $num_values) {
+  $node = is_object($node) ? $node : node_load($node);
+  $field_name = _commerce_product_display_manager_get_node_reference_field_name($node);
+  $allowed_values = _commerce_product_display_manager_get_num_allowed_references($node);
+
+  if (isset($node->{$field_name}[LANGUAGE_NONE])) {
+    if ($allowed_values != -1 && $num_values > $allowed_values) {
+      return FALSE;
+    }
+  }
+
+  return TRUE;
+}
+
+/**
+ * Returns the maximum number of values the product reference field in the
+ * specified node can contain.
+ */
+function _commerce_product_display_manager_get_num_allowed_references($node) {
+  $node = is_object($node) ? $node : node_load($node);
+  $field_name = _commerce_product_display_manager_get_node_reference_field_name($node);
+  $field_settings = field_info_field($field_name);
+  return (int) $field_settings['cardinality'];
+}
+
+/**
+ * Creates a display node and returns the result as a json object.
+ *
+ * @param type
+ *  The node type of whitch to create a node from.
+ *
+ * @param title
+ *  Set the title of the new node to this.
+ *
+ * @return
+ *  Return the results through drupal_json_output().
+ */
+function _commerce_product_display_manager_create_display_node($type, $title) {
+  global $user;
+
+  $node = new stdClass();
+  $node->is_new = TRUE;
+  $node->type = $type;
+
+  // Prepare the object with the bundle default settings
+  node_object_prepare($node);
+
+  // Additional entity properties
+  $node->uid = $user->uid;
+  $node->title = $title;
+  $node->format = filter_fallback_format();
+
+  node_save($node);
+
+  // Attach fields to it.
+  field_attach_load('node', array($node->nid => $node));
+
+  return $node;
+}
+
+/**
+ * Add JavaScript and CSS used by the product reference table in the product form.
+ */
+function _commerce_product_display_manager_product_form_reference_attach($form_element) {
+  drupal_add_js(drupal_get_path('module', 'commerce_product_display_manager') . '/commerce_product_display_manager_product_form_reference.js');
+  drupal_add_css(drupal_get_path('module', 'commerce_product_display_manager') . '/commerce_product_display_manager_product_form_reference.css');
+
+  // Add translated messages for the product reference table.
+  drupal_add_js(array(
+    'commerce_product_display_manager_product_form' => array(
+      'already_has_reference' => t('The product is already referenced by the specified display node.'),
+      'node_not_found' => t('Could not find any node with the specified node ID.'),
+      'title_missing' => t('You have to enter a title for the new display node.'),
+      'not_created' => t('The new display node could not be created.'),
+      'node_full' => t('The display node cannot reference to more products, limit reached.'),
+      'added_new' => t('Added!'),
+      'added_existing' => t('Added!'),
+    )
+  ), 'setting');
+
+  return $form_element;
+}
diff --git a/commerce_product_display_manager_product_clone.inc b/commerce_product_display_manager_product_clone.inc
new file mode 100644
index 0000000..4d36bcd
--- /dev/null
+++ b/commerce_product_display_manager_product_clone.inc
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * Menu callback to clone a product.
+ */
+function commerce_product_display_manager_product_ui_product_form_wrapper($product, $base_product) {
+
+  // Override the base product values indicating this is a new one.
+  $clone = clone($base_product);
+  $clone->is_new = $product->is_new;
+  $clone->created = $product->created;
+  $clone->changed = $product->changed;
+  $clone->status = $product->status;
+  $clone->uid = $product->uid;
+  $clone->product_id = $product->product_id;
+  $clone->revision_id = $product->revision_id;
+
+  module_load_include('inc', 'commerce_product_ui', 'includes/commerce_product_ui.products');
+
+  return commerce_product_ui_product_form_wrapper($clone);
+
+}
diff --git a/commerce_product_display_manager_product_display_manager_form.css b/commerce_product_display_manager_product_display_manager_form.css
new file mode 100644
index 0000000..dcca0ee
--- /dev/null
+++ b/commerce_product_display_manager_product_display_manager_form.css
@@ -0,0 +1,27 @@
+#commerce_product_display_manager_product_display_manager tr.display-node {
+  font-weight: bold;
+  border-top: 1px solid #7f7f7f;
+}
+
+#commerce_product_display_manager_product_display_manager tr.display-node.orphans {
+  font-weight: bold;
+  font-style: italic;
+  border-top: 3px solid black;
+
+}
+
+#commerce_product_display_manager_product_display_manager tr.display-node.orphans td {
+  opacity:0.75;
+}
+
+#commerce_product_display_manager_product_display_manager tr.display-node.first {
+  border-top: 0;
+}
+
+#commerce_product_display_manager_product_display_manager tr.product-orphan {
+  font-style: italic;
+}
+
+#commerce_product_display_manager_product_display_manager tr.product-orphan td {
+  opacity:0.75;
+}
diff --git a/commerce_product_display_manager_product_display_manager_form.js b/commerce_product_display_manager_product_display_manager_form.js
new file mode 100644
index 0000000..739bd40
--- /dev/null
+++ b/commerce_product_display_manager_product_display_manager_form.js
@@ -0,0 +1,28 @@
+Drupal.behaviors.commerce_product_display_manager_product_display_manager_form = {
+  attach: function(context, settings) {
+
+    (function ($) {
+
+      if (typeof Drupal.tableDrag == 'undefined' || typeof Drupal.tableDrag.commerce_product_display_manager_product_display_manager == 'undefined') {
+        return;
+      }
+
+      // Add drop listener for rows to set their css classes.
+      Drupal.tableDrag.commerce_product_display_manager_product_display_manager.onDrop = function () {
+
+        $parent = $(this.oldRowElement).prevAll('tr.display-node:first');
+        if ($parent.hasClass('orphans')) {
+          $(this.oldRowElement).removeClass('product');
+          $(this.oldRowElement).addClass('product-orphan');
+        }
+        else {
+          $(this.oldRowElement).addClass('product');
+          $(this.oldRowElement).removeClass('product-orphan');
+        }
+
+      }
+
+    })(jQuery);
+
+  }
+};
diff --git a/commerce_product_display_manager_product_form_reference.css b/commerce_product_display_manager_product_form_reference.css
new file mode 100644
index 0000000..13309cd
--- /dev/null
+++ b/commerce_product_display_manager_product_form_reference.css
@@ -0,0 +1,60 @@
+/**
+ *  The long names are created by the $form['#tree'] property.
+ */
+
+#commerce_product_display_manager_product_referenced_by {
+  margin-top: 10px;
+}
+
+#commerce_product_display_manager_product_referenced_by .hidden {
+  display: none !important;
+}
+
+#commerce_product_display_manager_product_referenced_by div.commerce-pdm-product-form-reference-add-links {
+  font-weight: bold !important;
+}
+
+#commerce_product_display_manager_product_referenced_by tr.add-new {
+  border-top: 1px solid black;
+}
+
+#commerce_product_display_manager_product_referenced_by
+div.commerce-pdm-product-form-reference-add-actions
+div.actions div.form-item,
+#commerce_product_display_manager_product_referenced_by div.commerce-pdm-product-form-reference-add-links,
+#commerce_product_display_manager_product_referenced_by #edit-quick-reference-add-new-reference-actions-commerce-pdm-product-display-cancel,
+#edit-quick-reference-add-new-reference-actions-commerce-pdm-product-display-add,
+#commerce_product_display_manager_product_referenced_by tr.add-new label {
+  float: left;
+}
+
+
+#commerce_product_display_manager_product_referenced_by tr.add-new label {
+  margin-right: 5px;
+}
+
+div.form-item-quick-reference-add-new-reference-actions-commerce-pdm-product-display-title,
+#edit-quick-reference-add-new-reference-actions-commerce-pdm-product-display-cancel,
+#edit-quick-reference-add-new-reference-actions-commerce-pdm-product-display-add {
+  margin-left: 15px !important;
+}
+
+#commerce_product_display_manager_product_referenced_by tr.deleted input {
+  text-decoration: line-through;
+  opacity: 0.5;
+}
+
+#commerce_product_display_manager_product_referenced_by div.commerce-pdm-product-form-reference-error-message {
+  float: left;
+  margin-left: 15px !important;
+}
+
+/**
+ * Make it look like regular text.
+ */
+#commerce_product_display_manager_product_referenced_by input.commerce-pdm-reference-title,
+#commerce_product_display_manager_product_referenced_by input.commerce-pdm-reference-nid {
+  border: 0 !important;
+  background-color: transparent !important;
+  color: inherit !important;
+}
diff --git a/commerce_product_display_manager_product_form_reference.js b/commerce_product_display_manager_product_form_reference.js
new file mode 100644
index 0000000..f347dd5
--- /dev/null
+++ b/commerce_product_display_manager_product_form_reference.js
@@ -0,0 +1,250 @@
+Drupal.behaviors.commerce_product_display_manager_form_commerce_product_ui_product_form_alter = {
+  attach: function(context, settings) {
+
+    (function ($) {
+
+      var commerce_product_display_manager_TYPE_MESSAGE_INFORMATION = 'commercePdmTypeMessageInfomration';
+      var commerce_product_display_manager_TYPE_MESSAGE_ERROR = 'commercePdmTypeMessageError';
+
+      // Declare all used elements as understandable variables.
+      $table = $('table#commerce_product_display_manager_product_referenced_by');
+      $newTitleInput = $table.find('input#edit-quick-reference-add-new-reference-actions-commerce-pdm-product-display-title');
+      $newTypeSelect = $table.find('select#edit-quick-reference-add-new-reference-actions-commerce-pdm-product-display-type');
+      $existingNidInput = $table.find('input#edit-quick-reference-add-new-reference-actions-commerce-pdm-product-display-existing');
+      $addButton = $table.find('a#edit-quick-reference-add-new-reference-actions-commerce-pdm-product-display-add');
+
+      /**
+       *
+       */
+      $addButton.bind('click', function(e) {
+        if (!$table.find('div.add-new').hasClass('hidden')) {
+          addNew();
+        }
+        else {
+          addExisting();
+        }
+
+        return false;
+      })
+
+      /**
+       *
+       */
+      $newTitleInput.bind('keypress', function(e) {
+        if (e.keyCode == 13) {
+          addNew();
+          return false;
+        }
+      });
+
+      /**
+       *
+       */
+      $existingNidInput.bind('keypress', function(e) {
+        // Accept only when the ENTER key has been presses and the autocomplete
+        // list is hidden.
+        if (e.keyCode == 13 && $(this).siblings('#autocomplete').length == 0) {
+          addExisting();
+          return false;
+        }
+      });
+
+      /**
+       *
+       */
+      function addExisting() {
+        // Display throbber.
+        $existingNidInput.css('background-position', '100% -16px');
+        $.ajax({
+          url: Drupal.settings.basePath + 'commerce_product_display_manager/get_node_info/' + $existingNidInput.val(),
+          dataTypeString: 'json',
+          complete: function() {
+            // Hide throbber.
+            $existingNidInput.css('background-position', '100% 4px');
+          },
+          success: function(result) {
+            if (result.success) {
+              if ($('input.commerce-pdm-reference-nid[val="' + result.data.nid + '"]').length == 0) {
+                addReferencedRow(result.data.title, result.data.nid, 0);
+                displayMessage(Drupal.settings.commerce_product_display_manager_product_form.added_existing, commerce_product_display_manager_TYPE_MESSAGE_INFORMATION);
+              }
+              else { // This product is already referenced by that display node.
+                displayMessage(Drupal.settings.commerce_product_display_manager_product_form.already_has_reference, commerce_product_display_manager_TYPE_MESSAGE_ERROR);
+              }
+            }
+            else {
+              if (result.message == 'node_full') {
+                displayMessage(Drupal.settings.commerce_product_display_manager_product_form.node_full, commerce_product_display_manager_TYPE_MESSAGE_ERROR);
+              }
+              else {
+                displayMessage(Drupal.settings.commerce_product_display_manager_product_form.node_not_found, commerce_product_display_manager_TYPE_MESSAGE_ERROR);
+              }
+            }
+          }
+        });
+      }
+
+      /**
+       *
+       */
+      function addNew() {
+        if ($newTitleInput.val().length > 0) {
+          var displayNodeType = $newTypeSelect.val();
+          var displatNodeTitle = $newTitleInput.val();
+
+          displayMessage(Drupal.settings.commerce_product_display_manager_product_form.added_new, commerce_product_display_manager_TYPE_MESSAGE_INFORMATION);
+          addReferencedRow(displatNodeTitle, 'New (' + displayNodeType + ')', displayNodeType);
+        }
+        else {
+          displayMessage(Drupal.settings.commerce_product_display_manager_product_form.title_missing, commerce_product_display_manager_TYPE_MESSAGE_ERROR);
+        }
+      }
+
+      /**
+       *
+       */
+      function addReferencedRow(title, nid, newType) {
+        var numRows =  $table .find('tr').length - 3;
+        var $template = $table.find('tr.reference-row-template');
+        var $new_row = $template.clone();
+
+        $new_row.find('input.commerce-pdm-reference-attach').val(1);
+
+        var $titleInput = $new_row.find('input#edit-quick-reference-commerce-pdm-product-reference-row-template-title');
+        var $titleDiv = $new_row.find('div.form-item-quick-reference-commerce-pdm-product-reference-row-template-title');
+        var $nidInput = $new_row.find('input#edit-quick-reference-commerce-pdm-product-reference-row-template-nid');
+        var $nidDiv = $new_row.find('div.form-item-quick-reference-commerce-pdm-product-reference-row-template-nid');
+        var $attachInput = $new_row.find('input.commerce-pdm-reference-attach');
+        var $newTypeInput = $new_row.find('input.commerce-pdm-reference-new-type');
+        var $newType = $new_row.find('input.commerce-pdm-reference-new-type');
+        var $deleted = $new_row.find('input.commerce-pdm-reference-deleted');
+
+        $new_row.find('a, input').attr('id', '');
+
+        $titleInput.attr('id', 'edit-quick-reference-' + numRows + '-title');
+        $titleInput.attr('name', 'quick_reference[' + numRows  + '][title]');
+        $titleDiv.removeClass('form-item-quick-reference-commerce-pdm-product-reference-row-template-title');
+        $titleDiv.addClass('form-item-quick-reference-' + numRows + '-title');
+
+        $nidInput.attr('id', 'edit-quick-reference-' + numRows + '-nid');
+        $nidInput.attr('name', 'quick_reference[' + numRows  + '][nid]');
+        $nidInput.attr('val', nid);  // Because we need to check this later and value is not set???
+        $nidDiv.removeClass('form-item-quick-reference-commerce-pdm-product-reference-row-template-nid');
+        $nidDiv.addClass('form-item-quick-reference-' + numRows + '-nid');
+
+        $newType.attr('name', 'quick_reference[' + numRows + '][new_type]');
+        $deleted.attr('name', 'quick_reference[' + numRows + '][deleted]');
+        $attachInput.attr('name', 'quick_reference[' + numRows + '][attach]');
+
+        $new_row.removeClass('hidden').removeClass('reference-row-template');
+
+        $titleInput.val(title);
+        $nidInput.val(nid);
+        $newTypeInput.val(newType);
+        $new_row.find('input.commerce-pdm-new-reference').val(newType);
+
+        $new_row.removeClass('odd').removeClass('even');
+        $alternateRowClass = numRows % 2 ? 'even' : 'odd';
+        $new_row.addClass($alternateRowClass);
+
+        $template.before($new_row);
+        $new_row.hide();
+        $new_row.fadeIn(250);
+
+        resetReferenceAddingRow();
+      }
+
+      /**
+       *
+       */
+      function resetReferenceAddingRow() {
+        $newTitleInput.val('');
+        $existingNidInput.val('');
+        toggleActionsVisible();
+      }
+
+      /**
+       *
+       */
+      function displayMessage(msg, messageType) {
+        $messageContainer = $('table#commerce_product_display_manager_product_referenced_by div.commerce-pdm-product-form-reference-error-message');
+        $messageContainer.css('color', (messageType == commerce_product_display_manager_TYPE_MESSAGE_INFORMATION) ? 'green' : 'red');
+        $messageContainer.text(msg);
+        $messageContainer.fadeIn(250).delay(1750).fadeOut(250);
+      }
+
+      /**
+       *
+       */
+      $('table#commerce_product_display_manager_product_referenced_by a.commerce-pdm-reference-delete').live('click', function() {
+        $(this).parents('tr').addClass('deleted');
+        $(this).siblings('input.commerce-pdm-reference-deleted').val(1);
+
+        $(this).addClass('hidden');
+        $(this).siblings('a.commerce-pdm-reference-undo-delete').removeClass('hidden');
+
+        return false;
+      });
+
+      /**
+       *
+       */
+      $('table#commerce_product_display_manager_product_referenced_by a.commerce-pdm-reference-undo-delete').live('click', function() {
+        $(this).parents('tr').removeClass('deleted');
+        $(this).siblings('input.commerce-pdm-reference-deleted').val(0);
+
+        $(this).addClass('hidden');
+        $(this).siblings('a.commerce-pdm-reference-delete').removeClass('hidden');
+
+        return false;
+      });
+
+      /**
+       *
+       */
+      $('fieldset#edit-quick-reference div.commerce-pdm-product-form-reference-add-links a').bind('click', function(e) {
+        var $add_new = $('fieldset#edit-quick-reference div.commerce-pdm-product-form-reference-add-actions div.add-new');
+        var $existing = $('fieldset#edit-quick-reference div.commerce-pdm-product-form-reference-add-actions div.existing');
+        if ($(this).attr('rel') == 'use_existing') {
+          $add_new.addClass('hidden');
+          $existing.removeClass('hidden');
+        }
+        else {
+          $add_new.removeClass('hidden');
+          $existing.addClass('hidden');
+        }
+
+        toggleActionsVisible();
+
+        return false;
+      });
+
+      /**
+       *
+       */
+      $table.find('a#edit-quick-reference-add-new-reference-actions-commerce-pdm-product-display-cancel').bind('click', function(e) {
+        resetReferenceAddingRow();
+        return false;
+      });
+
+      /**
+       *
+       */
+      function toggleActionsVisible() {
+        var $links = $('fieldset#edit-quick-reference div.commerce-pdm-product-form-reference-add-links');
+        var $actions = $('fieldset#edit-quick-reference div.commerce-pdm-product-form-reference-add-actions');
+
+        if ($links.hasClass('hidden')) {
+          $links.removeClass('hidden');
+          $actions.addClass('hidden');
+        }
+        else {
+          $links.addClass('hidden');
+          $actions.removeClass('hidden');
+        }
+      }
+
+    })(jQuery);
+
+  }
+};
