diff --git a/patternbuilder.module b/patternbuilder.module
index b84dee9..d2ae458 100644
--- a/patternbuilder.module
+++ b/patternbuilder.module
@@ -28,6 +28,17 @@ function patternbuilder_hook_info() {
 }
 
 /**
+ * Implements hook_permission().
+ */
+function patternbuilder_permission() {
+  return array(
+    'patternbuilder view reports' => array(
+      'title' => t('Patternbuilder view reports'),
+    ),
+  );
+}
+
+/**
  * Implements hook_menu().
  */
 function patternbuilder_menu() {
@@ -57,6 +68,24 @@ function patternbuilder_menu() {
     'weight' => 10,
   );
 
+  $items['admin/content/patterns'] = array(
+    'title' => 'Patterns',
+    'description' => 'List the patterns used by nodes',
+    'page callback' => 'patternbuilder_pattern_summary_list',
+    'access arguments' => array('patternbuilder view reports'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'patternbuilder.report.inc',
+  );
+
+  $items['admin/content/patterns/node'] = array(
+    'title' => 'Pattern Nodes',
+    'description' => 'List all nodes that is using given pattern.',
+    'page callback' => 'patternbuilder_pattern_pattern_node_list',
+    'access arguments' => array('patternbuilder view reports'),
+    'type' => MENU_LOCAL_TASK,
+    'file' => 'patternbuilder.report.inc',
+  );
+
   return $items;
 }
 
diff --git a/patternbuilder.report.inc b/patternbuilder.report.inc
new file mode 100644
index 0000000..a6f5d2a
--- /dev/null
+++ b/patternbuilder.report.inc
@@ -0,0 +1,464 @@
+<?php
+
+/**
+ * @file
+ * Inventory Report for the Patternbuilder module.
+ */
+
+/**
+ * Get the pattern nids or count of nodes.
+ *
+ * @param string $bundle
+ *   The patternbuilder bundle name.
+ * @param array $param
+ *   An array to use in query to filter.
+ *
+ * @return array
+ *   Return the array of all the nodes.
+ */
+function _patternbuilder_get_pattern_nodes($bundle, $param = array()) {
+  $fields = _patternbuilder_get_pattern_get_fields($bundle);
+
+  $nodes = array();
+  if (!empty($fields)) {
+    $paragraphs = array();
+    foreach ($fields as $key => $field) {
+      $field_info = field_info_field($key);
+      if (!empty($field_info['bundles']['paragraphs_item'])) {
+        // A field can have multiple bundles selected to reference,
+        // Loop to get all the nodes for all the selected bundles.
+        foreach ($field_info['bundles']['paragraphs_item'] as $sub_bundle) {
+          // Get all the paraph items to search nodes.
+          $paragraphs_items = _patternbuilder_get_pragraph_items($bundle, $key);
+          $param['paragraphs_item'] = array();
+          foreach ($paragraphs_items as $field_key => $items) {
+            $param['paragraphs_item'] = $items;
+            $nodes += _patternbuilder_paragraph_pattern_nodes_fetchall($sub_bundle, $field_key, $param);
+          }
+        }
+      }
+      else {
+        $nodes += _patternbuilder_paragraph_pattern_nodes_fetchall($bundle, $key, $param);
+      }
+    }
+  }
+  return $nodes;
+}
+
+/**
+ * Get the paragraph entities of given field.
+ *
+ * @param string $bundle
+ *   The patternbuilder bundle name.
+ * @param string $field
+ *   The field name.
+ *
+ * @return array
+ *   Return the array of all the paragraph items.
+ */
+function _patternbuilder_get_pragraph_items($bundle, $field) {
+  $table = 'field_data_' . $field;
+  $item_ids = array();
+  if (db_table_exists($table)) {
+    $query = db_select('paragraphs_item', 'pi');
+    $query->innerJoin($table, 'fi', "pi.item_id = fi.{$field}_value");
+    $query->innerJoin('paragraphs_item', 'pi2', "pi2.item_id = fi.entity_id");
+    $query->fields('pi2');
+    $query->condition('pi.bundle', $bundle);
+    $ids = $query->execute()->fetchAllAssoc('item_id', PDO::FETCH_ASSOC);
+
+    foreach ($ids as $item_id => $info) {
+      $item_ids[$info['field_name']][$item_id] = $item_id;
+    }
+  }
+  return $item_ids;
+}
+
+/**
+ * Get the node items of given entity.
+ *
+ * @param string $bundle
+ *   The patternbuilder bundle name.
+ * @param string $field
+ *   The field name.
+ * @param array $param
+ *   An array to use in query to filter.
+ *
+ * @return array
+ *   Return the array of all the nodes.
+ */
+function _patternbuilder_paragraph_pattern_nodes_fetchall($bundle, $field, $param) {
+  // Set default param type and language.
+  $param += array('type' => array(), 'language' => array());
+  $nodes = array();
+
+  $table = 'field_data_' . $field;
+  if (db_table_exists($table)) {
+    $query = db_select('paragraphs_item', 'pi');
+    $query->innerJoin($table, 'fi', "pi.item_id = fi.{$field}_value");
+    $query->innerJoin('node', 'n', 'n.nid = fi.entity_id');
+    $query->leftJoin('node_revision', 'node_revision', 'n.vid = node_revision.vid');
+    $query->leftJoin('users', 'users_node_revision', 'node_revision.uid = users_node_revision.uid');
+    $query->innerJoin('workbench_moderation_node_history', 'wh', 'n.nid = wh.nid and is_current = 1');
+    $query->fields('pi', array('item_id', 'bundle'));
+    $query->fields('wh', array('state', 'published'));
+    $query->fields('n');
+    $query->fields('users_node_revision', array('uid', 'name'));
+    $query->condition('pi.bundle', $bundle);
+
+    $type = array_filter((array) $param['type']);
+    $language = array_filter((array) $param['language']);
+
+    if (!empty($type)) {
+      $query->condition('n.type', $type, 'IN');
+    }
+
+    if (!empty($param['state'])) {
+      $query->condition('wh.state', $param['state']);
+    }
+
+    if (!empty($language)) {
+      $query->condition('n.language', $language, 'IN');
+    }
+
+    if (!empty($param['paragraphs_item'])) {
+      $query->condition('pi.item_id', $param['paragraphs_item'], 'IN');
+    }
+
+    $query->groupBy('n.nid');
+    $nodes = $query->execute()->fetchAllAssoc('nid', PDO::FETCH_ASSOC);
+  }
+
+  return $nodes;
+}
+
+/**
+ * Get field names of given pattern builder bundle.
+ *
+ * @param string $bundle
+ *   The bundle name.
+ *
+ * @return array
+ *   Return the array of fields name.
+ */
+function _patternbuilder_get_pattern_get_fields($bundle) {
+  $pattern_fields = &drupal_static(__FUNCTION__);
+  if (!isset($pattern_fields[$bundle])) {
+    $query = db_select('paragraphs_item', 'pi');
+    $query->fields('pi');
+    $query->groupBy('field_name');
+    $query->condition('pi.bundle', $bundle);
+    $pattern_fields[$bundle] = $query->execute()->fetchAllAssoc('field_name', PDO::FETCH_ASSOC);
+  }
+  return $pattern_fields[$bundle];
+}
+
+/**
+ * List all the pattern with node count and pattern status.
+ *
+ * @return array
+ *   Return renderable array.
+ */
+function patternbuilder_pattern_summary_list() {
+  $page = array();
+  // Disclaimer to show on the page.
+  $page['disclaimer'] = array(
+    '#type' => 'item',
+    '#title' => t('Disclaimer'),
+    '#markup' => t('This view only shows *nodes* using these patterns, but patterns may also be used by views or hard-coded content types (country page).'),
+  );
+
+  // Filter form.
+  $page['pattern_list_filter'] = drupal_get_form('patternbuilder_pattern_list_filter_form');
+  $query_param = drupal_get_query_parameters();
+
+  $header = array(
+    array(
+      'data' => t('Machine name'),
+      'field' => 'c.machine_name',
+      'sort' => 'ASC'
+    ),
+    array(
+      'data' => t('Bundle name'),
+      'field' => 'c.bundle_name'
+    ),
+    array(
+      'data' => t('Status'),
+      'field' => 'c.status'
+    ),
+    t('No. of nodes'),
+  );
+
+  $query = db_select('patternbuilder_components', 'c');
+  $query->fields('c')
+    ->condition('c.pattern_type', 'pattern')
+    ->condition('c.bundle_name', '', '<>')
+    ->groupBy('c.bundle_name');
+  $query->extend('TableSort')->orderByHeader($header);
+  $patterns = $query->execute()->fetchAllAssoc('machine_name');
+
+  $rows = array();
+  foreach ($patterns as $bundle) {
+    if (!empty($query_param['status']) && $bundle->status != $query_param['status']) {
+      continue;
+    }
+
+    $nodes = _patternbuilder_get_pattern_nodes($bundle->bundle_name);
+    $count = count($nodes);
+    $row = array(
+      array(
+        'data' => l($bundle->machine_name, 'admin/content/patterns/node', array('query' => array('bundle' => $bundle->bundle_name))),
+      ),
+      array(
+        'data' => l($bundle->bundle_name, 'admin/content/patterns/node', array('query' => array('bundle' => $bundle->bundle_name))),
+      ),
+      array(
+        'data' => $bundle->status,
+      ),
+      array(
+        'data' => $count ? $count : '-',
+      ),
+    );
+    $rows[$bundle->bundle_name] = $row;
+  }
+
+  // Render paragraphs bundle table.
+  $page['pattern_list_table'] = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => $rows,
+    '#empty' => t('No Pattern have been defined yet.'),
+  );
+
+  return $page;
+}
+
+/**
+ * List all the nodes that are using given pattern.
+ *
+ * @return array
+ *   Return renderable array.
+ */
+function patternbuilder_pattern_pattern_node_list() {
+  $page = array();
+
+  $query_param = drupal_get_query_parameters();
+  $bundles = (array) $query_param['bundle'];
+
+  $nodes = $component = array();
+  foreach ($bundles as $bundle) {
+    $component[$bundle] = patternbuilder_get_bundle_component($bundle);
+    $nodes += _patternbuilder_get_pattern_nodes($bundle, $query_param);
+  }
+
+  $header = array(
+    t('Nid'),
+    t('Title'),
+    t('Content type'),
+    t('Language'),
+    t('Revision author'),
+    t('Last updated'),
+    t('Node status'),
+    t('Pattern name'),
+    t('Pattern type'),
+    t('Pattern status'),
+    array('data' => t('Operations'), 'colspan' => '2')
+  );
+
+  $rows = $content_types = array();
+  foreach ($nodes as $node) {
+    $content_types[$node['type']] = $node['type'];
+    $row = array(
+      array(
+        'data' => $node['nid'],
+      ),
+      array(
+        'data' => l($node['title'], 'node/' . $node['nid']),
+      ),
+      array(
+        'data' => $node['type'],
+      ),
+      array(
+        'data' => ($node['language'] == LANGUAGE_NONE) ? t('Language neutral') : locale_language_name($node['language']),
+      ),
+      array(
+        'data' => theme('username', array('account' => (object) $node)),
+      ),
+      array(
+        'data' => format_date($node['changed'], 'short'),
+      ),
+      array(
+        'data' => $node['state'],
+      ),
+      array(
+        'data' => $node['bundle'],
+      ),
+      array(
+        'data' => !empty($component[$node['bundle']]) ? $component[$node['bundle']]->pattern_type : '',
+      ),
+      array(
+        'data' => !empty($component[$node['bundle']]) ? $component[$node['bundle']]->status : '',
+      ),
+      array(
+        'data' => l(t('edit'), 'node/' . $node['nid'] . '/edit')
+      ),
+      array(
+        'data' => l(t('delete'), 'node/' . $node['nid'] . '/delete')
+      )
+    );
+
+    $rows[$node['nid']] = $row;
+  }
+
+  // Items to show per page.
+  $per_page = 50;
+  // Initialize the pager
+  $current_page = pager_default_initialize(count($rows), $per_page);
+  // Split your list into page sized chunks
+  $chunks = array_chunk($rows, $per_page, TRUE);
+
+  // Disclaimer to show on the page.
+  $page['disclaimer'] = array(
+    '#type' => 'item',
+    '#title' => t('Disclaimer'),
+    '#markup' => t('This view only shows *nodes* using the selected patterns, but patterns may also be used by views or hard-coded content types (country page).'),
+  );
+
+  $page['pattern_list_filter'] = drupal_get_form('patternbuilder_pattern_list_filter_form', 'bundle', array('content_type' => $content_types));
+
+  // Render paragraphs bundle table.
+  $page['pattern_list_table'] = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => !empty($chunks[$current_page]) ? $chunks[$current_page] : array(),
+    '#empty' => t('No Node have been created for this pattern yet.'),
+  );
+
+  if (count($rows) > $per_page) {
+    $page['pattern_list_table_pager'] = array('#theme' => 'pager', array('quantity' => count($rows)));
+  }
+
+  return $page;
+}
+
+/**
+ * Return array of pattern bundle list.
+ *
+ * @return array
+ *   Array of bundle names.
+ */
+function _patternbuilder_get_pattern_list_options() {
+  $patterns = patternbuilder_get_bundle_component_map();
+  $options = array('' => t('Select'));
+  foreach ($patterns as $pattern) {
+    $options[$pattern->bundle_name] = $pattern->bundle_name;
+  }
+  return $options;
+}
+
+/**
+ * Return array of all enabled languages.
+ *
+ * @return array
+ *   Array of language list.
+ */
+function _patternbuilder_get_language_options() {
+  $languages = language_list('enabled');
+  $languages = current($languages);
+  $options = array('' => t('Select'));
+  $options[LANGUAGE_NONE] = t('Language neutral');
+  foreach ($languages as $language) {
+    $options[$language->language] = $language->name;
+  }
+  return $options;
+}
+
+/**
+ * Workbench moderation state list.
+ *
+ * @return array
+ *   Array of workbench moderation states list.
+ */
+function _patternbuilder_get_workbench_state_options() {
+  $states = workbench_moderation_states();
+  $options = array('' => t('Select'));
+  foreach ($states as $state) {
+    $options[$state->name] = $state->label;
+  }
+  return $options;
+}
+
+/**
+ * Pattern filter form for the list view and patterns node list view.
+ *
+ * @param string $element
+ *   Form element to show, by default it's status.
+ * @param array $param
+ *   Extra parameter to define extra conditions.
+ *
+ * @return array
+ *   Array of Form elements.
+ */
+function patternbuilder_pattern_list_filter_form($form, &$form_state, $element = 'status', $param = array()) {
+  $query_param = drupal_get_query_parameters();
+  if ($element == 'status') {
+    $status_options = patternbuilder_pattern_status_options_list();
+    array_unshift($status_options, t('Select'));
+
+    $form['status'] = array(
+      '#type' => 'select',
+      '#title' => t('Status'),
+      '#options' => $status_options,
+      '#default_value' => !empty($query_param['status']) ? $query_param['status'] : NULL,
+    );
+  }
+  else {
+
+    $form['type'] = array(
+      '#type' => 'select',
+      '#title' => t('Content Type'),
+      '#options' => $param['content_type'],
+      '#multiple' => TRUE,
+      '#default_value' => !empty($query_param['type']) ? (array) $query_param['type'] : NULL,
+    );
+
+    $form['bundle'] = array(
+      '#type' => 'select',
+      '#title' => t('Pattern Bundle'),
+      '#options' => _patternbuilder_get_pattern_list_options(),
+      '#multiple' => TRUE,
+      '#default_value' => !empty($query_param['bundle']) ? (array) $query_param['bundle'] : NULL,
+    );
+
+    $form['language'] = array(
+      '#type' => 'select',
+      '#title' => t('Language'),
+      '#options' => _patternbuilder_get_language_options(),
+      '#multiple' => TRUE,
+      '#default_value' => !empty($query_param['language']) ? (array) $query_param['language'] : NULL,
+    );
+
+    $form['state'] = array(
+      '#type' => 'select',
+      '#title' => t('State'),
+      '#options' => _patternbuilder_get_workbench_state_options(),
+      '#default_value' => !empty($query_param['state']) ? (array) $query_param['state'] : NULL,
+    );
+  }
+
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Submit'),
+  );
+
+  return $form;
+}
+
+/**
+ * Form submit callback.
+ */
+function patternbuilder_pattern_list_filter_form_submit(&$form, &$form_state) {
+  form_state_values_clean($form_state);
+  $values = $form_state['values'];
+  $form_state['redirect'] = array(current_path(), array('query' => $values));
+}
