diff --git a/oslo_messaging/_drivers/amqp.py b/oslo_messaging/_drivers/amqp.py
index a8289dbc9..d4db2c6b8 100644
--- a/oslo_messaging/_drivers/amqp.py
+++ b/oslo_messaging/_drivers/amqp.py
@@ -26,7 +26,6 @@ import collections
 import uuid
 
 from oslo_config import cfg
-import six
 
 from oslo_messaging._drivers import common as rpc_common
 
@@ -62,7 +61,7 @@ def unpack_context(msg):
     """Unpack context from msg."""
     context_dict = {}
     for key in list(msg.keys()):
-        key = six.text_type(key)
+        key = str(key)
         if key.startswith('_context_'):
             value = msg.pop(key)
             context_dict[key[9:]] = value
diff --git a/oslo_messaging/_drivers/amqp1_driver/controller.py b/oslo_messaging/_drivers/amqp1_driver/controller.py
index 3e2f5bbf8..62975071b 100644
--- a/oslo_messaging/_drivers/amqp1_driver/controller.py
+++ b/oslo_messaging/_drivers/amqp1_driver/controller.py
@@ -29,6 +29,7 @@ import collections
 import logging
 import os
 import platform
+import queue
 import random
 import sys
 import threading
@@ -38,9 +39,6 @@ import uuid
 from oslo_utils import eventletutils
 import proton
 import pyngus
-from six import iteritems
-from six import itervalues
-from six import moves
 
 from oslo_messaging._drivers.amqp1_driver.addressing import AddresserFactory
 from oslo_messaging._drivers.amqp1_driver.addressing import keyify
@@ -868,7 +866,7 @@ class Controller(pyngus.ConnectionEventHandler):
         self._command = os.path.basename(sys.argv[0])
         self._pid = os.getpid()
         # queue of drivertask objects to execute on the eventloop thread
-        self._tasks = moves.queue.Queue(maxsize=500)
+        self._tasks = queue.Queue(maxsize=500)
         # limit the number of Task()'s to execute per call to _process_tasks().
         # This allows the eventloop main thread to return to servicing socket
         # I/O in a timely manner
@@ -961,7 +959,7 @@ class Controller(pyngus.ConnectionEventHandler):
             LOG.debug("Waiting for eventloop to exit")
             self.processor.join(timeout)
             self._hard_reset("Shutting down")
-            for sender in itervalues(self._all_senders):
+            for sender in self._all_senders.values():
                 sender.destroy()
             self._all_senders.clear()
             self._servers.clear()
@@ -1134,7 +1132,7 @@ class Controller(pyngus.ConnectionEventHandler):
                   'vhost': ("/" + self.hosts.virtual_host
                             if self.hosts.virtual_host else "")})
 
-        for sender in itervalues(self._all_senders):
+        for sender in self._all_senders.values():
             sender.attach(self._socket_connection.pyngus_conn,
                           self.reply_link, self.addresser)
 
@@ -1181,8 +1179,8 @@ class Controller(pyngus.ConnectionEventHandler):
         self.addresser = self.addresser_factory(props,
                                                 self.hosts.virtual_host
                                                 if self.pseudo_vhost else None)
-        for servers in itervalues(self._servers):
-            for server in itervalues(servers):
+        for servers in self._servers.values():
+            for server in servers.values():
                 server.attach(self._socket_connection.pyngus_conn,
                               self.addresser)
         self.reply_link = Replies(self._socket_connection.pyngus_conn,
@@ -1279,7 +1277,7 @@ class Controller(pyngus.ConnectionEventHandler):
         del self._purged_senders[:]
         self._active_senders.clear()
         unused = []
-        for key, sender in iteritems(self._all_senders):
+        for key, sender in self._all_senders.items():
             # clean up any sender links that no longer have messages to send
             if sender.pending_messages == 0:
                 unused.append(key)
@@ -1289,8 +1287,8 @@ class Controller(pyngus.ConnectionEventHandler):
         for key in unused:
             self._all_senders[key].destroy(reason)
             del self._all_senders[key]
-        for servers in itervalues(self._servers):
-            for server in itervalues(servers):
+        for servers in self._servers.values():
+            for server in servers.values():
                 server.reset()
         if self.reply_link:
             self.reply_link.destroy()
@@ -1300,13 +1298,13 @@ class Controller(pyngus.ConnectionEventHandler):
 
     def _detach_senders(self):
         """Close all sender links"""
-        for sender in itervalues(self._all_senders):
+        for sender in self._all_senders.values():
             sender.detach()
 
     def _detach_servers(self):
         """Close all listener links"""
-        for servers in itervalues(self._servers):
-            for server in itervalues(servers):
+        for servers in self._servers.values():
+            for server in servers.values():
                 server.detach()
 
     def _purge_sender_links(self):
diff --git a/oslo_messaging/_drivers/amqpdriver.py b/oslo_messaging/_drivers/amqpdriver.py
index 89e3fd38d..011222cee 100644
--- a/oslo_messaging/_drivers/amqpdriver.py
+++ b/oslo_messaging/_drivers/amqpdriver.py
@@ -14,6 +14,7 @@
 #    under the License.
 
 import logging
+import queue
 import threading
 import time
 import uuid
@@ -21,7 +22,6 @@ import uuid
 import cachetools
 from oslo_utils import eventletutils
 from oslo_utils import timeutils
-from six import moves
 
 import oslo_messaging
 from oslo_messaging._drivers import amqp as rpc_amqp
@@ -48,7 +48,7 @@ class MessageOperationsHandler(object):
 
     def __init__(self, name):
         self.name = "%s (%s)" % (name, hex(id(self)))
-        self._tasks = moves.queue.Queue()
+        self._tasks = queue.Queue()
 
         self._shutdown = eventletutils.Event()
         self._shutdown_thread = threading.Thread(
@@ -75,7 +75,7 @@ class MessageOperationsHandler(object):
         while True:
             try:
                 task = self._tasks.get(block=False)
-            except moves.queue.Empty:
+            except queue.Empty:
                 break
             task()
 
@@ -403,7 +403,7 @@ class ReplyWaiters(object):
     def get(self, msg_id, timeout):
         try:
             return self._queues[msg_id].get(block=True, timeout=timeout)
-        except moves.queue.Empty:
+        except queue.Empty:
             raise oslo_messaging.MessagingTimeout(
                 'Timed out waiting for a reply '
                 'to message ID %s' % msg_id)
@@ -418,7 +418,7 @@ class ReplyWaiters(object):
             queue.put(message_data)
 
     def add(self, msg_id):
-        self._queues[msg_id] = moves.queue.Queue()
+        self._queues[msg_id] = queue.Queue()
         queues_length = len(self._queues)
         if queues_length > self._wrn_threshold:
             LOG.warning('Number of call queues is %(queues_length)s, '
@@ -529,7 +529,7 @@ class ReplyWaiter(object):
                     timeout = cm_timeout
             try:
                 message = self.waiters.get(msg_id, timeout=timeout)
-            except moves.queue.Empty:
+            except queue.Empty:
                 self._raise_timeout_exception(msg_id)
 
             reply, ending = self._process_reply(message)
diff --git a/oslo_messaging/_drivers/base.py b/oslo_messaging/_drivers/base.py
index fb44540e9..2947e6d53 100644
--- a/oslo_messaging/_drivers/base.py
+++ b/oslo_messaging/_drivers/base.py
@@ -18,7 +18,6 @@ import threading
 from oslo_config import cfg
 from oslo_utils import excutils
 from oslo_utils import timeutils
-import six
 
 from oslo_messaging import exceptions
 
@@ -65,8 +64,7 @@ class TransportDriverError(exceptions.MessagingException):
     """Base class for transport driver specific exceptions."""
 
 
-@six.add_metaclass(abc.ABCMeta)
-class IncomingMessage(object):
+class IncomingMessage(object, metaclass=abc.ABCMeta):
     """The IncomingMessage class represents a single message received from the
     messaging backend. Instances of this class are passed to up a server's
     messaging processing logic. The backend driver must provide a concrete
@@ -116,8 +114,7 @@ class IncomingMessage(object):
         """
 
 
-@six.add_metaclass(abc.ABCMeta)
-class RpcIncomingMessage(IncomingMessage):
+class RpcIncomingMessage(IncomingMessage, metaclass=abc.ABCMeta):
     """The RpcIncomingMessage represents an RPC request message received from
     the backend. This class must be used for RPC calls that return a value to
     the caller.
@@ -170,8 +167,7 @@ class RpcIncomingMessage(IncomingMessage):
         """
 
 
-@six.add_metaclass(abc.ABCMeta)
-class PollStyleListener(object):
+class PollStyleListener(object, metaclass=abc.ABCMeta):
     """A PollStyleListener is used to transfer received messages to a server
     for processing. A polling pattern is used to retrieve messages.  A
     PollStyleListener uses a separate thread to run the polling loop.  A
@@ -227,8 +223,7 @@ class PollStyleListener(object):
         pass
 
 
-@six.add_metaclass(abc.ABCMeta)
-class Listener(object):
+class Listener(object, metaclass=abc.ABCMeta):
     """A Listener is used to transfer incoming messages from the driver to a
     server for processing.  A callback is used by the driver to transfer the
     messages.
@@ -328,8 +323,7 @@ class PollStyleListenerAdapter(Listener):
         self._poll_style_listener.cleanup()
 
 
-@six.add_metaclass(abc.ABCMeta)
-class BaseDriver(object):
+class BaseDriver(object, metaclass=abc.ABCMeta):
     """Defines the backend driver interface. Each backend driver implementation
     must provide a concrete derivation of this class implementing the backend
     specific logic for its public methods.
diff --git a/oslo_messaging/_drivers/common.py b/oslo_messaging/_drivers/common.py
index 64351b2b3..54c6f7fcb 100644
--- a/oslo_messaging/_drivers/common.py
+++ b/oslo_messaging/_drivers/common.py
@@ -15,13 +15,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-# TODO(smcginnis) update this once six has support for collections.abc
-# (https://github.com/benjaminp/six/pull/241) or clean up once we drop py2.7.
-try:
-    from collections.abc import Mapping
-except ImportError:
-    from collections import Mapping
-
+from collections.abc import Mapping
 import copy
 import logging
 import sys
@@ -29,14 +23,13 @@ import traceback
 
 from oslo_serialization import jsonutils
 from oslo_utils import timeutils
-import six
 
 import oslo_messaging
 from oslo_messaging import _utils as utils
 
 LOG = logging.getLogger(__name__)
 
-_EXCEPTIONS_MODULE = 'exceptions' if six.PY2 else 'builtins'
+_EXCEPTIONS_MODULE = 'builtins'
 _EXCEPTIONS_MODULES = ['exceptions', 'builtins']
 
 
@@ -184,8 +177,8 @@ def serialize_remote_exception(failure_info):
 
     # NOTE(matiu): With cells, it's possible to re-raise remote, remote
     # exceptions. Lets turn it back into the original exception type.
-    cls_name = six.text_type(failure.__class__.__name__)
-    mod_name = six.text_type(failure.__class__.__module__)
+    cls_name = str(failure.__class__.__name__)
+    mod_name = str(failure.__class__.__module__)
     if (cls_name.endswith(_REMOTE_POSTFIX) and
             mod_name.endswith(_REMOTE_POSTFIX)):
         cls_name = cls_name[:-len(_REMOTE_POSTFIX)]
@@ -194,7 +187,7 @@ def serialize_remote_exception(failure_info):
     data = {
         'class': cls_name,
         'module': mod_name,
-        'message': six.text_type(failure),
+        'message': str(failure),
         'tb': tb,
         'args': failure.args,
         'kwargs': kwargs
@@ -206,7 +199,7 @@ def serialize_remote_exception(failure_info):
 
 
 def deserialize_remote_exception(data, allowed_remote_exmods):
-    failure = jsonutils.loads(six.text_type(data))
+    failure = jsonutils.loads(str(data))
 
     trace = failure.get('tb', [])
     message = failure.get('message', "") + "\n" + "\n".join(trace)
@@ -235,7 +228,7 @@ def deserialize_remote_exception(data, allowed_remote_exmods):
         failure = klass(*failure.get('args', []), **failure.get('kwargs', {}))
     except (AttributeError, TypeError, ImportError) as error:
         LOG.warning("Failed to rebuild remote exception due to error: %s",
-                    six.text_type(error))
+                    str(error))
         return oslo_messaging.RemoteError(name, failure.get('message'), trace)
 
     ex_type = type(failure)
diff --git a/oslo_messaging/_drivers/impl_fake.py b/oslo_messaging/_drivers/impl_fake.py
index 47fa4a382..93e8bc773 100644
--- a/oslo_messaging/_drivers/impl_fake.py
+++ b/oslo_messaging/_drivers/impl_fake.py
@@ -14,12 +14,12 @@
 #    under the License.
 
 import copy
+import queue
 import threading
 import time
 
 from oslo_serialization import jsonutils
 from oslo_utils import eventletutils
-from six import moves
 
 import oslo_messaging
 from oslo_messaging._drivers import base
@@ -133,8 +133,8 @@ class FakeExchange(object):
                 self.deliver_message(topic, ctxt, message, server=server,
                                      fanout=fanout, reply_q=reply_q)
 
-            for queue in queues:
-                queue.append((ctxt, message, reply_q, requeue))
+            for q in queues:
+                q.append((ctxt, message, reply_q, requeue))
 
     def poll(self, target, pool):
         with self._queues_lock:
@@ -195,7 +195,7 @@ class FakeDriver(base.BaseDriver):
 
         reply_q = None
         if wait_for_reply:
-            reply_q = moves.queue.Queue()
+            reply_q = queue.Queue()
 
         exchange.deliver_message(target.topic, ctxt, message,
                                  server=target.server,
@@ -209,7 +209,7 @@ class FakeDriver(base.BaseDriver):
                     raise failure
                 else:
                     return reply
-            except moves.queue.Empty:
+            except queue.Empty:
                 raise oslo_messaging.MessagingTimeout(
                     'No reply on topic %s' % target.topic)
 
diff --git a/oslo_messaging/_drivers/impl_rabbit.py b/oslo_messaging/_drivers/impl_rabbit.py
index 2018c5eb7..c5c39704b 100644
--- a/oslo_messaging/_drivers/impl_rabbit.py
+++ b/oslo_messaging/_drivers/impl_rabbit.py
@@ -24,6 +24,7 @@ import ssl
 import sys
 import threading
 import time
+from urllib import parse
 import uuid
 
 import kombu
@@ -34,9 +35,6 @@ from oslo_config import cfg
 from oslo_log import log as logging
 from oslo_utils import eventletutils
 from oslo_utils import importutils
-import six
-import six.moves
-from six.moves.urllib import parse
 
 import oslo_messaging
 from oslo_messaging._drivers import amqp as rpc_amqp
@@ -320,7 +318,7 @@ class Consumer(object):
             self.declare(conn)
         try:
             self.queue.consume(callback=self._callback,
-                               consumer_tag=six.text_type(tag),
+                               consumer_tag=str(tag),
                                nowait=self.nowait)
         except conn.connection.channel_errors as exc:
             # We retries once because of some races that we can
@@ -340,14 +338,14 @@ class Consumer(object):
                                    exc.method_name == 'Basic.ack'):
                 self.declare(conn)
                 self.queue.consume(callback=self._callback,
-                                   consumer_tag=six.text_type(tag),
+                                   consumer_tag=str(tag),
                                    nowait=self.nowait)
             else:
                 raise
 
     def cancel(self, tag):
         LOG.trace('ConsumerBase.cancel: canceling %s', tag)
-        self.queue.cancel(six.text_type(tag))
+        self.queue.cancel(str(tag))
 
     def _callback(self, message):
         """Call callback with deserialized message.
@@ -753,7 +751,7 @@ class Connection(object):
             info = {'err_str': exc, 'sleep_time': interval}
             info.update(self._get_connection_info(conn_error=True))
 
-            if 'Socket closed' in six.text_type(exc):
+            if 'Socket closed' in str(exc):
                 LOG.error('[%(connection_id)s] AMQP server'
                           ' %(hostname)s:%(port)s closed'
                           ' the connection. Check login credentials:'
@@ -867,8 +865,8 @@ class Connection(object):
         """Close/release this connection."""
         self._heartbeat_stop()
         if self.connection:
-            for consumer in six.moves.filter(lambda c: c.type == 'fanout',
-                                             self._consumers):
+            for consumer in filter(lambda c: c.type == 'fanout',
+                                   self._consumers):
                 LOG.debug('[connection close] Deleting fanout '
                           'queue: %s ' % consumer.queue.name)
                 consumer.queue.delete()
diff --git a/oslo_messaging/_drivers/pool.py b/oslo_messaging/_drivers/pool.py
index 774c3ab34..5eea00f92 100644
--- a/oslo_messaging/_drivers/pool.py
+++ b/oslo_messaging/_drivers/pool.py
@@ -19,7 +19,6 @@ import threading
 
 from oslo_log import log as logging
 from oslo_utils import timeutils
-import six
 
 from oslo_messaging._drivers import common
 
@@ -36,8 +35,7 @@ else:
         cond.wait()
 
 
-@six.add_metaclass(abc.ABCMeta)
-class Pool(object):
+class Pool(object, metaclass=abc.ABCMeta):
     """A thread-safe object pool.
 
     Modelled after the eventlet.pools.Pool interface, but designed to be safe
diff --git a/oslo_messaging/dispatcher.py b/oslo_messaging/dispatcher.py
index 82d459586..347a67619 100644
--- a/oslo_messaging/dispatcher.py
+++ b/oslo_messaging/dispatcher.py
@@ -13,16 +13,13 @@
 
 import abc
 
-import six
-
 
 __all__ = [
     "DispatcherBase"
 ]
 
 
-@six.add_metaclass(abc.ABCMeta)
-class DispatcherBase(object):
+class DispatcherBase(object, metaclass=abc.ABCMeta):
     "Base class for dispatcher"
 
     @abc.abstractmethod
diff --git a/oslo_messaging/exceptions.py b/oslo_messaging/exceptions.py
index f6ba20a76..48645b30b 100644
--- a/oslo_messaging/exceptions.py
+++ b/oslo_messaging/exceptions.py
@@ -13,8 +13,6 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import six
-
 __all__ = ['MessagingException', 'MessagingTimeout', 'MessageDeliveryFailure',
            'InvalidTarget', 'MessageUndeliverable']
 
@@ -35,7 +33,7 @@ class InvalidTarget(MessagingException, ValueError):
     """Raised if a target does not meet certain pre-conditions."""
 
     def __init__(self, msg, target):
-        msg = msg + ":" + six.text_type(target)
+        msg = msg + ":" + str(target)
         super(InvalidTarget, self).__init__(msg)
         self.target = target
 
diff --git a/oslo_messaging/hacking/checks.py b/oslo_messaging/hacking/checks.py
index 3925ab4fa..1241b249f 100644
--- a/oslo_messaging/hacking/checks.py
+++ b/oslo_messaging/hacking/checks.py
@@ -16,7 +16,6 @@ import re
 
 import ast
 from hacking import core
-import six
 
 
 oslo_namespace_imports_dot = re.compile(r"import[\s]+oslo[.][^\s]+")
@@ -45,18 +44,6 @@ def check_oslo_namespace_imports(logical_line):
         yield(0, msg)
 
 
-@core.flake8ext
-def check_mock_imports(logical_line):
-    if re.match(mock_imports_directly, logical_line):
-        msg = ("O322: '%s' must be used instead of '%s'.") % (
-            logical_line.replace('import mock', 'from six.moves import mock'),
-            logical_line)
-        yield(0, msg)
-    elif re.match(mock_imports_direclty_from, logical_line):
-        msg = "O322: Use mock from six.moves."
-        yield(0, msg)
-
-
 class BaseASTChecker(ast.NodeVisitor):
     """Provides a simple framework for writing AST-based checks.
 
@@ -152,7 +139,7 @@ class CheckForLoggingIssues(BaseASTChecker):
             if obj_name is None:
                 return None
             return obj_name + '.' + method_name
-        elif isinstance(node, six.string_types):
+        elif isinstance(node, str):
             return node
         else:  # could be Subscript, Call or many more
             return None
@@ -284,10 +271,7 @@ class CheckForLoggingIssues(BaseASTChecker):
         peers = find_peers(node)
         for peer in peers:
             if isinstance(peer, ast.Raise):
-                if six.PY3:
-                    exc = peer.exc
-                else:
-                    exc = peer.type
+                exc = peer.exc
                 if (isinstance(exc, ast.Call) and
                         len(exc.args) > 0 and
                         isinstance(exc.args[0], ast.Name) and
diff --git a/oslo_messaging/notify/dispatcher.py b/oslo_messaging/notify/dispatcher.py
index df4fc42da..4d31a684b 100644
--- a/oslo_messaging/notify/dispatcher.py
+++ b/oslo_messaging/notify/dispatcher.py
@@ -18,8 +18,6 @@ import itertools
 import logging
 import operator
 
-import six
-
 from oslo_messaging import dispatcher
 from oslo_messaging import serializer as msg_serializer
 
@@ -124,7 +122,7 @@ class BatchNotificationDispatcher(NotificationDispatcher):
 
         requeues = set()
         for priority, messages in messages_grouped:
-            __, raw_messages, messages = six.moves.zip(*messages)
+            __, raw_messages, messages = zip(*messages)
             if priority not in PRIORITIES:
                 LOG.warning('Unknown priority "%s"', priority)
                 continue
diff --git a/oslo_messaging/notify/filter.py b/oslo_messaging/notify/filter.py
index 44eb8278f..349f82ded 100644
--- a/oslo_messaging/notify/filter.py
+++ b/oslo_messaging/notify/filter.py
@@ -15,8 +15,6 @@
 
 import re
 
-import six
-
 
 class NotificationFilter(object):
 
@@ -63,7 +61,7 @@ class NotificationFilter(object):
     def _check_for_single_mismatch(data, regex):
         if regex is None:
             return False
-        if not isinstance(data, six.string_types):
+        if not isinstance(data, str):
             return True
         if not regex.match(data):
             return True
diff --git a/oslo_messaging/notify/notifier.py b/oslo_messaging/notify/notifier.py
index ebe05dd14..02ff643ed 100644
--- a/oslo_messaging/notify/notifier.py
+++ b/oslo_messaging/notify/notifier.py
@@ -22,7 +22,6 @@ import uuid
 
 from oslo_config import cfg
 from oslo_utils import timeutils
-import six
 from stevedore import extension
 from stevedore import named
 
@@ -106,8 +105,7 @@ def _send_notification():
     notifier._notify({}, args.event_type, args.payload, args.priority)
 
 
-@six.add_metaclass(abc.ABCMeta)
-class Driver(object):
+class Driver(object, metaclass=abc.ABCMeta):
     """Base driver for Notifications"""
 
     def __init__(self, conf, topics, transport):
@@ -182,7 +180,7 @@ class Notifier(object):
 
     Notification messages follow the following format::
 
-        {'message_id': six.text_type(uuid.uuid4()),
+        {'message_id': str(uuid.uuid4()),
          'publisher_id': 'compute.host1',
          'timestamp': timeutils.utcnow(),
          'priority': 'WARN',
@@ -300,12 +298,12 @@ class Notifier(object):
         payload = self._serializer.serialize_entity(ctxt, payload)
         ctxt = self._serializer.serialize_context(ctxt)
 
-        msg = dict(message_id=six.text_type(uuid.uuid4()),
+        msg = dict(message_id=str(uuid.uuid4()),
                    publisher_id=publisher_id or self.publisher_id,
                    event_type=event_type,
                    priority=priority,
                    payload=payload,
-                   timestamp=six.text_type(timeutils.utcnow()))
+                   timestamp=str(timeutils.utcnow()))
 
         def do_notify(ext):
             try:
diff --git a/oslo_messaging/rpc/client.py b/oslo_messaging/rpc/client.py
index ea5f54e2c..115198bf5 100644
--- a/oslo_messaging/rpc/client.py
+++ b/oslo_messaging/rpc/client.py
@@ -19,7 +19,6 @@ import abc
 import logging
 
 from oslo_config import cfg
-import six
 
 from oslo_messaging._drivers import base as driver_base
 from oslo_messaging import _utils as utils
@@ -85,8 +84,7 @@ class ClientSendError(exceptions.MessagingException):
         self.ex = ex
 
 
-@six.add_metaclass(abc.ABCMeta)
-class _BaseCallContext(object):
+class _BaseCallContext(object, metaclass=abc.ABCMeta):
 
     _marker = object()
 
diff --git a/oslo_messaging/rpc/dispatcher.py b/oslo_messaging/rpc/dispatcher.py
index c118931e4..86e2e6630 100644
--- a/oslo_messaging/rpc/dispatcher.py
+++ b/oslo_messaging/rpc/dispatcher.py
@@ -22,8 +22,6 @@ import logging
 import sys
 import threading
 
-import six
-
 from oslo_utils import eventletutils
 
 from oslo_messaging import _utils as utils
@@ -83,8 +81,7 @@ class UnsupportedVersion(RPCDispatcherError):
         self.method = method
 
 
-@six.add_metaclass(ABCMeta)
-class RPCAccessPolicyBase(object):
+class RPCAccessPolicyBase(object, metaclass=ABCMeta):
     """Determines which endpoint methods may be invoked via RPC"""
 
     @abstractmethod
diff --git a/oslo_messaging/serializer.py b/oslo_messaging/serializer.py
index 56fe9d764..acfecddc4 100644
--- a/oslo_messaging/serializer.py
+++ b/oslo_messaging/serializer.py
@@ -17,13 +17,11 @@
 import abc
 
 from oslo_serialization import jsonutils
-import six
 
 __all__ = ['Serializer', 'NoOpSerializer', 'JsonPayloadSerializer']
 
 
-@six.add_metaclass(abc.ABCMeta)
-class Serializer(object):
+class Serializer(object, metaclass=abc.ABCMeta):
     """Generic (de-)serialization definition base class."""
 
     @abc.abstractmethod
diff --git a/oslo_messaging/server.py b/oslo_messaging/server.py
index 4df1512b5..3eb33a2ef 100644
--- a/oslo_messaging/server.py
+++ b/oslo_messaging/server.py
@@ -27,7 +27,6 @@ from oslo_config import cfg
 from oslo_service import service
 from oslo_utils import eventletutils
 from oslo_utils import timeutils
-import six
 from stevedore import driver
 
 from oslo_messaging._drivers import base as driver_base
@@ -297,8 +296,8 @@ def ordered(after=None, reset_after=None):
     return _ordered
 
 
-@six.add_metaclass(abc.ABCMeta)
-class MessageHandlingServer(service.ServiceBase, _OrderedTaskRunner):
+class MessageHandlingServer(service.ServiceBase, _OrderedTaskRunner,
+                            metaclass=abc.ABCMeta):
     """Server for handling messages.
 
     Connect a transport to a dispatcher that knows how to process the
diff --git a/oslo_messaging/tests/__init__.py b/oslo_messaging/tests/__init__.py
index 7564f2688..ed8a3f831 100644
--- a/oslo_messaging/tests/__init__.py
+++ b/oslo_messaging/tests/__init__.py
@@ -19,5 +19,5 @@ eventlet.monkey_patch()
 # oslotest prepares mock for six in oslotest/__init__.py as follow:
 # six.add_move(six.MovedModule('mock', 'mock', 'unittest.mock')) and
 # oslo.messaging imports oslotest before importing test submodules to
-# setup six.moves for mock, then "from six.moves import mock" works well.
+# setup six.moves for mock, then "from unittest import mock" works well.
 import oslotest
diff --git a/oslo_messaging/tests/drivers/test_amqp_driver.py b/oslo_messaging/tests/drivers/test_amqp_driver.py
index cfcc0678b..7f39da89a 100644
--- a/oslo_messaging/tests/drivers/test_amqp_driver.py
+++ b/oslo_messaging/tests/drivers/test_amqp_driver.py
@@ -15,21 +15,21 @@
 import copy
 import logging
 import os
+import queue
 import select
 import shlex
 import shutil
-from six.moves import mock
 import socket
 import subprocess
 import sys
 import tempfile
 import threading
 import time
+from unittest import mock
 import uuid
 
 from oslo_utils import eventletutils
 from oslo_utils import importutils
-from six import moves
 from string import Template
 import testtools
 
@@ -74,7 +74,7 @@ class _ListenerThread(threading.Thread):
         self.listener = listener
         self.msg_count = msg_count
         self._msg_ack = msg_ack
-        self.messages = moves.queue.Queue()
+        self.messages = queue.Queue()
         self.daemon = True
         self.started = eventletutils.Event()
         self._done = eventletutils.Event()
@@ -106,7 +106,7 @@ class _ListenerThread(threading.Thread):
             while True:
                 m = self.messages.get(False)
                 msgs.append(m)
-        except moves.queue.Empty:
+        except queue.Empty:
             pass
         return msgs
 
diff --git a/oslo_messaging/tests/drivers/test_impl_kafka.py b/oslo_messaging/tests/drivers/test_impl_kafka.py
index 72a86831f..77b2ed6cf 100644
--- a/oslo_messaging/tests/drivers/test_impl_kafka.py
+++ b/oslo_messaging/tests/drivers/test_impl_kafka.py
@@ -11,8 +11,9 @@
 # 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 six.moves import mock
+
 import testscenarios
+from unittest import mock
 
 import oslo_messaging
 from oslo_messaging._drivers import impl_kafka as kafka_driver
diff --git a/oslo_messaging/tests/drivers/test_impl_rabbit.py b/oslo_messaging/tests/drivers/test_impl_rabbit.py
index 9212196f4..3da58a4e7 100644
--- a/oslo_messaging/tests/drivers/test_impl_rabbit.py
+++ b/oslo_messaging/tests/drivers/test_impl_rabbit.py
@@ -32,7 +32,7 @@ from oslo_messaging._drivers import common as driver_common
 from oslo_messaging._drivers import impl_rabbit as rabbit_driver
 from oslo_messaging.exceptions import MessageDeliveryFailure
 from oslo_messaging.tests import utils as test_utils
-from six.moves import mock
+from unittest import mock
 
 load_tests = testscenarios.load_tests_apply_scenarios
 
diff --git a/oslo_messaging/tests/functional/test_functional.py b/oslo_messaging/tests/functional/test_functional.py
index a1fcdd16d..a71f6c25f 100644
--- a/oslo_messaging/tests/functional/test_functional.py
+++ b/oslo_messaging/tests/functional/test_functional.py
@@ -17,7 +17,6 @@ import uuid
 
 import concurrent.futures
 from oslo_config import cfg
-import six.moves
 from testtools import matchers
 
 import oslo_messaging
@@ -535,7 +534,7 @@ class NotifyTestCase(utils.SkipIfNoTransportURL):
                                            batch_timeout=batch_timeout))
         notifier = listener.notifier('abc')
 
-        for i in six.moves.range(0, 205):
+        for i in range(0, 205):
             notifier.info({}, 'test%s' % i, 'Hello World!')
         events = listener.get_events(timeout=get_timeout)
         self.assertEqual(3, len(events))
diff --git a/oslo_messaging/tests/functional/utils.py b/oslo_messaging/tests/functional/utils.py
index 5f6f9c7e6..371c170a1 100644
--- a/oslo_messaging/tests/functional/utils.py
+++ b/oslo_messaging/tests/functional/utils.py
@@ -12,12 +12,12 @@
 #    under the License.
 
 import os
+import queue
 import time
 import uuid
 
 import fixtures
 from oslo_config import cfg
-from six import moves
 
 import oslo_messaging
 from oslo_messaging._drivers.kafka_driver import kafka_options
@@ -102,7 +102,7 @@ class RpcServerFixture(fixtures.Fixture):
         self.target = target
         self.endpoint = endpoint or TestServerEndpoint()
         self.executor = executor
-        self.syncq = moves.queue.Queue()
+        self.syncq = queue.Queue()
         self.ctrl_target = ctrl_target or self.target
 
     def setUp(self):
@@ -323,7 +323,7 @@ class NotificationFixture(fixtures.Fixture):
         self.conf = conf
         self.url = url
         self.topics = topics
-        self.events = moves.queue.Queue()
+        self.events = queue.Queue()
         self.name = str(id(self))
         self.batch = batch
 
@@ -395,7 +395,7 @@ class NotificationFixture(fixtures.Fixture):
         try:
             while True:
                 results.append(self.events.get(timeout=timeout))
-        except moves.queue.Empty:
+        except queue.Empty:
             pass
         return results
 
diff --git a/oslo_messaging/tests/notify/test_dispatcher.py b/oslo_messaging/tests/notify/test_dispatcher.py
index 93a14676f..98a1de4b4 100644
--- a/oslo_messaging/tests/notify/test_dispatcher.py
+++ b/oslo_messaging/tests/notify/test_dispatcher.py
@@ -19,7 +19,7 @@ import testscenarios
 import oslo_messaging
 from oslo_messaging.notify import dispatcher as notify_dispatcher
 from oslo_messaging.tests import utils as test_utils
-from six.moves import mock
+from unittest import mock
 
 load_tests = testscenarios.load_tests_apply_scenarios
 
diff --git a/oslo_messaging/tests/notify/test_listener.py b/oslo_messaging/tests/notify/test_listener.py
index 1125b1781..a94ca0bc7 100644
--- a/oslo_messaging/tests/notify/test_listener.py
+++ b/oslo_messaging/tests/notify/test_listener.py
@@ -23,7 +23,7 @@ import oslo_messaging
 from oslo_messaging.notify import dispatcher
 from oslo_messaging.notify import notifier as msg_notifier
 from oslo_messaging.tests import utils as test_utils
-from six.moves import mock
+from unittest import mock
 
 load_tests = testscenarios.load_tests_apply_scenarios
 
diff --git a/oslo_messaging/tests/notify/test_log_handler.py b/oslo_messaging/tests/notify/test_log_handler.py
index 40d109451..1f60af312 100644
--- a/oslo_messaging/tests/notify/test_log_handler.py
+++ b/oslo_messaging/tests/notify/test_log_handler.py
@@ -17,7 +17,7 @@ import fixtures
 import oslo_messaging
 from oslo_messaging.notify import log_handler
 from oslo_messaging.tests import utils as test_utils
-from six.moves import mock
+from unittest import mock
 
 
 class PublishErrorsHandlerTestCase(test_utils.BaseTestCase):
diff --git a/oslo_messaging/tests/notify/test_logger.py b/oslo_messaging/tests/notify/test_logger.py
index b5cad25ef..2161ff18d 100644
--- a/oslo_messaging/tests/notify/test_logger.py
+++ b/oslo_messaging/tests/notify/test_logger.py
@@ -23,7 +23,7 @@ import testscenarios
 
 import oslo_messaging
 from oslo_messaging.tests import utils as test_utils
-from six.moves import mock
+from unittest import mock
 
 
 load_tests = testscenarios.load_tests_apply_scenarios
diff --git a/oslo_messaging/tests/notify/test_middleware.py b/oslo_messaging/tests/notify/test_middleware.py
index 65ee79c29..9fe968d35 100644
--- a/oslo_messaging/tests/notify/test_middleware.py
+++ b/oslo_messaging/tests/notify/test_middleware.py
@@ -19,7 +19,7 @@ import webob
 
 from oslo_messaging.notify import middleware
 from oslo_messaging.tests import utils
-from six.moves import mock
+from unittest import mock
 
 
 class FakeApp(object):
diff --git a/oslo_messaging/tests/notify/test_notifier.py b/oslo_messaging/tests/notify/test_notifier.py
index 2d6b7716e..832ee02ed 100755
--- a/oslo_messaging/tests/notify/test_notifier.py
+++ b/oslo_messaging/tests/notify/test_notifier.py
@@ -34,7 +34,7 @@ from oslo_messaging.notify import messaging
 from oslo_messaging.notify import notifier as msg_notifier
 from oslo_messaging import serializer as msg_serializer
 from oslo_messaging.tests import utils as test_utils
-from six.moves import mock
+from unittest import mock
 
 load_tests = testscenarios.load_tests_apply_scenarios
 
diff --git a/oslo_messaging/tests/rpc/test_client.py b/oslo_messaging/tests/rpc/test_client.py
index 4063562a4..af1282af0 100755
--- a/oslo_messaging/tests/rpc/test_client.py
+++ b/oslo_messaging/tests/rpc/test_client.py
@@ -14,8 +14,8 @@
 #    under the License.
 
 from oslo_config import cfg
-from six.moves import mock
 import testscenarios
+from unittest import mock
 
 import oslo_messaging
 from oslo_messaging import exceptions
diff --git a/oslo_messaging/tests/rpc/test_dispatcher.py b/oslo_messaging/tests/rpc/test_dispatcher.py
index 0bc201fb0..89b36cd5e 100755
--- a/oslo_messaging/tests/rpc/test_dispatcher.py
+++ b/oslo_messaging/tests/rpc/test_dispatcher.py
@@ -19,7 +19,7 @@ import oslo_messaging
 from oslo_messaging import rpc
 from oslo_messaging import serializer as msg_serializer
 from oslo_messaging.tests import utils as test_utils
-from six.moves import mock
+from unittest import mock
 
 load_tests = testscenarios.load_tests_apply_scenarios
 
diff --git a/oslo_messaging/tests/rpc/test_server.py b/oslo_messaging/tests/rpc/test_server.py
index c993a871a..1fc6be808 100644
--- a/oslo_messaging/tests/rpc/test_server.py
+++ b/oslo_messaging/tests/rpc/test_server.py
@@ -14,12 +14,13 @@
 #    under the License.
 
 import threading
+from unittest import mock
+
 
 import eventlet
 import fixtures
 from oslo_config import cfg
 from oslo_utils import eventletutils
-from six.moves import mock
 import testscenarios
 
 import oslo_messaging
diff --git a/oslo_messaging/tests/test_exception_serialization.py b/oslo_messaging/tests/test_exception_serialization.py
index d2a10c7aa..93b63c51e 100644
--- a/oslo_messaging/tests/test_exception_serialization.py
+++ b/oslo_messaging/tests/test_exception_serialization.py
@@ -16,7 +16,6 @@
 import sys
 
 from oslo_serialization import jsonutils
-import six
 import testscenarios
 
 import oslo_messaging
@@ -25,8 +24,8 @@ from oslo_messaging.tests import utils as test_utils
 
 load_tests = testscenarios.load_tests_apply_scenarios
 
-EXCEPTIONS_MODULE = 'exceptions' if six.PY2 else 'builtins'
-OTHER_EXCEPTIONS_MODULE = 'builtins' if six.PY2 else 'exceptions'
+EXCEPTIONS_MODULE = 'builtins'
+OTHER_EXCEPTIONS_MODULE = 'exceptions'
 
 
 class NovaStyleException(Exception):
@@ -289,9 +288,9 @@ class DeserializeRemoteExceptionTestCase(test_utils.BaseTestCase):
 
         self.assertIsInstance(ex, self.cls)
         self.assertEqual(self.remote_name, ex.__class__.__name__)
-        self.assertEqual(self.str, six.text_type(ex))
+        self.assertEqual(self.str, str(ex))
         if hasattr(self, 'msg'):
-            self.assertEqual(self.msg, six.text_type(ex))
+            self.assertEqual(self.msg, str(ex))
             self.assertEqual((self.msg,) + self.remote_args, ex.args)
         else:
             self.assertEqual(self.remote_args, ex.args)
diff --git a/oslo_messaging/tests/test_opts.py b/oslo_messaging/tests/test_opts.py
index b870d2cdd..8335d86be 100644
--- a/oslo_messaging/tests/test_opts.py
+++ b/oslo_messaging/tests/test_opts.py
@@ -12,7 +12,9 @@
 #    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 six.moves import mock
+
+from unittest import mock
+
 import stevedore
 import testtools
 
diff --git a/oslo_messaging/tests/test_transport.py b/oslo_messaging/tests/test_transport.py
index 02a19f784..31fec16cd 100755
--- a/oslo_messaging/tests/test_transport.py
+++ b/oslo_messaging/tests/test_transport.py
@@ -14,9 +14,9 @@
 #    under the License.
 
 import fixtures
+from unittest import mock
+
 from oslo_config import cfg
-import six
-from six.moves import mock
 from stevedore import driver
 import testscenarios
 
@@ -150,7 +150,7 @@ class GetTransportSadPathTestCase(test_utils.BaseTestCase):
         ex_msg_contains = self.ex.pop('msg_contains')
         ex = self.assertRaises(
             ex_cls, oslo_messaging.get_transport, self.conf, url=self.url)
-        self.assertIn(ex_msg_contains, six.text_type(ex))
+        self.assertIn(ex_msg_contains, str(ex))
         for k, v in self.ex.items():
             self.assertTrue(hasattr(ex, k))
             self.assertEqual(v, str(getattr(ex, k)))
@@ -172,7 +172,7 @@ class _SetDefaultsFixture(fixtures.Fixture):
         def first(seq, default=None, key=None):
             if key is None:
                 key = bool
-            return next(six.moves.filter(key, seq), default)
+            return next(filter(key, seq), default)
 
         def default(opts, name):
             return first(opts, key=lambda o: o.name == name).default
diff --git a/oslo_messaging/tests/test_utils.py b/oslo_messaging/tests/test_utils.py
index 05ca1c261..b4c7402df 100644
--- a/oslo_messaging/tests/test_utils.py
+++ b/oslo_messaging/tests/test_utils.py
@@ -16,7 +16,7 @@
 from oslo_messaging._drivers import common
 from oslo_messaging import _utils as utils
 from oslo_messaging.tests import utils as test_utils
-from six.moves import mock
+from unittest import mock
 
 
 class VersionIsCompatibleTestCase(test_utils.BaseTestCase):
diff --git a/oslo_messaging/transport.py b/oslo_messaging/transport.py
index 48979a64b..337fb69aa 100644
--- a/oslo_messaging/transport.py
+++ b/oslo_messaging/transport.py
@@ -21,9 +21,8 @@ import logging
 
 from debtcollector import removals
 from oslo_config import cfg
-import six
-from six.moves.urllib import parse
 from stevedore import driver
+from urllib import parse
 
 from oslo_messaging import exceptions
 
@@ -456,7 +455,7 @@ class TransportURL(object):
             conf.register_opts(_transport_opts)
         url = url or conf.transport_url
 
-        if not isinstance(url, six.string_types):
+        if not isinstance(url, str):
             raise InvalidTransportURL(url, 'Wrong URL type')
 
         url = parse.urlparse(url)
diff --git a/requirements.txt b/requirements.txt
index e8261a20d..cccb632c0 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -14,7 +14,6 @@ stevedore>=1.20.0 # Apache-2.0
 debtcollector>=1.2.0 # Apache-2.0
 
 # for jsonutils
-six>=1.10.0 # MIT
 cachetools>=2.0.0 # MIT License
 
 WebOb>=1.7.1 # MIT
diff --git a/test-requirements.txt b/test-requirements.txt
index 766610509..8a7e62ce7 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -6,7 +6,6 @@
 hacking>=3.0,<3.1.0 # Apache-2.0
 
 fixtures>=3.0.0 # Apache-2.0/BSD
-mock>=2.0.0 # BSD
 stestr>=2.0.0 # Apache-2.0
 testscenarios>=0.4 # Apache-2.0/BSD
 testtools>=2.2.0 # MIT
diff --git a/tools/simulator.py b/tools/simulator.py
index fd4461ddd..ab2529b62 100755
--- a/tools/simulator.py
+++ b/tools/simulator.py
@@ -23,7 +23,6 @@ import logging
 import os
 import random
 import signal
-import six
 import socket
 import string
 import sys
@@ -139,7 +138,7 @@ class MessageStatsCollector(object):
         max_latency = 0
         sum_latencies = 0
 
-        for i in six.moves.range(count):
+        for i in range(count):
             p = self.buffer[i]
             size += len(p.cargo)
 
@@ -471,10 +470,10 @@ def generate_messages(messages_count):
         messages_count = MESSAGES_LIMIT
     LOG.info("Generating %d random messages", messages_count)
     generator = init_random_generator()
-    for i in six.moves.range(messages_count):
+    for i in range(messages_count):
         length = generator()
         msg = ''.join(random.choice(
-                      string.ascii_lowercase) for x in six.moves.range(length))
+                      string.ascii_lowercase) for x in range(length))
         MESSAGES.append(msg)
 
     LOG.info("Messages has been prepared")
@@ -533,7 +532,7 @@ def spawn_rpc_clients(threads, transport, targets, wait_after_msg, timeout,
     p = eventlet.GreenPool(size=threads)
     targets = itertools.cycle(targets)
 
-    for i in six.moves.range(threads):
+    for i in range(threads):
         target = next(targets)
         LOG.debug("starting RPC client for target %s", target)
         client_builder = functools.partial(RPCClient, i, transport, target,
@@ -548,7 +547,7 @@ def spawn_rpc_clients(threads, transport, targets, wait_after_msg, timeout,
 def spawn_notify_clients(threads, topic, transport, message_count,
                          wait_after_msg, timeout, duration):
     p = eventlet.GreenPool(size=threads)
-    for i in six.moves.range(threads):
+    for i in range(threads):
         client_builder = functools.partial(NotifyClient, i, transport, [topic],
                                            wait_after_msg)
         p.spawn_n(send_messages, i, client_builder, message_count, duration)
@@ -574,7 +573,7 @@ def send_messages(client_id, client_builder, messages_count, duration):
     else:
         LOG.debug("Sending %d messages using client %d",
                   messages_count, client_id)
-        for _ in six.moves.range(messages_count):
+        for _ in range(messages_count):
             client.send_msg()
             eventlet.sleep()
             if not IS_RUNNING:
diff --git a/tox.ini b/tox.ini
index 309ef234f..9646cb274 100644
--- a/tox.ini
+++ b/tox.ini
@@ -101,12 +101,10 @@ exclude = .tox,dist,doc,*.egg,build,__init__.py
 
 [hacking]
 import_exceptions =
-  six.moves
 
 [flake8:local-plugins]
 extension =
   O321 = checks:check_oslo_namespace_imports
-  O322 = checks:check_mock_imports
   O324 = checks:CheckForLoggingIssues
 paths = ./oslo_messaging/hacking