diff --git a/_modules/manilang.py b/_modules/manilang.py
deleted file mode 100644
index 633e363..0000000
--- a/_modules/manilang.py
+++ /dev/null
@@ -1,121 +0,0 @@
-import logging
-
-
-try:
-    import os_client_config
-    from keystoneauth1 import exceptions as ka_exceptions
-    REQUIREMENTS_MET = True
-except ImportError:
-    REQUIREMENTS_MET = False
-
-
-def __virtual__():
-    """Only load manilang if requirements are available."""
-    if REQUIREMENTS_MET:
-        return 'manilang'
-    else:
-        return False, ("The manilang execution module cannot be loaded: "
-                       "os_client_config or keystoneauth are unavailable.")
-
-
-log = logging.getLogger(__name__)
-
-
-class ManilaException(Exception):
-
-    _msg = "Manila module exception occured."
-
-    def __init__(self, message=None, **kwargs):
-        super(ManilaException, self).__init__(message or self._msg)
-
-
-class NoManilaEndpoint(ManilaException):
-    _msg = "Manila endpoint not found in keystone catalog."
-
-
-class NoAuthPluginConfigured(ManilaException):
-    _msg = ("You are using keystoneauth auth plugin that does not support "
-            "fetching endpoint list from token (noauth or admin_token).")
-
-
-class NoCredentials(ManilaException):
-    _msg = "Please provide cloud name present in clouds.yaml."
-
-
-def _get_raw_client(cloud_name):
-    service_type = 'sharev2'
-    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.error('%s' % e)
-        raise e
-    if service_type not in endpoints:
-        service_type = None
-        for possible_type in ('share', 'shared-file-system'):
-            if possible_type in endpoints:
-                service_type = possible_type
-                break
-        if not service_type:
-            e = NoManilaEndpoint()
-            log.error('%s' % e)
-            raise e
-        adapter = os_client_config.make_rest_client(service_type,
-                                                    cloud=cloud_name)
-    log.debug("Using manila endpoint with type %s." % service_type)
-    return adapter
-
-
-def _add_microversion_header(microversion, headers):
-    if microversion:
-        headers.setdefault('X-OpenStack-Manila-API-Version', microversion)
-
-
-def create_adapter(fun):
-    def inner(*args, **kwargs):
-        headers = kwargs.pop('headers', {})
-        _add_microversion_header(kwargs.get('microversion'), headers)
-        cloud_name = kwargs.get('cloud_name')
-        if not cloud_name:
-            e = NoCredentials()
-            log.error('%s' % e)
-            raise e
-        adapter = _get_raw_client(cloud_name)
-        return fun(*args, adapter=adapter, headers=headers, **kwargs)
-    return inner
-
-
-@create_adapter
-def get_default_share_types(**kwargs):
-    adapter = kwargs.get('adapter')
-    try:
-        response = adapter.get('/types/default',
-                               headers=kwargs.get('headers', {}))
-    except ka_exceptions.NotFound:
-        log.debug("No default share type found.")
-        return None
-    return response.json()
-
-
-@create_adapter
-def create_share_type(name, driver_handles_share_servers, extra_specs=None,
-                      is_public=True, **kwargs):
-    adapter = kwargs.get('adapter')
-    extra_specs = extra_specs or {}
-    extra_specs['driver_handles_share_servers'] = driver_handles_share_servers
-    post_data = {
-        'share_type': {
-            'extra_specs': extra_specs, 'name': name,
-            'os-share-type-access:is_public': is_public}}
-    # NOTE: passing share_type dictionary in kwargs will override anything
-    #       that was constructed from function arguments. Use with caution.
-    #       is_public attribute is special, as os-share-type-access:is_public
-    #       always overrides share_type_access:is_public, no matter what
-    #       microversion used (sic!).
-    post_data['share_type'].update(kwargs.get('share_type', {}))
-    response = adapter.post('/types', json=post_data,
-                            headers=kwargs.get('headers', {}))
-    return response.json()['share_type']
diff --git a/_modules/manilang/__init__.py b/_modules/manilang/__init__.py
new file mode 100644
index 0000000..4d0b401
--- /dev/null
+++ b/_modules/manilang/__init__.py
@@ -0,0 +1,45 @@
+# Copyright 2018 Mirantis Inc
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+try:
+    import os_client_config
+    from keystoneauth1 import exceptions as ka_exceptions
+    REQUIREMENTS_MET = True
+except ImportError:
+    REQUIREMENTS_MET = False
+
+from manilang import share_types
+
+list_share_types = share_types.list_share_types
+create_share_type = share_types.create_share_type
+set_share_type_extra_specs = share_types.set_share_type_extra_specs
+unset_share_type_extra_specs = share_types.unset_share_type_extra_specs
+delete_share_type = share_types.delete_share_type
+
+
+__all__ = (
+    'list_share_types', 'create_share_type',
+    'set_share_type_extra_specs', 'unset_share_type_extra_specs',
+    'delete_share_type',
+)
+
+
+def __virtual__():
+    """Only load manilang if requirements are available."""
+    if REQUIREMENTS_MET:
+        return 'manilang'
+    else:
+        return False, ("The manilang execution module cannot be loaded: "
+                       "os_client_config or keystoneauth are unavailable.")
diff --git a/_modules/manilang/common.py b/_modules/manilang/common.py
new file mode 100644
index 0000000..47bcfd8
--- /dev/null
+++ b/_modules/manilang/common.py
@@ -0,0 +1,98 @@
+# Copyright 2018 Mirantis Inc
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+import logging
+
+import os_client_config
+
+
+MANILA_HEADER = 'X-OpenStack-Manila-API-Version'
+
+
+log = logging.getLogger(__name__)
+
+
+class ManilaException(Exception):
+
+    _msg = "Manila module exception occured."
+
+    def __init__(self, message=None, **kwargs):
+        super(ManilaException, self).__init__(message or self._msg)
+
+
+class NoManilaEndpoint(ManilaException):
+    _msg = "Manila endpoint not found in keystone catalog."
+
+
+class NoAuthPluginConfigured(ManilaException):
+    _msg = ("You are using keystoneauth auth plugin that does not support "
+            "fetching endpoint list from token (noauth or admin_token).")
+
+
+class NoCredentials(ManilaException):
+    _msg = "Please provide cloud name present in clouds.yaml."
+
+
+def _get_raw_client(cloud_name):
+    service_type = 'sharev2'
+    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.error('%s' % e)
+        raise e
+    if service_type not in endpoints:
+        service_type = None
+        for possible_type in ('share', 'shared-file-system'):
+            if possible_type in endpoints:
+                service_type = possible_type
+                break
+        if not service_type:
+            e = NoManilaEndpoint()
+            log.exception('%s' % e)
+            raise e
+        adapter = os_client_config.make_rest_client(service_type,
+                                                    cloud=cloud_name)
+    log.debug("Using manila endpoint with type %s." % service_type)
+    return adapter
+
+
+def send(method, microversion_header=None):
+    def wrap(func):
+        def wrapped_f(*args, **kwargs):
+            headers = kwargs.pop('headers', {})
+            if kwargs.get('microversion'):
+                headers.setdefault(microversion_header,
+                                   kwargs.get('microversion'))
+            cloud_name = kwargs.pop('cloud_name')
+            if not cloud_name:
+                e = NoCredentials()
+                log.error('%s' % e)
+                raise e
+            adapter = _get_raw_client(cloud_name)
+            url, json = func(*args, **kwargs)
+            if json:
+                response = getattr(adapter, method)(url, headers=headers,
+                                                    json=json)
+            else:
+                response = getattr(adapter, method)(url, headers=headers)
+            if not response.content:
+                return {}
+            return response.json()
+        return wrapped_f
+    return wrap
diff --git a/_modules/manilang/share_types.py b/_modules/manilang/share_types.py
new file mode 100644
index 0000000..51d4e23
--- /dev/null
+++ b/_modules/manilang/share_types.py
@@ -0,0 +1,107 @@
+# Copyright 2018 Mirantis Inc
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from manilang.common import send, MANILA_HEADER
+
+
+@send('get', MANILA_HEADER)
+def list_share_types(**kwargs):
+    url = '/types'
+    return url, None
+
+
+@send('get', MANILA_HEADER)
+def get_default_share_types(**kwargs):
+    url = '/types/default'
+    return url, None
+
+
+@send('get', MANILA_HEADER)
+def get_share_type_detail(share_type_id, **kwargs):
+    url = '/types/{}'.format(share_type_id)
+    return url, None
+
+
+@send('get', MANILA_HEADER)
+def get_extra_specs(share_type_id, **kwargs):
+    url = '/types/{}/extra_specs'.format(share_type_id)
+    return url, None
+
+
+@send('post', MANILA_HEADER)
+def create_share_type(name, extra_specs, **kwargs):
+    json = {
+        'share_type': {
+            'extra_specs': extra_specs,
+            'name': name,
+        }
+    }
+    # NOTE: passing share_type dictionary in kwargs will override anything
+    #       that was constructed from function arguments. Use with caution.
+    #       is_public attribute is special, as os-share-type-access:is_public
+    #       always overrides share_type_access:is_public, no matter what
+    #       microversion used (sic!).
+    json['share_type'].update(kwargs)
+    url = '/types'
+    return url, json
+
+
+@send('get', MANILA_HEADER)
+def get_share_type_access_details(share_type_id, **kwargs):
+    url = '/types/{}/share_type_access'.format(share_type_id)
+    return url, None
+
+
+@send('post', MANILA_HEADER)
+def set_share_type_extra_specs(share_type_id, extra_specs, **kwargs):
+    url = '/types/{}/extra_specs'.format(share_type_id)
+    json = {
+        'extra_specs': extra_specs
+    }
+    return url, json
+
+
+@send('delete', MANILA_HEADER)
+def unset_share_type_extra_specs(share_type_id, extra_spec_key, **kwargs):
+    url = '/types/{}/extra_specs/{}'.format(share_type_id, extra_spec_key)
+    return url, None
+
+
+@send('post', MANILA_HEADER)
+def add_share_type_access(share_type_id, project, **kwargs):
+    url = '/types/{}/action'.format(share_type_id)
+    json = {
+        'addProjectAccess': {
+            'project': project
+        }
+    }
+    return url, json
+
+
+@send('post', MANILA_HEADER)
+def remove_share_type_access(share_type_id, project, **kwargs):
+    url = 'types/{}/action'.format(share_type_id)
+    json = {
+        'removeProjectAccess': {
+            'project': project
+        }
+    }
+    return url, json
+
+
+@send('delete', MANILA_HEADER)
+def delete_share_type(share_type_id, **kwargs):
+    url = '/types/{}'.format(share_type_id)
+    return url, None
diff --git a/_modules/manilang/shares.py b/_modules/manilang/shares.py
new file mode 100644
index 0000000..77e5f1a
--- /dev/null
+++ b/_modules/manilang/shares.py
@@ -0,0 +1,79 @@
+# Copyright 2018 Mirantis Inc
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+import urllib
+
+from manilang.common import send, MANILA_HEADER
+
+
+@send('get', MANILA_HEADER)
+def list_shares(**kwargs):
+    url = '/shares?{}'.format(urllib.urlencode(kwargs))
+    return url, None
+
+
+@send('get', MANILA_HEADER)
+def list_shares_detailed(**kwargs):
+
+    url = '/shares/detail?{}'.format(urllib.urlencode(kwargs))
+    return url, None
+
+
+@send('get', MANILA_HEADER)
+def get_share_details(share_id, **kwargs):
+    url = '/shares/{}'.format(share_id)
+    return url, None
+
+
+@send('post', MANILA_HEADER)
+def create_share(share_proto, size, **kwargs):
+    url = '/shares'
+    json = {
+        'share': {
+            'share_proto': share_proto,
+            'size': size,
+        },
+    }
+    json['share'].update(kwargs)
+    return url, json
+
+
+@send('post', MANILA_HEADER)
+def manage_share(protocol, export_path, service_host, **kwargs):
+    url = '/shares/manage'
+    json = {
+        'share': {
+            'protocol': protocol,
+            'export_path': export_path,
+            'service_host': service_host,
+        }
+    }
+    json['share'].update(kwargs)
+    return url, json
+
+
+@send('put', MANILA_HEADER)
+def update_share(share_id, **kwargs):
+    url = '/shares/{}'.format(share_id)
+    json = {
+        'share': kwargs,
+    }
+    return url, json
+
+
+@send('delete', MANILA_HEADER)
+def delete_share(share_id, **kwargs):
+    url = '/shares/{}'.format(share_id)
+    return url, None
diff --git a/_states/example.sls b/_states/example.sls
new file mode 100644
index 0000000..55afcba
--- /dev/null
+++ b/_states/example.sls
@@ -0,0 +1,13 @@
+present_example:
+  manilang.share_type_present:
+    - microversion: '2.4'
+    - cloud_name: admin
+    - extra_specs:
+        driver_handles_share_servers: false
+        snapshot_support : true
+        key: value
+
+absent_example:
+    manilang.share_type_absent:
+      - microversion: '2.4'
+      - cloud_name: admin
diff --git a/_states/manilang.py b/_states/manilang.py
new file mode 100644
index 0000000..38d90de
--- /dev/null
+++ b/_states/manilang.py
@@ -0,0 +1,225 @@
+# Copyright 2018 Mirantis Inc
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+import logging
+log = logging.getLogger(__name__)
+
+
+def __virtual__():
+    '''
+    Only load if manila module is present in __salt__
+    '''
+    return 'manilang' if 'manilang.list_share_types' in __salt__ else False
+
+
+manilang_func = {
+    'list_types': 'manilang.list_share_types',
+    'create_type': 'manilang.create_share_type',
+    'set_type_specs': 'manilang.set_share_type_extra_specs',
+    'unset_type_specs': 'manilang.unset_share_type_extra_specs',
+    'delete_type': 'manilang.delete_share_type',
+}
+
+
+def share_type_present(name, extra_specs, cloud_name, **kwargs):
+    """
+    Ensure that share_type is present and has desired parameters
+
+    This function will create the desired share type if one with the requested
+    name does not exist. If it does, it will be updated to correspond to
+    parameters passed to this function.
+
+    :param name: name of the share type.
+    :param extra_specs: dictionary of extra_specs that share type should have.
+    It contains one required parameter - driver_handles_share_servers.
+    :param kwargs: other arguments that will be pushed into share_type
+        dictionary to be POSTed, if specified.
+
+    """
+    origin_share_types = __salt__[
+        manilang_func['list_types']
+    ](cloud_name=cloud_name)['share_types']
+    share_types = [
+        share_type
+        for share_type in origin_share_types if share_type['name'] == name
+    ]
+    if not share_types:
+        try:
+            res = __salt__[
+                manilang_func['create_type']
+            ](name, extra_specs, cloud_name=cloud_name, **kwargs)
+        except Exception as e:
+            log.error('Manila share type create failed with {}'.format(e))
+            return _create_failed(name, 'resource')
+        return _created(name, 'share_type', res)
+
+    elif len(share_types) == 1:
+        exact_share_type = share_types[0]
+
+        api_extra_specs = exact_share_type['extra_specs']
+        api_keys = set(api_extra_specs)
+        sls_keys = set(extra_specs)
+
+        to_delete = api_keys - sls_keys
+        to_add = sls_keys - api_keys
+        to_update = sls_keys & api_keys
+        resp = {}
+
+        for key in to_delete:
+            try:
+                __salt__[
+                    manilang_func['unset_type_specs']
+                ](exact_share_type['id'], key, cloud_name=cloud_name)
+            except Exception as e:
+                log.error(
+                    'Manila share type delete '
+                    'extra specs failed with {}'.format(e)
+                )
+                return _update_failed(name, 'share_type_extra_specs')
+            resp.update({'deleted_extra_specs': to_delete})
+
+        diff = {}
+
+        for key in to_add:
+            diff[key] = extra_specs[key]
+        for key in to_update:
+            if extra_specs[key] != api_extra_specs[key]:
+                diff[key] = extra_specs[key]
+        if diff:
+            try:
+                resp.update(
+                    __salt__[
+                        manilang_func['set_type_specs']
+                    ](exact_share_type['id'], {'extra_specs': diff},
+                      cloud_name=cloud_name)
+                )
+            except Exception as e:
+                log.error(
+                    'Manila share type update '
+                    'extra specs failed with {}'.format(e)
+                )
+                return _update_failed(name, 'share_type_extra_specs')
+        if to_delete or diff:
+            return _updated(name, 'share_type', resp)
+        return _no_changes(name, 'share_type')
+    else:
+        return _find_failed(name, 'share_type')
+
+
+def share_type_absent(name, cloud_name):
+    origin_share_types = __salt__[
+        manilang_func['list_types']
+    ](cloud_name=cloud_name)['share_types']
+    share_types = [
+        share_type
+        for share_type in origin_share_types if share_type['name'] == name
+    ]
+    if not share_types:
+        return _absent(name, 'share_type')
+    elif len(share_types) == 1:
+        try:
+            __salt__[manilang_func['delete_type']](share_types[0]['id'],
+                                                   cloud_name=cloud_name)
+        except Exception as e:
+            log.error('Manila share type delete failed with {}'.format(e))
+            return _delete_failed(name, 'share_type')
+        return _deleted(name, 'share_type')
+    else:
+        return _find_failed(name, 'share_type')
+
+
+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
