diff --git a/openstack-common.conf b/openstack-common.conf
index 7d3ecb716..187ae232e 100644
--- a/openstack-common.conf
+++ b/openstack-common.conf
@@ -1,7 +1,6 @@
 [DEFAULT]
 
 # The list of modules to copy from oslo-incubator.git
-module=gettextutils
 module=middleware/base
 module=middleware/__init__
 module=context
diff --git a/oslo.messaging/locale/oslo.messaging.pot b/oslo.messaging/locale/oslo.messaging.pot
index 535de57b1..244024e64 100644
--- a/oslo.messaging/locale/oslo.messaging.pot
+++ b/oslo.messaging/locale/oslo.messaging.pot
@@ -18,6 +18,272 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 1.3\n"
 
+#: oslo/messaging/_drivers/common.py:74
+msgid "An unknown RPC related exception occurred."
+msgstr ""
+
+#: oslo/messaging/_drivers/common.py:86
+msgid "Exception in string format operation"
+msgstr ""
+
+#: oslo/messaging/_drivers/common.py:101
+#, python-format
+msgid ""
+"Timeout while waiting on RPC response - topic: \"%(topic)s\", RPC method:"
+" \"%(method)s\" info: \"%(info)s\""
+msgstr ""
+
+#: oslo/messaging/_drivers/common.py:118 oslo/messaging/_drivers/common.py:119
+#: oslo/messaging/_drivers/common.py:120
+msgid "<unknown>"
+msgstr ""
+
+#: oslo/messaging/_drivers/common.py:124
+#, python-format
+msgid "Found duplicate message(%(msg_id)s). Skipping it."
+msgstr ""
+
+#: oslo/messaging/_drivers/common.py:128
+msgid "Invalid reuse of an RPC connection."
+msgstr ""
+
+#: oslo/messaging/_drivers/common.py:132
+#, python-format
+msgid "Specified RPC version, %(version)s, not supported by this endpoint."
+msgstr ""
+
+#: oslo/messaging/_drivers/common.py:137
+#, python-format
+msgid ""
+"Specified RPC envelope version, %(version)s, not supported by this "
+"endpoint."
+msgstr ""
+
+#: oslo/messaging/_drivers/common.py:142
+#, python-format
+msgid "Specified RPC version cap, %(version_cap)s, is too low"
+msgstr ""
+
+#: oslo/messaging/_drivers/common.py:189
+#, python-format
+msgid "Returning exception %s to caller"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_qpid.py:90
+#, python-format
+msgid "Invalid value for qpid_topology_version: %d"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_qpid.py:208
+msgid "Failed to process message... skipping it."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_qpid.py:554
+#, python-format
+msgid ""
+"Unable to connect to AMQP server on %(broker)s after %(retry)d tries: "
+"%(e)s"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_qpid.py:560
+#, python-format
+msgid ""
+"Unable to connect to AMQP server on %(broker)s: %(e)s. Sleeping %(delay)s"
+" seconds"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_qpid.py:566
+#, python-format
+msgid "Connected to AMQP server on %s"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_qpid.py:614
+#: oslo/messaging/_drivers/impl_rabbit.py:704
+#, python-format
+msgid "Failed to declare consumer for topic '%(topic)s': %(err_str)s"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_qpid.py:632
+#: oslo/messaging/_drivers/impl_rabbit.py:723
+#, python-format
+msgid "Failed to consume message from queue: %s"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_qpid.py:640
+msgid "Error processing message.  Skipping it."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_qpid.py:652
+#: oslo/messaging/_drivers/impl_rabbit.py:748
+#, python-format
+msgid "Failed to publish message to topic '%(topic)s': %(err_str)s"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_rabbit.py:173
+msgid "Failed to process message ... skipping it."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_rabbit.py:511
+#, python-format
+msgid "Invalid SSL version : %s"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_rabbit.py:541
+#, python-format
+msgid "Connecting to AMQP server on %(hostname)s:%(port)d"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_rabbit.py:558
+#, python-format
+msgid "Connected to AMQP server on %(hostname)s:%(port)d"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_rabbit.py:570
+#, python-format
+msgid "Delaying reconnect for %1.1f seconds..."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_rabbit.py:628
+#, python-format
+msgid ""
+"Unable to connect to AMQP server on %(hostname)s:%(port)d after %(retry)d"
+" tries: %(err_str)s"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_rabbit.py:643
+#, python-format
+msgid ""
+"AMQP server %(hostname)s:%(port)d closed the connection. Check login "
+"credentials: %(err_str)s"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_rabbit.py:647
+#, python-format
+msgid ""
+"AMQP server on %(hostname)s:%(port)d is unreachable: %(err_str)s. Trying "
+"again in %(sleep_time)d seconds."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:105
+msgid "JSON serialization failed."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:155
+msgid "Could not open socket."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:209
+msgid "You cannot recv on this socket."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:214
+msgid "You cannot send on this socket."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:295
+msgid "Exception during message handling"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:348
+msgid "RPC message did not include method."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:380
+msgid "Registering reactor"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:392
+msgid "In reactor registered"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:396
+msgid "Consuming socket"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:446
+#, python-format
+msgid "Creating proxy for topic: %s"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:452
+msgid "Topic contained dangerous characters."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:484
+msgid "Topic socket file creation failed."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:490
+#, python-format
+msgid "Local per-topic backlog buffer full for topic %s. Dropping message."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:506
+#, python-format
+msgid "Required IPC directory does not exist at %s"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:515
+#, python-format
+msgid "Permission denied to IPC directory at %s"
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:518
+msgid "Could not create ZeroMQ receiver daemon. Socket may already be in use."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:571
+msgid "ZMQ Envelope version unsupported or unknown."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:599
+msgid "Skipping topic registration. Already registered."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:702
+msgid "Unsupported or unknown ZMQ envelope returned."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:709
+msgid "RPC Message Invalid."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:741
+msgid "No matchmaker results. Not casting."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:744
+msgid "No match from matchmaker."
+msgstr ""
+
+#: oslo/messaging/_drivers/impl_zmq.py:829
+#, python-format
+msgid "rpc_zmq_matchmaker = %(orig)s is deprecated; use %(new)s instead"
+msgstr ""
+
+#: oslo/messaging/_drivers/matchmaker.py:44
+msgid "Match not found by MatchMaker."
+msgstr ""
+
+#: oslo/messaging/_drivers/matchmaker.py:78
+msgid "Matchmaker does not implement registration or heartbeat."
+msgstr ""
+
+#: oslo/messaging/_drivers/matchmaker.py:214
+#, python-format
+msgid "Matchmaker unregistered: %(key)s, %(host)s"
+msgstr ""
+
+#: oslo/messaging/_drivers/matchmaker.py:226
+msgid "Register before starting heartbeat."
+msgstr ""
+
+#: oslo/messaging/_drivers/matchmaker_ring.py:73
+#: oslo/messaging/_drivers/matchmaker_ring.py:91
+#, python-format
+msgid "No key defining hosts for topic '%s', see ringfile"
+msgstr ""
+
 #: oslo/messaging/notify/_impl_routing.py:80
 #, python-format
 msgid "Failed to load any notifiers for %s"
diff --git a/oslo/messaging/_drivers/common.py b/oslo/messaging/_drivers/common.py
index 69bbddd87..2645fbd39 100644
--- a/oslo/messaging/_drivers/common.py
+++ b/oslo/messaging/_drivers/common.py
@@ -23,8 +23,8 @@ import traceback
 import six
 
 from oslo import messaging
+from oslo.messaging._i18n import _
 from oslo.messaging import _utils as utils
-from oslo.messaging.openstack.common.gettextutils import _
 from oslo.serialization import jsonutils
 
 LOG = logging.getLogger(__name__)
diff --git a/oslo/messaging/_drivers/impl_qpid.py b/oslo/messaging/_drivers/impl_qpid.py
index 2c9ce3f77..f87ca44a3 100644
--- a/oslo/messaging/_drivers/impl_qpid.py
+++ b/oslo/messaging/_drivers/impl_qpid.py
@@ -25,8 +25,8 @@ from oslo.config import cfg
 from oslo.messaging._drivers import amqp as rpc_amqp
 from oslo.messaging._drivers import amqpdriver
 from oslo.messaging._drivers import common as rpc_common
+from oslo.messaging._i18n import _
 from oslo.messaging import exceptions
-from oslo.messaging.openstack.common.gettextutils import _
 from oslo.serialization import jsonutils
 from oslo.utils import importutils
 from oslo.utils import netutils
diff --git a/oslo/messaging/_drivers/impl_rabbit.py b/oslo/messaging/_drivers/impl_rabbit.py
index a7066e264..0297e1e30 100644
--- a/oslo/messaging/_drivers/impl_rabbit.py
+++ b/oslo/messaging/_drivers/impl_rabbit.py
@@ -31,8 +31,8 @@ from oslo.config import cfg
 from oslo.messaging._drivers import amqp as rpc_amqp
 from oslo.messaging._drivers import amqpdriver
 from oslo.messaging._drivers import common as rpc_common
+from oslo.messaging._i18n import _
 from oslo.messaging import exceptions
-from oslo.messaging.openstack.common.gettextutils import _
 from oslo.utils import netutils
 
 rabbit_opts = [
diff --git a/oslo/messaging/_drivers/impl_zmq.py b/oslo/messaging/_drivers/impl_zmq.py
index 56612daeb..fec174c90 100644
--- a/oslo/messaging/_drivers/impl_zmq.py
+++ b/oslo/messaging/_drivers/impl_zmq.py
@@ -32,7 +32,7 @@ from oslo.config import cfg
 from oslo.messaging._drivers import base
 from oslo.messaging._drivers import common as rpc_common
 from oslo.messaging._executors import impl_eventlet  # FIXME(markmc)
-from oslo.messaging.openstack.common.gettextutils import _
+from oslo.messaging._i18n import _
 from oslo.serialization import jsonutils
 from oslo.utils import excutils
 from oslo.utils import importutils
diff --git a/oslo/messaging/_drivers/matchmaker.py b/oslo/messaging/_drivers/matchmaker.py
index f80125cd8..1ac332a07 100644
--- a/oslo/messaging/_drivers/matchmaker.py
+++ b/oslo/messaging/_drivers/matchmaker.py
@@ -22,7 +22,7 @@ import logging
 import eventlet
 
 from oslo.config import cfg
-from oslo.messaging.openstack.common.gettextutils import _
+from oslo.messaging._i18n import _
 
 matchmaker_opts = [
     cfg.IntOpt('matchmaker_heartbeat_freq',
diff --git a/oslo/messaging/_drivers/matchmaker_ring.py b/oslo/messaging/_drivers/matchmaker_ring.py
index 6ef69ac6c..f3f0334b0 100644
--- a/oslo/messaging/_drivers/matchmaker_ring.py
+++ b/oslo/messaging/_drivers/matchmaker_ring.py
@@ -22,7 +22,7 @@ import logging
 
 from oslo.config import cfg
 from oslo.messaging._drivers import matchmaker as mm
-from oslo.messaging.openstack.common.gettextutils import _
+from oslo.messaging._i18n import _
 
 matchmaker_opts = [
     # Matchmaker ring file
diff --git a/oslo/messaging/_i18n.py b/oslo/messaging/_i18n.py
new file mode 100644
index 000000000..bc265d56b
--- /dev/null
+++ b/oslo/messaging/_i18n.py
@@ -0,0 +1,53 @@
+#    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.
+
+"""oslo.i18n integration module.
+
+See http://docs.openstack.org/developer/oslo.i18n/usage.html
+
+"""
+
+from oslo import i18n
+from oslo.messaging.openstack.common import gettextutils
+
+
+_translators = i18n.TranslatorFactory(domain='oslo.messaging')
+
+# The primary translation function using the well-known name "_"
+_ = _translators.primary
+
+# Translators for log levels.
+#
+# The abbreviated names are meant to reflect the usual use of a short
+# name like '_'. The "L" is for "log" and the other letter comes from
+# the level.
+_LI = _translators.log_info
+_LW = _translators.log_warning
+_LE = _translators.log_error
+_LC = _translators.log_critical
+
+# Parts in oslo-incubator are still using gettextutils._(), _LI(), etc., from
+# oslo-incubator. Until these parts are changed to use oslo.i18n, Keystone
+# needs to do something to allow them to work. One option is to continue to
+# initialize gettextutils, but with the way that Nova has initialization
+# spread out over mutltiple entry points, we'll monkey-patch
+# gettextutils._(), _LI(), etc., to use our oslo.i18n versions.
+
+# FIXME(dims): Remove the monkey-patching and update openstack-common.conf and
+# do a sync with oslo-incubator to remove gettextutils once oslo-incubator
+# isn't using oslo-incubator gettextutils any more.
+
+gettextutils._ = _
+gettextutils._LI = _LI
+gettextutils._LW = _LW
+gettextutils._LE = _LE
+gettextutils._LC = _LC
diff --git a/oslo/messaging/notify/_impl_routing.py b/oslo/messaging/notify/_impl_routing.py
index 50d14ee5f..5b879424d 100644
--- a/oslo/messaging/notify/_impl_routing.py
+++ b/oslo/messaging/notify/_impl_routing.py
@@ -21,8 +21,8 @@ from stevedore import dispatch
 import yaml
 
 from oslo.config import cfg
+from oslo.messaging._i18n import _
 from oslo.messaging.notify import notifier
-from oslo.messaging.openstack.common.gettextutils import _  # noqa
 
 
 LOG = logging.getLogger(__name__)
diff --git a/oslo/messaging/rpc/dispatcher.py b/oslo/messaging/rpc/dispatcher.py
index 7dce7659a..424f7bd0f 100644
--- a/oslo/messaging/rpc/dispatcher.py
+++ b/oslo/messaging/rpc/dispatcher.py
@@ -30,9 +30,9 @@ import sys
 
 import six
 
+from oslo.messaging._i18n import _
 from oslo.messaging import _utils as utils
 from oslo.messaging import localcontext
-from oslo.messaging.openstack.common.gettextutils import _  # noqa
 from oslo.messaging import serializer as msg_serializer
 from oslo.messaging import server as msg_server
 from oslo.messaging import target as msg_target
diff --git a/requirements-py3.txt b/requirements-py3.txt
index 2718116a8..d243d7fa2 100644
--- a/requirements-py3.txt
+++ b/requirements-py3.txt
@@ -5,12 +5,13 @@
 oslo.config>=1.4.0  # Apache-2.0
 oslo.serialization>=1.0.0               # Apache-2.0
 oslo.utils>=1.0.0                       # Apache-2.0
+oslo.i18n>=1.0.0  # Apache-2.0
 stevedore>=1.0.0  # Apache-2.0
 
 # for jsonutils
 six>=1.7.0
 
-# used by openstack/common/gettextutils.py
+# used by oslo.i18n
 Babel>=1.3
 
 # for the routing notifier
diff --git a/requirements.txt b/requirements.txt
index 4d3c8d648..27488cec2 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -5,6 +5,7 @@
 oslo.config>=1.4.0  # Apache-2.0
 oslo.utils>=1.0.0                       # Apache-2.0
 oslo.serialization>=1.0.0               # Apache-2.0
+oslo.i18n>=1.0.0  # Apache-2.0
 stevedore>=1.0.0  # Apache-2.0
 
 # for jsonutils
@@ -15,7 +16,7 @@ six>=1.7.0
 
 eventlet>=0.15.1
 
-# used by openstack/common/gettextutils.py
+# used by oslo.i18n
 Babel>=1.3
 
 # for the routing notifier
diff --git a/tox.ini b/tox.ini
index 32fd28118..fe551b3da 100644
--- a/tox.ini
+++ b/tox.ini
@@ -44,5 +44,6 @@ builtins = _
 
 [hacking]
 import_exceptions =
+  oslo.messaging._i18n
   oslo.messaging.openstack.common.gettextutils
   six.moves