diff --git a/_modules/cinderng.py b/_modules/cinderng.py
new file mode 100644
index 0000000..cd71348
--- /dev/null
+++ b/_modules/cinderng.py
@@ -0,0 +1,144 @@
+# -*- coding: utf-8 -*-
+import logging
+from functools import wraps
+LOG = logging.getLogger(__name__)
+
+# Import third party libs
+HAS_CINDER = False
+try:
+    from cinderclient.v3 import client
+    HAS_CINDER = True
+except ImportError:
+    pass
+
+__opts__ = {}
+
+
+def __virtual__():
+    '''
+    Only load this module if cinder
+    is installed on this minion.
+    '''
+    if HAS_CINDER:
+        return 'cinderng'
+    return False
+
+def _authng(profile=None):
+    '''
+    Set up cinder credentials
+    '''
+    credentials = {
+        'username': profile['user'],
+        'password': profile['password'],
+        'project_id': profile['project_id'],
+        'auth_url': profile['protocol'] + "://" + profile['host'] + ":" + str(profile['port']) + "/v3",
+        'endpoint_type': profile['endpoint_type'],
+        'certificate': profile['certificate'],
+        'region_name': profile['region_name']
+    }
+    return credentials
+
+def create_conn(cred=None):
+    '''
+    create connection
+    '''
+    nt = client.Client(username=cred['username'], api_key=cred['password'], project_id=cred['project_id'], auth_url=cred['auth_url'], endpoint_type=cred['endpoint_type'], cacert=cred['certificate'], region_name=cred['region_name'])
+    return nt
+
+def list_volumes(profile=None, **kwargs):
+    '''
+    Return list of cinder volumes.
+    '''
+    cred = _authng(profile)
+    nt = create_conn(cred)
+    return nt.volumes.list()
+
+def list_volume_type(profile=None, **kwargs):
+    '''
+    Return list of volume types
+    '''
+    cred = _authng(profile)
+    nt = create_conn(cred)
+    return nt.volume_types.list()
+
+def get_volume_type(type_name, profile=None, **kwargs):
+    '''
+    Returns id of the specified volume type name
+    '''
+    vt_id = None
+    vt_list = list_volume_type(profile);
+    for vt in vt_list:
+        if vt.name == type_name:
+            vt_id = vt.id
+
+    if vt_id:
+        cred = _authng(profile)
+        nt = create_conn(cred)
+        try:
+            vt = nt.volume_types.get(vt_id)
+            return vt
+        except:
+            return
+    else:
+        return
+
+def create_volume_type(type_name, profile=None, **kwargs):
+    '''
+    Create cinder volume type
+    '''
+    vt = get_volume_type(type_name, profile)
+    if not vt:
+        cred = _authng(profile)
+        nt = create_conn(cred)
+        try:
+            nt.volume_types.create(type_name)
+            return 'created'
+        except:
+            return 'failed'
+    else:
+        return 'exists'
+
+
+def get_keys_volume_type(type_name, profile=None, **kwargs):
+    '''
+    Return extra specs of the specified volume type.
+    '''
+
+    vt = get_volume_type(type_name, profile)
+    if vt:
+        try:
+            return vt.get_keys()
+        except:
+            return 'failed'
+    else:
+        return
+
+def set_keys_volume_type(type_name, keys={}, profile=None, **kwargs):
+    '''
+    Set extra specs of the specified volume type.
+    '''
+    set_keys = False
+    vt = get_volume_type(type_name, profile)
+    if vt:
+        k = get_keys_volume_type(type_name, profile)
+        if not k:
+            set_keys = True
+        elif k:
+            for key in keys:
+                if k.get(key) != keys[key]:
+                    set_keys = True
+        elif len(k) != len(keys):
+            set_keys = True
+        else:
+            return
+
+        if set_keys:
+            try:
+                vt.set_keys(keys)
+                return 'updated'
+            except:
+                return 'failed'
+        else:
+            return 'exist'
+    else:
+        return 'not found'
