diff --git a/_modules/__init__.py b/_modules/__init__.py
deleted file mode 100644
index 7793d21..0000000
--- a/_modules/__init__.py
+++ /dev/null
@@ -1,30 +0,0 @@
-try:
-    import os_client_config
-    from keystoneauth1 import exceptions as ka_exceptions
-    REQUIREMENTS_MET = True
-except ImportError:
-    REQUIREMENTS_MET = False
-
-from octaviav2 import loadbalancers
-
-
-loadbalancer_list = loadbalancers.loadbalancer_list
-loadbalancer_get_details = loadbalancers.loadbalancer_get_details
-loadbalancer_update = loadbalancers.loadbalancer_update
-loadbalancer_delete = loadbalancers.loadbalancer_delete
-loadbalancer_create = loadbalancers.loadbalancer_create
-
-
-__all__ = (
-    'loadbalancer_get_details', 'loadbalancer_update', 'loadbalancer_delete',
-    'loadbalancer_list', 'loadbalancer_create',
-)
-
-
-def __virtual__():
-    """Only load neutronv2 if requirements are available."""
-    if REQUIREMENTS_MET:
-        return 'octaviav2'
-    else:
-        return False, ("The octaviav2 execution module cannot be loaded: "
-                       "os_client_config or keystoneauth are unavailable.")
diff --git a/_modules/common.py b/_modules/common.py
deleted file mode 100644
index 7cccf0b..0000000
--- a/_modules/common.py
+++ /dev/null
@@ -1,114 +0,0 @@
-import logging
-import os_client_config
-from uuid import UUID
-
-log = logging.getLogger(__name__)
-
-
-class OctaviaException(Exception):
-
-    _msg = "Octavia module exception occured."
-
-    def __init__(self, message=None, **kwargs):
-        super(OctaviaException, self).__init__(message or self._msg)
-
-
-class NoAuthPluginConfigured(OctaviaException):
-    _msg = ("You are using keystoneauth auth plugin that does not support "
-            "fetching endpoint list from token (noauth or admin_token).")
-
-
-class NoCredentials(OctaviaException):
-    _msg = "Please provide cloud name present in clouds.yaml."
-
-
-class ResourceNotFound(OctaviaException):
-    _msg = "Uniq resource: {resource} with name: {name} not found."
-
-    def __init__(self, resource, name, **kwargs):
-        super(ResourceNotFound, self).__init__(
-            self._msg.format(resource=resource, name=name))
-
-
-class MultipleResourcesFound(OctaviaException):
-    _msg = "Multiple resource: {resource} with name: {name} found."
-
-    def __init__(self, resource, name, **kwargs):
-        super(MultipleResourcesFound, self).__init__(
-            self._msg.format(resource=resource, name=name))
-
-
-def _get_raw_client(cloud_name):
-    service_type = 'load-balancer'
-    config = os_client_config.OpenStackConfig()
-    cloud = config.get_one_cloud(cloud_name)
-    adapter = cloud.get_session_client(service_type)
-    # workaround for IndexError as Octavia doen's have a version discovery
-    # document till Rocky (https://review.openstack.org/#/c/559460/)
-    adapter.min_version = None
-    adapter.max_version = None
-    adapter.version = None
-    try:
-        access_info = adapter.session.auth.get_access(adapter.session)
-        access_info.service_catalog.get_endpoints()
-    except (AttributeError, ValueError):
-        e = NoAuthPluginConfigured()
-        log.exception('%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, resp_id_key='id'):
-    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][resp_id_key]
-            return func(uuid, *args[start_arg:], **kwargs)
-        return wrapped_f
-    return wrap
diff --git a/_modules/loadbalancers.py b/_modules/loadbalancers.py
deleted file mode 100644
index 451880d..0000000
--- a/_modules/loadbalancers.py
+++ /dev/null
@@ -1,47 +0,0 @@
-from octaviav2.common import send
-from octaviav2.common import get_by_name_or_uuid
-
-try:
-    from urllib.parse import urlencode
-except ImportError:
-    from urllib import urlencode
-
-RESOURCE_LIST_KEY = 'loadbalancers'
-
-
-@send('get')
-def loadbalancer_list(**kwargs):
-    url = '/v2.0/lbaas/loadbalancers?{}'.format(urlencode(kwargs))
-    return url, {}
-
-@get_by_name_or_uuid(loadbalancer_list, RESOURCE_LIST_KEY)
-@send('get')
-def loadbalancer_get_details(loadbalancer_id, **kwargs):
-    url = '/v2.0/lbaas/loadbalancers/{}?{}'.format(loadbalancer_id, urlencode(kwargs))
-    return url, {}
-
-
-@get_by_name_or_uuid(loadbalancer_list, RESOURCE_LIST_KEY)
-@send('put')
-def loadbalancer_update(loadbalancer_id, **kwargs):
-    url = '/v2.0/lbaas/loadbalancers/{}'.format(loadbalancer_id)
-    json = {
-        'loadbalancer': kwargs,
-    }
-    return url, {'json': json}
-
-
-@get_by_name_or_uuid(loadbalancer_list, RESOURCE_LIST_KEY)
-@send('delete')
-def loadbalancer_delete(loadbalancer_id, **kwargs):
-    url = '/v2.0/lbaas/loadbalancers/{}'.format(loadbalancer_id)
-    return url, {}
-
-
-@send('post')
-def loadbalancer_create(**kwargs):
-    url = '/v2.0/lbaas/loadbalancers'
-    json = {
-        'loadbalancer': kwargs,
-    }
-    return url, {'json': json}
diff --git a/_states/octaviav2.py b/_states/octaviav2.py
deleted file mode 100644
index 4f9ef84..0000000
--- a/_states/octaviav2.py
+++ /dev/null
@@ -1,117 +0,0 @@
-import logging
-import random
-
-log = logging.getLogger(__name__)
-
-
-def __virtual__():
-    return 'octaviav2' if 'octaviav2.loadbalancer_list' in __salt__ else False
-
-
-def _octaviav2_call(fname, *args, **kwargs):
-    return __salt__['octaviav2.{}'.format(fname)](*args, **kwargs)
-
-
-def _resource_present(resource, name, changeable_params, cloud_name, **kwargs):
-    try:
-        method_name = '{}_get_details'.format(resource)
-        exact_resource = _octaviav2_call(
-            method_name, name, cloud_name=cloud_name
-        )[resource]
-    except Exception as e:
-        if 'ResourceNotFound' in repr(e):
-            try:
-                method_name = '{}_create'.format(resource)
-                resp = _octaviav2_call(
-                    method_name, name=name, cloud_name=cloud_name, **kwargs
-                )
-            except Exception as e:
-                log.exception('Octavia {0} create failed with {1}'.
-                    format(resource, e))
-                return _failed('create', name, resource)
-            return _succeeded('create', name, resource, resp)
-        elif 'MultipleResourcesFound' in repr(e):
-            return _failed('find', name, resource)
-        else:
-            raise
-
-    to_update = {}
-    for key in kwargs:
-        if key in changeable_params and (key not in exact_resource
-                or kwargs[key] != exact_resource[key]):
-            to_update[key] = kwargs[key]
-    try:
-        method_name = '{}_update'.format(resource)
-        resp = _octaviav2_call(
-            method_name, name, cloud_name=cloud_name, **to_update
-        )
-    except Exception as e:
-        log.exception('Octavia {0} update failed with {1}'.format(resource, e))
-        return _failed('update', name, resource)
-    return _succeeded('update', name, resource, resp)
-
-
-def _resource_absent(resource, name, cloud_name):
-    try:
-        method_name = '{}_get_details'.format(resource)
-        _octaviav2_call(
-            method_name, name, cloud_name=cloud_name
-        )[resource]
-    except Exception as e:
-        if 'ResourceNotFound' in repr(e):
-            return _succeeded('absent', name, resource)
-        if 'MultipleResourcesFound' in repr(e):
-            return _failed('find', name, resource)
-    try:
-        method_name = '{}_delete'.format(resource)
-        _octaviav2_call(
-            method_name, name, cloud_name=cloud_name
-        )
-    except Exception as e:
-        log.error('Octavia delete {0} failed with {1}'.format(resource, e))
-        return _failed('delete', name, resource)
-    return _succeeded('delete', name, resource)
-
-
-def loadbalancer_present(name, cloud_name, **kwargs):
-    changeable = (
-        'admin_state_up', 'vip_qos_policy_id', 'description',
-    )
-
-    return _resource_present('loadbalancer', name, changeable, cloud_name, **kwargs)
-
-
-def loadbalancer_absent(name, cloud_name):
-    return _resource_absent('loadbalancer', name, cloud_name)
-
-def _succeeded(op, name, resource, changes=None):
-    msg_map = {
-        'create': '{0} {1} created',
-        'delete': '{0} {1} removed',
-        'update': '{0} {1} updated',
-        'no_changes': '{0} {1} is in desired state',
-        'absent': '{0} {1} not present',
-    }
-    changes_dict = {
-        'name': name,
-        'result': True,
-        'comment': msg_map[op].format(resource, name),
-        'changes': changes or {},
-    }
-    return changes_dict
-
-
-def _failed(op, name, resource):
-    msg_map = {
-        'create': '{0} {1} failed to create',
-        'delete': '{0} {1} failed to delete',
-        'update': '{0} {1} failed to update',
-        'find': '{0} {1} found multiple {0}',
-    }
-    changes_dict = {
-        'name': name,
-        'result': False,
-        'comment': msg_map[op].format(resource, name),
-        'changes': {},
-    }
-    return changes_dict
diff --git a/octavia/upgrade/verify/_api.sls b/octavia/upgrade/verify/_api.sls
index d8a5f7e..e308a64 100644
--- a/octavia/upgrade/verify/_api.sls
+++ b/octavia/upgrade/verify/_api.sls
@@ -1,20 +1,3 @@
-{%- from "octavia/map.jinja" import api with context %}
-{%- from "keystone/map.jinja" import client as kclient with context %}
-
-
 octavia_upgrade_verify_api:
   test.show_notification:
-    - text: "Running octavia.upgrade.verify.api"
-
-
-{%- if kclient.enabled and kclient.get('os_client_config', {}).get('enabled', False)  %}
-  {%- if api.enabled %}
-
-octaviav2_loadbalancer_list:
-  module.run:
-    - name: octaviav2.loadbalancer_list
-    - kwargs:
-        cloud_name: admin_identity
-
-  {%- endif %}
-{%- endif %}
+    - text: "Running octavia.upgrade.verify.api"
\ No newline at end of file
