diff --git a/oslo_messaging/serializer.py b/oslo_messaging/serializer.py
index 78bf983b6..b1761fd83 100644
--- a/oslo_messaging/serializer.py
+++ b/oslo_messaging/serializer.py
@@ -12,12 +12,14 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-__all__ = ['Serializer', 'NoOpSerializer', 'JsonPayloadSerializer']
+__all__ = ['Serializer', 'NoOpSerializer', 'JsonPayloadSerializer',
+           'RequestContextSerializer']
 
 """Provides the definition of a message serialization handler"""
 
 import abc
 
+from oslo_context import context as common_context
 from oslo_serialization import jsonutils
 import six
 
@@ -61,6 +63,28 @@ class Serializer(object):
         """
 
 
+class RequestContextSerializer(Serializer):
+
+    def __init__(self, base):
+        self._base = base
+
+    def serialize_entity(self, context, entity):
+        if not self._base:
+            return entity
+        return self._base.serialize_entity(context, entity)
+
+    def deserialize_entity(self, context, entity):
+        if not self._base:
+            return entity
+        return self._base.deserialize_entity(context, entity)
+
+    def serialize_context(self, context):
+        return context.to_dict()
+
+    def deserialize_context(self, context):
+        return common_context.RequestContext.from_dict(context)
+
+
 class NoOpSerializer(Serializer):
     """A serializer that does nothing."""
 
diff --git a/oslo_messaging/tests/test_serializer.py b/oslo_messaging/tests/test_serializer.py
new file mode 100644
index 000000000..329d9de71
--- /dev/null
+++ b/oslo_messaging/tests/test_serializer.py
@@ -0,0 +1,75 @@
+# Copyright 2015 Mirantis Inc.
+#
+#    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 oslo_context import context as common_context
+from six.moves import mock
+
+from oslo_messaging import serializer
+from oslo_messaging.tests import utils as test_utils
+
+
+class TestRequestContextSerializer(test_utils.BaseTestCase):
+
+    def setUp(self):
+        super(TestRequestContextSerializer, self).setUp()
+
+        self.serializer = serializer.RequestContextSerializer(mock.MagicMock())
+        self.context = common_context.RequestContext()
+        self.entity = {'foo': 'bar'}
+
+    def test_serialize_entity(self):
+        self.serializer.serialize_entity(self.context, self.entity)
+        self.serializer._base.serialize_entity.assert_called_with(
+            self.context, self.entity)
+
+    def test_serialize_entity_empty_base(self):
+        # NOTE(viktors): Return False for check `if self.serializer._base:`
+        bool_args = {'__bool__': lambda *args: False,
+                     '__nonzero__': lambda *args: False}
+        self.serializer._base.configure_mock(**bool_args)
+
+        entity = self.serializer.serialize_entity(self.context, self.entity)
+        self.assertFalse(self.serializer._base.serialize_entity.called)
+        self.assertEqual(entity, self.entity)
+
+    def test_deserialize_entity(self):
+        self.serializer.deserialize_entity(self.context, self.entity)
+        self.serializer._base.deserialize_entity.assert_called_with(
+            self.context, self.entity)
+
+    def test_deserialize_entity_empty_base(self):
+        # NOTE(viktors): Return False for check `if self.serializer._base:`
+        bool_args = {'__bool__': lambda *args: False,
+                     '__nonzero__': lambda *args: False}
+        self.serializer._base.configure_mock(**bool_args)
+
+        entity = self.serializer.deserialize_entity(self.context, self.entity)
+        self.assertFalse(self.serializer._base.serialize_entity.called)
+        self.assertEqual(entity, self.entity)
+
+    def test_serialize_context(self):
+        new_context = self.serializer.serialize_context(self.context)
+
+        self.assertEqual(new_context, self.context.to_dict())
+
+    @mock.patch.object(common_context.RequestContext, 'from_dict',
+                       return_value='foobar')
+    def test_deserialize_context(self, mock_to_dict):
+        new_context = self.serializer.deserialize_context(self.context)
+
+        mock_to_dict.assert_called_with(self.context)
+        self.assertEqual(
+            new_context,
+            common_context.RequestContext.from_dict(self.context)
+        )