diff --git a/lms/djangoapps/discussion/apps.py b/lms/djangoapps/discussion/apps.py
index 2a0c2a2db6fabd1dec7911568c47216e461817ad..7aa94c6bda1c8ca0b36841dce07c13303397fb5e 100644
--- a/lms/djangoapps/discussion/apps.py
+++ b/lms/djangoapps/discussion/apps.py
@@ -4,10 +4,12 @@ Discussion Application Configuration
 Signal handlers are connected here.
 """
 
+from __future__ import absolute_import
+
 from django.apps import AppConfig
 
 from openedx.core.constants import COURSE_ID_PATTERN
-from openedx.core.djangoapps.plugins.constants import ProjectType, SettingsType, PluginURLs, PluginSettings
+from openedx.core.djangoapps.plugins.constants import PluginSettings, PluginURLs, ProjectType, SettingsType
 
 
 class DiscussionConfig(AppConfig):
diff --git a/lms/djangoapps/discussion/django_comment_client/middleware.py b/lms/djangoapps/discussion/django_comment_client/middleware.py
index 5ab3cd29a8f227088aebe4885ce66cd72d828847..64f1c4061735213edde1a18ed6a4d304267114e8 100644
--- a/lms/djangoapps/discussion/django_comment_client/middleware.py
+++ b/lms/djangoapps/discussion/django_comment_client/middleware.py
@@ -1,4 +1,6 @@
 # pylint: disable=missing-docstring
+from __future__ import absolute_import
+
 import json
 import logging
 
diff --git a/lms/djangoapps/discussion/django_comment_client/permissions.py b/lms/djangoapps/discussion/django_comment_client/permissions.py
index 7ec72ad1d614a61997ac4853b1f4f8a5a088aa65..3928ce606c9408d96a468bc01b27753290fc0abe 100644
--- a/lms/djangoapps/discussion/django_comment_client/permissions.py
+++ b/lms/djangoapps/discussion/django_comment_client/permissions.py
@@ -3,16 +3,20 @@
 Module for checking permissions with the comment_client backend
 """
 
+from __future__ import absolute_import
+
 import logging
 from types import NoneType
 
+import six
 from edx_django_utils.cache import DEFAULT_REQUEST_CACHE
 from opaque_keys.edx.keys import CourseKey
 
 from lms.djangoapps.teams.models import CourseTeam
 from openedx.core.djangoapps.django_comment_common.comment_client import Thread
 from openedx.core.djangoapps.django_comment_common.models import (
-    CourseDiscussionSettings, all_permissions_for_user_in_course,
+    CourseDiscussionSettings,
+    all_permissions_for_user_in_course
 )
 from openedx.core.djangoapps.django_comment_common.utils import get_course_discussion_settings
 from openedx.core.lib.cache_utils import request_cached
@@ -137,7 +141,7 @@ def _check_conditions_permissions(user, permissions, course_id, content, user_gr
     """
 
     def test(user, per, operator="or"):
-        if isinstance(per, basestring):
+        if isinstance(per, six.string_types):
             if per in CONDITIONS:
                 return _check_condition(user, per, content)
             if 'group_' in per:
diff --git a/lms/djangoapps/discussion/django_comment_client/urls.py b/lms/djangoapps/discussion/django_comment_client/urls.py
index f51def9cc0e4de62e626250d3fa1040edbc3af63..7aa21784172378d97157f5fce2e57ed7bbf30f20 100644
--- a/lms/djangoapps/discussion/django_comment_client/urls.py
+++ b/lms/djangoapps/discussion/django_comment_client/urls.py
@@ -1,6 +1,8 @@
 """
 Urls for the django_comment_client.
 """
+from __future__ import absolute_import
+
 from django.conf.urls import include, url
 
 urlpatterns = [
diff --git a/lms/djangoapps/discussion/django_comment_client/utils.py b/lms/djangoapps/discussion/django_comment_client/utils.py
index 265892b6bae458111a1b0da7a461a911b8485405..d1083d9f95a08b6bc8f0de178ff14b8f34ba2439 100644
--- a/lms/djangoapps/discussion/django_comment_client/utils.py
+++ b/lms/djangoapps/discussion/django_comment_client/utils.py
@@ -1,35 +1,41 @@
 # pylint: skip-file
+from __future__ import absolute_import
+
 import json
 import logging
 from collections import defaultdict
 from datetime import datetime
 
+import six
 from django.conf import settings
 from django.contrib.auth.models import User
-from django.urls import reverse
 from django.db import connection
 from django.http import HttpResponse
-from pytz import UTC
+from django.urls import reverse
 from opaque_keys.edx.keys import CourseKey, UsageKey
 from opaque_keys.edx.locations import i4xEncoder
+from pytz import UTC
 from six import text_type
+from six.moves import map
 
 from courseware import courses
 from courseware.access import has_access
 from lms.djangoapps.discussion.django_comment_client.constants import TYPE_ENTRY, TYPE_SUBCATEGORY
 from lms.djangoapps.discussion.django_comment_client.permissions import (
-    check_permissions_by_view, get_team, has_permission,
+    check_permissions_by_view,
+    get_team,
+    has_permission
 )
 from lms.djangoapps.discussion.django_comment_client.settings import MAX_COMMENT_DEPTH
+from openedx.core.djangoapps.course_groups.cohorts import get_cohort_id, get_cohort_names, is_course_cohorted
 from openedx.core.djangoapps.django_comment_common.models import (
-    FORUM_ROLE_STUDENT,
     FORUM_ROLE_COMMUNITY_TA,
+    FORUM_ROLE_STUDENT,
     CourseDiscussionSettings,
     DiscussionsIdMapping,
     Role
 )
 from openedx.core.djangoapps.django_comment_common.utils import get_course_discussion_settings
-from openedx.core.djangoapps.course_groups.cohorts import get_cohort_id, get_cohort_names, is_course_cohorted
 from openedx.core.lib.cache_utils import request_cached
 from student.models import get_user_by_username_or_email
 from student.roles import GlobalStaff
@@ -51,7 +57,7 @@ def strip_none(dic):
     """
     Returns a dictionary stripped of any keys having values of None
     """
-    return dict([(k, v) for k, v in dic.iteritems() if v is not None])
+    return dict([(k, v) for k, v in six.iteritems(dic) if v is not None])
 
 
 def strip_blank(dic):
@@ -63,7 +69,7 @@ def strip_blank(dic):
         Determines if the provided value contains no information
         """
         return isinstance(v, str) and len(v.strip()) == 0
-    return dict([(k, v) for k, v in dic.iteritems() if not _is_blank(v)])
+    return dict([(k, v) for k, v in six.iteritems(dic) if not _is_blank(v)])
 
 # TODO should we be checking if d1 and d2 have the same keys with different values?
 
@@ -236,7 +242,7 @@ def get_discussion_id_map_by_course_id(course_id, user):
     by discussion_id.
     """
     xblocks = get_accessible_discussion_xblocks_by_course_id(course_id, user)
-    return dict(map(get_discussion_id_map_entry, xblocks))
+    return dict(list(map(get_discussion_id_map_entry, xblocks)))
 
 
 @request_cached()
@@ -501,7 +507,7 @@ class JsonError(HttpResponse):
         """
         Object constructor, returns an error response containing the provided exception messages
         """
-        if isinstance(error_messages, basestring):
+        if isinstance(error_messages, six.string_types):
             error_messages = [error_messages]
         content = json.dumps({'errors': error_messages}, indent=2, ensure_ascii=False)
         super(JsonError, self).__init__(content,
diff --git a/lms/djangoapps/discussion/tasks.py b/lms/djangoapps/discussion/tasks.py
index cdf056bdc40b8b1c417c32f92dc82bd70543d302..b0e543b57b1b266b251b9360b923f2b106f69ff1 100644
--- a/lms/djangoapps/discussion/tasks.py
+++ b/lms/djangoapps/discussion/tasks.py
@@ -2,33 +2,35 @@
 Defines asynchronous celery task for sending email notification (through edx-ace)
 pertaining to new discussion forum comments.
 """
+from __future__ import absolute_import
+
 import logging
-from urlparse import urljoin
 
+import six
 from celery import task
+from celery_utils.logged_task import LoggedTask
 from django.conf import settings
 from django.contrib.auth.models import User
 from django.contrib.sites.models import Site
-
-from celery_utils.logged_task import LoggedTask
 from edx_ace import ace
-from edx_ace.utils import date
 from edx_ace.recipient import Recipient
+from edx_ace.utils import date
 from eventtracking import tracker
-from lms.djangoapps.discussion.django_comment_client.utils import (
-    permalink, get_accessible_discussion_xblocks_by_course_id,
-)
 from opaque_keys.edx.keys import CourseKey
+from six.moves.urllib.parse import urljoin
 
-from openedx.core.djangoapps.ace_common.template_context import get_base_template_context
+import openedx.core.djangoapps.django_comment_common.comment_client as cc
+from lms.djangoapps.discussion.django_comment_client.utils import (
+    get_accessible_discussion_xblocks_by_course_id,
+    permalink
+)
 from openedx.core.djangoapps.ace_common.message import BaseMessageType
+from openedx.core.djangoapps.ace_common.template_context import get_base_template_context
 from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
-import openedx.core.djangoapps.django_comment_common.comment_client as cc
 from openedx.core.djangoapps.django_comment_common.models import DiscussionsIdMapping
 from openedx.core.lib.celery.task_utils import emulate_http_request
 from track import segment
 
-
 log = logging.getLogger(__name__)
 
 
@@ -48,7 +50,7 @@ def update_discussions_map(context):
     course_key = CourseKey.from_string(context['course_id'])
     discussion_blocks = get_accessible_discussion_xblocks_by_course_id(course_key, include_all=True)
     discussions_id_map = {
-        discussion_block.discussion_id: unicode(discussion_block.location)
+        discussion_block.discussion_id: six.text_type(discussion_block.location)
         for discussion_block in discussion_blocks
     }
     DiscussionsIdMapping.update_mapping(course_key, discussions_id_map)
@@ -85,10 +87,10 @@ def _track_notification_sent(message, context):
         'app_label': 'discussion',
         'name': 'responsenotification',  # This is 'Campaign' in GA
         'language': message.language,
-        'uuid': unicode(message.uuid),
-        'send_uuid': unicode(message.send_uuid),
+        'uuid': six.text_type(message.uuid),
+        'send_uuid': six.text_type(message.send_uuid),
         'thread_id': context['thread_id'],
-        'course_id': unicode(context['course_id']),
+        'course_id': six.text_type(context['course_id']),
         'thread_created_at': date.deserialize(context['thread_created_at']),
         'nonInteraction': 1,
     }
diff --git a/lms/djangoapps/discussion/urls.py b/lms/djangoapps/discussion/urls.py
index d6bf5fe7498f3027ddab92fb1eaba5698b2dcb2b..82593824aa77e131eaca1005954200169ec9c931 100644
--- a/lms/djangoapps/discussion/urls.py
+++ b/lms/djangoapps/discussion/urls.py
@@ -1,6 +1,8 @@
 """
 Forum urls for the django_comment_client.
 """
+from __future__ import absolute_import
+
 from django.conf.urls import url
 
 from discussion import views