diff --git a/modules/patternbuilder_importer/patternbuilder_importer.drush.inc b/modules/patternbuilder_importer/patternbuilder_importer.drush.inc
index 70fad23..395f6b1 100644
--- a/modules/patternbuilder_importer/patternbuilder_importer.drush.inc
+++ b/modules/patternbuilder_importer/patternbuilder_importer.drush.inc
@@ -19,11 +19,13 @@ function patternbuilder_importer_drush_command() {
     ),
     'options' => array(
       'all' => 'Forces the import of all schemas and ignores any name arguments',
+      'changed' => 'Import schemas that are changed and ignores any name arguments',
       'type' => 'Imports schemas for a specific pattern type.',
     ),
     'examples' => array(
       'drush pbi' => 'Import all schemas.',
       'drush pbi --all' => 'Force the import of all schemas even if specific schemas are defined.',
+      'drush pbi --changed' => 'Force the import schemas that are changed even if specific schemas are defined.',
       'drush pbi band card' => 'Import only the "band" and "card" schemas.',
       'drush pbi --type=layout' => 'Import only the schemas for the "layout" pattern type.',
     ),
@@ -55,10 +57,14 @@ function patternbuilder_importer_drush_command() {
  */
 function drush_patternbuilder_importer_pbi() {
   $is_all = drush_get_option('all');
+  $is_changed = drush_get_option('changed');
 
   if ($is_all) {
     patternbuilder_importer_import_schemas();
   }
+  elseif ($is_changed) {
+    patternbuilder_importer_import_schemas(array(), array(), TRUE);
+  }
   else {
     $schema_names = func_get_args();
     $schema_names = !empty($schema_names) ? $schema_names : array();
@@ -117,6 +123,12 @@ function drush_patternbuilder_importer_pbi_remove() {
     // Remove bundle.
     foreach ($patterns_to_remove as $bundle_name => $component) {
       paragraphs_bundle_delete($bundle_name);
+
+      db_update('patternbuilder_components')
+        ->fields(array('pattern_hash' => ''))
+        ->condition('bundle_name', $bundle_name)
+        ->execute();
+
       drush_log(dt('@component (bundle: @bundle) removed.', array(
         '@component' => $component->machine_name,
         '@bundle' => $bundle_name,
diff --git a/modules/patternbuilder_importer/patternbuilder_importer.module b/modules/patternbuilder_importer/patternbuilder_importer.module
index dcbf77b..6ea8646 100644
--- a/modules/patternbuilder_importer/patternbuilder_importer.module
+++ b/modules/patternbuilder_importer/patternbuilder_importer.module
@@ -93,6 +93,74 @@ function _patternbuilder_importer_print($message, $type = NULL, $append_newline
 }
 
 /**
+ * Match given $ref string file name with $files array.
+ *
+ * @param string $ref
+ *   The raw file name.
+ * @param array $files
+ *   The array of files machine_name, against which we have to check.
+ *
+ * @return bool
+ *   Return true if it matches else false.
+ */
+function _patternbuilder_importer_match_with_ref($ref, array $files) {
+  if (strpos($ref, '.json') !== FALSE  && preg_match('@^([^\/]+)\.json@', $ref, $matches)) {
+    if (in_array($matches[1], $files)) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Function that check for the $ref in files.
+ *
+ * Check if the $ref is referring to the files that has been modified, and if it
+ * matches, then We have to reimport the parent json schema file as well. So,
+ * this function simply Search for $ref from the given properties, and matches
+ * with the array of $schema_files.
+ *
+ * @param array $schema
+ *   The properties array of json schema file.
+ * @param string $machine_name
+ *   The machine_name of file for which we are checking array.
+ * @param array $schema_files
+ *   The actual files that has been changed.
+ *
+ * @return bool
+ *   Return true if schema has $ref, that we are looking for.
+ */
+function _patternbuilder_importer_search_ref($schema, $machine_name, $schema_files) {
+  $files = array_keys($schema_files);
+
+  foreach ($schema as $key => $info) {
+    if (in_array($info->type, array('object', 'array'))) {
+      if ($info->type == 'object' && !empty($info->properties)) {
+        _patternbuilder_importer_search_ref($info->properties, $machine_name, $schema_files);
+      }
+      elseif ($info->type == 'array') {
+        _patternbuilder_importer_search_ref($info, $machine_name, $schema_files);
+      }
+    }
+    elseif (!empty($info->{'$ref'})) {
+      if (_patternbuilder_importer_match_with_ref($info->{'$ref'}, $files)) {
+        return TRUE;
+      }
+    }
+    elseif (!empty($info->oneOf)) {
+      foreach ($info->oneOf as $item) {
+        if (!empty($info->{'$ref'})) {
+          if (_patternbuilder_importer_match_with_ref($item->{'$ref'}, $files)) {
+            return TRUE;
+          }
+        }
+      }
+    }
+  }
+  return FALSE;
+}
+
+/**
  * Import pattern schemas.
  *
  * If no argument is provided then all schemas are imported.
@@ -103,16 +171,47 @@ function _patternbuilder_importer_print($message, $type = NULL, $append_newline
  *   Optional. A list of schema machine names.
  * @param array $pattern_types
  *   Optional. A list of pattern type machine names.
+ * @param bool $only_changed
+ *   Set to True to import given or all schemas, False for only changed schemas.
  *
  * @return bool
  *   TRUE if schemas were imported, else FALSE.
  */
-function patternbuilder_importer_import_schemas(array $schema_names = array(), array $pattern_types = array()) {
+function patternbuilder_importer_import_schemas(array $schema_names = array(), array $pattern_types = array(), $only_changed = FALSE) {
   patternbuilder_importer_invalidate_cache();
   $all_schema_files = patternbuilder_get_schemas(TRUE);
   $schema_files = $all_schema_files;
 
-  if (empty($all_schema_files)) {
+  // If only changed.
+  if ($only_changed) {
+    $existing_schemas = patternbuilder_components_load(NULL, TRUE);
+    foreach ($all_schema_files as $machine_name => $file) {
+      $file_hash = patternbuilder_generate_file_hash($file);
+      if (!empty($existing_schemas[$machine_name]) && $file_hash == $existing_schemas[$machine_name]->pattern_hash) {
+        unset($schema_files[$machine_name]);
+      }
+    }
+
+    foreach ($all_schema_files as $machine_name => $file) {
+      $schema = patternbuilder_importer_load_json((array) $file);
+      if (!empty($schema[0]['schema'])) {
+        $properties = $schema[0]['schema']->properties;
+        if (!empty($properties)) {
+          $is_changed = _patternbuilder_importer_search_ref($properties, $machine_name, $schema_files);
+          if ($is_changed) {
+            $schema_files[$machine_name] = $all_schema_files[$machine_name];
+          }
+        }
+      }
+    }
+
+    // Log the message when no schema file changed.
+    if (empty($schema_files)) {
+      watchdog('patternbuilder_importer', 'There were no schema files changes to improt.', array(), WATCHDOG_WARNING);
+      return FALSE;
+    }
+  }
+  elseif (empty($all_schema_files)) {
     watchdog('patternbuilder_importer', 'There were no schema files found to import.', WATCHDOG_WARNING);
     return FALSE;
   }
diff --git a/patternbuilder.install b/patternbuilder.install
index d47077a..0f13681 100644
--- a/patternbuilder.install
+++ b/patternbuilder.install
@@ -48,6 +48,11 @@ function patternbuilder_schema() {
         'length' => 32,
         'not null' => FALSE,
       ),
+      'pattern_hash' => array(
+        'description' => 'Pattern hash to compare when changed.',
+        'type' => 'varchar',
+        'length' => 64,
+      ),
     ),
     'primary key' => array('id'),
     'unique keys' => array(
@@ -473,3 +478,14 @@ function patternbuilder_update_7104() {
 function patternbuilder_update_7105() {
   _patternbuilder_install_add_patternbuilder_dirs();
 }
+
+/**
+ * Add file hash to compare for changed schema.
+ */
+function patternbuilder_update_7106() {
+  db_add_field('patternbuilder_components', 'pattern_hash', array(
+    'description' => 'Pattern hash to compare when changed.',
+    'type' => 'varchar',
+    'length' => 64,
+  ));
+}
diff --git a/patternbuilder.module b/patternbuilder.module
index b84dee9..27bd158 100644
--- a/patternbuilder.module
+++ b/patternbuilder.module
@@ -896,6 +896,12 @@ function patternbuilder_component_save(&$component) {
     $record['status'] = $default_status_key;
   }
 
+  $schemas = patternbuilder_get_schemas();
+  if (!empty($schemas[$record['machine_name']])) {
+    $schema_path = $schemas[$record['machine_name']];
+    $record['pattern_hash'] = patternbuilder_generate_file_hash($schema_path);
+  }
+
   // Ensure only allowed fields to update.
   $record = array_intersect_key($record, array(
     'machine_name' => 1,
@@ -903,6 +909,7 @@ function patternbuilder_component_save(&$component) {
     'status' => 1,
     'bundle_name' => 1,
     'field_name' => 1,
+    'pattern_hash' => 1,
   ));
 
   // Update record.
@@ -930,6 +937,19 @@ function patternbuilder_component_save(&$component) {
 }
 
 /**
+ * Pattern builder generate hash for the given file content.
+ *
+ * @param string $file_path
+ *   Json schema file path.
+ *
+ * @return string
+ *   Return hash string of the given file.
+ */
+function patternbuilder_generate_file_hash($file_path) {
+  return hash_file('md5', $file_path);
+}
+
+/**
  * Returns an array of some or all of the order statuses keyed by name.
  *
  * @param array $conditions
