diff --git a/manifests/cors.pp b/manifests/cors.pp
new file mode 100644
index 00000000..c1ed8968
--- /dev/null
+++ b/manifests/cors.pp
@@ -0,0 +1,58 @@
+# == Class: cinder::cors
+#
+# Configure the cinder cors
+#
+# === Parameters
+#
+# [*allowed_origin*]
+#   (Optional) Indicate whether this resource may be shared with the domain
+#   received in the requests "origin" header.
+#   (string value)
+#   Defaults to $::os_service_default.
+#
+# [*allow_credentials*]
+#   (Optional) Indicate that the actual request can include user credentials.
+#   (boolean value)
+#   Defaults to $::os_service_default.
+#
+# [*expose_headers*]
+#   (Optional) Indicate which headers are safe to expose to the API.
+#   (list value)
+#   Defaults to $::os_service_default.
+#
+# [*max_age*]
+#   (Optional) Maximum cache age of CORS preflight requests.
+#   (integer value)
+#   Defaults to $::os_service_default.
+#
+# [*allow_methods*]
+#   (Optional) Indicate which methods can be used during the actual request.
+#   (list value)
+#   Defaults to $::os_service_default.
+#
+# [*allow_headers*]
+#   (Optional) Indicate which header field names may be used during the actual
+#   request.
+#   (list value)
+#   Defaults to $::os_service_default.
+#
+class cinder::cors (
+  $allowed_origin    = $::os_service_default,
+  $allow_credentials = $::os_service_default,
+  $expose_headers    = $::os_service_default,
+  $max_age           = $::os_service_default,
+  $allow_methods     = $::os_service_default,
+  $allow_headers     = $::os_service_default,
+) {
+
+  include cinder::deps
+
+  oslo::cors { 'cinder_config':
+    allowed_origin    => $allowed_origin,
+    allow_credentials => $allow_credentials,
+    expose_headers    => $expose_headers,
+    max_age           => $max_age,
+    allow_methods     => $allow_methods,
+    allow_headers     => $allow_headers,
+  }
+}
diff --git a/releasenotes/notes/cors-ec65ae3f0a49fc44.yaml b/releasenotes/notes/cors-ec65ae3f0a49fc44.yaml
new file mode 100644
index 00000000..671af3f4
--- /dev/null
+++ b/releasenotes/notes/cors-ec65ae3f0a49fc44.yaml
@@ -0,0 +1,4 @@
+---
+features:
+  - |
+    The new ``cinder::cors`` option has been added.
diff --git a/spec/classes/cinder_cors_spec.rb b/spec/classes/cinder_cors_spec.rb
new file mode 100644
index 00000000..217dab6a
--- /dev/null
+++ b/spec/classes/cinder_cors_spec.rb
@@ -0,0 +1,53 @@
+require 'spec_helper'
+
+describe 'cinder::cors' do
+
+  shared_examples_for 'cinder::cors' do
+    it 'configure cors default params' do
+      is_expected.to contain_oslo__cors('cinder_config').with(
+        :allowed_origin    => '<SERVICE DEFAULT>',
+        :allow_credentials => '<SERVICE DEFAULT>',
+        :expose_headers    => '<SERVICE DEFAULT>',
+        :max_age           => '<SERVICE DEFAULT>',
+        :allow_methods     => '<SERVICE DEFAULT>',
+        :allow_headers     => '<SERVICE DEFAULT>',
+      )
+    end
+
+    context 'with specific parameters' do
+      let :params do
+        { :allowed_origin    => '*',
+          :allow_credentials => true,
+          :expose_headers    => 'Content-Language,Expires',
+          :max_age           => 3600,
+          :allow_methods     => 'GET,POST,PUT,DELETE,OPTIONS',
+          :allow_headers     => 'Content-Type,Cache-Control',
+        }
+      end
+
+      it 'configure cors params' do
+        is_expected.to contain_oslo__cors('cinder_config').with(
+          :allowed_origin    => '*',
+          :allow_credentials => true,
+          :expose_headers    => 'Content-Language,Expires',
+          :max_age           => 3600,
+          :allow_methods     => 'GET,POST,PUT,DELETE,OPTIONS',
+          :allow_headers     => 'Content-Type,Cache-Control',
+        )
+      end
+    end
+  end
+
+  on_supported_os({
+    :supported_os   => OSDefaults.get_supported_os
+  }).each do |os,facts|
+    context "on #{os}" do
+      let (:facts) do
+        facts.merge!(OSDefaults.get_facts())
+      end
+
+      it_behaves_like 'cinder::cors'
+    end
+  end
+
+end