diff --git a/_modules/glancev2/__init__.py b/_modules/glancev2/__init__.py
new file mode 100644
index 0000000..8c7418b
--- /dev/null
+++ b/_modules/glancev2/__init__.py
@@ -0,0 +1,36 @@
+try:
+    import os_client_config
+    from keystoneauth1 import exceptions as ka_exceptions
+    REQUIREMENTS_MET = True
+except ImportError:
+    REQUIREMENTS_MET = False
+
+from glancev2 import image
+from glancev2 import task
+
+image_create = image.image_create
+image_delete = image.image_delete
+image_deactivate = image.image_deactivate
+image_reactivate = image.image_reactivate
+image_list = image.image_list
+image_update = image.image_update
+image_download = image.image_data_download
+image_get_details = image.image_get_details
+task_list = task.task_list
+task_create = task.task_create
+task_show = task.task_show
+
+__all__ = (
+    'image_update', 'image_create', 'image_list', 'image_delete', 'task_show',
+    'image_download', 'task_create', 'task_list', 'image_get_details',
+    'image_deactivate', 'image_reactivate'
+)
+
+
+def __virtual__():
+    """Only load glanceng if requirements are available."""
+    if REQUIREMENTS_MET:
+        return 'glancev2'
+    else:
+        return False, ("The glanceng execution module cannot be loaded: "
+                       "os_client_config or keystoneauth are unavailable.")
diff --git a/_modules/glancev2/common.py b/_modules/glancev2/common.py
new file mode 100644
index 0000000..1e686f1
--- /dev/null
+++ b/_modules/glancev2/common.py
@@ -0,0 +1,117 @@
+import logging
+import os_client_config
+from uuid import UUID
+
+log = logging.getLogger(__name__)
+
+
+class GlanceException(Exception):
+
+    _msg = "Glance module exception occured."
+
+    def __init__(self, message=None, **kwargs):
+        super(GlanceException, self).__init__(message or self._msg)
+
+
+class NoGlanceEndpoint(GlanceException):
+    _msg = "Glance endpoint not found in keystone catalog."
+
+
+class NoAuthPluginConfigured(GlanceException):
+    _msg = ("You are using keystoneauth auth plugin that does not support "
+            "fetching endpoint list from token (noauth or admin_token).")
+
+
+class NoCredentials(GlanceException):
+    _msg = "Please provide cloud name present in clouds.yaml."
+
+
+class ResourceNotFound(GlanceException):
+    _msg = "Uniq resource: {resource} with name: {name} not found."
+
+    def __init__(self, resource, name, **kwargs):
+        super(GlanceException, self).__init__(
+            self._msg.format(resource=resource, name=name))
+
+
+class MultipleResourcesFound(GlanceException):
+    _msg = "Multiple resource: {resource} with name: {name} found."
+
+    def __init__(self, resource, name, **kwargs):
+        super(GlanceException, self).__init__(
+            self._msg.format(resource=resource, name=name))
+
+
+def get_raw_client(cloud_name):
+    service_type = 'image'
+    adapter = os_client_config.make_rest_client(service_type,
+                                                cloud=cloud_name)
+    try:
+        access_info = adapter.session.auth.get_access(adapter.session)
+        endpoints = access_info.service_catalog.get_endpoints()
+    except (AttributeError, ValueError):
+        e = NoAuthPluginConfigured()
+        log.exception('%s' % e)
+        raise e
+    if service_type not in endpoints:
+        if not service_type:
+            e = NoGlanceEndpoint()
+            log.error('%s' % e)
+            raise e
+    return adapter
+
+
+def send(method):
+    def wrap(func):
+        def wrapped_f(*args, **kwargs):
+            cloud_name = kwargs.pop('cloud_name')
+            if not cloud_name:
+                e = NoCredentials()
+                log.error('%s' % e)
+                raise e
+            adapter = get_raw_client(cloud_name)
+            # Remove salt internal kwargs
+            kwarg_keys = list(kwargs.keys())
+            for k in kwarg_keys:
+                if k.startswith('__'):
+                    kwargs.pop(k)
+            url, request_kwargs = func(*args, **kwargs)
+            response = getattr(adapter, method)(url, **request_kwargs)
+            if not response.content:
+                return {}
+            return response.json()
+        return wrapped_f
+    return wrap
+
+
+def _check_uuid(val):
+    try:
+        return str(UUID(val)).replace('-', '') == val.replace('-', '')
+    except (TypeError, ValueError, AttributeError):
+        return False
+
+
+def get_by_name_or_uuid(resource_list, resp_key):
+    def wrap(func):
+        def wrapped_f(*args, **kwargs):
+            if 'name' in kwargs:
+                ref = kwargs.pop('name', None)
+                start_arg = 0
+            else:
+                start_arg = 1
+                ref = args[0]
+            if _check_uuid(ref):
+                uuid = ref
+            else:
+                # Then we have name not uuid
+                cloud_name = kwargs['cloud_name']
+                resp = resource_list(
+                    name=ref, cloud_name=cloud_name)[resp_key]
+                if len(resp) == 0:
+                    raise ResourceNotFound(resp_key, ref)
+                elif len(resp) > 1:
+                    raise MultipleResourcesFound(resp_key, ref)
+                uuid = resp[0]['id']
+            return func(uuid, *args[start_arg:], **kwargs)
+        return wrapped_f
+    return wrap
diff --git a/_modules/glancev2/image.py b/_modules/glancev2/image.py
new file mode 100644
index 0000000..b8eedbe
--- /dev/null
+++ b/_modules/glancev2/image.py
@@ -0,0 +1,102 @@
+try:
+    from urllib.parse import urlencode
+except ImportError:
+    from urllib import urlencode
+import hashlib
+
+from glancev2.common import send, get_raw_client, get_by_name_or_uuid
+
+RESOURCE_LIST_KEY = 'images'
+
+
+@send('get')
+def image_list(**kwargs):
+    url = '/v2/images?{}'.format(urlencode(kwargs))
+    return url, {}
+
+
+@send('post')
+def image_create(**kwargs):
+    url = '/v2/images'
+    return url, {'json': kwargs}
+
+
+@get_by_name_or_uuid(image_list, RESOURCE_LIST_KEY)
+@send('get')
+def image_get_details(image_id, **kwargs):
+    url = '/v2/images/{}'.format(image_id)
+    return url, {}
+
+
+@get_by_name_or_uuid(image_list, RESOURCE_LIST_KEY)
+@send('patch')
+def image_update(image_id, properties, **kwargs):
+    url = '/v2/images/{}'.format(image_id)
+    headers = {
+        'Content-Type': 'application/openstack-images-v2.1-json-patch',
+    }
+    return url, {'json': properties, 'headers': headers}
+
+
+@get_by_name_or_uuid(image_list, RESOURCE_LIST_KEY)
+@send('delete')
+def image_delete(image_id, **kwargs):
+    url = '/v2/images/{}'.format(image_id)
+    return url, {}
+
+
+@get_by_name_or_uuid(image_list, RESOURCE_LIST_KEY)
+@send('post')
+def image_deactivate(image_id, **kwargs):
+    url = '/v2/images/{}/actions/deactivate'.format(image_id)
+    return url, {}
+
+
+@get_by_name_or_uuid(image_list, RESOURCE_LIST_KEY)
+@send('post')
+def image_reactivate(image_id, **kwargs):
+    url = '/v2/images/{}/actions/reactivate'.format(image_id)
+    return url, {}
+
+
+class StreamingDownloader(object):
+
+    def __init__(self, adapter, image_id, chunksize):
+        self.hasher = hashlib.new('md5')
+        self.chunksize = chunksize
+
+        resp = adapter.get('/v2/images/{}/file'.format(image_id),
+                           stream=True)
+        if resp.status_code != 200:
+            raise Exception('Invalid response code: %s' % resp.status_code)
+
+        self._request = resp
+
+    def __iter__(self):
+        for chunk in self._request.iter_content(chunk_size=self.chunksize):
+            self.hasher.update(chunk)
+            yield chunk
+
+    def validate(self):
+        return self.hasher.hexdigest() == self._request.headers['Content-Md5']
+
+
+@get_by_name_or_uuid(image_list, RESOURCE_LIST_KEY)
+def image_data_download(image_id, file_name, **kwargs):
+    cloud_name = kwargs.pop('cloud_name')
+    adapter = get_raw_client(cloud_name)
+    downloader = StreamingDownloader(adapter, image_id, 1024 * 1024)
+    with open(file_name, 'wb') as f:
+        for chunk in downloader:
+            f.write(chunk)
+    return downloader.validate()
+
+
+@get_by_name_or_uuid(image_list, RESOURCE_LIST_KEY)
+@send('put')
+def image_data_upload(image_id, file_name, **kwargs):
+    url = '/v2/images/{}/file'.format(image_id)
+    headers = {'Content-Type': 'application/octet-stream '}
+    with open(file_name, 'rb') as f:
+        data = f.readlines()
+    return url, {'json': data, 'headers': headers}
diff --git a/_modules/glancev2/task.py b/_modules/glancev2/task.py
new file mode 100644
index 0000000..11fe499
--- /dev/null
+++ b/_modules/glancev2/task.py
@@ -0,0 +1,27 @@
+try:
+    from urllib.parse import urlencode
+except ImportError:
+    from urllib import urlencode
+from glancev2.common import send
+
+
+@send('post')
+def task_create(task_type, task_input, **kwargs):
+    url = '/v2/tasks'
+    json = {
+        'type': task_type,
+        'input': task_input
+    }
+    return url, {'json': json}
+
+
+@send('get')
+def task_list(**kwargs):
+    url = '/v2/tasks?{}'.format(urlencode(kwargs))
+    return url, {}
+
+
+@send('get')
+def task_show(task_id, **kwargs):
+    url = '/v2/tasks/{}'.format(task_id)
+    return url, {}
diff --git a/_states/glancev2.py b/_states/glancev2.py
new file mode 100644
index 0000000..2c5a84f
--- /dev/null
+++ b/_states/glancev2.py
@@ -0,0 +1,271 @@
+# -*- coding: utf-8 -*-
+'''
+Managing Images in OpenStack Glance
+===================================
+'''
+# Import python libs
+import logging
+import time
+
+
+# Import OpenStack libs
+def __virtual__():
+    return 'glancev2' if 'glancev2.image_list' in __salt__ else False
+
+
+log = logging.getLogger(__name__)
+
+
+def _glancev2_call(fname, *args, **kwargs):
+    return __salt__['glancev2.{}'.format(fname)](*args, **kwargs)
+
+
+def image_present(name, cloud_name, location, image_properties,
+                  import_from_format='raw', timeout=30,
+                  sleep_time=5, checksum=None):
+    """
+    Creates a task to import an image
+
+    This state checks if an image is present and, if not, creates a task
+    with import_type that would download an image from a remote location and
+    upload it to Glance.
+    After the task is created, its status is monitored. On success the state
+    would check that an image is present and return its ID.
+
+    Also, this state can update(add and replace) image properties,
+    but !!It can't delete properties, that are already in state
+
+    :param name: name of the image
+    :param cloud_name: name of the cloud in cloud.yaml
+    :param location: url link describing where to obtain image
+    :param image_properties: Dict that contains params needed
+           to create or update image.
+           :param container_format:  Format of the container
+           :param disk_format: Format of the disk
+           :param protected: If true, image will not be deletable.
+           :param tags: List of strings related to the image
+           :param visibility: Scope of image accessibility.
+                              Valid values: public, private, community, shared
+    :param import_from_format: (optional) Format to import the image from
+    :param timeout: (optional) Time for task to download image
+    :param sleep_time: (optional) Timer countdown
+    :param checksum: (optional) checksum of the image to verify it
+    """
+    try:
+        exact_image = _glancev2_call(
+            'image_get_details', name=name, cloud_name=cloud_name
+        )
+    except Exception as e:
+        if 'ResourceNotFound' in repr(e):
+            image_properties['name'] = name
+            task_params = {"import_from": location,
+                           "import_from_format": import_from_format,
+                           "image_properties": image_properties
+                           }
+            # Try create task
+            try:
+                task = _glancev2_call(
+                    'task_create', task_type='import', task_input=task_params,
+                    cloud_name=cloud_name
+                )
+            except Exception as e:
+                log.error(
+                    'Glance image create failed on create task with {}'.format(
+                        e)
+                )
+                return _create_failed(name, 'image_task')
+            while timeout > 0:
+                if task['status'] == 'success':
+                    break
+                elif task['status'] == 'failure':
+                    log.error('Glance task failed to complete')
+                    return _create_failed(name, 'image')
+                else:
+                    timeout -= sleep_time
+                    time.sleep(sleep_time)
+                    # Check task status again
+                    try:
+                        task = _glancev2_call(
+                            'task_show', task_id=task['id'],
+                            cloud_name=cloud_name
+                        )
+                    except Exception as e:
+                        log.error(
+                            'Glance failed to check '
+                            'task status with {}'.format(e)
+                        )
+                        return _create_failed(name, 'image_task')
+            if timeout <= 0 and task['status'] != 'success':
+                log.error(
+                    'Glance task failed to import '
+                    'image for given amount of time'
+                )
+                return _create_failed(name, 'image')
+            # Task successfully finished
+            # and now check that is created the image
+
+            image = _glancev2_call(
+                'image_list', name=name, cloud_name=cloud_name
+            )['images'][0]
+
+            if not image:
+                return _create_failed(name, 'image')
+
+            resp = _created(name, 'image', image)
+
+            if checksum:
+                if image['status'] == 'active':
+                    if 'checksum' not in image:
+                        log.error(
+                            'Glance image. No checksum for image.'
+                            'Image status is active'
+                        )
+                        return _create_failed(name, 'image')
+                    if image['checksum'] != checksum:
+                        log.error(
+                            'Glance image create failed since '
+                            'image_checksum should be '
+                            '{} but it is {}'.format(checksum,
+                                                     image['checksum'])
+                        )
+                        return _create_failed(name, 'image')
+
+                elif image['status'] in ['saving', 'queued']:
+                    resp['comment'] = resp['comment'] \
+                                      + " checksum couldn't be verified, " \
+                                        "since status is not active"
+            return resp
+        if 'MultipleResourcesFound' in repr(e):
+            return _find_failed(name, 'image')
+    to_change = []
+    for prop in image_properties:
+        path = prop.replace('~', '~0').replace('/', '~1')
+        if prop in exact_image:
+            if exact_image[prop] != image_properties[prop]:
+                to_change.append({
+                    'op': 'replace',
+                    'path': '/{}'.format(path),
+                    'value': image_properties[prop]
+                })
+        else:
+            to_change.append({
+                'op': 'add',
+                'path': '/{}'.format(path),
+                'value': image_properties[prop]
+            })
+    if to_change:
+        try:
+            resp = _glancev2_call(
+                'image_update', name=name,
+                properties=to_change, cloud_name=cloud_name,
+            )
+        except Exception as e:
+            log.error('Glance image update failed with {}'.format(e))
+            return _update_failed(name, 'image')
+        return _updated(name, 'image', resp)
+    return _no_changes(name, 'image')
+
+
+def image_absent(name, cloud_name):
+    try:
+        image = _glancev2_call(
+            'image_get_details', name=name, cloud_name=cloud_name
+        )
+    except Exception as e:
+        if 'ResourceNotFound' in repr(e):
+            return _absent(name, 'image')
+        if 'MultipleResourcesFound' in repr(e):
+            return _find_failed(name, 'image')
+    try:
+        _glancev2_call(
+            'image_delete', name=name, cloud_name=cloud_name
+        )
+    except Exception as e:
+        log.error('Glance image delete failed with {}'.format(e))
+        return _delete_failed(name, 'image')
+    return _deleted(name, 'image')
+
+
+def _created(name, resource, resource_definition):
+    changes_dict = {
+        'name': name,
+        'changes': resource_definition,
+        'result': True,
+        'comment': '{}{} created'.format(resource, name)
+    }
+    return changes_dict
+
+
+def _updated(name, resource, resource_definition):
+    changes_dict = {
+        'name': name,
+        'changes': resource_definition,
+        'result': True,
+        'comment': '{}{} updated'.format(resource, name)
+    }
+    return changes_dict
+
+
+def _no_changes(name, resource):
+    changes_dict = {
+        'name': name,
+        'changes': {},
+        'result': True,
+        'comment': '{}{} is in desired state'.format(resource, name)
+    }
+    return changes_dict
+
+
+def _deleted(name, resource):
+    changes_dict = {
+        'name': name,
+        'changes': {},
+        'result': True,
+        'comment': '{}{} removed'.format(resource, name)
+    }
+    return changes_dict
+
+
+def _absent(name, resource):
+    changes_dict = {'name': name,
+                    'changes': {},
+                    'comment': '{0} {1} not present'.format(resource, name),
+                    'result': True}
+    return changes_dict
+
+
+def _delete_failed(name, resource):
+    changes_dict = {'name': name,
+                    'changes': {},
+                    'comment': '{0} {1} failed to delete'.format(resource,
+                                                                 name),
+                    'result': False}
+    return changes_dict
+
+
+def _create_failed(name, resource):
+    changes_dict = {'name': name,
+                    'changes': {},
+                    'comment': '{0} {1} failed to create'.format(resource,
+                                                                 name),
+                    'result': False}
+    return changes_dict
+
+
+def _update_failed(name, resource):
+    changes_dict = {'name': name,
+                    'changes': {},
+                    'comment': '{0} {1} failed to update'.format(resource,
+                                                                 name),
+                    'result': False}
+    return changes_dict
+
+
+def _find_failed(name, resource):
+    changes_dict = {
+        'name': name,
+        'changes': {},
+        'comment': '{0} {1} found multiple {0}'.format(resource, name),
+        'result': False,
+    }
+    return changes_dict
