diff --git a/modules/cloudinary_storage/cloudinary_storage.module b/modules/cloudinary_storage/cloudinary_storage.module
index 6d7a914..e2a01dc 100644
--- a/modules/cloudinary_storage/cloudinary_storage.module
+++ b/modules/cloudinary_storage/cloudinary_storage.module
@@ -1,5 +1,4 @@
 <?php
-use Drupal\Core\Form\FormStateInterface;
 
 /**
  * @file
@@ -188,7 +187,7 @@ function cloudinary_storage_form_cloudinary_sdk_settings_alter(&$form, $form_sta
     '#default_value' => \Drupal::config('cloudinary_storage.settings')->get('cloudinary_storage_default'),
   );
 
-  // Unshfit exist storage clear checking.
+  // Unshift exist storage clear checking.
   array_unshift($form['#submit'], 'cloudinary_storage_settings_submit');
 }
 
diff --git a/modules/cloudinary_storage/modules/cloudinary_storage_db/cloudinary_storage_db.info.yml b/modules/cloudinary_storage/modules/cloudinary_storage_db/cloudinary_storage_db.info.yml
index 3593833..6723bab 100644
--- a/modules/cloudinary_storage/modules/cloudinary_storage_db/cloudinary_storage_db.info.yml
+++ b/modules/cloudinary_storage/modules/cloudinary_storage_db/cloudinary_storage_db.info.yml
@@ -3,6 +3,6 @@ description: 'The module provides stores information in database for uploaded Cl
 package: Cloudinary
 core: 8.x
 dependencies:
-  - cloudinary_storage
-  - cloudinary
+  - cloudinary:cloudinary_storage
+  - cloudinary:cloudinary
 type: module
diff --git a/modules/cloudinary_storage/modules/cloudinary_storage_db/cloudinary_storage_db.install b/modules/cloudinary_storage/modules/cloudinary_storage_db/cloudinary_storage_db.install
index f1f3636..e9e7961 100644
--- a/modules/cloudinary_storage/modules/cloudinary_storage_db/cloudinary_storage_db.install
+++ b/modules/cloudinary_storage/modules/cloudinary_storage_db/cloudinary_storage_db.install
@@ -5,10 +5,12 @@
  * Provides installation functions.
  */
 
+use Drupal\cloudinary_storage_db\CloudinaryStorageDb;
+
 /**
- * Implements hook_disable().
+ * Implements hook_uninstall().
  */
-function cloudinary_storage_db_disable() {
+function cloudinary_storage_db_uninstall() {
   // Delete all saved resource data in db.
   $storage = new CloudinaryStorageDb();
   $storage->clear();
@@ -18,32 +20,34 @@ function cloudinary_storage_db_disable() {
  * Implements hook_schema().
  */
 function cloudinary_storage_db_schema() {
-  $schema['cloudinary_storage'] = array(
+  $schema['cloudinary_storage'] = [
     'description' => 'Stores information for uploaded Cloudinary files.',
-    'fields' => array(
-      'public_id' => array(
+    'fields' => [
+      'public_id' => [
         'description' => 'The public_id of Cloudinary file.',
         'type' => 'varchar',
         'length' => 255,
         'not null' => TRUE,
         'default' => '',
-      ),
-      'mode' => array(
+      ],
+      'mode' => [
         'description' => 'The file mode, file or directory.',
         'type' => 'int',
         'unsigned' => TRUE,
         'not null' => TRUE,
         'default' => 0,
-      ),
-      'metadata' => array(
+      ],
+      'metadata' => [
         'description' => 'The file metadata.',
         'type' => 'text',
         'serialize' => TRUE,
         'not null' => FALSE,
-      ),
-    ),
-    'primary key' => array(array('public_id', 100)),
-  );
+      ],
+    ],
+    'primary key' => [
+      ['public_id', 100]
+    ],
+  ];
 
   return $schema;
 }
diff --git a/modules/cloudinary_storage/modules/cloudinary_storage_db/cloudinary_storage_db.module b/modules/cloudinary_storage/modules/cloudinary_storage_db/cloudinary_storage_db.module
index 7b83142..28536ad 100644
--- a/modules/cloudinary_storage/modules/cloudinary_storage_db/cloudinary_storage_db.module
+++ b/modules/cloudinary_storage/modules/cloudinary_storage_db/cloudinary_storage_db.module
@@ -5,8 +5,6 @@
  * File for the cloudinary_storage_db module.
  */
 
-use Drupal\cloudinary_storage_db\CloudinaryStorageDb;
-
 /**
  * Implements hook_cloudinary_storage_info().
  */
diff --git a/modules/cloudinary_storage/modules/cloudinary_storage_db/cloudinary_storage_db.services.yml b/modules/cloudinary_storage/modules/cloudinary_storage_db/cloudinary_storage_db.services.yml
index 0a3fc8a..17a36bd 100644
--- a/modules/cloudinary_storage/modules/cloudinary_storage_db/cloudinary_storage_db.services.yml
+++ b/modules/cloudinary_storage/modules/cloudinary_storage_db/cloudinary_storage_db.services.yml
@@ -1,4 +1,3 @@
 services:
   cloudinary_storage_db:
     class: Drupal\cloudinary_storage_db\CloudinaryStorageDb
-    #arguments: [@service_container]
diff --git a/modules/cloudinary_storage/modules/cloudinary_storage_db/src/CloudinaryStorageDb.php b/modules/cloudinary_storage/modules/cloudinary_storage_db/src/CloudinaryStorageDb.php
index 5f45d6f..6d84b13 100644
--- a/modules/cloudinary_storage/modules/cloudinary_storage_db/src/CloudinaryStorageDb.php
+++ b/modules/cloudinary_storage/modules/cloudinary_storage_db/src/CloudinaryStorageDb.php
@@ -1,4 +1,5 @@
 <?php
+
 namespace Drupal\cloudinary_storage_db;
 
 use Drupal\cloudinary_storage\CloudinaryStorage;
@@ -12,53 +13,66 @@ use Drupal\cloudinary_storage\CloudinaryStorage;
  * Implements cloudinary storage with database.
  */
 class CloudinaryStorageDb extends CloudinaryStorage {
+
   /**
-   * Create or update cloudinary file resource into db.
+   * @inheritdoc
    */
-  protected function save($resource = array()) {
-    if (isset($resource['public_id']) && !empty($resource['mode'])) {
+  protected function save($resource = []) {
+    $public_id_key = self::CLOUDINARY_STORAGE_NAME_PUBLIC_ID;
+
+    if (isset($resource[$public_id_key]) && !empty($resource['mode'])) {
       $data = array(
-        'public_id' => $resource['public_id'],
+        'public_id' => $resource[$public_id_key],
         'mode' => $resource['mode'],
         'metadata' => serialize($resource),
       );
 
-      db_merge('cloudinary_storage')
-        ->key(array('public_id' => $data['public_id']))
+      \Drupal::database()->merge(self::CLOUDINARY_STORAGE_TABLE_NAME)
+        ->keys([$public_id_key => $data[$public_id_key]])
         ->fields($data)
         ->execute();
     }
   }
 
   /**
-   * Delete cloudinary file resource from db.
+   * @inheritdoc
    */
   protected function delete($public_id) {
-    db_delete('cloudinary_storage')
-      ->condition('public_id', $public_id)
+    \Drupal::database()->delete(self::CLOUDINARY_STORAGE_TABLE_NAME)
+      ->condition(self::CLOUDINARY_STORAGE_NAME_PUBLIC_ID, $public_id)
       ->execute();
   }
 
   /**
    * Delete cloudinary folder resource from db.
+   *
+   * @param string $public_id
+   *   Public id value.
    */
   protected function deleteFolder($public_id) {
+    $db = \Drupal::database();
     // Only remove file and folder resource in this folder.
     // Cloudinary can not delete folder, parent folder update is not necessary.
-    db_delete('cloudinary_storage')
-      ->condition('public_id', db_like($public_id) . '%', 'LIKE')
+    $db->delete(self::CLOUDINARY_STORAGE_TABLE_NAME)
+      ->condition(self::CLOUDINARY_STORAGE_NAME_PUBLIC_ID, $db->escapeLike($public_id) . '%', 'LIKE')
       ->execute();
   }
 
   /**
    * Load cloudinary file resource from db.
+   *
+   * @param string $public_id
+   *   Public id value.
+   *
+   * @return array
+   *   Resource data.
    */
   protected function load($public_id) {
-    $resource = array();
+    $resource = [];
 
-    $result = db_select('cloudinary_storage', 'cs')
+    $result = \Drupal::database()->select(self::CLOUDINARY_STORAGE_TABLE_NAME, 'cs')
       ->fields('cs')
-      ->condition('public_id', $public_id)
+      ->condition(self::CLOUDINARY_STORAGE_NAME_PUBLIC_ID, $public_id)
       ->range(0, 1)
       ->execute()
       ->fetchObject();
@@ -74,7 +88,7 @@ class CloudinaryStorageDb extends CloudinaryStorage {
    * Clear all resources data from db.
    */
   public function clear() {
-    db_query('TRUNCATE {cloudinary_storage}');
+    \Drupal::database()->truncate(self::CLOUDINARY_STORAGE_TABLE_NAME);
   }
 
 }
diff --git a/modules/cloudinary_storage/modules/cloudinary_storage_file/cloudinary_storage_file.info.yml b/modules/cloudinary_storage/modules/cloudinary_storage_file/cloudinary_storage_file.info.yml
new file mode 100644
index 0000000..29b3cdc
--- /dev/null
+++ b/modules/cloudinary_storage/modules/cloudinary_storage_file/cloudinary_storage_file.info.yml
@@ -0,0 +1,7 @@
+name: Cloudinary Storage File
+description: The module provides stores information in local file system for uploaded Cloudinary files.
+package: Cloudinary
+core: 8.x
+dependencies:
+  - cloudinary:cloudinary_storage
+type: module
diff --git a/modules/cloudinary_storage/modules/cloudinary_storage_file/cloudinary_storage_file.install b/modules/cloudinary_storage/modules/cloudinary_storage_file/cloudinary_storage_file.install
new file mode 100644
index 0000000..24ab386
--- /dev/null
+++ b/modules/cloudinary_storage/modules/cloudinary_storage_file/cloudinary_storage_file.install
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @file
+ * Provides installation functions.
+ */
+
+use Drupal\cloudinary_storage_file\CloudinaryStorageFile;
+
+/**
+ * Implements hook_uninstall().
+ */
+function cloudinary_storage_file_uninstall() {
+  // Delete all saved resource data in file.
+  $storage = new CloudinaryStorageFile();
+  $storage->clear();
+}
diff --git a/modules/cloudinary_storage/modules/cloudinary_storage_file/cloudinary_storage_file.module b/modules/cloudinary_storage/modules/cloudinary_storage_file/cloudinary_storage_file.module
new file mode 100644
index 0000000..e3ad703
--- /dev/null
+++ b/modules/cloudinary_storage/modules/cloudinary_storage_file/cloudinary_storage_file.module
@@ -0,0 +1,99 @@
+<?php
+
+/**
+ * @file
+ * File for the cloudinary_storage_file module.
+ */
+
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Link;
+use Drupal\Core\Url;
+
+/**
+ * Destination for file storage.
+ */
+define('CLOUDINARY_STORAGE_FILE_PATH', 'private://cloudinary_storage');
+
+/**
+ * File name for folder metadata.
+ */
+define('CLOUDINARY_STORAGE_FILE_FOLDER_NAME', '.metadata');
+
+/**
+ * Implements hook_cloudinary_storage_info().
+ */
+function cloudinary_storage_file_cloudinary_storage_info() {
+  return array(
+    'cloudinary_storage_file' => array(
+      'title' => t('File'),
+      'class' => '\Drupal\cloudinary_storage_file\CloudinaryStorageFile',
+    ),
+  );
+}
+
+/**
+ * Implements hook_form_FORM_ID_alter().
+ *
+ * @see cloudinary_sdk_settings().
+ */
+function cloudinary_storage_file_form_cloudinary_sdk_settings_alter(&$form, $form_state) {
+  // Cloudinary resource data will be save into private file system.
+  $message = t('Cloudinary resource data will be save into private system after enable file storage.');
+  $wrappers = \Drupal::service("stream_wrapper_manager")->getWrappers();
+
+  // Display warning message if private file system is not set.
+  if (!isset($wrappers['private'])) {
+    $message .= '<br />' . t('Please configure the private file system path.');
+    $message .= '<br />' . Link::fromTextAndUrl(t('Configure'), Url::fromRoute('system.file_system_settings', array(
+      'query' => \Drupal::destination()->getAsArray(),
+      'attributes' => array(
+        'class' => array('module-link', 'module-link-configure'),
+      )
+    )))->toString();
+  }
+  // Display warning message if private file system is CloudinaryStreamWrapper.
+  elseif ($wrappers['private']['class'] == 'CloudinaryStreamWrapper') {
+    $message .= '<br />' . t('The current stream wrapper class of private file system is CloudinaryStreamWrapper.');
+    $message .= '<br />' . t('You should be change with another stream wrapper class for private file system.');
+  }
+  else {
+    return;
+  }
+
+  $form['storage']['cloudinary_storage_default_warning'] = array(
+    '#type' => 'container',
+    '#states' => array(
+      'visible' => array(
+        ':input[name="cloudinary_storage_default"]' => array('value' => 'cloudinary_storage_file'),
+      ),
+    ),
+  );
+
+  $form['storage']['cloudinary_storage_default_warning']['cloudinary_storage_file'] = array(
+    '#markup' => '<div class="messages warning">' . $message . '</div>',
+  );
+
+  $form['#validate'][] = 'cloudinary_storage_file_settings_validate';
+}
+
+/**
+ * Validator for the cloudinary_sdk_settings().
+ */
+function cloudinary_storage_file_settings_validate($form, FormStateInterface $form_state) {
+  $storage = $form_state->getValue('cloudinary_storage_default');
+
+  if ($storage == 'cloudinary_storage_file') {
+    $wrappers = \Drupal::service("stream_wrapper_manager")->getWrappers();
+    $message = '';
+
+    if (!isset($wrappers['private'])) {
+      $message .= t('Please configure the private file system path.');
+      $form_state->setErrorByName('cloudinary_storage_default', $message);
+    }
+    elseif ($wrappers['private']['class'] == 'CloudinaryStreamWrapper') {
+      $message .= t('The current stream wrapper class of private file system is CloudinaryStreamWrapper.');
+      $message .= '<br />' . t('You should be change with another stream wrapper class for private file system.');
+      $form_state->setErrorByName('cloudinary_storage_default', $message);
+    }
+  }
+}
diff --git a/modules/cloudinary_storage/modules/cloudinary_storage_file/src/CloudinaryStorageFile.php b/modules/cloudinary_storage/modules/cloudinary_storage_file/src/CloudinaryStorageFile.php
new file mode 100644
index 0000000..c8bb254
--- /dev/null
+++ b/modules/cloudinary_storage/modules/cloudinary_storage_file/src/CloudinaryStorageFile.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace Drupal\cloudinary_storage_file;
+
+use Drupal\cloudinary_storage\CloudinaryStorage;
+use Drupal\Component\Serialization\Json;
+
+/**
+ * @file
+ * File storage implementation for uploaded Cloudinary files.
+ */
+
+/**
+ * Implements cloudinary storage with file.
+ */
+class CloudinaryStorageFile extends CloudinaryStorage {
+
+  /**
+   * @inheritdoc
+   */
+  protected function save($resource) {
+    if (isset($resource['public_id'])) {
+      $data = Json::encode($resource);
+      $destination = CLOUDINARY_STORAGE_FILE_PATH . '/' . $resource['public_id'];
+
+      if ($resource['mode'] == CLOUDINARY_STREAM_WRAPPER_FOLDER) {
+        $destination = trim($destination, '/') . '/' . CLOUDINARY_STORAGE_FILE_FOLDER_NAME;
+      }
+
+      $directory = dirname($destination);
+      file_prepare_directory($directory, FILE_CREATE_DIRECTORY);
+      file_unmanaged_save_data($data, $destination, FILE_EXISTS_REPLACE);
+    }
+  }
+
+  /**
+   * @inheritdoc
+   */
+  protected function delete($public_id) {
+    $path = CLOUDINARY_STORAGE_FILE_PATH . '/' . $public_id;
+    file_unmanaged_delete($path);
+  }
+
+  /**
+   * @inheritdoc
+   */
+  protected function deleteFolder($public_id) {
+    // Only remove file and folder resource in this folder.
+    // Cloudinary can not delete folder, parent folder update is not necessary.
+    $path = CLOUDINARY_STORAGE_FILE_PATH . '/' . $public_id;
+    file_unmanaged_delete_recursive($path);
+  }
+
+  /**
+   * @inheritdoc
+   */
+  protected function load($public_id) {
+
+    $resource = array();
+
+    $destination = CLOUDINARY_STORAGE_FILE_PATH . '/' . $public_id;
+
+    if (!file_exists($destination)) {
+      $destination = trim($destination, '/') . '/' . CLOUDINARY_STORAGE_FILE_FOLDER_NAME;
+    }
+
+    if (file_exists($destination)) {
+      $data = file_get_contents($destination);
+      $resource = (array) Json::decode($data);
+    }
+
+    return $resource;
+  }
+
+}
diff --git a/modules/cloudinary_storage/src/CloudinaryStorage.php b/modules/cloudinary_storage/src/CloudinaryStorage.php
index 2e25796..aa815a0 100644
--- a/modules/cloudinary_storage/src/CloudinaryStorage.php
+++ b/modules/cloudinary_storage/src/CloudinaryStorage.php
@@ -1,21 +1,41 @@
 <?php
+
 namespace Drupal\cloudinary_storage;
 
 /**
  * Abstract for cloudinary storage.
  */
 abstract class CloudinaryStorage {
+
+  /**
+   * Cloudinary storage field name.
+   */
+  const CLOUDINARY_STORAGE_NAME_PUBLIC_ID = 'public_id';
+
+  /**
+   * Cloudinary storage table name.
+   */
+  const CLOUDINARY_STORAGE_TABLE_NAME = 'cloudinary_storage';
+
   /**
    * A current file resource of Cloudinary.
    *
-   * @var Array
+   * @var array
    */
   protected $resource = NULL;
 
   /**
    * Object constructor.
+   *
+   * @param array|null $resource
+   *  Resource data.
+   *
+   * @param bool $loaded
+   *   Boolean indicate, load or not load resource.
    */
   public function __construct($resource = NULL, $loaded = TRUE) {
+    $public_id = self::CLOUDINARY_STORAGE_NAME_PUBLIC_ID;
+
     if (is_null($resource)) {
       return;
     }
@@ -26,8 +46,8 @@ abstract class CloudinaryStorage {
     elseif (is_string($resource)) {
       $this->resource = $this->load($resource);
     }
-    elseif (is_array($resource) && isset($resource['public_id'])) {
-      $this->resource = $this->load($resource['public_id']);
+    elseif (is_array($resource) && isset($resource[$public_id])) {
+      $this->resource = $this->load($resource[$public_id]);
     }
   }
 
@@ -39,31 +59,51 @@ abstract class CloudinaryStorage {
   }
 
   /**
-   * Insert or update resource.
+   * Create or update cloudinary file resource into db.
+   *
+   * @param array $resource
+   *  Resource data.
    */
   abstract protected function save($resource);
 
   /**
-   * Delete resource by public_id.
+   * Delete cloudinary file resource from db.
+   *
+   * @param string $public_id
+   *   Public id value.
    */
   abstract protected function delete($public_id);
 
   /**
    * Delete folder resource by public_id.
+   *
+   * @param string $public_id
+   *   Public id value.
    */
   abstract protected function deleteFolder($public_id);
 
   /**
    * Load resource by public_id.
+   *
+   * @param string $public_id
+   *   Public id value.
    */
   abstract protected function load($public_id);
 
   /**
-   * Preprae file or folder resource for folder update.
+   * Prepare file or folder resource for folder update.
+   *
+   * @param array $data
+   *   File or folder data.
+   * @param array $update
+   *   File or folder updated data.
+   *
+   * @return array
+   *   Prepared folder data.
    */
   static protected function prepareFolderData($data, $update) {
     if (empty($data) || !is_array($data)) {
-      $data = array();
+      $data = [];
     }
 
     // Append new file or folder if not exist.
@@ -90,8 +130,16 @@ abstract class CloudinaryStorage {
 
   /**
    * Update child files or folders in folder resource.
+   *
+   * @param string $path
+   *   Path value.
+   * @param array $file
+   *   File data.
+   *
+   * @param array $folder
+   *   Folder data.
    */
-  public function folderUpdate($path, $file = array(), $folder = array()) {
+  public function folderUpdate($path, $file = [], $folder = []) {
     if ($path === FALSE) {
       return;
     }
@@ -120,9 +168,17 @@ abstract class CloudinaryStorage {
   /**
    * Remove old resource or save new resource.
    *
-   * Return array with path and filename.
+   * @param bool $new
+   *   Boolean indicate
+   * @param array|null $resource
+   *   Resource data.
+   *
+   * @return array
+   *   Return array with path and filename.
    */
   public function resourceUpdate($new = TRUE, $resource = NULL) {
+    $public_id = self::CLOUDINARY_STORAGE_NAME_PUBLIC_ID;
+
     if (!$resource) {
       $resource = $this->resource;
     }
@@ -130,8 +186,8 @@ abstract class CloudinaryStorage {
     $path = FALSE;
     $file = '';
 
-    if (isset($resource['public_id'])) {
-      $file = $resource['public_id'];
+    if (isset($resource[$public_id])) {
+      $file = $resource[$public_id];
       $path = dirname($file);
 
       // Append file format into filename.
@@ -146,15 +202,15 @@ abstract class CloudinaryStorage {
       }
       else {
         if ($resource['mode'] == CLOUDINARY_STREAM_WRAPPER_FOLDER) {
-          $this->deleteFolder($resource['public_id']);
+          $this->deleteFolder($resource[$public_id]);
         }
         elseif ($resource['mode'] == CLOUDINARY_STREAM_WRAPPER_FILE) {
-          $this->delete($resource['public_id']);
+          $this->delete($resource[$public_id]);
         }
       }
     }
 
-    return array($path, $file);
+    return [$path, $file];
   }
 
 }
