diff --git a/.dir-locals.el b/.dir-locals.el
new file mode 100644
index 00000000..3d400c9a
--- /dev/null
+++ b/.dir-locals.el
@@ -0,0 +1,2 @@
+;;; This file contains project-specific emacs configuration
+((nil . ((python-sort-imports-on-save t))))
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 00000000..d29698dc
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,24 @@
+# http://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.ini]
+indent_size = 4
+
+[*.py]
+indent_size = 4
+
+[Makefile]
+indent_style = tab
+indent_size = 8
+
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 00000000..cddbca91
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,19 @@
+# Submitting Pull Requests
+
+## General
+
+ - [ ] Make sure you use [semantic commit messages](https://seesparkbox.com/foundry/semantic_commit_messages).
+       Examples: `"fix(google): Fixed foobar bug"`, `"feat(accounts): Added foobar feature"`.
+ - [ ] All Python code must be 100% pep8 and isort clean.
+ - [ ] JavaScript code should adhere to [StandardJS](https://standardjs.com).
+ - [ ] If your changes are significant, please update `ChangeLog.rst`.
+ - [ ] Feel free to add yourself to `AUTHORS`.
+ 
+ ## Provider Specifics
+ 
+ In case you add a new provider:
+ 
+- [ ] Make sure unit tests are available.
+- [ ] Add an entry of your provider in `test_settings.py::INSTALLED_APPS` and `docs/installation.rst::INSTALLED_APPS`.
+- [ ] Add documentation to `docs/providers.rst`.
+- [ ] Add an entry to the list of supported providers over at `docs/overview.rst`.
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..1b7183ff
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,33 @@
+*.pyc
+*~
+.idea
+.project
+.pydevproject
+*.geany
+docs/_build
+build
+dist
+*.egg*
+example/local_settings.py
+node_modules/
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+coverage.xml
+
+.ropeproject/*
+pep8.txt
+*.bak
+.#*
+\#*
+*.db
+*.tmp
+virtualenv
+.DS_Store
+
+*.prefs
+*.mo
+/.stfolder
diff --git a/.isort.cfg b/.isort.cfg
new file mode 100644
index 00000000..38d081df
--- /dev/null
+++ b/.isort.cfg
@@ -0,0 +1,13 @@
+[settings]
+indent=4
+combine_star=1
+combine_as_imports=1
+include_trailing_comma=1
+multi_line_output=3
+lines_after_imports=2
+known_django=django
+known_future_library=future
+known_standard_library=types,requests
+known_first_party=allauth
+default_section=THIRDPARTY
+sections=FUTURE,STDLIB,DJANGO,THIRDPARTY,FIRSTPARTY,LOCALFOLDER
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 00000000..b4279b78
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,67 @@
+# https://travis-ci.org/pennersr/django-allauth
+language: python
+
+matrix:
+  fast_finish: true
+  include:
+    # Python 3.5
+    - python: 3.5
+      env: TOXENV=py35-django20,py35-django21,py35-django22
+
+    # Python 3.6
+    - python: 3.6
+      env: TOXENV=py36-django20,py36-django21,py36-django22,py36-django30
+
+    # Python 3.7
+    - python: 3.7
+      env: TOXENV=py37-django20,py37-django21,py37-django22,py37-django30,docs,checkqa,standardjs
+
+    # Python 3.8
+    - python: 3.8
+      env: TOXENV=py38-django22,py38-django30
+
+    # Django Master
+    - python: 3.6
+      env: TOXENV=py36-djangomaster
+    - python: 3.7
+      env: TOXENV=py37-djangomaster
+    - python: 3.8
+      env: TOXENV=py38-djangomaster
+
+  allow_failures:
+    - python: 3.6
+      env: TOXENV=py36-djangomaster
+    - python: 3.7
+      env: TOXENV=py37-djangomaster
+    - python: 3.8
+      env: TOXENV=py38-djangomaster
+
+cache:
+  directories:
+    - $HOME/.cache/pip
+    - $TRAVIS_BUILD_DIR/.tox
+
+install:
+  - if [[ $TOXENV == "standardjs" ]]; then nvm install 8; fi
+  - pip install --upgrade pip wheel setuptools
+  - pip install coveralls tox
+
+script:
+  - tox
+
+after_success:
+  - coveralls
+
+branches:
+ only:
+  - master
+
+notifications:
+  webhooks:
+    urls:
+      - https://readthedocs.org/build/django-allauth
+    on_start: never
+    on_cancel: never
+    on_error: never
+    on_failure: never
+    on_success: always
diff --git a/AUTHORS b/AUTHORS
index 704d9d58..8af301da 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -28,6 +28,7 @@ Benjamin Jorand
 Biel Massot
 Björn Andersson
 Bojan Mihelac
+Bruno Alla
 Chris Beaven
 Chris Davis
 Christian Carter
@@ -56,6 +57,7 @@ Griffith Rees
 Guilhem Saurel
 Guillaume Vincent
 Guoyu Hao
+Haesung Park
 Hatem Nassrat
 Hyunwoo Shim
 J. Erm
@@ -74,6 +76,7 @@ Jesse Gerard Brands
 Jihoon Park
 Jiyoon Ha
 Joe Vanderstelt
+Joel Fernandes
 John Bazik
 John Whitlock
 Jonas Aule
@@ -125,6 +128,7 @@ Sam Solomon
 Sanghyeok Lee
 Seizan Shimazaki
 Serafeim Papastefanos
+Sergey Silaev
 Shane Rice
 Stuart Ross
 Terry Jones
@@ -138,6 +142,7 @@ Udi Oron
 Victor Semionov
 Volodymyr Yatsyk
 Vuong Nguyen
+Vlad Dmitrievich
 Wendy Edwards
 Will Gordon
 Will Ross
diff --git a/ChangeLog.rst b/ChangeLog.rst
index dd005e69..64d2c34e 100644
--- a/ChangeLog.rst
+++ b/ChangeLog.rst
@@ -1,3 +1,15 @@
+0.42.0 (Unreleased)
+*******************
+
+Note worthy changes
+-------------------
+
+- New provider: Yandex (OAuth2)
+
+- Fixed Twitch ``get_avatar_url()`` method to use the profile picture retrieved
+  by new user details endpoint introduced in version 0.40.0.
+
+
 0.41.0 (2019-12-18)
 *******************
 
diff --git a/Makefile b/Makefile
new file mode 100644
index 00000000..17b8a819
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,17 @@
+VIRTUALENV = $(shell pwd)/venv.tmp
+PYTHON = $(VIRTUALENV)/bin/python
+ISORT = isort $$(find $(PWD)/allauth -not -path '*/migrations/*' -type f -name '*.py' -not -name '__init__.py' -print)
+
+po:
+	( cd allauth ; $(PYTHON) ../manage.py makemessages -a -e html,txt,py )
+
+mo:
+	( cd allauth ; $(PYTHON) ../manage.py compilemessages )
+
+isort-fix:
+	$(ISORT)
+
+.PHONY:						\
+	po					\
+	mo					\
+	isort-fix
diff --git a/PKG-INFO b/PKG-INFO
deleted file mode 100644
index be5d1ba9..00000000
--- a/PKG-INFO
+++ /dev/null
@@ -1,114 +0,0 @@
-Metadata-Version: 1.1
-Name: django-allauth
-Version: 0.41.0
-Summary: Integrated set of Django applications addressing authentication, registration, account management as well as 3rd party (social) account authentication.
-Home-page: http://github.com/pennersr/django-allauth
-Author: Raymond Penners
-Author-email: raymond.penners@intenct.nl
-License: UNKNOWN
-Description: ==========================
-        Welcome to django-allauth!
-        ==========================
-        
-        .. image:: https://travis-ci.org/pennersr/django-allauth.svg
-           :target: http://travis-ci.org/pennersr/django-allauth
-        
-        .. image:: https://img.shields.io/pypi/v/django-allauth.svg
-           :target: https://pypi.python.org/pypi/django-allauth
-        
-        .. image:: https://coveralls.io/repos/pennersr/django-allauth/badge.svg?branch=master
-           :alt: Coverage Status
-           :target: https://coveralls.io/r/pennersr/django-allauth
-        
-        .. image:: https://pennersr.github.io/img/bitcoin-badge.svg
-           :target: https://blockchain.info/address/1AJXuBMPHkaDCNX2rwAy34bGgs7hmrePEr
-        
-        .. image:: https://img.shields.io/badge/code%20style-pep8-green.svg
-           :target: https://www.python.org/dev/peps/pep-0008/
-        
-        .. image:: https://img.shields.io/badge/code_style-standard-brightgreen.svg
-           :target: http://standardjs.com
-        
-        .. image:: https://pennersr.github.io/img/emacs-badge.svg
-           :target: https://www.gnu.org/software/emacs/
-        
-        Integrated set of Django applications addressing authentication,
-        registration, account management as well as 3rd party (social) account
-        authentication.
-        
-        Home page
-          http://www.intenct.nl/projects/django-allauth/
-        
-        Source code
-          http://github.com/pennersr/django-allauth
-        
-        Mailinglist
-          http://groups.google.com/group/django-allauth
-        
-        Documentation
-          https://django-allauth.readthedocs.io/en/latest/
-        
-        Stack Overflow
-          http://stackoverflow.com/questions/tagged/django-allauth
-        
-        Rationale
-        =========
-        
-        Most existing Django apps that address the problem of social
-        authentication focus on just that. You typically need to integrate
-        another app in order to support authentication via a local
-        account.
-        
-        This approach separates the worlds of local and social
-        authentication. However, there are common scenarios to be dealt with
-        in both worlds. For example, an e-mail address passed along by an
-        OpenID provider is not guaranteed to be verified. So, before hooking
-        an OpenID account up to a local account the e-mail address must be
-        verified. So, e-mail verification needs to be present in both worlds.
-        
-        Integrating both worlds is quite a tedious process. It is definitely
-        not a matter of simply adding one social authentication app, and one
-        local account registration app to your ``INSTALLED_APPS`` list.
-        
-        This is the reason this project got started -- to offer a fully
-        integrated authentication app that allows for both local and social
-        authentication, with flows that just work.
-        
-        
-        Commercial Support
-        ==================
-        
-        This project is sponsored by IntenCT_. If you require assistance on
-        your project(s), please contact us: info@intenct.nl.
-        
-        .. _IntenCT: http://www.intenct.info
-        
-        
-        Cross-Selling
-        =============
-        
-        If you like this, you may also like:
-        
-        - django-trackstats: https://github.com/pennersr/django-trackstats
-        - netwell: https://github.com/pennersr/netwell
-        
-Keywords: django auth account social openid twitter facebook oauth registration
-Platform: UNKNOWN
-Classifier: Development Status :: 4 - Beta
-Classifier: Intended Audience :: Developers
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Environment :: Web Environment
-Classifier: Topic :: Internet
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Framework :: Django
-Classifier: Framework :: Django :: 2.0
-Classifier: Framework :: Django :: 2.1
-Classifier: Framework :: Django :: 2.2
-Classifier: Framework :: Django :: 3.0
diff --git a/allauth/account/adapter.py b/allauth/account/adapter.py
index 02a2f82d..bf2da84c 100644
--- a/allauth/account/adapter.py
+++ b/allauth/account/adapter.py
@@ -412,8 +412,13 @@ class DefaultAccountAdapter(object):
                        'first_name', 'last_name', 'email'])
 
     def is_safe_url(self, url):
-        from django.utils.http import is_safe_url
-        return is_safe_url(url, allowed_hosts=None)
+        try:
+            from django.utils.http import url_has_allowed_host_and_scheme
+        except ImportError:
+            from django.utils.http import \
+                is_safe_url as url_has_allowed_host_and_scheme
+
+        return url_has_allowed_host_and_scheme(url, allowed_hosts=None)
 
     def get_email_confirmation_url(self, request, emailconfirmation):
         """Constructs the email confirmation (activation) url.
diff --git a/allauth/locale/ar/LC_MESSAGES/django.po b/allauth/locale/ar/LC_MESSAGES/django.po
index b7bc7730..d5120b4d 100644
--- a/allauth/locale/ar/LC_MESSAGES/django.po
+++ b/allauth/locale/ar/LC_MESSAGES/django.po
@@ -25,11 +25,11 @@ msgstr "اسم المستخدم غير مسموح به. الرجاء اختيا
 
 #: account/adapter.py:49
 msgid "Too many failed login attempts. Try again later."
-msgstr ""
+msgstr "تجاوزت الحد المسموح لمحاولة تسجيل الدخول, حاول في وقت لاحق"
 
 #: account/adapter.py:51
 msgid "A user is already registered with this e-mail address."
-msgstr "هنالك مستخدم مسجل سابقا مع نفس عنوان البريد الاكتروني‪.‬"
+msgstr "هنالك مستخدم مسجل سابقا مع نفس عنوان البريد الالكتروني‪.‬"
 
 #: account/adapter.py:294
 #, python-brace-format
@@ -50,7 +50,7 @@ msgstr "كلمة السر"
 
 #: account/forms.py:92
 msgid "Remember Me"
-msgstr "ذكرني"
+msgstr "تذكرني"
 
 #: account/forms.py:98
 msgid "This account is currently inactive."
@@ -81,7 +81,7 @@ msgstr "اسم المستخدم"
 
 #: account/forms.py:130
 msgid "Username or e-mail"
-msgstr "اسم المستخدم أو البريج الالكتروني"
+msgstr "اسم المستخدم أو البريد الالكتروني"
 
 #: account/forms.py:133
 msgctxt "field label"
@@ -89,14 +89,10 @@ msgid "Login"
 msgstr "تسجيل الدخول"
 
 #: account/forms.py:292
-#, fuzzy
-#| msgid "E-mail (optional)"
 msgid "E-mail (again)"
-msgstr "البريد الالكتروني ‪)‬اختياري‪(‬"
+msgstr "البريد الالكتروني ‪(مجددا)‬"
 
 #: account/forms.py:296
-#, fuzzy
-#| msgid "email confirmation"
 msgid "E-mail address confirmation"
 msgstr "تأكيد البريد الإلكتروني"
 
@@ -105,10 +101,8 @@ msgid "E-mail (optional)"
 msgstr "البريد الالكتروني ‪)‬اختياري‪(‬"
 
 #: account/forms.py:345
-#, fuzzy
-#| msgid "You must type the same password each time."
 msgid "You must type the same email each time."
-msgstr "يجب عليك كتابة نفس كلمة المرور في كل مرة‪.‬"
+msgstr "يجب عليك كتابة نفس البريد الالكتروني في كل مرة‪.‬"
 
 #: account/forms.py:368 account/forms.py:477
 msgid "Password (again)"
@@ -144,7 +138,7 @@ msgstr "لم يتم تعيين عنوان البريد الإلكتروني لأ
 
 #: account/forms.py:568
 msgid "The password reset token was invalid."
-msgstr ""
+msgstr "خطأ في شهادة اعادة تعيين كلمة المرور."
 
 #: account/models.py:21
 msgid "user"
@@ -176,7 +170,7 @@ msgstr "تمّ إنشاؤه"
 
 #: account/models.py:82
 msgid "sent"
-msgstr "مبعوث"
+msgstr "تم ارساله"
 
 #: account/models.py:83 socialaccount/models.py:55
 msgid "key"
@@ -209,7 +203,7 @@ msgstr "حسابك ليس لديه عنوان البريد الإلكتروني
 
 #: socialaccount/apps.py:7
 msgid "Social Accounts"
-msgstr "الحسابات الاجتماعية"
+msgstr "حسابات التواصل الاجتماعية"
 
 #: socialaccount/models.py:42 socialaccount/models.py:76
 msgid "provider"
@@ -241,11 +235,11 @@ msgstr ""
 
 #: socialaccount/models.py:66
 msgid "social application"
-msgstr ""
+msgstr "تطبيق اجتماعي"
 
 #: socialaccount/models.py:67
 msgid "social applications"
-msgstr ""
+msgstr "تطبيقات اجتماعية"
 
 #: socialaccount/models.py:95
 msgid "uid"
@@ -253,23 +247,23 @@ msgstr ""
 
 #: socialaccount/models.py:97
 msgid "last login"
-msgstr ""
+msgstr "أخر دخول"
 
 #: socialaccount/models.py:99
 msgid "date joined"
-msgstr ""
+msgstr "تاريخ الانضمام"
 
 #: socialaccount/models.py:101
 msgid "extra data"
-msgstr ""
+msgstr "بيانات اضافية"
 
 #: socialaccount/models.py:105
 msgid "social account"
-msgstr ""
+msgstr "حساب تواصل اجتماعي"
 
 #: socialaccount/models.py:106
 msgid "social accounts"
-msgstr ""
+msgstr "حسابات تواصل اجتماعي"
 
 #: socialaccount/models.py:131
 msgid "token"
@@ -289,7 +283,7 @@ msgstr ""
 
 #: socialaccount/models.py:140
 msgid "expires at"
-msgstr ""
+msgstr "ينتهي في"
 
 #: socialaccount/models.py:144
 msgid "social application token"
@@ -301,7 +295,7 @@ msgstr ""
 
 #: socialaccount/providers/douban/views.py:36
 msgid "Invalid profile data"
-msgstr ""
+msgstr "معلومات بروفايل غير صالحة"
 
 #: socialaccount/providers/oauth/client.py:78
 #, python-format
@@ -367,7 +361,7 @@ msgstr "اجعله اولي"
 
 #: templates/account/email.html:35
 msgid "Re-send Verification"
-msgstr "ابعث رسالة التحقيق مرة أخرى"
+msgstr "اعادة ارسال رسالة التأكيد"
 
 #: templates/account/email.html:36 templates/socialaccount/connections.html:35
 msgid "Remove"
@@ -382,13 +376,13 @@ msgid ""
 "You currently do not have any e-mail address set up. You should really add "
 "an e-mail address so you can receive notifications, reset your password, etc."
 msgstr ""
-"أنت حاليا ليس لديك أي عنوان البريد الإلكتروني. يجب أن تضيف عنوان البريد "
-"الإلكتروني حتى تتمكن من تلقي الإخطارات، إعادة تعيين كلمة المرور الخاصة بك، "
+"ليس لديك أي عنوان البريد الإلكتروني. يجب أن تضيف عنوان البريد"
+"الإلكتروني حتى تتمكن من تلقي الاشعارات, إعادة تعيين كلمة المرور الخاصة بك، "
 "الخ"
 
 #: templates/account/email.html:48
 msgid "Add E-mail Address"
-msgstr "أضف عنوان البريد الاكتريني"
+msgstr "أضف عنوان البريد الالكتروني"
 
 #: templates/account/email.html:53
 msgid "Add E-mail"
@@ -396,15 +390,9 @@ msgstr "أضف عنوان البريد الالكتروني"
 
 #: templates/account/email.html:62
 msgid "Do you really want to remove the selected e-mail address?"
-msgstr "هل تريد حقا ان تحذف عنوان البريد الاكتروني المختار؟"
+msgstr "هل تريد حقا ان تحذف عنوان البريد الالكتروني المحدد؟"
 
 #: templates/account/email/email_confirmation_message.txt:1
-#, fuzzy, python-format
-#| msgid ""
-#| "User %(user_display)s at %(site_name)s has given this as an email "
-#| "address.\n"
-#| "\n"
-#| "To confirm this is correct, go to %(activate_url)s\n"
 msgid ""
 "Hello from %(site_name)s!\n"
 "\n"
@@ -413,10 +401,12 @@ msgid ""
 "\n"
 "To confirm this is correct, go to %(activate_url)s\n"
 msgstr ""
-"المستخدم %(user_display)s في الموقع %(site_name)s أعطى هذا كعنوان بريد "
-"إلكتروني.\n"
-"‏\n"
-"لتأكيد هذه المعلومات صحيحة، انتقل إلى %(activate_url)s\n"
+"مرحبا من %(site_name)s!\n"
+"\n"
+"تتلقى هذه الرسالة بسبب أن المستخدم %(user_display)s قام باضافة بريدك الالكترني "
+"لحسابه في الموقع.\n"
+"\n"
+"لتأكيد صحة هذا الاجراء, اضغط على الرابط %(activate_url)s\n"
 
 #: templates/account/email/email_confirmation_message.txt:7
 #, python-format
@@ -424,20 +414,14 @@ msgid ""
 "Thank you from %(site_name)s!\n"
 "%(site_domain)s"
 msgstr ""
+"شكرا لك من فريق %(site_name)s!\n"
+"%(site_domain)s"
 
 #: templates/account/email/email_confirmation_subject.txt:3
-#, fuzzy
-#| msgid "Confirm E-mail Address"
 msgid "Please Confirm Your E-mail Address"
-msgstr "قم بتحقيق عنوان البريد الاكتروني"
+msgstr "قم بتأكيد عنوان البريد الالكتروني"
 
 #: templates/account/email/password_reset_key_message.txt:1
-#, fuzzy, python-format
-#| msgid ""
-#| "You're receiving this e-mail because you or someone else has requested a "
-#| "password for your user account at %(site_domain)s.\n"
-#| "It can be safely ignored if you did not request a password reset. Click "
-#| "the link below to reset your password."
 msgid ""
 "Hello from %(site_name)s!\n"
 "\n"
@@ -446,10 +430,12 @@ msgid ""
 "It can be safely ignored if you did not request a password reset. Click the "
 "link below to reset your password."
 msgstr ""
-"تلقيت هذا البريد الإلكتروني لأنك ‪)‬أو أي شخص آخر‪(‬ قد طلب كلمة مرور لحساب "
-"المستخدم الخاص بك في%(site_domain)s‪.‬\n"
-"يمكن تجاهل هذه الرسالة بأمان إذا كنت لم تطلب إعادة تعيين كلمة مرور. انقر فوق "
-"الارتباط الموجود أدناه لإعادة تعيين كلمة المرور الخاصة بك."
+"مرحبا من %(site_name)s!\n"
+"\n"
+"أنت تتلقى هذه الرسالة بسبب طلبك أو طلب شخص أخر"
+"الحصول على كلمة المرور الخاصة بك.\n"
+"اذا لم تقم بطلب كلمة مرور يمكنك تجاهل هذه الريالة. اضغط على "
+" الرابط بالاسفل لاعادة تعيين كلمة المرور."
 
 #: templates/account/email/password_reset_key_message.txt:8
 #, python-format
@@ -462,6 +448,8 @@ msgid ""
 "Thank you for using %(site_name)s!\n"
 "%(site_domain)s"
 msgstr ""
+"شكرا لاستخدامك %(site_name)s!\n"
+"%(site_domain)s"
 
 #: templates/account/email/password_reset_key_subject.txt:3
 msgid "Password Reset E-mail"
@@ -470,7 +458,7 @@ msgstr "البريد الإلكتروني لإعادة تعيين كلمة ال
 #: templates/account/email_confirm.html:6
 #: templates/account/email_confirm.html:10
 msgid "Confirm E-mail Address"
-msgstr "قم بتحقيق عنوان البريد الاكتروني"
+msgstr "قم بتحقيق عنوان البريد الالكتروني"
 
 #: templates/account/email_confirm.html:16
 #, python-format
@@ -555,7 +543,7 @@ msgstr "قد اكّدت عنوان البريد الالكتروني %(email)s."
 #: templates/account/messages/email_deleted.txt:2
 #, python-format
 msgid "Removed e-mail address %(email)s."
-msgstr "قد أزلنا عنوان البريد الاكتروني %(email)s."
+msgstr "قد أزلنا عنوان البريد الالكتروني %(email)s."
 
 #: templates/account/messages/logged_in.txt:4
 #, python-format
@@ -597,7 +585,7 @@ msgstr "غيّر كلمة المرور"
 #: templates/account/password_reset_done.html:6
 #: templates/account/password_reset_done.html:9
 msgid "Password Reset"
-msgstr "إعادة ضبط كلمة المرور"
+msgstr "إعادة تعيين كلمة المرور"
 
 #: templates/account/password_reset.html:15
 msgid ""
@@ -768,7 +756,7 @@ msgstr "إضافة حساب طرف الثالث"
 #: templates/socialaccount/login_cancelled.html:5
 #: templates/socialaccount/login_cancelled.html:9
 msgid "Login Cancelled"
-msgstr "الدخول تم إلغاؤه‪.‬"
+msgstr "تم الغاء تسجيل الدخول"
 
 #: templates/socialaccount/login_cancelled.html:13
 #, python-format
@@ -783,15 +771,15 @@ msgstr ""
 
 #: templates/socialaccount/messages/account_connected.txt:2
 msgid "The social account has been connected."
-msgstr "قد تم ربط الحساب الاجتماعي."
+msgstr "قد تم ربط حساب التواصل الاجتماعي."
 
 #: templates/socialaccount/messages/account_connected_other.txt:2
 msgid "The social account is already connected to a different account."
-msgstr "الحساب الاجتماعي متصل مسبقاً إلى حساب مختلف."
+msgstr "حساب التواصل الاجتماعي متصل مسبقاً إلى حساب مختلف."
 
 #: templates/socialaccount/messages/account_disconnected.txt:2
 msgid "The social account has been disconnected."
-msgstr "تم قطع الاتصال بالحساب الاجتماعي."
+msgstr "تم قطع الاتصال بحساب التواصل الاجتماعي."
 
 #: templates/socialaccount/signup.html:10
 #, python-format
@@ -812,9 +800,8 @@ msgstr ""
 #~ msgstr "اسم المستخدم مسجل مسبقا. الرجاء اختيار اسم اخر‪.‬"
 
 #, fuzzy
-#~| msgid "Sign In"
 #~ msgid "Shopify Sign In"
-#~ msgstr "تسجيل الدخول"
+#~ msgstr "تسجيل الدخول Shopify"
 
 #~ msgid ""
 #~ "You have confirmed that <a href=\"mailto:%(email)s\">%(email)s</a> is an "
@@ -827,21 +814,21 @@ msgstr ""
 #~ msgstr "شكرا لاستخدام موقعنا!"
 
 #~ msgid "Confirmation e-mail sent to %(email)s"
-#~ msgstr "דואל אישור נשלח אל %(email)s"
+#~ msgstr "ارسلت رسالة التأكيد الى بريدك الالكتروني %(email)s"
 
 #~ msgid "Delete Password"
-#~ msgstr "מחיקת סיסמא"
+#~ msgstr "احذف كلمة المرور"
 
 #~ msgid ""
 #~ "You may delete your password since you are currently logged in using "
 #~ "OpenID."
-#~ msgstr "אתה רשאי למחוק את סיסמאתך כיוון שהנך מחובר באמצעות OpenID"
+#~ msgstr "بامكانك حذف كلمة المرور بما انك قمت بتسجيل الدخول بواسطة OpenID"
 
 #~ msgid "delete my password"
-#~ msgstr "מחק סיסמא"
+#~ msgstr "احذف كلمة المرور الخاصة بي"
 
 #~ msgid "Password Deleted"
-#~ msgstr "הסיסמא נמחקה"
+#~ msgstr "تم حذف كلمة المرور"
 
 #~ msgid "Your password has been deleted."
-#~ msgstr "סיסמתך נמחקה מהמערכת."
+#~ msgstr "تم حذف كلمة المرور الخاصة بك."
diff --git a/allauth/locale/es/LC_MESSAGES/django.po b/allauth/locale/es/LC_MESSAGES/django.po
index a7dade54..5fb55218 100644
--- a/allauth/locale/es/LC_MESSAGES/django.po
+++ b/allauth/locale/es/LC_MESSAGES/django.po
@@ -780,8 +780,8 @@ msgid ""
 "accounts. If this was a mistake, please proceed to <a href=\"%(login_url)s"
 "\">sign in</a>."
 msgstr ""
-"Has decidido cancelar el inicio de sesión a nuestro sitio usando las "
-"siguientes cuentas. Si esto fue un error, <a href=\"%(login_url)s\">inicie "
+"Has decidido cancelar el inicio de sesión a nuestro sitio usando una de tus "
+"cuentas. Si esto fue un error, <a href=\"%(login_url)s\">inicie "
 "sesión</a>."
 
 #: templates/socialaccount/messages/account_connected.txt:2
diff --git a/allauth/locale/pl/LC_MESSAGES/django.po b/allauth/locale/pl/LC_MESSAGES/django.po
index 999b4c87..69877866 100644
--- a/allauth/locale/pl/LC_MESSAGES/django.po
+++ b/allauth/locale/pl/LC_MESSAGES/django.po
@@ -564,7 +564,7 @@ msgstr "Hasło zostało ustawione."
 
 #: templates/account/messages/primary_email_set.txt:2
 msgid "Primary e-mail address set."
-msgstr "Ustaw podstawowy adres e-mail."
+msgstr "Podstawowy adres e-mail został ustawiony."
 
 #: templates/account/messages/unverified_primary_email.txt:2
 msgid "Your primary e-mail address must be verified."
diff --git a/allauth/socialaccount/fields.py b/allauth/socialaccount/fields.py
index 85784375..da170bc8 100644
--- a/allauth/socialaccount/fields.py
+++ b/allauth/socialaccount/fields.py
@@ -10,7 +10,7 @@ class JSONField(models.TextField):
     """Simple JSON field that stores python structures as JSON strings
     on database.
     """
-    if django.VERSION < (2, 0):
+    if django.VERSION < (3, 0):
         def from_db_value(self, value, expression, connection, context):
             return self.to_python(value)
     else:
diff --git a/allauth/socialaccount/providers/amazon/views.py b/allauth/socialaccount/providers/amazon/views.py
index eb25968c..b232d4c3 100644
--- a/allauth/socialaccount/providers/amazon/views.py
+++ b/allauth/socialaccount/providers/amazon/views.py
@@ -13,7 +13,7 @@ class AmazonOAuth2Adapter(OAuth2Adapter):
     provider_id = AmazonProvider.id
     access_token_url = 'https://api.amazon.com/auth/o2/token'
     authorize_url = 'http://www.amazon.com/ap/oa'
-    profile_url = 'https://www.amazon.com/ap/user/profile'
+    profile_url = 'https://api.amazon.com/user/profile'
     supports_state = False
     redirect_uri_protocol = 'https'
 
diff --git a/allauth/socialaccount/providers/edx/__init__.py b/allauth/socialaccount/providers/edx/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/allauth/socialaccount/providers/edx/provider.py b/allauth/socialaccount/providers/edx/provider.py
new file mode 100644
index 00000000..e710494e
--- /dev/null
+++ b/allauth/socialaccount/providers/edx/provider.py
@@ -0,0 +1,32 @@
+from allauth.socialaccount.providers.base import ProviderAccount
+from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider
+
+
+class EdxAccount(ProviderAccount):
+    def get_profile_url(self):
+        if self.account.extra_data['profile_image']['has_image']:
+            return self.account.extra_data['image_url_full']
+
+
+class EdxProvider(OAuth2Provider):
+    id = 'edx'
+    name = 'Edx'
+    account_class = EdxAccount
+
+    def get_default_scope(self):
+        return ['profile']
+
+    def extract_uid(self, data):
+        """Extract uid ('id') and ensure it's a str."""
+        return str(data['username'])
+
+    def extract_common_fields(self, data):
+        return dict(
+            email=data.get('email'),
+            username=data.get('username'),
+            name=data.get('name'),
+            user_id=data.get('user_id'),
+        )
+
+
+provider_classes = [EdxProvider]
diff --git a/allauth/socialaccount/providers/edx/tests.py b/allauth/socialaccount/providers/edx/tests.py
new file mode 100644
index 00000000..b26a5a25
--- /dev/null
+++ b/allauth/socialaccount/providers/edx/tests.py
@@ -0,0 +1,44 @@
+from allauth.socialaccount.tests import OAuth2TestsMixin
+from allauth.tests import MockedResponse, TestCase
+
+from .provider import EdxProvider
+
+
+class EdxTests(OAuth2TestsMixin, TestCase):
+    provider_id = EdxProvider.id
+
+    def get_mocked_response(self):
+        print(self)
+        return MockedResponse(200, """{
+"username":"krzysztof",
+"bio":null,
+"requires_parental_consent":true,
+"language_proficiencies":[
+
+],
+"name":"Krzysztof Hoffmann",
+"country":null,
+"social_links":[
+
+],
+"is_active":true,
+"profile_image":{
+  "image_url_small":"http://draft.navoica.pl/static/images/profiles/default_30.png",
+  "image_url_full":"http://draft.navoica.pl/static/images/profiles/default_500.png",
+  "image_url_large":"http://draft.navoica.pl/static/images/profiles/default_120.png",
+  "image_url_medium":"http://draft.navoica.pl/static/images/profiles/default_50.png",
+  "has_image":false
+},
+"extended_profile":[
+
+],
+"year_of_birth":null,
+"level_of_education":null,
+"goals":"",
+"accomplishments_shared":false,
+"gender":null,
+"date_joined":"2019-09-21T07:48:31Z",
+"mailing_address":"",
+"email":"krzysztof.hoffmann@opi.org.pl",
+"account_privacy":"private"
+}""")
diff --git a/allauth/socialaccount/providers/edx/urls.py b/allauth/socialaccount/providers/edx/urls.py
new file mode 100644
index 00000000..37232688
--- /dev/null
+++ b/allauth/socialaccount/providers/edx/urls.py
@@ -0,0 +1,6 @@
+from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns
+
+from .provider import EdxProvider
+
+
+urlpatterns = default_urlpatterns(EdxProvider)
diff --git a/allauth/socialaccount/providers/edx/views.py b/allauth/socialaccount/providers/edx/views.py
new file mode 100644
index 00000000..53cfdfc1
--- /dev/null
+++ b/allauth/socialaccount/providers/edx/views.py
@@ -0,0 +1,46 @@
+import requests
+
+from allauth.socialaccount import app_settings
+from allauth.socialaccount.providers.oauth2.views import (
+    OAuth2Adapter,
+    OAuth2CallbackView,
+    OAuth2LoginView,
+)
+
+from .provider import EdxProvider
+
+
+class EdxOAuth2Adapter(OAuth2Adapter):
+    provider_id = EdxProvider.id
+    provider_default_url = 'https://edx.org'
+
+    settings = app_settings.PROVIDERS.get(provider_id, {})
+    provider_base_url = settings.get('EDX_URL', provider_default_url)
+
+    access_token_url = '{0}/oauth2/access_token'.format(provider_base_url)
+    authorize_url = '{0}/oauth2/authorize/'.format(provider_base_url)
+    profile_url = '{0}/api/user/v1/me'.format(provider_base_url)
+    account_url = '{0}/api/user/v1/accounts/{1}'
+    supports_state = False
+    redirect_uri_protocol = 'https'
+
+    def complete_login(self, request, app, token, **kwargs):
+        response = requests.get(
+            self.profile_url,
+            params={'access_token': token})
+        extra_data = response.json()
+
+        if extra_data.get('email', None) is None:
+            response = requests.get(
+                self.account_url.format(self.provider_base_url,
+                                        extra_data['username']),
+                params={'access_token': token})
+            extra_data = response.json()
+
+        return self.get_provider().sociallogin_from_response(
+            request,
+            extra_data)
+
+
+oauth2_login = OAuth2LoginView.adapter_view(EdxOAuth2Adapter)
+oauth2_callback = OAuth2CallbackView.adapter_view(EdxOAuth2Adapter)
diff --git a/allauth/socialaccount/providers/github/views.py b/allauth/socialaccount/providers/github/views.py
index 06cba317..95fb156f 100644
--- a/allauth/socialaccount/providers/github/views.py
+++ b/allauth/socialaccount/providers/github/views.py
@@ -26,20 +26,19 @@ class GitHubOAuth2Adapter(OAuth2Adapter):
     emails_url = '{0}/user/emails'.format(api_url)
 
     def complete_login(self, request, app, token, **kwargs):
-        params = {'access_token': token.token}
-        resp = requests.get(self.profile_url, params=params)
+        headers = {'Authorization': 'token {}'.format(token.token)}
+        resp = requests.get(self.profile_url, headers=headers)
         resp.raise_for_status()
         extra_data = resp.json()
         if app_settings.QUERY_EMAIL and not extra_data.get('email'):
-            extra_data['email'] = self.get_email(token)
+            extra_data['email'] = self.get_email(headers)
         return self.get_provider().sociallogin_from_response(
             request, extra_data
         )
 
-    def get_email(self, token):
+    def get_email(self, headers):
         email = None
-        params = {'access_token': token.token}
-        resp = requests.get(self.emails_url, params=params)
+        resp = requests.get(self.emails_url, headers=headers)
         resp.raise_for_status()
         emails = resp.json()
         if resp.status_code == 200 and emails:
diff --git a/allauth/socialaccount/providers/kakao/views.py b/allauth/socialaccount/providers/kakao/views.py
index 09a56fd7..b5f4a155 100644
--- a/allauth/socialaccount/providers/kakao/views.py
+++ b/allauth/socialaccount/providers/kakao/views.py
@@ -18,6 +18,7 @@ class KakaoOAuth2Adapter(OAuth2Adapter):
     def complete_login(self, request, app, token, **kwargs):
         headers = {'Authorization': 'Bearer {0}'.format(token.token)}
         resp = requests.get(self.profile_url, headers=headers)
+        resp.raise_for_status()
         extra_data = resp.json()
         return self.get_provider().sociallogin_from_response(request,
                                                              extra_data)
diff --git a/allauth/socialaccount/providers/microsoft/provider.py b/allauth/socialaccount/providers/microsoft/provider.py
index 6c176a92..20ec5123 100644
--- a/allauth/socialaccount/providers/microsoft/provider.py
+++ b/allauth/socialaccount/providers/microsoft/provider.py
@@ -8,7 +8,7 @@ class MicrosoftGraphAccount(ProviderAccount):
 
     def to_str(self):
         name = self.account.extra_data.get('displayName')
-        if name.strip() != '':
+        if name and name.strip() != '':
             return name
         return super(MicrosoftGraphAccount, self).to_str()
 
diff --git a/allauth/socialaccount/providers/naver/views.py b/allauth/socialaccount/providers/naver/views.py
index 6ec6787c..d1c8a6a9 100644
--- a/allauth/socialaccount/providers/naver/views.py
+++ b/allauth/socialaccount/providers/naver/views.py
@@ -18,6 +18,7 @@ class NaverOAuth2Adapter(OAuth2Adapter):
     def complete_login(self, request, app, token, **kwargs):
         headers = {'Authorization': 'Bearer {0}'.format(token.token)}
         resp = requests.get(self.profile_url, headers=headers)
+        resp.raise_for_status()
         extra_data = resp.json().get('response')
         return self.get_provider().sociallogin_from_response(request,
                                                              extra_data)
diff --git a/allauth/socialaccount/providers/twitch/provider.py b/allauth/socialaccount/providers/twitch/provider.py
index 141a896a..14829271 100644
--- a/allauth/socialaccount/providers/twitch/provider.py
+++ b/allauth/socialaccount/providers/twitch/provider.py
@@ -7,7 +7,10 @@ class TwitchAccount(ProviderAccount):
         return 'http://twitch.tv/' + self.account.extra_data.get('login')
 
     def get_avatar_url(self):
-        return self.account.extra_data.get('logo')
+        # We're using `logo` as a failback for legacy profiles retrieved
+        # with the old https://api.twitch.tv/kraken/user endpoint.
+        logo = self.account.extra_data.get('logo')
+        return self.account.extra_data.get('profile_image_url', logo)
 
     def to_str(self):
         dflt = super(TwitchAccount, self).to_str()
diff --git a/allauth/socialaccount/providers/untappd/client.py b/allauth/socialaccount/providers/untappd/client.py
index dba1c632..b9b8c6e3 100644
--- a/allauth/socialaccount/providers/untappd/client.py
+++ b/allauth/socialaccount/providers/untappd/client.py
@@ -1,10 +1,13 @@
 import requests
 
+from allauth.socialaccount import app_settings
 from allauth.socialaccount.providers.oauth2.client import (
     OAuth2Client,
     OAuth2Error,
 )
 
+from .provider import UntappdProvider
+
 
 class UntappdOAuth2Client(OAuth2Client):
     """
@@ -26,11 +29,16 @@ class UntappdOAuth2Client(OAuth2Client):
         if self.access_token_method == 'GET':
             params = data
             data = None
+        # Allow custom User Agent to comply with Untappd API
+        settings = app_settings.PROVIDERS.get(UntappdProvider.id, {})
+        headers = {
+            'User-Agent': settings.get('USER_AGENT', 'django-allauth')}
         # TODO: Proper exception handling
         resp = requests.request(self.access_token_method,
                                 url,
                                 params=params,
-                                data=data)
+                                data=data,
+                                headers=headers)
         access_token = None
         if resp.status_code == 200:
             access_token = resp.json()['response']
diff --git a/allauth/socialaccount/providers/yandex/__init__.py b/allauth/socialaccount/providers/yandex/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/allauth/socialaccount/providers/yandex/provider.py b/allauth/socialaccount/providers/yandex/provider.py
new file mode 100644
index 00000000..a3ac4a01
--- /dev/null
+++ b/allauth/socialaccount/providers/yandex/provider.py
@@ -0,0 +1,53 @@
+from allauth.account.models import EmailAddress
+from allauth.socialaccount import app_settings
+from allauth.socialaccount.providers.base import ProviderAccount
+from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider
+
+
+class YandexAccout(ProviderAccount):
+    def to_str(self):
+        first_name = self.account.extra_data.get("first_name", "")
+        last_name = self.account.extra_data.get("last_name", "")
+        name = " ".join([first_name, last_name]).strip()
+        return name or super(YandexAccout, self).to_str()
+
+
+class YandexProvider(OAuth2Provider):
+    id = "yandex"
+    name = "Yandex"
+    account_class = YandexAccout
+
+    def get_default_scope(self):
+        scope = ["login:info"]
+        if app_settings.QUERY_EMAIL:
+            scope.append("login:email")
+        return scope
+
+    def extract_uid(self, data):
+        return str(data["id"])
+
+    def get_user_email(self, data):
+        email = data.get("default_email")
+        if not email:
+            emails = data.get("emails")
+            email = emails[0] if emails else ""
+        return email
+
+    def extract_common_fields(self, data):
+        email = self.get_user_email(data)
+        return dict(
+            email=email,
+            last_name=data.get("last_name"),
+            username=data.get("display_name"),
+            first_name=data.get("first_name"),
+        )
+
+    def extract_email_addresses(self, data):
+        ret = []
+        email = self.get_user_email(data)
+        if email:
+            ret.append(EmailAddress(email=email, verified=True, primary=True))
+        return ret
+
+
+provider_classes = [YandexProvider]
diff --git a/allauth/socialaccount/providers/yandex/tests.py b/allauth/socialaccount/providers/yandex/tests.py
new file mode 100644
index 00000000..a2321912
--- /dev/null
+++ b/allauth/socialaccount/providers/yandex/tests.py
@@ -0,0 +1,41 @@
+from __future__ import absolute_import
+
+from allauth.socialaccount.tests import OAuth2TestsMixin
+from allauth.tests import MockedResponse, TestCase
+
+from .provider import YandexProvider
+
+
+class YandexTests(OAuth2TestsMixin, TestCase):
+    provider_id = YandexProvider.id
+
+    yandex_data = """
+        {
+            "login": "vasya",
+                "old_social_login": "uid-mmzxrnry",
+                    "default_email": "test@yandex.ru",
+                        "id": "1000034426",
+                            "client_id": "4760187d81bc4b7799476b42b5103713",
+                                "emails": [
+                                    "test@yandex.ru",
+                                    "other-test@yandex.ru"
+                                ],
+                                "openid_identities": [
+                                    "http://openid.yandex.ru/vasya/",
+                                    "http://vasya.ya.ru/"
+                                ]
+        }"""
+
+    def get_mocked_response(self, data=None):
+        if data is None:
+            data = self.yandex_data
+        return MockedResponse(200, data)
+
+    def get_login_response_json(self, with_refresh_token=True):
+        return """
+            {
+                "access_token":"testac",
+                "refresh_token":"1:GN686QVt0mmakDd9:A4pYuW9LGk0_UnlrMIWklk",
+                "token_type":"bearer",
+                "expires_in":124234123534
+            }"""
diff --git a/allauth/socialaccount/providers/yandex/urls.py b/allauth/socialaccount/providers/yandex/urls.py
new file mode 100644
index 00000000..9d8af4f6
--- /dev/null
+++ b/allauth/socialaccount/providers/yandex/urls.py
@@ -0,0 +1,6 @@
+from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns
+
+from .provider import YandexProvider
+
+
+urlpatterns = default_urlpatterns(YandexProvider)
diff --git a/allauth/socialaccount/providers/yandex/views.py b/allauth/socialaccount/providers/yandex/views.py
new file mode 100644
index 00000000..b46ac204
--- /dev/null
+++ b/allauth/socialaccount/providers/yandex/views.py
@@ -0,0 +1,31 @@
+import requests
+
+from allauth.socialaccount.providers.oauth2.views import (
+    OAuth2Adapter,
+    OAuth2CallbackView,
+    OAuth2LoginView,
+)
+
+from .provider import YandexProvider
+
+
+class YandexAuth2Adapter(OAuth2Adapter):
+    provider_id = YandexProvider.id
+    access_token_url = "https://oauth.yandex.ru/token"
+    authorize_url = "https://oauth.yandex.com/authorize"
+    profile_url = "https://login.yandex.ru/info"
+
+    def complete_login(self, request, app, token, **kwargs):
+        resp = requests.get(
+            self.profile_url,
+            params={"oauth_token": token.token, "format": "json"},
+        )
+        resp.raise_for_status()
+        extra_data = resp.json()
+        return self.get_provider().sociallogin_from_response(
+            request, extra_data
+        )
+
+
+oauth2_login = OAuth2LoginView.adapter_view(YandexAuth2Adapter)
+oauth2_callback = OAuth2CallbackView.adapter_view(YandexAuth2Adapter)
diff --git a/allauth/templates/account/email.html b/allauth/templates/account/email.html
index 019e3e8f..9a9ed1f8 100644
--- a/allauth/templates/account/email.html
+++ b/allauth/templates/account/email.html
@@ -2,7 +2,7 @@
 
 {% load i18n %}
 
-{% block head_title %}{% trans "Account" %}{% endblock %}
+{% block head_title %}{% trans "E-mail Addresses" %}{% endblock %}
 
 {% block content %}
     <h1>{% trans "E-mail Addresses" %}</h1>
diff --git a/allauth/tests.py b/allauth/tests.py
index 64179266..f370e87a 100644
--- a/allauth/tests.py
+++ b/allauth/tests.py
@@ -5,6 +5,7 @@ import json
 import requests
 from datetime import date, datetime
 
+import django
 from django.core.files.base import ContentFile
 from django.db import models
 from django.test import RequestFactory, TestCase
@@ -93,9 +94,14 @@ class BasicTests(TestCase):
         class SomeField(models.Field):
             def get_prep_value(self, value):
                 return 'somevalue'
-
-            def from_db_value(self, value, expression, connection, context):
-                return some_value
+            if django.VERSION < (3, 0):
+                def from_db_value(
+                    self, value, expression, connection, context
+                ):
+                    return some_value
+            else:
+                def from_db_value(self, value, expression, connection):
+                    return some_value
 
         class SomeModel(models.Model):
             dt = models.DateTimeField()
diff --git a/allauth/utils.py b/allauth/utils.py
index 5191849f..71d7c71a 100644
--- a/allauth/utils.py
+++ b/allauth/utils.py
@@ -8,6 +8,7 @@ import unicodedata
 from collections import OrderedDict
 from urllib.parse import urlsplit
 
+import django
 from django.contrib.auth import get_user_model
 from django.contrib.sites.models import Site
 from django.core.exceptions import FieldDoesNotExist, ImproperlyConfigured
@@ -219,7 +220,12 @@ def deserialize_instance(model, data):
                     try:
                         # This is quite an ugly hack, but will cover most
                         # use cases...
-                        v = f.from_db_value(v, None, None, None)
+                        # The signature of `from_db_value` changed in Django 3
+                        # https://docs.djangoproject.com/en/3.0/releases/3.0/#features-removed-in-3-0
+                        if django.VERSION < (3, 0):
+                            v = f.from_db_value(v, None, None, None)
+                        else:
+                            v = f.from_db_value(v, None, None)
                     except Exception:
                         raise ImproperlyConfigured(
                             "Unable to auto serialize field '{}', custom"
diff --git a/debian/changelog b/debian/changelog
index b256d3b8..9758eb23 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+django-allauth (0.41.0+git20200323.1a39970-1) UNRELEASED; urgency=medium
+
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Sat, 28 Mar 2020 08:27:40 +0000
+
 django-allauth (0.41.0+ds-1) unstable; urgency=medium
 
   * New upstream release 0.41.0
diff --git a/debian/patches/0001-Remove-all-privacy-breack-links-from-documentation.patch b/debian/patches/0001-Remove-all-privacy-breack-links-from-documentation.patch
index 48f25e98..a00a10a2 100644
--- a/debian/patches/0001-Remove-all-privacy-breack-links-from-documentation.patch
+++ b/debian/patches/0001-Remove-all-privacy-breack-links-from-documentation.patch
@@ -6,10 +6,10 @@ Subject: Remove all privacy breack links from documentation
  README.rst | 22 ----------------------
  1 file changed, 22 deletions(-)
 
-diff --git a/README.rst b/README.rst
-index f21cf61..51d1713 100644
---- a/README.rst
-+++ b/README.rst
+Index: django-allauth/README.rst
+===================================================================
+--- django-allauth.orig/README.rst
++++ django-allauth/README.rst
 @@ -2,28 +2,6 @@
  Welcome to django-allauth!
  ==========================
diff --git a/debian/patches/0002-Fixes-wrongly-encoded-characters-in-some-.po-files.patch b/debian/patches/0002-Fixes-wrongly-encoded-characters-in-some-.po-files.patch
index e2abde78..582a3093 100644
--- a/debian/patches/0002-Fixes-wrongly-encoded-characters-in-some-.po-files.patch
+++ b/debian/patches/0002-Fixes-wrongly-encoded-characters-in-some-.po-files.patch
@@ -9,10 +9,10 @@ Subject: Fixes wrongly encoded characters in some .po files.
  allauth/locale/tr/LC_MESSAGES/django.po    | 2 +-
  4 files changed, 4 insertions(+), 4 deletions(-)
 
-diff --git a/allauth/locale/es/LC_MESSAGES/django.po b/allauth/locale/es/LC_MESSAGES/django.po
-index a7dade5..e54c03b 100644
---- a/allauth/locale/es/LC_MESSAGES/django.po
-+++ b/allauth/locale/es/LC_MESSAGES/django.po
+Index: django-allauth/allauth/locale/es/LC_MESSAGES/django.po
+===================================================================
+--- django-allauth.orig/allauth/locale/es/LC_MESSAGES/django.po
++++ django-allauth/allauth/locale/es/LC_MESSAGES/django.po
 @@ -9,7 +9,7 @@ msgstr ""
  "Report-Msgid-Bugs-To: \n"
  "POT-Creation-Date: 2019-12-18 11:53-0600\n"
@@ -22,10 +22,10 @@ index a7dade5..e54c03b 100644
  "Language-Team: Spanish (http://www.transifex.com/projects/p/django-allauth/"
  "language/es/)\n"
  "Language: es\n"
-diff --git a/allauth/locale/pt_PT/LC_MESSAGES/django.po b/allauth/locale/pt_PT/LC_MESSAGES/django.po
-index 183c6ae..9b39981 100644
---- a/allauth/locale/pt_PT/LC_MESSAGES/django.po
-+++ b/allauth/locale/pt_PT/LC_MESSAGES/django.po
+Index: django-allauth/allauth/locale/pt_PT/LC_MESSAGES/django.po
+===================================================================
+--- django-allauth.orig/allauth/locale/pt_PT/LC_MESSAGES/django.po
++++ django-allauth/allauth/locale/pt_PT/LC_MESSAGES/django.po
 @@ -9,7 +9,7 @@ msgstr ""
  "Report-Msgid-Bugs-To: \n"
  "POT-Creation-Date: 2019-12-18 11:53-0600\n"
@@ -35,10 +35,10 @@ index 183c6ae..9b39981 100644
  "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/"
  "django-allauth/language/pt_PT/)\n"
  "Language: pt_PT\n"
-diff --git a/allauth/locale/sv/LC_MESSAGES/django.po b/allauth/locale/sv/LC_MESSAGES/django.po
-index cffe67c..b487966 100644
---- a/allauth/locale/sv/LC_MESSAGES/django.po
-+++ b/allauth/locale/sv/LC_MESSAGES/django.po
+Index: django-allauth/allauth/locale/sv/LC_MESSAGES/django.po
+===================================================================
+--- django-allauth.orig/allauth/locale/sv/LC_MESSAGES/django.po
++++ django-allauth/allauth/locale/sv/LC_MESSAGES/django.po
 @@ -9,7 +9,7 @@ msgstr ""
  "Report-Msgid-Bugs-To: \n"
  "POT-Creation-Date: 2019-12-18 11:53-0600\n"
@@ -48,10 +48,10 @@ index cffe67c..b487966 100644
  "Language-Team: Swedish (http://www.transifex.com/projects/p/django-allauth/"
  "language/sv/)\n"
  "Language: sv\n"
-diff --git a/allauth/locale/tr/LC_MESSAGES/django.po b/allauth/locale/tr/LC_MESSAGES/django.po
-index d264661..fbea6cf 100644
---- a/allauth/locale/tr/LC_MESSAGES/django.po
-+++ b/allauth/locale/tr/LC_MESSAGES/django.po
+Index: django-allauth/allauth/locale/tr/LC_MESSAGES/django.po
+===================================================================
+--- django-allauth.orig/allauth/locale/tr/LC_MESSAGES/django.po
++++ django-allauth/allauth/locale/tr/LC_MESSAGES/django.po
 @@ -10,7 +10,7 @@ msgstr ""
  "Report-Msgid-Bugs-To: \n"
  "POT-Creation-Date: 2019-12-18 11:53-0600\n"
diff --git a/django_allauth.egg-info/PKG-INFO b/django_allauth.egg-info/PKG-INFO
deleted file mode 100644
index be5d1ba9..00000000
--- a/django_allauth.egg-info/PKG-INFO
+++ /dev/null
@@ -1,114 +0,0 @@
-Metadata-Version: 1.1
-Name: django-allauth
-Version: 0.41.0
-Summary: Integrated set of Django applications addressing authentication, registration, account management as well as 3rd party (social) account authentication.
-Home-page: http://github.com/pennersr/django-allauth
-Author: Raymond Penners
-Author-email: raymond.penners@intenct.nl
-License: UNKNOWN
-Description: ==========================
-        Welcome to django-allauth!
-        ==========================
-        
-        .. image:: https://travis-ci.org/pennersr/django-allauth.svg
-           :target: http://travis-ci.org/pennersr/django-allauth
-        
-        .. image:: https://img.shields.io/pypi/v/django-allauth.svg
-           :target: https://pypi.python.org/pypi/django-allauth
-        
-        .. image:: https://coveralls.io/repos/pennersr/django-allauth/badge.svg?branch=master
-           :alt: Coverage Status
-           :target: https://coveralls.io/r/pennersr/django-allauth
-        
-        .. image:: https://pennersr.github.io/img/bitcoin-badge.svg
-           :target: https://blockchain.info/address/1AJXuBMPHkaDCNX2rwAy34bGgs7hmrePEr
-        
-        .. image:: https://img.shields.io/badge/code%20style-pep8-green.svg
-           :target: https://www.python.org/dev/peps/pep-0008/
-        
-        .. image:: https://img.shields.io/badge/code_style-standard-brightgreen.svg
-           :target: http://standardjs.com
-        
-        .. image:: https://pennersr.github.io/img/emacs-badge.svg
-           :target: https://www.gnu.org/software/emacs/
-        
-        Integrated set of Django applications addressing authentication,
-        registration, account management as well as 3rd party (social) account
-        authentication.
-        
-        Home page
-          http://www.intenct.nl/projects/django-allauth/
-        
-        Source code
-          http://github.com/pennersr/django-allauth
-        
-        Mailinglist
-          http://groups.google.com/group/django-allauth
-        
-        Documentation
-          https://django-allauth.readthedocs.io/en/latest/
-        
-        Stack Overflow
-          http://stackoverflow.com/questions/tagged/django-allauth
-        
-        Rationale
-        =========
-        
-        Most existing Django apps that address the problem of social
-        authentication focus on just that. You typically need to integrate
-        another app in order to support authentication via a local
-        account.
-        
-        This approach separates the worlds of local and social
-        authentication. However, there are common scenarios to be dealt with
-        in both worlds. For example, an e-mail address passed along by an
-        OpenID provider is not guaranteed to be verified. So, before hooking
-        an OpenID account up to a local account the e-mail address must be
-        verified. So, e-mail verification needs to be present in both worlds.
-        
-        Integrating both worlds is quite a tedious process. It is definitely
-        not a matter of simply adding one social authentication app, and one
-        local account registration app to your ``INSTALLED_APPS`` list.
-        
-        This is the reason this project got started -- to offer a fully
-        integrated authentication app that allows for both local and social
-        authentication, with flows that just work.
-        
-        
-        Commercial Support
-        ==================
-        
-        This project is sponsored by IntenCT_. If you require assistance on
-        your project(s), please contact us: info@intenct.nl.
-        
-        .. _IntenCT: http://www.intenct.info
-        
-        
-        Cross-Selling
-        =============
-        
-        If you like this, you may also like:
-        
-        - django-trackstats: https://github.com/pennersr/django-trackstats
-        - netwell: https://github.com/pennersr/netwell
-        
-Keywords: django auth account social openid twitter facebook oauth registration
-Platform: UNKNOWN
-Classifier: Development Status :: 4 - Beta
-Classifier: Intended Audience :: Developers
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Environment :: Web Environment
-Classifier: Topic :: Internet
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
-Classifier: Framework :: Django
-Classifier: Framework :: Django :: 2.0
-Classifier: Framework :: Django :: 2.1
-Classifier: Framework :: Django :: 2.2
-Classifier: Framework :: Django :: 3.0
diff --git a/django_allauth.egg-info/SOURCES.txt b/django_allauth.egg-info/SOURCES.txt
deleted file mode 100644
index d6e2cfef..00000000
--- a/django_allauth.egg-info/SOURCES.txt
+++ /dev/null
@@ -1,705 +0,0 @@
-AUTHORS
-ChangeLog.rst
-LICENSE
-MANIFEST.in
-README.rst
-setup.py
-test_settings.py
-allauth/__init__.py
-allauth/app_settings.py
-allauth/exceptions.py
-allauth/models.py
-allauth/tests.py
-allauth/urls.py
-allauth/utils.py
-allauth/account/__init__.py
-allauth/account/adapter.py
-allauth/account/admin.py
-allauth/account/app_settings.py
-allauth/account/apps.py
-allauth/account/auth_backends.py
-allauth/account/decorators.py
-allauth/account/forms.py
-allauth/account/managers.py
-allauth/account/models.py
-allauth/account/signals.py
-allauth/account/tests.py
-allauth/account/urls.py
-allauth/account/utils.py
-allauth/account/views.py
-allauth/account/management/__init__.py
-allauth/account/management/commands/__init__.py
-allauth/account/management/commands/account_unsetmultipleprimaryemails.py
-allauth/account/migrations/0001_initial.py
-allauth/account/migrations/0002_email_max_length.py
-allauth/account/migrations/__init__.py
-allauth/account/templatetags/__init__.py
-allauth/account/templatetags/account.py
-allauth/locale/ar/LC_MESSAGES/django.mo
-allauth/locale/ar/LC_MESSAGES/django.po
-allauth/locale/cs/LC_MESSAGES/django.mo
-allauth/locale/cs/LC_MESSAGES/django.po
-allauth/locale/da/LC_MESSAGES/django.mo
-allauth/locale/da/LC_MESSAGES/django.po
-allauth/locale/de/LC_MESSAGES/django.mo
-allauth/locale/de/LC_MESSAGES/django.po
-allauth/locale/el/LC_MESSAGES/django.mo
-allauth/locale/el/LC_MESSAGES/django.po
-allauth/locale/en/LC_MESSAGES/django.mo
-allauth/locale/en/LC_MESSAGES/django.po
-allauth/locale/es/LC_MESSAGES/django.mo
-allauth/locale/es/LC_MESSAGES/django.po
-allauth/locale/eu/LC_MESSAGES/django.mo
-allauth/locale/eu/LC_MESSAGES/django.po
-allauth/locale/fa/LC_MESSAGES/django.mo
-allauth/locale/fa/LC_MESSAGES/django.po
-allauth/locale/fi/LC_MESSAGES/django.mo
-allauth/locale/fi/LC_MESSAGES/django.po
-allauth/locale/fr/LC_MESSAGES/django.mo
-allauth/locale/fr/LC_MESSAGES/django.po
-allauth/locale/he/LC_MESSAGES/django.mo
-allauth/locale/he/LC_MESSAGES/django.po
-allauth/locale/hr/LC_MESSAGES/django.mo
-allauth/locale/hr/LC_MESSAGES/django.po
-allauth/locale/hu/LC_MESSAGES/django.mo
-allauth/locale/hu/LC_MESSAGES/django.po
-allauth/locale/it/LC_MESSAGES/django.mo
-allauth/locale/it/LC_MESSAGES/django.po
-allauth/locale/ja/LC_MESSAGES/django.mo
-allauth/locale/ja/LC_MESSAGES/django.po
-allauth/locale/ko/LC_MESSAGES/django.mo
-allauth/locale/ko/LC_MESSAGES/django.po
-allauth/locale/ky/LC_MESSAGES/django.mo
-allauth/locale/ky/LC_MESSAGES/django.po
-allauth/locale/lt/LC_MESSAGES/django.mo
-allauth/locale/lt/LC_MESSAGES/django.po
-allauth/locale/lv/LC_MESSAGES/django.mo
-allauth/locale/lv/LC_MESSAGES/django.po
-allauth/locale/nl/LC_MESSAGES/django.mo
-allauth/locale/nl/LC_MESSAGES/django.po
-allauth/locale/no/LC_MESSAGES/django.mo
-allauth/locale/no/LC_MESSAGES/django.po
-allauth/locale/pl/LC_MESSAGES/django.mo
-allauth/locale/pl/LC_MESSAGES/django.po
-allauth/locale/pt_BR/LC_MESSAGES/django.mo
-allauth/locale/pt_BR/LC_MESSAGES/django.po
-allauth/locale/pt_PT/LC_MESSAGES/django.mo
-allauth/locale/pt_PT/LC_MESSAGES/django.po
-allauth/locale/ru/LC_MESSAGES/django.mo
-allauth/locale/ru/LC_MESSAGES/django.po
-allauth/locale/sk/LC_MESSAGES/django.mo
-allauth/locale/sk/LC_MESSAGES/django.po
-allauth/locale/sr/LC_MESSAGES/django.mo
-allauth/locale/sr/LC_MESSAGES/django.po
-allauth/locale/sr_Latn/LC_MESSAGES/django.mo
-allauth/locale/sr_Latn/LC_MESSAGES/django.po
-allauth/locale/sv/LC_MESSAGES/django.mo
-allauth/locale/sv/LC_MESSAGES/django.po
-allauth/locale/th/LC_MESSAGES/django.mo
-allauth/locale/th/LC_MESSAGES/django.po
-allauth/locale/tr/LC_MESSAGES/django.mo
-allauth/locale/tr/LC_MESSAGES/django.po
-allauth/locale/uk/LC_MESSAGES/django.mo
-allauth/locale/uk/LC_MESSAGES/django.po
-allauth/locale/zh_CN/LC_MESSAGES/django.mo
-allauth/locale/zh_CN/LC_MESSAGES/django.po
-allauth/locale/zh_Hans/LC_MESSAGES/django.mo
-allauth/locale/zh_Hans/LC_MESSAGES/django.po
-allauth/locale/zh_Hant/LC_MESSAGES/django.mo
-allauth/locale/zh_Hant/LC_MESSAGES/django.po
-allauth/locale/zh_TW/LC_MESSAGES/django.mo
-allauth/locale/zh_TW/LC_MESSAGES/django.po
-allauth/socialaccount/__init__.py
-allauth/socialaccount/adapter.py
-allauth/socialaccount/admin.py
-allauth/socialaccount/app_settings.py
-allauth/socialaccount/apps.py
-allauth/socialaccount/fields.py
-allauth/socialaccount/forms.py
-allauth/socialaccount/helpers.py
-allauth/socialaccount/models.py
-allauth/socialaccount/signals.py
-allauth/socialaccount/tests.py
-allauth/socialaccount/urls.py
-allauth/socialaccount/views.py
-allauth/socialaccount/migrations/0001_initial.py
-allauth/socialaccount/migrations/0002_token_max_lengths.py
-allauth/socialaccount/migrations/0003_extra_data_default_dict.py
-allauth/socialaccount/migrations/__init__.py
-allauth/socialaccount/providers/__init__.py
-allauth/socialaccount/providers/base.py
-allauth/socialaccount/providers/agave/__init__.py
-allauth/socialaccount/providers/agave/provider.py
-allauth/socialaccount/providers/agave/tests.py
-allauth/socialaccount/providers/agave/urls.py
-allauth/socialaccount/providers/agave/views.py
-allauth/socialaccount/providers/amazon/__init__.py
-allauth/socialaccount/providers/amazon/provider.py
-allauth/socialaccount/providers/amazon/tests.py
-allauth/socialaccount/providers/amazon/urls.py
-allauth/socialaccount/providers/amazon/views.py
-allauth/socialaccount/providers/amazon_cognito/__init__.py
-allauth/socialaccount/providers/amazon_cognito/provider.py
-allauth/socialaccount/providers/amazon_cognito/tests.py
-allauth/socialaccount/providers/amazon_cognito/urls.py
-allauth/socialaccount/providers/amazon_cognito/utils.py
-allauth/socialaccount/providers/amazon_cognito/views.py
-allauth/socialaccount/providers/angellist/__init__.py
-allauth/socialaccount/providers/angellist/provider.py
-allauth/socialaccount/providers/angellist/tests.py
-allauth/socialaccount/providers/angellist/urls.py
-allauth/socialaccount/providers/angellist/views.py
-allauth/socialaccount/providers/asana/__init__.py
-allauth/socialaccount/providers/asana/models.py
-allauth/socialaccount/providers/asana/provider.py
-allauth/socialaccount/providers/asana/tests.py
-allauth/socialaccount/providers/asana/urls.py
-allauth/socialaccount/providers/asana/views.py
-allauth/socialaccount/providers/auth0/__init__.py
-allauth/socialaccount/providers/auth0/provider.py
-allauth/socialaccount/providers/auth0/tests.py
-allauth/socialaccount/providers/auth0/urls.py
-allauth/socialaccount/providers/auth0/views.py
-allauth/socialaccount/providers/authentiq/__init__.py
-allauth/socialaccount/providers/authentiq/provider.py
-allauth/socialaccount/providers/authentiq/tests.py
-allauth/socialaccount/providers/authentiq/urls.py
-allauth/socialaccount/providers/authentiq/views.py
-allauth/socialaccount/providers/azure/__init__.py
-allauth/socialaccount/providers/azure/models.py
-allauth/socialaccount/providers/azure/provider.py
-allauth/socialaccount/providers/azure/tests.py
-allauth/socialaccount/providers/azure/urls.py
-allauth/socialaccount/providers/azure/views.py
-allauth/socialaccount/providers/baidu/__init__.py
-allauth/socialaccount/providers/baidu/provider.py
-allauth/socialaccount/providers/baidu/tests.py
-allauth/socialaccount/providers/baidu/urls.py
-allauth/socialaccount/providers/baidu/views.py
-allauth/socialaccount/providers/basecamp/__init__.py
-allauth/socialaccount/providers/basecamp/provider.py
-allauth/socialaccount/providers/basecamp/tests.py
-allauth/socialaccount/providers/basecamp/urls.py
-allauth/socialaccount/providers/basecamp/views.py
-allauth/socialaccount/providers/battlenet/__init__.py
-allauth/socialaccount/providers/battlenet/models.py
-allauth/socialaccount/providers/battlenet/provider.py
-allauth/socialaccount/providers/battlenet/tests.py
-allauth/socialaccount/providers/battlenet/urls.py
-allauth/socialaccount/providers/battlenet/validators.py
-allauth/socialaccount/providers/battlenet/views.py
-allauth/socialaccount/providers/bitbucket/__init__.py
-allauth/socialaccount/providers/bitbucket/provider.py
-allauth/socialaccount/providers/bitbucket/tests.py
-allauth/socialaccount/providers/bitbucket/urls.py
-allauth/socialaccount/providers/bitbucket/views.py
-allauth/socialaccount/providers/bitbucket_oauth2/__init__.py
-allauth/socialaccount/providers/bitbucket_oauth2/provider.py
-allauth/socialaccount/providers/bitbucket_oauth2/tests.py
-allauth/socialaccount/providers/bitbucket_oauth2/urls.py
-allauth/socialaccount/providers/bitbucket_oauth2/views.py
-allauth/socialaccount/providers/bitly/__init__.py
-allauth/socialaccount/providers/bitly/provider.py
-allauth/socialaccount/providers/bitly/tests.py
-allauth/socialaccount/providers/bitly/urls.py
-allauth/socialaccount/providers/bitly/views.py
-allauth/socialaccount/providers/box/__init__.py
-allauth/socialaccount/providers/box/provider.py
-allauth/socialaccount/providers/box/tests.py
-allauth/socialaccount/providers/box/urls.py
-allauth/socialaccount/providers/box/views.py
-allauth/socialaccount/providers/cern/__init__.py
-allauth/socialaccount/providers/cern/provider.py
-allauth/socialaccount/providers/cern/tests.py
-allauth/socialaccount/providers/cern/urls.py
-allauth/socialaccount/providers/cern/views.py
-allauth/socialaccount/providers/coinbase/__init__.py
-allauth/socialaccount/providers/coinbase/provider.py
-allauth/socialaccount/providers/coinbase/tests.py
-allauth/socialaccount/providers/coinbase/urls.py
-allauth/socialaccount/providers/coinbase/views.py
-allauth/socialaccount/providers/dataporten/__init__.py
-allauth/socialaccount/providers/dataporten/models.py
-allauth/socialaccount/providers/dataporten/provider.py
-allauth/socialaccount/providers/dataporten/tests.py
-allauth/socialaccount/providers/dataporten/urls.py
-allauth/socialaccount/providers/dataporten/views.py
-allauth/socialaccount/providers/daum/__init__.py
-allauth/socialaccount/providers/daum/models.py
-allauth/socialaccount/providers/daum/provider.py
-allauth/socialaccount/providers/daum/tests.py
-allauth/socialaccount/providers/daum/urls.py
-allauth/socialaccount/providers/daum/views.py
-allauth/socialaccount/providers/digitalocean/__init__.py
-allauth/socialaccount/providers/digitalocean/provider.py
-allauth/socialaccount/providers/digitalocean/tests.py
-allauth/socialaccount/providers/digitalocean/urls.py
-allauth/socialaccount/providers/digitalocean/views.py
-allauth/socialaccount/providers/discord/__init__.py
-allauth/socialaccount/providers/discord/provider.py
-allauth/socialaccount/providers/discord/tests.py
-allauth/socialaccount/providers/discord/urls.py
-allauth/socialaccount/providers/discord/views.py
-allauth/socialaccount/providers/disqus/__init__.py
-allauth/socialaccount/providers/disqus/provider.py
-allauth/socialaccount/providers/disqus/tests.py
-allauth/socialaccount/providers/disqus/urls.py
-allauth/socialaccount/providers/disqus/views.py
-allauth/socialaccount/providers/douban/__init__.py
-allauth/socialaccount/providers/douban/provider.py
-allauth/socialaccount/providers/douban/tests.py
-allauth/socialaccount/providers/douban/urls.py
-allauth/socialaccount/providers/douban/views.py
-allauth/socialaccount/providers/doximity/__init__.py
-allauth/socialaccount/providers/doximity/provider.py
-allauth/socialaccount/providers/doximity/tests.py
-allauth/socialaccount/providers/doximity/urls.py
-allauth/socialaccount/providers/doximity/views.py
-allauth/socialaccount/providers/draugiem/__init__.py
-allauth/socialaccount/providers/draugiem/provider.py
-allauth/socialaccount/providers/draugiem/tests.py
-allauth/socialaccount/providers/draugiem/urls.py
-allauth/socialaccount/providers/draugiem/views.py
-allauth/socialaccount/providers/dropbox/__init__.py
-allauth/socialaccount/providers/dropbox/provider.py
-allauth/socialaccount/providers/dropbox/tests.py
-allauth/socialaccount/providers/dropbox/urls.py
-allauth/socialaccount/providers/dropbox/views.py
-allauth/socialaccount/providers/dwolla/__init__.py
-allauth/socialaccount/providers/dwolla/models.py
-allauth/socialaccount/providers/dwolla/provider.py
-allauth/socialaccount/providers/dwolla/test.py
-allauth/socialaccount/providers/dwolla/urls.py
-allauth/socialaccount/providers/dwolla/views.py
-allauth/socialaccount/providers/edmodo/__init__.py
-allauth/socialaccount/providers/edmodo/provider.py
-allauth/socialaccount/providers/edmodo/tests.py
-allauth/socialaccount/providers/edmodo/urls.py
-allauth/socialaccount/providers/edmodo/views.py
-allauth/socialaccount/providers/eventbrite/__init__.py
-allauth/socialaccount/providers/eventbrite/provider.py
-allauth/socialaccount/providers/eventbrite/tests.py
-allauth/socialaccount/providers/eventbrite/urls.py
-allauth/socialaccount/providers/eventbrite/views.py
-allauth/socialaccount/providers/eveonline/__init__.py
-allauth/socialaccount/providers/eveonline/provider.py
-allauth/socialaccount/providers/eveonline/tests.py
-allauth/socialaccount/providers/eveonline/urls.py
-allauth/socialaccount/providers/eveonline/views.py
-allauth/socialaccount/providers/evernote/__init__.py
-allauth/socialaccount/providers/evernote/provider.py
-allauth/socialaccount/providers/evernote/tests.py
-allauth/socialaccount/providers/evernote/urls.py
-allauth/socialaccount/providers/evernote/views.py
-allauth/socialaccount/providers/exist/__init__.py
-allauth/socialaccount/providers/exist/provider.py
-allauth/socialaccount/providers/exist/tests.py
-allauth/socialaccount/providers/exist/urls.py
-allauth/socialaccount/providers/exist/views.py
-allauth/socialaccount/providers/facebook/__init__.py
-allauth/socialaccount/providers/facebook/forms.py
-allauth/socialaccount/providers/facebook/locale.py
-allauth/socialaccount/providers/facebook/provider.py
-allauth/socialaccount/providers/facebook/tests.py
-allauth/socialaccount/providers/facebook/urls.py
-allauth/socialaccount/providers/facebook/views.py
-allauth/socialaccount/providers/facebook/data/FacebookLocales.xml
-allauth/socialaccount/providers/facebook/static/facebook/js/fbconnect.js
-allauth/socialaccount/providers/facebook/templates/facebook/fbconnect.html
-allauth/socialaccount/providers/feedly/__init__.py
-allauth/socialaccount/providers/feedly/provider.py
-allauth/socialaccount/providers/feedly/tests.py
-allauth/socialaccount/providers/feedly/urls.py
-allauth/socialaccount/providers/feedly/views.py
-allauth/socialaccount/providers/fivehundredpx/__init__.py
-allauth/socialaccount/providers/fivehundredpx/models.py
-allauth/socialaccount/providers/fivehundredpx/provider.py
-allauth/socialaccount/providers/fivehundredpx/tests.py
-allauth/socialaccount/providers/fivehundredpx/urls.py
-allauth/socialaccount/providers/fivehundredpx/views.py
-allauth/socialaccount/providers/flickr/__init__.py
-allauth/socialaccount/providers/flickr/provider.py
-allauth/socialaccount/providers/flickr/tests.py
-allauth/socialaccount/providers/flickr/urls.py
-allauth/socialaccount/providers/flickr/views.py
-allauth/socialaccount/providers/foursquare/__init__.py
-allauth/socialaccount/providers/foursquare/provider.py
-allauth/socialaccount/providers/foursquare/tests.py
-allauth/socialaccount/providers/foursquare/urls.py
-allauth/socialaccount/providers/foursquare/views.py
-allauth/socialaccount/providers/fxa/__init__.py
-allauth/socialaccount/providers/fxa/models.py
-allauth/socialaccount/providers/fxa/provider.py
-allauth/socialaccount/providers/fxa/tests.py
-allauth/socialaccount/providers/fxa/urls.py
-allauth/socialaccount/providers/fxa/views.py
-allauth/socialaccount/providers/github/__init__.py
-allauth/socialaccount/providers/github/provider.py
-allauth/socialaccount/providers/github/tests.py
-allauth/socialaccount/providers/github/urls.py
-allauth/socialaccount/providers/github/views.py
-allauth/socialaccount/providers/gitlab/__init__.py
-allauth/socialaccount/providers/gitlab/provider.py
-allauth/socialaccount/providers/gitlab/tests.py
-allauth/socialaccount/providers/gitlab/urls.py
-allauth/socialaccount/providers/gitlab/views.py
-allauth/socialaccount/providers/globus/__init__.py
-allauth/socialaccount/providers/globus/provider.py
-allauth/socialaccount/providers/globus/tests.py
-allauth/socialaccount/providers/globus/urls.py
-allauth/socialaccount/providers/globus/views.py
-allauth/socialaccount/providers/google/__init__.py
-allauth/socialaccount/providers/google/provider.py
-allauth/socialaccount/providers/google/tests.py
-allauth/socialaccount/providers/google/urls.py
-allauth/socialaccount/providers/google/views.py
-allauth/socialaccount/providers/hubic/__init__.py
-allauth/socialaccount/providers/hubic/provider.py
-allauth/socialaccount/providers/hubic/tests.py
-allauth/socialaccount/providers/hubic/urls.py
-allauth/socialaccount/providers/hubic/views.py
-allauth/socialaccount/providers/instagram/__init__.py
-allauth/socialaccount/providers/instagram/provider.py
-allauth/socialaccount/providers/instagram/tests.py
-allauth/socialaccount/providers/instagram/urls.py
-allauth/socialaccount/providers/instagram/views.py
-allauth/socialaccount/providers/jupyterhub/__init__.py
-allauth/socialaccount/providers/jupyterhub/provider.py
-allauth/socialaccount/providers/jupyterhub/tests.py
-allauth/socialaccount/providers/jupyterhub/urls.py
-allauth/socialaccount/providers/jupyterhub/views.py
-allauth/socialaccount/providers/kakao/__init__.py
-allauth/socialaccount/providers/kakao/models.py
-allauth/socialaccount/providers/kakao/provider.py
-allauth/socialaccount/providers/kakao/tests.py
-allauth/socialaccount/providers/kakao/urls.py
-allauth/socialaccount/providers/kakao/views.py
-allauth/socialaccount/providers/line/__init__.py
-allauth/socialaccount/providers/line/models.py
-allauth/socialaccount/providers/line/provider.py
-allauth/socialaccount/providers/line/tests.py
-allauth/socialaccount/providers/line/urls.py
-allauth/socialaccount/providers/line/views.py
-allauth/socialaccount/providers/linkedin/__init__.py
-allauth/socialaccount/providers/linkedin/provider.py
-allauth/socialaccount/providers/linkedin/tests.py
-allauth/socialaccount/providers/linkedin/urls.py
-allauth/socialaccount/providers/linkedin/views.py
-allauth/socialaccount/providers/linkedin_oauth2/__init__.py
-allauth/socialaccount/providers/linkedin_oauth2/provider.py
-allauth/socialaccount/providers/linkedin_oauth2/tests.py
-allauth/socialaccount/providers/linkedin_oauth2/urls.py
-allauth/socialaccount/providers/linkedin_oauth2/views.py
-allauth/socialaccount/providers/mailchimp/__init__.py
-allauth/socialaccount/providers/mailchimp/provider.py
-allauth/socialaccount/providers/mailchimp/tests.py
-allauth/socialaccount/providers/mailchimp/urls.py
-allauth/socialaccount/providers/mailchimp/views.py
-allauth/socialaccount/providers/mailru/__init__.py
-allauth/socialaccount/providers/mailru/provider.py
-allauth/socialaccount/providers/mailru/tests.py
-allauth/socialaccount/providers/mailru/urls.py
-allauth/socialaccount/providers/mailru/views.py
-allauth/socialaccount/providers/meetup/__init__.py
-allauth/socialaccount/providers/meetup/models.py
-allauth/socialaccount/providers/meetup/provider.py
-allauth/socialaccount/providers/meetup/tests.py
-allauth/socialaccount/providers/meetup/urls.py
-allauth/socialaccount/providers/meetup/views.py
-allauth/socialaccount/providers/microsoft/__init__.py
-allauth/socialaccount/providers/microsoft/models.py
-allauth/socialaccount/providers/microsoft/provider.py
-allauth/socialaccount/providers/microsoft/tests.py
-allauth/socialaccount/providers/microsoft/urls.py
-allauth/socialaccount/providers/microsoft/views.py
-allauth/socialaccount/providers/naver/__init__.py
-allauth/socialaccount/providers/naver/models.py
-allauth/socialaccount/providers/naver/provider.py
-allauth/socialaccount/providers/naver/tests.py
-allauth/socialaccount/providers/naver/urls.py
-allauth/socialaccount/providers/naver/views.py
-allauth/socialaccount/providers/nextcloud/__init__.py
-allauth/socialaccount/providers/nextcloud/provider.py
-allauth/socialaccount/providers/nextcloud/tests.py
-allauth/socialaccount/providers/nextcloud/urls.py
-allauth/socialaccount/providers/nextcloud/views.py
-allauth/socialaccount/providers/oauth/__init__.py
-allauth/socialaccount/providers/oauth/client.py
-allauth/socialaccount/providers/oauth/provider.py
-allauth/socialaccount/providers/oauth/urls.py
-allauth/socialaccount/providers/oauth/views.py
-allauth/socialaccount/providers/oauth2/__init__.py
-allauth/socialaccount/providers/oauth2/client.py
-allauth/socialaccount/providers/oauth2/provider.py
-allauth/socialaccount/providers/oauth2/urls.py
-allauth/socialaccount/providers/oauth2/views.py
-allauth/socialaccount/providers/odnoklassniki/__init__.py
-allauth/socialaccount/providers/odnoklassniki/provider.py
-allauth/socialaccount/providers/odnoklassniki/tests.py
-allauth/socialaccount/providers/odnoklassniki/urls.py
-allauth/socialaccount/providers/odnoklassniki/views.py
-allauth/socialaccount/providers/openid/__init__.py
-allauth/socialaccount/providers/openid/admin.py
-allauth/socialaccount/providers/openid/forms.py
-allauth/socialaccount/providers/openid/models.py
-allauth/socialaccount/providers/openid/provider.py
-allauth/socialaccount/providers/openid/tests.py
-allauth/socialaccount/providers/openid/urls.py
-allauth/socialaccount/providers/openid/utils.py
-allauth/socialaccount/providers/openid/views.py
-allauth/socialaccount/providers/openid/migrations/0001_initial.py
-allauth/socialaccount/providers/openid/migrations/__init__.py
-allauth/socialaccount/providers/openstreetmap/__init__.py
-allauth/socialaccount/providers/openstreetmap/provider.py
-allauth/socialaccount/providers/openstreetmap/tests.py
-allauth/socialaccount/providers/openstreetmap/urls.py
-allauth/socialaccount/providers/openstreetmap/views.py
-allauth/socialaccount/providers/orcid/__init__.py
-allauth/socialaccount/providers/orcid/provider.py
-allauth/socialaccount/providers/orcid/tests.py
-allauth/socialaccount/providers/orcid/urls.py
-allauth/socialaccount/providers/orcid/views.py
-allauth/socialaccount/providers/patreon/__init__.py
-allauth/socialaccount/providers/patreon/models.py
-allauth/socialaccount/providers/patreon/provider.py
-allauth/socialaccount/providers/patreon/test.py
-allauth/socialaccount/providers/patreon/urls.py
-allauth/socialaccount/providers/patreon/views.py
-allauth/socialaccount/providers/paypal/__init__.py
-allauth/socialaccount/providers/paypal/provider.py
-allauth/socialaccount/providers/paypal/tests.py
-allauth/socialaccount/providers/paypal/urls.py
-allauth/socialaccount/providers/paypal/views.py
-allauth/socialaccount/providers/persona/__init__.py
-allauth/socialaccount/providers/persona/models.py
-allauth/socialaccount/providers/persona/provider.py
-allauth/socialaccount/providers/persona/tests.py
-allauth/socialaccount/providers/persona/urls.py
-allauth/socialaccount/providers/persona/views.py
-allauth/socialaccount/providers/persona/templates/persona/auth.html
-allauth/socialaccount/providers/pinterest/__init__.py
-allauth/socialaccount/providers/pinterest/provider.py
-allauth/socialaccount/providers/pinterest/tests.py
-allauth/socialaccount/providers/pinterest/urls.py
-allauth/socialaccount/providers/pinterest/views.py
-allauth/socialaccount/providers/quickbooks/__init__.py
-allauth/socialaccount/providers/quickbooks/models.py
-allauth/socialaccount/providers/quickbooks/provider.py
-allauth/socialaccount/providers/quickbooks/test.py
-allauth/socialaccount/providers/quickbooks/urls.py
-allauth/socialaccount/providers/quickbooks/views.py
-allauth/socialaccount/providers/reddit/__init__.py
-allauth/socialaccount/providers/reddit/provider.py
-allauth/socialaccount/providers/reddit/tests.py
-allauth/socialaccount/providers/reddit/urls.py
-allauth/socialaccount/providers/reddit/views.py
-allauth/socialaccount/providers/robinhood/__init__.py
-allauth/socialaccount/providers/robinhood/provider.py
-allauth/socialaccount/providers/robinhood/tests.py
-allauth/socialaccount/providers/robinhood/urls.py
-allauth/socialaccount/providers/robinhood/views.py
-allauth/socialaccount/providers/salesforce/__init__.py
-allauth/socialaccount/providers/salesforce/provider.py
-allauth/socialaccount/providers/salesforce/tests.py
-allauth/socialaccount/providers/salesforce/urls.py
-allauth/socialaccount/providers/salesforce/views.py
-allauth/socialaccount/providers/sharefile/__init__.py
-allauth/socialaccount/providers/sharefile/provider.py
-allauth/socialaccount/providers/sharefile/tests.py
-allauth/socialaccount/providers/sharefile/urls.py
-allauth/socialaccount/providers/sharefile/views.py
-allauth/socialaccount/providers/shopify/__init__.py
-allauth/socialaccount/providers/shopify/provider.py
-allauth/socialaccount/providers/shopify/tests.py
-allauth/socialaccount/providers/shopify/urls.py
-allauth/socialaccount/providers/shopify/views.py
-allauth/socialaccount/providers/slack/__init__.py
-allauth/socialaccount/providers/slack/models.py
-allauth/socialaccount/providers/slack/provider.py
-allauth/socialaccount/providers/slack/tests.py
-allauth/socialaccount/providers/slack/urls.py
-allauth/socialaccount/providers/slack/views.py
-allauth/socialaccount/providers/soundcloud/__init__.py
-allauth/socialaccount/providers/soundcloud/provider.py
-allauth/socialaccount/providers/soundcloud/tests.py
-allauth/socialaccount/providers/soundcloud/urls.py
-allauth/socialaccount/providers/soundcloud/views.py
-allauth/socialaccount/providers/spotify/__init__.py
-allauth/socialaccount/providers/spotify/provider.py
-allauth/socialaccount/providers/spotify/tests.py
-allauth/socialaccount/providers/spotify/urls.py
-allauth/socialaccount/providers/spotify/views.py
-allauth/socialaccount/providers/stackexchange/__init__.py
-allauth/socialaccount/providers/stackexchange/provider.py
-allauth/socialaccount/providers/stackexchange/tests.py
-allauth/socialaccount/providers/stackexchange/urls.py
-allauth/socialaccount/providers/stackexchange/views.py
-allauth/socialaccount/providers/steam/__init__.py
-allauth/socialaccount/providers/steam/models.py
-allauth/socialaccount/providers/steam/provider.py
-allauth/socialaccount/providers/steam/urls.py
-allauth/socialaccount/providers/steam/views.py
-allauth/socialaccount/providers/strava/__init__.py
-allauth/socialaccount/providers/strava/provider.py
-allauth/socialaccount/providers/strava/tests.py
-allauth/socialaccount/providers/strava/urls.py
-allauth/socialaccount/providers/strava/views.py
-allauth/socialaccount/providers/stripe/__init__.py
-allauth/socialaccount/providers/stripe/provider.py
-allauth/socialaccount/providers/stripe/tests.py
-allauth/socialaccount/providers/stripe/urls.py
-allauth/socialaccount/providers/stripe/views.py
-allauth/socialaccount/providers/telegram/__init__.py
-allauth/socialaccount/providers/telegram/provider.py
-allauth/socialaccount/providers/telegram/urls.py
-allauth/socialaccount/providers/telegram/views.py
-allauth/socialaccount/providers/trello/__init__.py
-allauth/socialaccount/providers/trello/provider.py
-allauth/socialaccount/providers/trello/tests.py
-allauth/socialaccount/providers/trello/urls.py
-allauth/socialaccount/providers/trello/views.py
-allauth/socialaccount/providers/tumblr/__init__.py
-allauth/socialaccount/providers/tumblr/provider.py
-allauth/socialaccount/providers/tumblr/tests.py
-allauth/socialaccount/providers/tumblr/urls.py
-allauth/socialaccount/providers/tumblr/views.py
-allauth/socialaccount/providers/twentythreeandme/__init__.py
-allauth/socialaccount/providers/twentythreeandme/provider.py
-allauth/socialaccount/providers/twentythreeandme/tests.py
-allauth/socialaccount/providers/twentythreeandme/urls.py
-allauth/socialaccount/providers/twentythreeandme/views.py
-allauth/socialaccount/providers/twitch/__init__.py
-allauth/socialaccount/providers/twitch/provider.py
-allauth/socialaccount/providers/twitch/tests.py
-allauth/socialaccount/providers/twitch/urls.py
-allauth/socialaccount/providers/twitch/views.py
-allauth/socialaccount/providers/twitter/__init__.py
-allauth/socialaccount/providers/twitter/provider.py
-allauth/socialaccount/providers/twitter/tests.py
-allauth/socialaccount/providers/twitter/urls.py
-allauth/socialaccount/providers/twitter/views.py
-allauth/socialaccount/providers/untappd/__init__.py
-allauth/socialaccount/providers/untappd/client.py
-allauth/socialaccount/providers/untappd/provider.py
-allauth/socialaccount/providers/untappd/tests.py
-allauth/socialaccount/providers/untappd/urls.py
-allauth/socialaccount/providers/untappd/views.py
-allauth/socialaccount/providers/vimeo/__init__.py
-allauth/socialaccount/providers/vimeo/provider.py
-allauth/socialaccount/providers/vimeo/tests.py
-allauth/socialaccount/providers/vimeo/urls.py
-allauth/socialaccount/providers/vimeo/views.py
-allauth/socialaccount/providers/vimeo_oauth2/__init__.py
-allauth/socialaccount/providers/vimeo_oauth2/models.py
-allauth/socialaccount/providers/vimeo_oauth2/provider.py
-allauth/socialaccount/providers/vimeo_oauth2/test.py
-allauth/socialaccount/providers/vimeo_oauth2/urls.py
-allauth/socialaccount/providers/vimeo_oauth2/views.py
-allauth/socialaccount/providers/vk/__init__.py
-allauth/socialaccount/providers/vk/provider.py
-allauth/socialaccount/providers/vk/tests.py
-allauth/socialaccount/providers/vk/urls.py
-allauth/socialaccount/providers/vk/views.py
-allauth/socialaccount/providers/weibo/__init__.py
-allauth/socialaccount/providers/weibo/provider.py
-allauth/socialaccount/providers/weibo/tests.py
-allauth/socialaccount/providers/weibo/urls.py
-allauth/socialaccount/providers/weibo/views.py
-allauth/socialaccount/providers/weixin/__init__.py
-allauth/socialaccount/providers/weixin/client.py
-allauth/socialaccount/providers/weixin/provider.py
-allauth/socialaccount/providers/weixin/tests.py
-allauth/socialaccount/providers/weixin/urls.py
-allauth/socialaccount/providers/weixin/views.py
-allauth/socialaccount/providers/windowslive/__init__.py
-allauth/socialaccount/providers/windowslive/provider.py
-allauth/socialaccount/providers/windowslive/tests.py
-allauth/socialaccount/providers/windowslive/urls.py
-allauth/socialaccount/providers/windowslive/views.py
-allauth/socialaccount/providers/xing/__init__.py
-allauth/socialaccount/providers/xing/provider.py
-allauth/socialaccount/providers/xing/tests.py
-allauth/socialaccount/providers/xing/urls.py
-allauth/socialaccount/providers/xing/views.py
-allauth/socialaccount/providers/yahoo/__init__.py
-allauth/socialaccount/providers/yahoo/models.py
-allauth/socialaccount/providers/yahoo/provider.py
-allauth/socialaccount/providers/yahoo/tests.py
-allauth/socialaccount/providers/yahoo/urls.py
-allauth/socialaccount/providers/yahoo/views.py
-allauth/socialaccount/providers/ynab/__init__.py
-allauth/socialaccount/providers/ynab/provider.py
-allauth/socialaccount/providers/ynab/tests.py
-allauth/socialaccount/providers/ynab/urls.py
-allauth/socialaccount/providers/ynab/views.py
-allauth/socialaccount/templatetags/__init__.py
-allauth/socialaccount/templatetags/socialaccount.py
-allauth/templates/base.html
-allauth/templates/account/account_inactive.html
-allauth/templates/account/base.html
-allauth/templates/account/email.html
-allauth/templates/account/email_confirm.html
-allauth/templates/account/login.html
-allauth/templates/account/logout.html
-allauth/templates/account/password_change.html
-allauth/templates/account/password_reset.html
-allauth/templates/account/password_reset_done.html
-allauth/templates/account/password_reset_from_key.html
-allauth/templates/account/password_reset_from_key_done.html
-allauth/templates/account/password_set.html
-allauth/templates/account/signup.html
-allauth/templates/account/signup_closed.html
-allauth/templates/account/verification_sent.html
-allauth/templates/account/verified_email_required.html
-allauth/templates/account/email/email_confirmation_message.txt
-allauth/templates/account/email/email_confirmation_signup_message.txt
-allauth/templates/account/email/email_confirmation_signup_subject.txt
-allauth/templates/account/email/email_confirmation_subject.txt
-allauth/templates/account/email/password_reset_key_message.txt
-allauth/templates/account/email/password_reset_key_subject.txt
-allauth/templates/account/messages/cannot_delete_primary_email.txt
-allauth/templates/account/messages/email_confirmation_sent.txt
-allauth/templates/account/messages/email_confirmed.txt
-allauth/templates/account/messages/email_deleted.txt
-allauth/templates/account/messages/logged_in.txt
-allauth/templates/account/messages/logged_out.txt
-allauth/templates/account/messages/password_changed.txt
-allauth/templates/account/messages/password_set.txt
-allauth/templates/account/messages/primary_email_set.txt
-allauth/templates/account/messages/unverified_primary_email.txt
-allauth/templates/account/snippets/already_logged_in.html
-allauth/templates/openid/base.html
-allauth/templates/openid/login.html
-allauth/templates/socialaccount/authentication_error.html
-allauth/templates/socialaccount/base.html
-allauth/templates/socialaccount/connections.html
-allauth/templates/socialaccount/login_cancelled.html
-allauth/templates/socialaccount/signup.html
-allauth/templates/socialaccount/messages/account_connected.txt
-allauth/templates/socialaccount/messages/account_connected_other.txt
-allauth/templates/socialaccount/messages/account_connected_updated.txt
-allauth/templates/socialaccount/messages/account_disconnected.txt
-allauth/templates/socialaccount/snippets/login_extra.html
-allauth/templates/socialaccount/snippets/provider_list.html
-allauth/templates/tests/test_403_csrf.html
-django_allauth.egg-info/PKG-INFO
-django_allauth.egg-info/SOURCES.txt
-django_allauth.egg-info/dependency_links.txt
-django_allauth.egg-info/requires.txt
-django_allauth.egg-info/top_level.txt
-docs/Makefile
-docs/advanced.rst
-docs/conf.py
-docs/configuration.rst
-docs/decorators.rst
-docs/faq.rst
-docs/forms.rst
-docs/index.rst
-docs/installation.rst
-docs/overview.rst
-docs/providers.rst
-docs/release-notes.rst
-docs/signals.rst
-docs/support.rst
-docs/templates.rst
-docs/views.rst
\ No newline at end of file
diff --git a/django_allauth.egg-info/dependency_links.txt b/django_allauth.egg-info/dependency_links.txt
deleted file mode 100644
index 8b137891..00000000
--- a/django_allauth.egg-info/dependency_links.txt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/django_allauth.egg-info/requires.txt b/django_allauth.egg-info/requires.txt
deleted file mode 100644
index 09e2ba3e..00000000
--- a/django_allauth.egg-info/requires.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-Django>=2.0
-python3-openid>=3.0.8
-requests-oauthlib>=0.3.0
-requests
diff --git a/django_allauth.egg-info/top_level.txt b/django_allauth.egg-info/top_level.txt
deleted file mode 100644
index 1dddbbce..00000000
--- a/django_allauth.egg-info/top_level.txt
+++ /dev/null
@@ -1 +0,0 @@
-allauth
diff --git a/docs/advanced.rst b/docs/advanced.rst
index 309057d7..666e688c 100644
--- a/docs/advanced.rst
+++ b/docs/advanced.rst
@@ -80,7 +80,7 @@ instances are created and populated with data
 
 - ``allauth.socialaccount.adapter.DefaultSocialAccountAdapter``:
 
-  - ``is_open_for_signup(self, request)``: The default function
+  - ``is_open_for_signup(self, request, socialaccount)``: The default function
     returns that is the same as ``ACCOUNT_ADAPTER`` in ``settings.py``.
     You can override this method by returning ``True``/``False``
     if you want to enable/disable socialaccount signup.
diff --git a/docs/faq.rst b/docs/faq.rst
index 40fed363..cc1a8f5a 100644
--- a/docs/faq.rst
+++ b/docs/faq.rst
@@ -17,14 +17,12 @@ This information is nice and all, but... I need more!
 
 Here are a few third party resources to help you get started:
 
+- https://dev.to/gajesh/the-complete-django-allauth-guide-la3
 - https://www.youtube.com/watch?v=2QLAc7RJ99s
 - https://speakerdeck.com/tedtieken/signing-up-and-signing-in-users-in-django-with-django-allauth
 - https://stackoverflow.com/questions/tagged/django-allauth
 - http://www.sarahhagstrom.com/2013/09/the-missing-django-allauth-tutorial/
 - https://github.com/aellerton/demo-allauth-bootstrap
-- https://medium.com/@gajeshbhat/django-allauth-setup-and-configuration-tutorial-63417bba339c
-- https://medium.com/@gajeshbhat/extending-and-customizing-django-allauth-eed206623a1a
-- https://medium.com/@gajeshbhat/django-allauth-social-login-tutorial-ad021c24d666
 
 I think I found a security issue... now what?
 *********************************************
diff --git a/docs/installation.rst b/docs/installation.rst
index 448911b4..86336898 100644
--- a/docs/installation.rst
+++ b/docs/installation.rst
@@ -71,6 +71,7 @@ settings.py (Important - Please note 'django.contrib.sites' is required as INSTA
         'allauth.socialaccount.providers.dropbox',
         'allauth.socialaccount.providers.dwolla',
         'allauth.socialaccount.providers.edmodo',
+        'allauth.socialaccount.providers.edx',
         'allauth.socialaccount.providers.eveonline',
         'allauth.socialaccount.providers.evernote',
         'allauth.socialaccount.providers.exist',
@@ -128,6 +129,7 @@ settings.py (Important - Please note 'django.contrib.sites' is required as INSTA
         'allauth.socialaccount.providers.weixin',
         'allauth.socialaccount.providers.windowslive',
         'allauth.socialaccount.providers.xing',
+        'allauth.socialaccount.providers.yandex',
         'allauth.socialaccount.providers.ynab',
         ...
     )
diff --git a/docs/overview.rst b/docs/overview.rst
index 7bd97c27..f6cb973e 100644
--- a/docs/overview.rst
+++ b/docs/overview.rst
@@ -83,6 +83,8 @@ Supported Providers
 
 - Edmodo (OAuth2)
 
+- Edx (open.edx.org) (OAuth2)
+
 - Eve Online (OAuth2)
 
 - Eventbrite (OAuth2)
@@ -197,6 +199,8 @@ Supported Providers
 
 - Yahoo (OAuth2)
 
+- Yandex (OAuth2)
+
 - YNAB (OAuth2)
 
 
diff --git a/docs/providers.rst b/docs/providers.rst
index 261a31f1..5f5d0f1d 100644
--- a/docs/providers.rst
+++ b/docs/providers.rst
@@ -403,6 +403,23 @@ value is set, the Edmodo provider will use ``basic`` by default:
     }
 
 
+Edx
+------
+
+Open Edx OAuth2 documentation
+    https://course-catalog-api-guide.readthedocs.io/en/latest/authentication/
+
+It is necessary to set ``EDX_URL`` to your open edx installation. If no ``EDX_URL``
+value is set, the Edx provider will use ``https://edx.org`` which does not work:
+
+.. code-block:: python
+
+    SOCIALACCOUNT_PROVIDERS = {
+      'edx': {
+          'EDX_URL': "https://openedx.local",
+      }
+    }
+
 Eve Online
 ----------
 
@@ -1684,6 +1701,20 @@ The configuration values come from your API dashboard on Untappd:
 * Secret key: "Client Secret" from Untappd
 * Sites: choose your site
 
+In addition, you should override your user agent to comply with Untappd's API
+rules, and specify something in the format
+``<platform>:<app ID>:<version string>``. Otherwise,
+you will risk additional rate limiting in your application.
+
+.. code-block:: python
+
+    SOCIALACCOUNT_PROVIDERS = {
+        'untappd': {
+            'USER_AGENT': 'django:myappid:1.0',
+        }
+    }
+
+
 
 Telegram
 --------
@@ -1795,6 +1826,21 @@ Yahoo
 Register your OAuth2 app below and enter the resultant client id and secret into admin
     https://developer.yahoo.com/apps/create/
 
+
+Yandex
+------
+
+App registration (get key and secret here)
+    https://oauth.yandex.com/client/new
+
+Development callback URL
+    https://oauth.yandex.com/verification_code
+
+Yandex OAuth app has many different access rights for its services. For the basic access level,
+you just need to a choose "Yandex.Passport API" section and check "Access to email address" and
+"Access to username, first name and surname, gender". Everything else is optional.
+
+
 YNAB
 ------
 
diff --git a/example/README.rst b/example/README.rst
new file mode 100644
index 00000000..b90aefab
--- /dev/null
+++ b/example/README.rst
@@ -0,0 +1,47 @@
+===============================
+Running the example application
+===============================
+
+Assuming you use virtualenv, follow these steps to download and run the
+django-allauth example application in this directory:
+
+::
+
+    $ git clone git://github.com/pennersr/django-allauth.git
+    $ cd django-allauth/example
+    $ virtualenv venv
+    $ . venv/bin/activate
+    $ pip install ..
+
+Now we need to create the database tables and an admin user.
+Run the following and when prompted to create a superuser choose yes and
+follow the instructions:
+
+::
+
+    $ python manage.py migrate
+    $ python manage.py createsuperuser
+
+
+Now you need to run the Django development server:
+
+::
+
+    $ python manage.py runserver
+
+You should then be able to open your browser on http://127.0.0.1:8000 and
+see a page with links to sign in or sign up.
+
+Example Bootstrap templates
+---------------------------
+
+There are templates in the ``templates/bootstrap/allauth/account/`` that can
+be used with Twitter's `Bootstrap <http://twitter.github.com/bootstrap/>`_
+library. To use these templates, in addition to the above commands, you
+will need to
+
+::
+
+    $ pip install django-bootstrap-form
+
+and put ``bootstrapform`` into ``INSTALLED_APPS`` in your ``settings.py`` file.
diff --git a/example/example/__init__.py b/example/example/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/example/example/demo/__init__.py b/example/example/demo/__init__.py
new file mode 100644
index 00000000..50def7f9
--- /dev/null
+++ b/example/example/demo/__init__.py
@@ -0,0 +1 @@
+default_app_config = 'example.demo.apps.DemoConfig'
diff --git a/example/example/demo/apps.py b/example/example/demo/apps.py
new file mode 100644
index 00000000..61b31a0f
--- /dev/null
+++ b/example/example/demo/apps.py
@@ -0,0 +1,42 @@
+from django.apps import AppConfig
+from django.db.models.signals import post_migrate
+from django.utils.translation import gettext_lazy as _
+
+
+def setup_dummy_social_apps(sender, **kwargs):
+    """
+    `allauth` needs tokens for OAuth based providers. So let's
+    setup some dummy tokens
+    """
+    from allauth.socialaccount.providers import registry
+    from allauth.socialaccount.models import SocialApp
+    from allauth.socialaccount.providers.oauth.provider import OAuthProvider
+    from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider
+    from django.contrib.sites.models import Site
+
+    site = Site.objects.get_current()
+    for provider in registry.get_list():
+        if (isinstance(provider, OAuth2Provider)
+                or isinstance(provider, OAuthProvider)):
+            try:
+                SocialApp.objects.get(provider=provider.id,
+                                      sites=site)
+            except SocialApp.DoesNotExist:
+                print("Installing dummy application credentials for %s."
+                      " Authentication via this provider will not work"
+                      " until you configure proper credentials via the"
+                      " Django admin (`SocialApp` models)" % provider.id)
+                app = SocialApp.objects.create(
+                    provider=provider.id,
+                    secret='secret',
+                    client_id='client-id',
+                    name='Dummy %s app' % provider.id)
+                app.sites.add(site)
+
+
+class DemoConfig(AppConfig):
+    name = 'example.demo'
+    verbose_name = _('Demo')
+
+    def ready(self):
+        post_migrate.connect(setup_dummy_social_apps, sender=self)
diff --git a/example/example/demo/models.py b/example/example/demo/models.py
new file mode 100644
index 00000000..e69de29b
diff --git a/example/example/demo/tests.py b/example/example/demo/tests.py
new file mode 100644
index 00000000..501deb77
--- /dev/null
+++ b/example/example/demo/tests.py
@@ -0,0 +1,16 @@
+"""
+This file demonstrates writing tests using the unittest module. These will pass
+when you run "manage.py test".
+
+Replace this with more appropriate tests for your application.
+"""
+
+from django.test import TestCase
+
+
+class SimpleTest(TestCase):
+    def test_basic_addition(self):
+        """
+        Tests that 1 + 1 always equals 2.
+        """
+        self.assertEqual(1 + 1, 2)
diff --git a/example/example/demo/views.py b/example/example/demo/views.py
new file mode 100644
index 00000000..60f00ef0
--- /dev/null
+++ b/example/example/demo/views.py
@@ -0,0 +1 @@
+# Create your views here.
diff --git a/example/example/local_settings.example b/example/example/local_settings.example
new file mode 100644
index 00000000..e133f3bf
--- /dev/null
+++ b/example/example/local_settings.example
@@ -0,0 +1,83 @@
+# django-allauth Configuration variables you might like to change.
+#
+# DO NOT CHANGE THIS FILE. Instead, copy it to local_settings.py
+# and make your changes there.
+
+
+# Specifies the login method to use -- whether the user logs in by entering
+# their username, e-mail address, or either one of both. Possible values
+# are 'username' | 'email' | 'username_email'
+# ACCOUNT_AUTHENTICATION_METHOD
+
+# The URL to redirect to after a successful e-mail confirmation, in case no
+# user is logged in. Default value is settings.LOGIN_URL.
+# ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL
+
+# The URL to redirect to after a successful e-mail confirmation, in case of
+# an authenticated user. Default is settings.LOGIN_REDIRECT_URL
+# ACCOUNT_EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL
+
+# Determines the expiration date of email confirmation mails (# of days).
+# ACCOUNT_EMAIL_CONFIRMATION_EXPIRE_DAYS = 3
+
+# The user is required to hand over an e-mail address when signing up.
+# ACCOUNT_EMAIL_REQUIRED = False
+
+# Determines the e-mail verification method during signup. When set to
+# "mandatory" the user is blocked from logging in until the email
+# address is verified. Choose "optional" or "none" to allow logins
+# with an unverified e-mail address. In case of "optional", the e-mail
+# verification mail is still sent, whereas in case of "none" no e-mail
+# verification mails are sent.
+# ACCOUNT_EMAIL_VERIFICATION = "optional"
+
+# Subject-line prefix to use for email messages sent. By default, the name
+# of the current Site (django.contrib.sites) is used.
+# ACCOUNT_EMAIL_SUBJECT_PREFIX = '[Site] '
+
+# A string pointing to a custom form class
+# (e.g. 'myapp.forms.SignupForm') that is used during signup to ask
+# the user for additional input (e.g. newsletter signup, birth
+# date). This class should implement a `def signup(self, request, user)`
+# method, where user represents the newly signed up user.
+# ACCOUNT_SIGNUP_FORM_CLASS = None
+
+# When signing up, let the user type in their password twice to avoid typ-o's.
+# ACCOUNT_SIGNUP_PASSWORD_VERIFICATION = True
+
+# Enforce uniqueness of e-mail addresses.
+# ACCOUNT_UNIQUE_EMAIL = True
+
+# A callable (or string of the form 'some.module.callable_name') that takes
+# a user as its only argument and returns the display name of the user. The
+# default implementation returns user.username.
+# ACCOUNT_USER_DISPLAY
+
+# An integer specifying the minimum allowed length of a username.
+# ACCOUNT_USERNAME_MIN_LENGTH = 1
+
+# The user is required to enter a username when signing up. Note that the
+# user will be asked to do so even if ACCOUNT_AUTHENTICATION_METHOD is set
+# to email. Set to False when you do not wish to prompt the user to enter a
+# username.
+# ACCOUNT_USERNAME_REQUIRED = True
+
+# render_value parameter as passed to PasswordInput fields.
+# ACCOUNT_PASSWORD_INPUT_RENDER_VALUE = False
+
+# Request e-mail address from 3rd party account provider? E.g. using OpenID
+# AX, or the Facebook 'email' permission.
+# SOCIALACCOUNT_QUERY_EMAIL = ACCOUNT_EMAIL_REQUIRED
+
+# Attempt to bypass the signup form by using fields (e.g. username, email)
+# retrieved from the social account provider. If a conflict arises due to a
+# duplicate e-mail address the signup form will still kick in.
+# SOCIALACCOUNT_AUTO_SIGNUP = True
+
+# Enable support for django-avatar. When enabled, the profile image of the
+# user is copied locally into django-avatar at signup. Default is
+# 'avatar' in settings.INSTALLED_APPS.
+# SOCIALACCOUNT_AVATAR_SUPPORT
+
+# Dictionary containing provider specific settings.
+# SOCIALACCOUNT_PROVIDERS
diff --git a/example/example/locale/nl/LC_MESSAGES/django.mo b/example/example/locale/nl/LC_MESSAGES/django.mo
new file mode 100644
index 00000000..ee9b8fc6
Binary files /dev/null and b/example/example/locale/nl/LC_MESSAGES/django.mo differ
diff --git a/example/example/locale/nl/LC_MESSAGES/django.po b/example/example/locale/nl/LC_MESSAGES/django.po
new file mode 100644
index 00000000..dbaa6aa6
--- /dev/null
+++ b/example/example/locale/nl/LC_MESSAGES/django.po
@@ -0,0 +1,634 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-09-04 20:44+0200\n"
+"PO-Revision-Date: 2012-09-04 20:45+0200\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: templates/bootstrap/allauth/account/base.html:8
+msgid "My Account"
+msgstr "Mijn Account"
+
+#: templates/bootstrap/allauth/account/base.html:12
+#: templates/uniform/allauth/account/email.html:10
+msgid "E-mail Addresses"
+msgstr "E-mail adressen"
+
+#: templates/bootstrap/allauth/account/base.html:15
+#: templates/bootstrap/allauth/account/password_change.html:6
+#: templates/bootstrap/allauth/account/password_change.html:14
+#: templates/bootstrap/allauth/account/password_reset_from_key.html:7
+#: templates/bootstrap/allauth/account/password_reset_from_key.html:10
+#: templates/uniform/allauth/account/password_change.html:5
+#: templates/uniform/allauth/account/password_change.html:8
+#: templates/uniform/allauth/account/password_change.html:15
+#: templates/uniform/allauth/account/password_reset_from_key.html:6
+#: templates/uniform/allauth/account/password_reset_from_key.html:9
+msgid "Change Password"
+msgstr "Wachtwoord wijzigen"
+
+#: templates/bootstrap/allauth/account/base.html:20
+#: templates/bootstrap/allauth/socialaccount/connections.html:5
+msgid "Connected Accounts"
+msgstr "Gekoppelde accounts"
+
+#: templates/bootstrap/allauth/account/email.html:7
+#: templates/bootstrap/allauth/socialaccount/connections.html:34
+#: templates/uniform/allauth/account/email.html:7
+msgid "Account"
+msgstr "Account"
+
+#: templates/bootstrap/allauth/account/email.html:14
+#: templates/uniform/allauth/account/email.html:13
+msgid "The following e-mail addresses are associated to your account:"
+msgstr "De volgende e-mail adressen zijn gekoppeld aan jouw account:"
+
+#: templates/bootstrap/allauth/account/email.html:23
+msgid "E-mail"
+msgstr "E-mail"
+
+#: templates/bootstrap/allauth/account/email.html:26
+msgid "Status"
+msgstr "Status"
+
+#: templates/bootstrap/allauth/account/email.html:41
+#: templates/uniform/allauth/account/email.html:27
+msgid "Verified"
+msgstr "Geverifieerd"
+
+#: templates/bootstrap/allauth/account/email.html:43
+#: templates/uniform/allauth/account/email.html:29
+msgid "Unverified"
+msgstr "Ongeverifieerd"
+
+#: templates/bootstrap/allauth/account/email.html:45
+#: templates/uniform/allauth/account/email.html:31
+msgid "Primary"
+msgstr "Primair"
+
+#: templates/bootstrap/allauth/account/email.html:53
+#: templates/uniform/allauth/account/email.html:37
+msgid "Make Primary"
+msgstr "Maak primair"
+
+#: templates/bootstrap/allauth/account/email.html:54
+#: templates/uniform/allauth/account/email.html:38
+msgid "Re-send Verification"
+msgstr "Stuur verificatie e-mail opnieuw"
+
+#: templates/bootstrap/allauth/account/email.html:55
+#: templates/bootstrap/allauth/socialaccount/connections.html:58
+#: templates/uniform/allauth/account/email.html:39
+msgid "Remove"
+msgstr "Verwijder"
+
+#: templates/bootstrap/allauth/account/email.html:62
+#: templates/uniform/allauth/account/email.html:46
+msgid "Warning:"
+msgstr "Waarschuwing:"
+
+#: templates/bootstrap/allauth/account/email.html:62
+#: templates/uniform/allauth/account/email.html:46
+msgid ""
+"You currently do not have any e-mail address set up. You should really add "
+"an e-mail address so you can receive notifications, reset your password, etc."
+msgstr ""
+"Het is raadzaam een e-mail adres toe te voegen zodat je notificaties kunt "
+"ontvangen, je wachtwoord opnieuw kunt instellen, enz."
+
+#: templates/bootstrap/allauth/account/email.html:67
+#: templates/uniform/allauth/account/email.html:51
+msgid "Add E-mail Address"
+msgstr "Voeg e-mail adres toe"
+
+#: templates/bootstrap/allauth/account/email.html:73
+#: templates/uniform/allauth/account/email.html:58
+msgid "Add E-mail"
+msgstr "E-mail toevoegen"
+
+#: templates/bootstrap/allauth/account/email.html:84
+#: templates/uniform/allauth/account/email.html:70
+msgid "Do you really want to remove the selected e-mail address?"
+msgstr "Wil je het geselecteerde e-mail adres echt verwijderen?"
+
+#: templates/bootstrap/allauth/account/email_confirm.html:7
+#: templates/bootstrap/allauth/account/email_confirm.html:11
+msgid "Confirm E-mail Address"
+msgstr "Bevestig e-mail adres"
+
+#: templates/bootstrap/allauth/account/email_confirm.html:15
+#, python-format
+msgid ""
+"Please confirm that <a href=\"mailto:%(email)s\">%(email)s</a> is an e-mail "
+"address for user %(user_display)s."
+msgstr ""
+"Bevestig dat <a href=\"mailto:%(email)s\">%(email)s</a> een e-mail adres is "
+"voor gebruiker %(user_display)s."
+
+#: templates/bootstrap/allauth/account/email_confirm.html:19
+msgid "Confirm"
+msgstr "Bevestigen"
+
+#: templates/bootstrap/allauth/account/login.html:8
+#: templates/bootstrap/allauth/account/login.html:13
+#: templates/bootstrap/allauth/account/login.html:45
+#: templates/uniform/allauth/account/login.html:8
+#: templates/uniform/allauth/account/login.html:13
+#: templates/uniform/allauth/account/login.html:48
+msgid "Sign In"
+msgstr "Aanmelden"
+
+#: templates/bootstrap/allauth/account/login.html:18
+#: templates/uniform/allauth/account/login.html:18
+#, python-format
+msgid ""
+"Please sign in with one\n"
+"of your existing third party accounts. Or, <a \n"
+"href=\"%(signup_url)s\">sign up</a> for a %(site_name)s account and sign in\n"
+"below:"
+msgstr ""
+"Meld je aan met een van je bestaande externe accounts. Of, <a \n"
+"href=\"%(signup_url)s\">registreer</a> voor een %(site_name)s account en "
+"meld je hiermee aan:"
+
+#: templates/bootstrap/allauth/account/login.html:29
+#: templates/uniform/allauth/account/login.html:29
+msgid "or"
+msgstr "of"
+
+#: templates/bootstrap/allauth/account/login.html:46
+#: templates/uniform/allauth/account/login.html:46
+msgid "Forgot Password?"
+msgstr "Wachtwoord vergeten?"
+
+#: templates/bootstrap/allauth/account/password_reset.html:7
+#: templates/bootstrap/allauth/account/password_reset.html:11
+#: templates/uniform/allauth/account/password_reset.html:7
+#: templates/uniform/allauth/account/password_reset.html:11
+msgid "Password Reset"
+msgstr "Nieuw wachtwoord"
+
+#: templates/bootstrap/allauth/account/password_reset.html:16
+#: templates/uniform/allauth/account/password_reset.html:16
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll send you "
+"an e-mail allowing you to reset it."
+msgstr ""
+"Wachtwoord vergeten? Vul je e-mail adres in en we sturen je een e-mail "
+"waarmee je een nieuw wachtwoord kunt instellen."
+
+#: templates/bootstrap/allauth/account/password_reset.html:22
+#: templates/uniform/allauth/account/password_reset.html:23
+msgid "Reset My Password"
+msgstr "Herstel mijn wachtwoord"
+
+#: templates/bootstrap/allauth/account/password_reset.html:26
+#: templates/uniform/allauth/account/password_reset.html:28
+msgid "Please contact us if you have any trouble resetting your password."
+msgstr "Neem a.u.b. contact met ons op als het niet lukt je wachtwoord opnieuw in te stellen."
+
+#: templates/bootstrap/allauth/account/password_reset_from_key.html:10
+#: templates/uniform/allauth/account/password_reset_from_key.html:9
+msgid "Bad Token"
+msgstr "Ongeldige sleutel"
+
+#: templates/bootstrap/allauth/account/password_reset_from_key.html:14
+#: templates/uniform/allauth/account/password_reset_from_key.html:13
+#, python-format
+msgid ""
+"The password reset link was invalid, possibly because it has already been "
+"used.  Please request a <a href=\"%(passwd_reset_url)s\">new password reset</"
+"a>."
+msgstr ""
+"De link om je wachtwoord opnieuw in te stellen is niet geldig. Mogelijk is "
+"deze al een keer gebruikt. <a href=\"%(passwd_reset_url)s\">Herstel je "
+"wachtwoord</a> opnieuw."
+
+#: templates/bootstrap/allauth/account/password_reset_from_key.html:22
+#: templates/uniform/allauth/account/password_reset_from_key.html:21
+msgid "change password"
+msgstr "Wachtwoord wijzigen"
+
+#: templates/bootstrap/allauth/account/password_reset_from_key.html:26
+#: templates/uniform/allauth/account/password_reset_from_key.html:26
+msgid "Your password is now changed."
+msgstr "Je wachtwoord is gewijzigd."
+
+#: templates/bootstrap/allauth/account/password_set.html:6
+#: templates/bootstrap/allauth/account/password_set.html:14
+#: templates/uniform/allauth/account/password_set.html:6
+#: templates/uniform/allauth/account/password_set.html:9
+#: templates/uniform/allauth/account/password_set.html:16
+msgid "Set Password"
+msgstr "Zet wachtwoord"
+
+#: templates/bootstrap/allauth/account/signup.html:7
+#: templates/bootstrap/allauth/socialaccount/signup.html:6
+#: templates/uniform/allauth/account/signup.html:7
+#: templates/uniform/allauth/socialaccount/signup.html:6
+msgid "Signup"
+msgstr "Registreren"
+
+#: templates/bootstrap/allauth/account/signup.html:10
+#: templates/bootstrap/allauth/account/signup.html:24
+#: templates/bootstrap/allauth/socialaccount/signup.html:9
+#: templates/bootstrap/allauth/socialaccount/signup.html:21
+#: templates/uniform/allauth/account/signup.html:10
+#: templates/uniform/allauth/account/signup.html:25
+#: templates/uniform/allauth/socialaccount/signup.html:9
+#: templates/uniform/allauth/socialaccount/signup.html:22
+msgid "Sign Up"
+msgstr "Registreren"
+
+#: templates/bootstrap/allauth/account/signup.html:15
+#: templates/uniform/allauth/account/signup.html:15
+#, python-format
+msgid ""
+"Already have an account? Then please <a href=\"%(login_url)s\">sign in</a>."
+msgstr "Heb je al een account? <a href=\"%(login_url)s\">Meld je dan aan</a>."
+
+#: templates/bootstrap/allauth/socialaccount/connections.html:11
+#: templates/uniform/allauth/socialaccount/connections.html:11
+msgid ""
+"You can sign in to your account using any of the following third party "
+"accounts:"
+msgstr "Je kunt jezelf aanmelden met een van de volgende externe accounts:"
+
+#: templates/bootstrap/allauth/socialaccount/connections.html:31
+msgid "Provider"
+msgstr "Provider"
+
+#: templates/bootstrap/allauth/socialaccount/connections.html:67
+msgid "None!"
+msgstr "Geen!"
+
+#: templates/bootstrap/allauth/socialaccount/connections.html:67
+msgid ""
+"You currently have no social network accounts connected to this account."
+msgstr "Je hebt momenteel geen externe accounts gekoppeld."
+
+#: templates/bootstrap/allauth/socialaccount/connections.html:71
+#: templates/uniform/allauth/socialaccount/connections.html:46
+msgid "Add a 3rd Party Account"
+msgstr "Voeg een extern account toe"
+
+#: templates/bootstrap/allauth/socialaccount/signup.html:11
+#: templates/uniform/allauth/socialaccount/signup.html:11
+#, python-format
+msgid ""
+"You are about to use your %(provider_name)s account to login to \n"
+"%(site_name)s. As a final step, please complete the following form:"
+msgstr ""
+"Om bij %(site_name)s in te kunnen loggen via %(provider_name)s hebben we de "
+"volgende gegevens nodig:"
+
+#: templates/uniform/allauth/openid/login.html:11
+msgid "OpenID Sign In"
+msgstr "Aanmelden via OpenID"
+
+#: templates/uniform/allauth/socialaccount/connections.html:5
+#: templates/uniform/allauth/socialaccount/connections.html:8
+msgid "Account Connections"
+msgstr "Account Connecties"
+
+#~ msgid ""
+#~ "If you have any trouble resetting your password, contact us at <a href="
+#~ "\"mailto:%(CONTACT_EMAIL)s\">%(CONTACT_EMAIL)s</a>."
+#~ msgstr ""
+#~ "Als je problemen hebt je wachtwoord opnieuw in te stellen, neem dan "
+#~ "contact op met <a href=\"mailto:%(CONTACT_EMAIL)s\">%(CONTACT_EMAIL)s</a>."
+
+#, fuzzy
+#~ msgid "Conntected Accounts"
+#~ msgstr "Gekoppelde accounts"
+
+#~ msgid "Language"
+#~ msgstr "Taal"
+
+#~ msgid "Pinax can be used in your preferred language."
+#~ msgstr "Deze site kan in jouw voorkeurstaal gebruikt worden."
+
+#~ msgid "Change my language"
+#~ msgstr "Verander mijn taal"
+
+#~ msgid "Signed Out"
+#~ msgstr "Afgemeld"
+
+#~ msgid "You have signed out."
+#~ msgstr "Je bent afgemeld."
+
+#~ msgid "Delete Password"
+#~ msgstr "Wis wachtwoord"
+
+#~ msgid ""
+#~ "You may delete your password since you are currently logged in using "
+#~ "OpenID."
+#~ msgstr "Je kunt je wachtwoord wissen omdat je via OpenID bent ingelogd."
+
+#~ msgid "delete my password"
+#~ msgstr "Wis mijn wachtwoord"
+
+#~ msgid "Password Deleted"
+#~ msgstr "Wachtwoord gewist"
+
+#~ msgid "Your password has been deleted."
+#~ msgstr "Je wachtwoord is gewist."
+
+#~ msgid ""
+#~ "We have sent you an e-mail. If you do not receive it within a few "
+#~ "minutes, contact us at <a href=\"mailto:%(CONTACT_EMAIL)s\">"
+#~ "%(CONTACT_EMAIL)s</a>."
+#~ msgstr ""
+#~ "We hebben je een e-mail verstuurd. Als je deze niet binnen enkele minuten "
+#~ "ontvangen hebt, neem dan contact op met <a href=\"mailto:%(CONTACT_EMAIL)s"
+#~ "\">%(CONTACT_EMAIL)s</a>."
+
+#~ msgid ""
+#~ "You're receiving this e-mail because you or someone else has requested a "
+#~ "password for your user account at %(site_domain)s.\n"
+#~ "It can be safely ignored if you did not request a password reset. Click "
+#~ "the link below to reset your password.\n"
+#~ "\n"
+#~ "%(password_reset_url)s\n"
+#~ "\n"
+#~ "In case you forgot, your username is %(username)s.\n"
+#~ "\n"
+#~ "Thanks for using our site!\n"
+#~ msgstr ""
+#~ "Je ontvangt deze mail omdat er een verzoek is ingelegd om het wachtwoord "
+#~ "behorende bij je %(site_domain)s account opnieuw in te stellen. Je kunt "
+#~ "deze gerust mail negeren als je dit niet zelf gedaan hebt. Anders, klik "
+#~ "op de volgende link om je wachtwoord opnieuw in te stellen.\n"
+#~ "\n"
+#~ "%(password_reset_url)s\n"
+#~ "\n"
+#~ "Deze link hoort bij je account met gebruikersnaam %(username)s.\n"
+#~ "\n"
+#~ "Bedankt voor het gebruik van onze site!\n"
+
+#~ msgid "Already have an account?"
+#~ msgstr "Heb je al een account?"
+
+#~ msgid "Sign in"
+#~ msgstr "Aanmelden"
+
+#~ msgid "Timezone"
+#~ msgstr "Tijdzone"
+
+#~ msgid "Verify Your E-mail Address"
+#~ msgstr "Verifieer je e-mail adres"
+
+#~ msgid ""
+#~ "We have sent you an e-mail to <b>%(email)s</b> for verification. Follow "
+#~ "the link provided to finalize the signup process. If you do not receive "
+#~ "it within a few minutes, contact us at <a href=\"mailto:%(CONTACT_EMAIL)s"
+#~ "\">%(CONTACT_EMAIL)s</a>."
+#~ msgstr ""
+#~ "We hebben een e-mail verstuurd aan <b>%(email)s</b> ter verificatie. Volg "
+#~ "de link in deze mail om je registratie af te sluiten. Als je de e-mail "
+#~ "niet binnen enkele minuten ontvangt, neem dan contact op met <a href="
+#~ "\"mailto:%(CONTACT_EMAIL)s\">%(CONTACT_EMAIL)s</a>."
+
+#~ msgid "Note"
+#~ msgstr "Notitie"
+
+#~ msgid "you are already logged in as %(user_display)s."
+#~ msgstr "je bent al ingelogd als %(user_display)s."
+
+#~ msgid "E-mail Address Confirmation"
+#~ msgstr "E-mail adres bevestiging"
+
+#~ msgid "Invalid confirmation key."
+#~ msgstr "Ongeldige bevestigingssleutel."
+
+#~ msgid "Account Inactive"
+#~ msgstr "Account inactief"
+
+#~ msgid "This account is inactive."
+#~ msgstr "Dit account is niet actief"
+
+#~ msgid "Social Network Login Failure"
+#~ msgstr "Aanmelden Mislukt"
+
+#~ msgid ""
+#~ "An error occured while attempting to login via your social network "
+#~ "account."
+#~ msgstr ""
+#~ "Er is een fout opgetreden toen we je wilde inloggen via je externe "
+#~ "account."
+
+#~ msgid "Login Cancelled"
+#~ msgstr "Aanmelden geannuleerd"
+
+#~ msgid ""
+#~ "You decided to cancel logging in to our site using one of your exisiting "
+#~ "accounts. If this was a mistake, please proceed to <a href=\"%(login_url)s"
+#~ "\">sign in</a>."
+#~ msgstr ""
+#~ "Je hebt het aanmelden via een extern account geannuleerd. Als dit een "
+#~ "vergissing was, <a href=\"%(login_url)s\">meld je dan opnieuw aan</a>."
+
+#~ msgid "Password"
+#~ msgstr "Wachtwoord"
+
+#~ msgid "Remember Me"
+#~ msgstr "Onthouden"
+
+#~ msgid "Username"
+#~ msgstr "Gebruikersnaam"
+
+#~ msgid "This account is currently inactive."
+#~ msgstr "Dit account is niet actief"
+
+#~ msgid "The e-mail address and/or password you specified are not correct."
+#~ msgstr "Je e-mail adres en wachtwoord komen niet overeen."
+
+#~ msgid "The username and/or password you specified are not correct."
+#~ msgstr "Je gebruikersnaam en wachtwoord komen niet overeen."
+
+#~ msgid "E-mail (optional)"
+#~ msgstr "E-mail (optioneel)"
+
+#~ msgid "Usernames can only contain letters, numbers and underscores."
+#~ msgstr ""
+#~ "Gebruikersnamen mogen alleen letters, cijfers en liggende streepjes (_) "
+#~ "bevatten."
+
+#~ msgid "This username is already taken. Please choose another."
+#~ msgstr "Deze gebruikersnaam is al in gebruik. Kies a.u.b. een andere naam."
+
+#~ msgid "A user is registered with this e-mail address."
+#~ msgstr "Er is al een gebruiker geregistreerd met dit e-mail adres."
+
+#~ msgid "Password (again)"
+#~ msgstr "Wachtwoord (bevestigen)"
+
+#~ msgid "You must type the same password each time."
+#~ msgstr "Je moet hetzelfde wachtwoord twee keer intoetsen."
+
+#~ msgid "Your e-mail address has already been verified"
+#~ msgstr "Je e-mail adres is al geverifieerd"
+
+#~ msgid "Confirmation e-mail sent to %(email)s"
+#~ msgstr "Bevestigings e-mail verzonden aan %(email)s"
+
+#~ msgid "This e-mail address already associated with this account."
+#~ msgstr "Dit e-mail adres is al geassocieerd met dit account."
+
+#~ msgid "This e-mail address already associated with another account."
+#~ msgstr "Dit e-mail adres is al geassocieerd met een ander account."
+
+#~ msgid "Current Password"
+#~ msgstr "Huidig wachtwoord"
+
+#~ msgid "New Password"
+#~ msgstr "Nieuw wachtwoord"
+
+#~ msgid "New Password (again)"
+#~ msgstr "Nieuw wachtwoord (bevestigen)"
+
+#~ msgid "Please type your current password."
+#~ msgstr "Geef je huidige wachtwoord op."
+
+#~ msgid "The e-mail address is not assigned to any user account"
+#~ msgstr "Dit e-mail adres is niet bij ons bekend"
+
+#~ msgid "Password Reset E-mail"
+#~ msgstr "Nieuw wachtwoord"
+
+#~ msgid "Successfully signed in as %(user)s."
+#~ msgstr "Je bent nu ingelogd als %(user)s."
+
+#~ msgid "Removed e-mail address %(email)s"
+#~ msgstr "E-mail adres %(email)s verwijderd"
+
+#~ msgid "Primary e-mail address set"
+#~ msgstr "Primair e-mail adres ingesteld"
+
+#~ msgid "Password successfully changed."
+#~ msgstr "Wachtwoord wijziging geslaagd."
+
+#~ msgid "Password successfully set."
+#~ msgstr "Je wachtwoord is gewijzigd."
+
+#~ msgid "OpenID"
+#~ msgstr "OpenID"
+
+#~ msgid "Your local account has no password setup."
+#~ msgstr "Je account heeft geen wachtwoord ingesteld."
+
+#~ msgid "Your local account has no verified e-mail address."
+#~ msgstr "Je account heeft geen geverifieerd e-mail adres."
+
+#~ msgid "Invalid response while obtaining request token from \"%s\"."
+#~ msgstr ""
+#~ "Ongeldig antwoord ontvangen tijdens het ophalen van een verzoeksleutel "
+#~ "van \"%s\"."
+
+#~ msgid "Invalid response while obtaining access token from \"%s\"."
+#~ msgstr ""
+#~ "Ongeldig antwoord ontvangen tijdens het ophalen van een toegangssleutel "
+#~ "van \"%s\"."
+
+#~ msgid "No request token saved for \"%s\"."
+#~ msgstr "Geen verzoeksleutel opgeslagen voor \"%s\"."
+
+#~ msgid "No access token saved for \"%s\"."
+#~ msgstr "Geen toegangssleutel opgeslagen voor \"%s\"."
+
+#~ msgid "No access to private resources at \"%s\"."
+#~ msgstr "Geen toegang tot prive data bij \"%s\"."
+
+#~ msgid "The social account has been disconnected"
+#~ msgstr "Het externe account is ontkoppeld"
+
+#, fuzzy
+#~ msgid ""
+#~ "You're receiving this e-mail because you requested a password reset\n"
+#~ "for your user account at Pinax.\n"
+#~ "\n"
+#~ "Your new password is: %(new_password)s\n"
+#~ "\n"
+#~ "Your username, in case you've forgotten: %(username)s\n"
+#~ "\n"
+#~ "You should log in as soon as possible and change your password.\n"
+#~ "\n"
+#~ "Thanks for using our site!\n"
+#~ msgstr ""
+#~ "Je ontvangt deze mail omdat er een verzoek is ingelegd om het wachtwoord\n"
+#~ "behorende bij je %(site_name)s account opnieuw in te stellen.\n"
+#~ "\n"
+#~ "Je nieuwe wachtwoord is: %(new_password)s\n"
+#~ "\n"
+#~ "Je gebruikersnaam, voor het geval je die vergeten bent, is: %(username)s\n"
+#~ "\n"
+#~ "Je moet zo snel mogelijk inloggen en bovenstaand wachtwoord veranderen.\n"
+#~ "\n"
+#~ "Bedankt voor het gebruik van onze site!\n"
+
+#~ msgid "If checked you will stay logged in for 3 weeks"
+#~ msgstr "Bij 'Onthouden' blijf je ingelogd gedurende 3 weken"
+
+#~ msgid "Timezone successfully updated."
+#~ msgstr "Tijdzone gewijzigd."
+
+#~ msgid "Language successfully updated."
+#~ msgstr "Taal gewijzigd."
+
+#~ msgid "E-Mail Addresses"
+#~ msgstr "E-mail adressen"
+
+#~ msgid "add"
+#~ msgstr "Voeg toe"
+
+#~ msgid "Login"
+#~ msgstr "Inloggen"
+
+#~ msgid "Log In"
+#~ msgstr "Inloggen"
+
+#~ msgid "Log in"
+#~ msgstr "Inloggen"
+
+#~ msgid "Logout"
+#~ msgstr "Afmelden"
+
+#~ msgid ""
+#~ "When you receive the new password, you should <a href=\"%(login_url)s"
+#~ "\">log in</a> and change it as soon as possible."
+#~ msgstr ""
+#~ "Zodra je het nieuwe wachtwoord ontvangen hebt moet je zo snel mogelijk <a "
+#~ "href=\"%(login_url)s\">inloggen</a> en het wachtwoord wijzigen."
+
+#~ msgid "You are already logged in."
+#~ msgstr "Je bent al ingelogd."
+
+#~ msgid ""
+#~ "By clicking \"Sign Up\", you are indicating that you have read and agree "
+#~ "to the <a href=\"%(terms_url)s\">Terms of Use</a> and <a href="
+#~ "\"%(privacy_url)s\">Privacy Policy</a>."
+#~ msgstr ""
+#~ "Door te registreren geef je aan dat je de <a href=\"%(terms_url)s"
+#~ "\">gebruiksvoorwaarden</a> en de <a href=\"%(privacy_url)s\">privacy "
+#~ "policy</a> gelezen hebt en ermee akkoord gaat."
+
+#~ msgid ""
+#~ "If you have any trouble creating your account, contact us at <a href="
+#~ "\"mailto:%(contact_email)s\">%(contact_email)s</a>."
+#~ msgstr ""
+#~ "Als je problemen hebt om een account aan te maken, neem dan contact op "
+#~ "met <a href=\"mailto:%(contact_email)s\">%(contact_email)s</a>."
+
+#~ msgid "Log in &raquo;"
+#~ msgstr "Inloggen"
diff --git a/example/example/settings.py b/example/example/settings.py
new file mode 100644
index 00000000..95002954
--- /dev/null
+++ b/example/example/settings.py
@@ -0,0 +1,188 @@
+# Django settings for example project.
+import os
+
+
+PROJECT_ROOT = os.path.normpath(os.path.dirname(os.path.abspath(__file__)))
+
+DEBUG = True
+
+ADMINS = (
+    # ('Your Name', 'your_email@example.com'),
+)
+
+MANAGERS = ADMINS
+
+EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
+
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.sqlite3',  # Add 'postgresql_psycopg2', 'postgresql',
+                                                 # 'mysql', 'sqlite3' or 'oracle'.
+        'NAME': os.path.join(PROJECT_ROOT, 'example.db'),  # Or path to database file if using sqlite3.
+        'USER': '',                      # Not used with sqlite3.
+        'PASSWORD': '',                  # Not used with sqlite3.
+        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
+        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
+    }
+}
+
+# Local time zone for this installation. Choices can be found here:
+# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
+# although not all choices may be available on all operating systems.
+# On Unix systems, a value of None will cause Django to use the same
+# timezone as the operating system.
+# If running in a Windows environment this must be set to the same as your
+# system time zone.
+TIME_ZONE = 'America/Chicago'
+
+# Language code for this installation. All choices can be found here:
+# http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGE_CODE = 'en-us'
+
+SITE_ID = 1
+
+# If you set this to False, Django will make some optimizations so as not
+# to load the internationalization machinery.
+USE_I18N = True
+
+# If you set this to False, Django will not format dates, numbers and
+# calendars according to the current locale
+USE_L10N = True
+
+LOCALE_PATHS = (os.path.join(PROJECT_ROOT, 'locale'), )
+
+
+# Absolute filesystem path to the directory that will hold user-uploaded files.
+# Example: "/home/media/media.lawrence.com/media/"
+MEDIA_ROOT = ''
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash.
+# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
+MEDIA_URL = ''
+
+# Absolute path to the directory static files should be collected to.
+# Don't put anything in this directory yourself; store your static files
+# in apps' "static/" subdirectories and in STATICFILES_DIRS.
+# Example: "/home/media/media.lawrence.com/static/"
+STATIC_ROOT = ''
+
+# URL prefix for static files.
+# Example: "http://media.lawrence.com/static/"
+STATIC_URL = '/static/'
+
+# Additional locations of static files
+STATICFILES_DIRS = (
+    # Put strings here, like "/home/html/static" or "C:/www/django/static".
+    # Always use forward slashes, even on Windows.
+    # Don't forget to use absolute paths, not relative paths.
+)
+
+# List of finder classes that know how to find static files in
+# various locations.
+STATICFILES_FINDERS = (
+    'django.contrib.staticfiles.finders.FileSystemFinder',
+    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
+    # 'django.contrib.staticfiles.finders.DefaultStorageFinder',
+)
+
+# Make this unique, and don't share it with anybody.
+SECRET_KEY = 't8_)kj3v!au0!_i56#gre**mkg0&z1df%3bw(#5^#^5e_64!$_'
+
+# List of callables that know how to import templates from various sources.
+TEMPLATES = [
+    {
+        'BACKEND': 'django.template.backends.django.DjangoTemplates',
+        'DIRS': [
+            # allauth templates: you could copy this directory into your
+            # project and tweak it according to your needs
+            # os.path.join(PROJECT_ROOT, 'templates', 'uniform', 'allauth'),
+            # example project specific templates
+            os.path.join(PROJECT_ROOT, 'templates', 'plain', 'example'),
+        ],
+        'APP_DIRS': True,
+        'OPTIONS': {
+            'context_processors': [
+                'django.template.context_processors.debug',
+                'django.template.context_processors.request',
+                'django.contrib.auth.context_processors.auth',
+                'django.contrib.messages.context_processors.messages',
+            ],
+        },
+    },
+]
+
+MIDDLEWARE = (
+    'django.middleware.common.CommonMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.middleware.csrf.CsrfViewMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'django.contrib.messages.middleware.MessageMiddleware',
+)
+
+AUTHENTICATION_BACKENDS = (
+    "allauth.account.auth_backends.AuthenticationBackend",
+)
+
+ROOT_URLCONF = 'example.urls'
+
+INSTALLED_APPS = (
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.sites',
+    'django.contrib.messages',
+    'django.contrib.staticfiles',
+    'django.contrib.admin',
+
+    'allauth',
+    'allauth.account',
+    'allauth.socialaccount',
+    'allauth.socialaccount.providers.dropbox',
+    'allauth.socialaccount.providers.azure',
+    'allauth.socialaccount.providers.facebook',
+    'allauth.socialaccount.providers.edx',
+    'allauth.socialaccount.providers.evernote',
+    'allauth.socialaccount.providers.google',
+    'allauth.socialaccount.providers.github',
+    'allauth.socialaccount.providers.linkedin',
+    'allauth.socialaccount.providers.openid',
+    'allauth.socialaccount.providers.persona',
+    'allauth.socialaccount.providers.reddit',
+    'allauth.socialaccount.providers.shopify',
+    'allauth.socialaccount.providers.slack',
+    'allauth.socialaccount.providers.soundcloud',
+    'allauth.socialaccount.providers.stackexchange',
+    'allauth.socialaccount.providers.telegram',
+    'allauth.socialaccount.providers.twitch',
+    'allauth.socialaccount.providers.twitter',
+    'allauth.socialaccount.providers.vimeo',
+    'allauth.socialaccount.providers.vimeo_oauth2',
+    'allauth.socialaccount.providers.weibo',
+    'allauth.socialaccount.providers.xing',
+    'example.demo'
+)
+
+
+AUTH_PASSWORD_VALIDATORS = [
+    {
+        'NAME':
+        'django.contrib.auth.password_validation.MinimumLengthValidator',
+        'OPTIONS': {
+            'min_length': 9,
+        }
+    }
+]
+
+
+try:
+    from local_settings import *  # noqa
+except ImportError:
+    pass
+ALLOWED_HOSTS = ['5d825be1.ngrok.io','127.0.0.1']
+
+SOCIALACCOUNT_PROVIDERS = {
+    'edx': {
+        'EDX_URL': "https://draft.navoica.pl",
+    }
+}
diff --git a/example/example/templates/bootstrap/allauth/account/base.html b/example/example/templates/bootstrap/allauth/account/base.html
new file mode 100644
index 00000000..f95d3a58
--- /dev/null
+++ b/example/example/templates/bootstrap/allauth/account/base.html
@@ -0,0 +1,26 @@
+{% extends "base.html" %}
+
+{% load i18n %}
+
+{% block content %}
+
+<h1>{% trans 'My Account' %}</h1>
+
+<ul class="nav nav-tabs">
+  <li class="{% block account_nav_email %}{% endblock %}">
+    <a href="{% url 'account_email' %}">{% trans 'E-mail Addresses' %}</a>
+  </li>
+  <li class="{% block account_nav_change_password %}{% endblock %}">
+    <a href="{% url 'account_change_password' %}">{% trans 'Change Password' %}</a>
+  </li>
+  {% url 'socialaccount_connections' as connections_url %}
+  {% if connections_url %}
+  <li class="{% block account_nav_socialaccount_connections %}{% endblock %}">
+    <a href="{{ connections_url }}">{% trans 'Connected Accounts' %}</a>
+  </li>
+  {% endif %}
+</ul>
+{% block account_content %}
+{% endblock %}
+
+{% endblock %}
diff --git a/example/example/templates/bootstrap/allauth/account/email.html b/example/example/templates/bootstrap/allauth/account/email.html
new file mode 100644
index 00000000..4e1c0d3c
--- /dev/null
+++ b/example/example/templates/bootstrap/allauth/account/email.html
@@ -0,0 +1,89 @@
+{% extends "account/base.html" %}
+
+{% load i18n %}
+{% load bootstrap %}
+
+{% block head_title %}{% trans "Account" %}{% endblock %}
+
+{% block account_nav_email %}active{% endblock %}
+
+{% block account_content %}
+
+{% if user.emailaddress_set.all %}
+<p>{% trans 'The following e-mail addresses are associated to your account:' %}</p>
+
+<form action="{% url 'account_email' %}" class="email_list uniForm" method="post">
+{% csrf_token %}
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>
+	{% trans 'E-mail' %}
+      </th>
+      <th>
+	{% trans 'Status' %}
+      </th>
+    </tr>
+  </thead>
+  <tbody>
+    {% for emailaddress in user.emailaddress_set.all %}
+    <tr>
+      <td>
+        <label class="radio" for="email_radio_{{ forloop.counter }}" class="{% if emailaddress.primary %}primary_email{% endif %}">
+  	<input id="email_radio_{{ forloop.counter }}" type="radio" name="email" {% if emailaddress.primary %}checked="checked"{% endif %} value="{{ emailaddress.email }}"/>
+  	{{ emailaddress.email }}
+        </label>
+      </td>
+      <td>
+        {% if emailaddress.verified %}
+        <span class="label label-info">{% trans "Verified" %}</span>
+        {% else %}
+        <span class="label label-warning">{% trans "Unverified" %}</span>
+        {% endif %}
+        {% if emailaddress.primary %}<span class="label label-success">{% trans "Primary" %}</span>{% endif %}
+      </td>
+    </tr>
+    {% endfor %}
+  </tbody>
+</table>
+
+<div class="form-actions">
+      <button class="btn btn-success" type="submit" name="action_primary" >{% trans 'Make Primary' %}</button>
+      <button class="btn" type="submit" name="action_send" >{% trans 'Re-send Verification' %}</button>
+      <button class="btn btn-danger" type="submit" name="action_remove" >{% trans 'Remove' %}</button>
+</div>
+
+</form>
+
+{% else %}
+<p><strong>{% trans 'Warning:'%}</strong> {% trans "You currently do not have any e-mail address set up. You should really add an e-mail address so you can receive notifications, reset your password, etc." %}</p>
+
+{% endif %}
+
+
+    <h2>{% trans "Add E-mail Address" %}</h2>
+
+    <form method="post" action="">
+        {% csrf_token %}
+        {{ add_email_form|bootstrap }}
+        <div class="form-actions">
+          <button class="btn btn-primary" name="action_add" type="submit">{% trans "Add E-mail" %}</button>
+        </div>
+    </form>
+
+{% endblock %}
+
+
+{% block extra_body %}
+<script type="text/javascript">
+$(function(){
+$("button[name='action_remove']").click(function(){
+if (confirm("{% trans 'Do you really want to remove the selected e-mail address?' %}")) {
+return true;
+}
+return false;
+});
+});
+</script>
+{% endblock %}
diff --git a/example/example/templates/bootstrap/allauth/account/email_confirm.html b/example/example/templates/bootstrap/allauth/account/email_confirm.html
new file mode 100644
index 00000000..e3ea6c9a
--- /dev/null
+++ b/example/example/templates/bootstrap/allauth/account/email_confirm.html
@@ -0,0 +1,31 @@
+{% extends "account/base.html" %}
+
+{% load i18n %}
+{% load account %}
+
+{% block head_title %}{% trans "Confirm E-mail Address" %}{% endblock %}
+
+
+{% block content %}
+<h1>{% trans "Confirm E-mail Address" %}</h1>
+
+{% if confirmation %}
+
+{% user_display confirmation.email_address.user as user_display %}
+
+<p>{% blocktrans with confirmation.email_address.email as email %}Please confirm that <a href="mailto:{{ email }}">{{ email }}</a> is an e-mail address for user {{ user_display }}.{% endblocktrans %}</p>
+
+<form method="post" action="{% url 'account_confirm_email' confirmation.key %}">
+{% csrf_token %}
+    <button class="btn btn-primary" type="submit">{% trans 'Confirm' %}</button>
+</form>
+
+{% else %}
+
+{% url 'account_email' as email_url %}
+
+<p>{% blocktrans %}This e-mail confirmation link expired or is invalid. Please <a href="{{ email_url }}">issue a new e-mail confirmation request</a>.{% endblocktrans %}</p>
+
+{% endif %}
+
+{% endblock %}
diff --git a/example/example/templates/bootstrap/allauth/account/login.html b/example/example/templates/bootstrap/allauth/account/login.html
new file mode 100644
index 00000000..f76c5337
--- /dev/null
+++ b/example/example/templates/bootstrap/allauth/account/login.html
@@ -0,0 +1,48 @@
+{% extends "account/base.html" %}
+
+{% load i18n %}
+{% load bootstrap %}
+{% load account socialaccount %}
+
+{% block head_title %}{% trans "Sign In" %}{% endblock %}
+
+
+{% block content %}
+
+<h1>{% trans "Sign In" %}</h1>
+
+{% get_providers as socialaccount_providers %}
+{% if socialaccount_providers %}
+<p>{% blocktrans with site.name as site_name %}Please sign in with one
+of your existing third party accounts. Or, <a href="{{ signup_url }}">sign up</a>
+for a {{ site_name }} account and sign in
+below:{% endblocktrans %}</p>
+
+<div class="socialaccount_ballot">
+
+  <ul class="socialaccount_providers">
+    {% include "socialaccount/snippets/provider_list.html" with process="login" %}
+  </ul>
+
+  <div class="login-or">{% trans 'or' %}</div>
+
+</div>
+
+{% include "socialaccount/snippets/login_extra.html" %}
+
+{% endif %}
+
+<form class="login" method="POST" action="{% url 'account_login' %}">
+  {% csrf_token %}
+  {{ form|bootstrap }}
+  {% if redirect_field_value %}
+  <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
+  {% endif %}
+  <div class="form-actions">
+    <button class="btn btn-primary" type="submit">{% trans "Sign In" %}</button>
+    <a class="btn" href="{% url 'account_reset_password' %}">{% trans "Forgot Password?" %}</a>
+
+  </div>
+</form>
+
+{% endblock %}
diff --git a/example/example/templates/bootstrap/allauth/account/logout.html b/example/example/templates/bootstrap/allauth/account/logout.html
new file mode 100644
index 00000000..2dcedf5b
--- /dev/null
+++ b/example/example/templates/bootstrap/allauth/account/logout.html
@@ -0,0 +1,21 @@
+{% extends "account/base.html" %}
+
+{% load i18n %}
+
+{% block head_title %}{% trans "Sign Out" %}{% endblock %}
+
+{% block content %}
+<h1>{% trans "Sign Out" %}</h1>
+
+<p>{% trans 'Are you sure you want to sign out?' %}</p>
+
+<form method="post" action="{% url 'account_logout' %}">
+  {% csrf_token %}
+  {% if redirect_field_value %}
+  <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}"/>
+  {% endif %}
+  <button class="btn btn-primary" type="submit">{% trans 'Sign Out' %}</button>
+</form>
+
+
+{% endblock %}
diff --git a/example/example/templates/bootstrap/allauth/account/password_change.html b/example/example/templates/bootstrap/allauth/account/password_change.html
new file mode 100644
index 00000000..cf7902ff
--- /dev/null
+++ b/example/example/templates/bootstrap/allauth/account/password_change.html
@@ -0,0 +1,17 @@
+{% extends "account/base.html" %}
+
+{% load i18n %}
+{% load bootstrap %}
+
+{% block head_title %}{% trans "Change Password" %}{% endblock %}
+{% block account_nav_change_password %}active{% endblock %}
+
+{% block account_content %}
+    <form method="POST" action="" class="password_change">
+        {% csrf_token %}
+        {{ password_change_form|bootstrap }}
+        <div class="form-actions">
+          <button class="btn btn-primary" type="submit" name="action">{% trans "Change Password" %}</button>
+        </div>
+    </form>
+{% endblock %}
diff --git a/example/example/templates/bootstrap/allauth/account/password_reset.html b/example/example/templates/bootstrap/allauth/account/password_reset.html
new file mode 100644
index 00000000..b42a4266
--- /dev/null
+++ b/example/example/templates/bootstrap/allauth/account/password_reset.html
@@ -0,0 +1,33 @@
+{% extends "account/base.html" %}
+
+{% load i18n %}
+{% load bootstrap %}
+{% load account %}
+
+{% block head_title %}{% trans "Password Reset" %}{% endblock %}
+
+{% block content %}
+
+    <h1>{% trans "Password Reset" %}</h1>
+    {% if user.is_authenticated %}
+    {% include "account/snippets/already_logged_in.html" %}
+    {% endif %}
+    
+    <p>{% trans "Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it." %}</p>
+    
+    <form method="POST" action="" >
+        {% csrf_token %}
+        {{ password_reset_form|bootstrap }}
+        <div class="form-actions">
+          <input class="btn btn-primary" type="submit" value="{% trans "Reset My Password" %}" />
+        </div>
+    </form>
+    
+    <p>{% blocktrans %}Please contact us if you have any trouble resetting your password.{% endblocktrans %}</p>
+{% endblock %}
+
+{% block extra_body %}
+    <script>
+        $("#id_email").focus();
+    </script>
+{% endblock %}
diff --git a/example/example/templates/bootstrap/allauth/account/password_reset_from_key.html b/example/example/templates/bootstrap/allauth/account/password_reset_from_key.html
new file mode 100644
index 00000000..f4b7cd5f
--- /dev/null
+++ b/example/example/templates/bootstrap/allauth/account/password_reset_from_key.html
@@ -0,0 +1,29 @@
+{% extends "account/base.html" %}
+
+{% load i18n %}
+{% load bootstrap %}
+
+{% block head_title %}{% trans "Change Password" %}{% endblock %}
+
+{% block content %}
+<h1>{% if token_fail %}{% trans "Bad Token" %}{% else %}{% trans "Change Password" %}{% endif %}</h1>
+
+{% if token_fail %}
+{% url 'account_reset_password' as passwd_reset_url %}
+<p>{% blocktrans %}The password reset link was invalid, possibly because it has already been used.  Please request a <a href="{{ passwd_reset_url }}">new password reset</a>.{% endblocktrans %}</p>
+
+{% else %}
+{% if form %}
+<form method="POST" action="" class="uniForm">
+  {% csrf_token %}
+  {{ form|bootstrap }}
+  <div class="form-actions">
+    <button class="btn btn-primary" type="submit">{% trans "Change Password" %}</button>
+  </div>
+</form>
+{% else %}
+<p>{% trans 'Your password is now changed.' %}</p>
+{% endif %}
+{% endif %}
+
+{% endblock %}
diff --git a/example/example/templates/bootstrap/allauth/account/password_set.html b/example/example/templates/bootstrap/allauth/account/password_set.html
new file mode 100644
index 00000000..0009ab3a
--- /dev/null
+++ b/example/example/templates/bootstrap/allauth/account/password_set.html
@@ -0,0 +1,17 @@
+{% extends "account/base.html" %}
+
+{% load i18n %}
+{% load bootstrap %}
+
+{% block head_title %}{% trans "Set Password" %}{% endblock %}
+{% block account_nav_change_password %}active{% endblock %}
+
+{% block account_content %}
+<form method="POST" action="" class="password_set">
+  {% csrf_token %}
+  {{ password_set_form|bootstrap }}
+  <div class="form-actions">
+    <input class="btn btn-primary" type="submit" name="action" value="{% trans "Set Password" %}"/>
+  </div>
+</form>
+{% endblock %}
diff --git a/example/example/templates/bootstrap/allauth/account/signup.html b/example/example/templates/bootstrap/allauth/account/signup.html
new file mode 100644
index 00000000..38e9c471
--- /dev/null
+++ b/example/example/templates/bootstrap/allauth/account/signup.html
@@ -0,0 +1,24 @@
+{% extends "account/base.html" %}
+
+{% load bootstrap %}
+{% load i18n %}
+
+{% block head_title %}{% trans "Signup" %}{% endblock %}
+
+{% block content %}
+<h1>{% trans "Sign Up" %}</h1>
+
+<p>{% blocktrans %}Already have an account? Then please <a href="{{ login_url }}">sign in</a>.{% endblocktrans %}</p>
+
+<form id="signup_form" method="post" action="{% url 'account_signup' %}">
+  {% csrf_token %}
+  {{ form|bootstrap }}
+  {% if redirect_field_value %}
+  <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
+  {% endif %}
+  <div class="form-actions">
+  <button class="btn btn-primary" type="submit">{% trans "Sign Up" %}</button>
+  </div>
+</form>
+
+{% endblock %}
diff --git a/example/example/templates/bootstrap/allauth/socialaccount/connections.html b/example/example/templates/bootstrap/allauth/socialaccount/connections.html
new file mode 100644
index 00000000..ac3f757e
--- /dev/null
+++ b/example/example/templates/bootstrap/allauth/socialaccount/connections.html
@@ -0,0 +1,79 @@
+{% extends "socialaccount/base.html" %}
+
+{% load i18n %}
+
+{% block head_title %}{% trans "Connected Accounts" %}{% endblock %}
+{% block account_nav_socialaccount_connections  %}active{% endblock %}
+
+{% block account_content %}
+
+{% if form.accounts %}
+<p>{% blocktrans %}You can sign in to your account using any of the following third party accounts:{% endblocktrans %}</p>
+
+
+<form method="post">
+{% csrf_token %}
+
+{% if form.non_field_errors %}
+    <div class="alert alert-error">
+        <a class="close" data-dismiss="alert">&times;</a>
+        {% for non_field_error in form.non_field_errors %}
+             {{ non_field_error }}
+        {% endfor %}
+    </div>
+{% endif %}
+
+
+<table class="table">
+  <thead>
+    <tr>
+      <th>
+	{% trans 'Provider' %}
+      </th>
+      <th>
+	{% trans 'Account' %}
+      </th>
+    </tr>
+  </thead>
+  <tbody>
+{% for base_account in form.accounts %}
+{% with base_account.get_provider_account as account %}
+    <tr>
+      <td>
+<label class="radio" for="id_account_{{base_account.id}}">
+<input id="id_account_{{base_account.id}}" type="radio" name="account" value="{{base_account.id}}"/>
+<span class="socialaccount_provider {{base_account.provider}} {{account.get_brand.id}}">{{account.get_brand.name}}</span>
+</label>
+      </td>
+      <td>
+	{{account}}
+      </td>
+    </tr>
+{% endwith %}
+{% endfor %}
+  </tbody>
+</table>
+
+<div class="form-actions">
+<button class="btn btn-danger" type="submit">{% trans 'Remove' %}</button>
+</div>
+
+</form>
+
+{% else %}
+<div class="alert">
+<strong>{% trans 'None!' %}</strong> {% trans 'You currently have no social network accounts connected to this account.' %}
+</div>
+{% endif %}
+
+<h2>{% trans 'Add a 3rd Party Account' %}</h2>
+
+<ul class="socialaccount_providers">
+{% include "socialaccount/snippets/provider_list.html" with process="connect" %}
+</ul>
+
+{% include "socialaccount/snippets/login_extra.html" %}
+
+{% endblock %}
+
+
diff --git a/example/example/templates/bootstrap/allauth/socialaccount/signup.html b/example/example/templates/bootstrap/allauth/socialaccount/signup.html
new file mode 100644
index 00000000..d2cb953d
--- /dev/null
+++ b/example/example/templates/bootstrap/allauth/socialaccount/signup.html
@@ -0,0 +1,28 @@
+{% extends "socialaccount/base.html" %}
+
+{% load i18n %}
+{% load bootstrap %}
+
+{% block head_title %}{% trans "Signup" %}{% endblock %}
+
+{% block content %}
+    <h1>{% trans "Sign Up" %}</h1>
+
+<p>{% blocktrans with provider_name=account.get_provider.name site_name=site.name %}You are about to use your {{provider_name}} account to login to 
+{{site_name}}. As a final step, please complete the following form:{% endblocktrans %}</p>
+    
+<form class="signup" id="signup_form" method="post" action="">
+  {% csrf_token %}
+  {{ form|bootstrap }}
+  {% if redirect_field_value %}
+  <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
+  {% endif %}
+  <div class="form-actions">
+  <button class="btn btn-primary"  type="submit">{% trans "Sign Up" %}</button>
+  </div>
+</form>
+        
+
+{% endblock %}
+
+
diff --git a/example/example/templates/plain/example/base.html b/example/example/templates/plain/example/base.html
new file mode 100644
index 00000000..6db115a8
--- /dev/null
+++ b/example/example/templates/plain/example/base.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>{% block head_title %}{% endblock %}</title>
+    {% block extra_head %}
+    {% endblock %}
+  </head>
+  <body>
+    {% block body %}
+
+    <em>Important: Authentication via OAuth based providers will not work until you <a href="/admin/socialaccount/socialapp/">setup proper applicaton credentials</a>.</em>
+
+    {% if messages %}
+    <div>
+      <strong>Messages:</strong>
+      <ul>
+	{% for message in messages %}
+	<li>{{message}}</li>
+	{% endfor %}
+      </ul>
+    </div>
+    {% endif %}
+
+    <div>
+      <strong>Menu:</strong>
+      <ul>
+	{% if user.is_authenticated %}
+	<li><a href="{% url 'account_email' %}">Change E-mail</a></li>
+	<li><a href="{% url 'account_logout' %}">Sign Out</a></li>
+	{% else %}
+	<li><a href="{% url 'account_login' %}">Sign In</a></li>
+	<li><a href="{% url 'account_signup' %}">Sign Up</a></li>
+	{% endif %}
+      </ul>
+    </div>
+    {% block content %}
+    {% endblock %}
+    {% endblock %}
+    {% block extra_body %}
+    {% endblock %}
+  </body>
+</html>
diff --git a/example/example/templates/plain/example/index.html b/example/example/templates/plain/example/index.html
new file mode 100644
index 00000000..0dd4d4de
--- /dev/null
+++ b/example/example/templates/plain/example/index.html
@@ -0,0 +1,7 @@
+{% extends "base.html" %}
+
+{% block content %}
+<h1>Example Project</h1>
+
+<p>Welcome</p>
+{% endblock %}
diff --git a/example/example/templates/plain/example/profile.html b/example/example/templates/plain/example/profile.html
new file mode 100644
index 00000000..7b55eae3
--- /dev/null
+++ b/example/example/templates/plain/example/profile.html
@@ -0,0 +1,7 @@
+{% extends "base.html" %}
+
+{% block content %}
+<h1>Profile</h1>
+
+<p>Your profile</p>
+{% endblock %}
diff --git a/example/example/templates/uniform/allauth/account/email.html b/example/example/templates/uniform/allauth/account/email.html
new file mode 100644
index 00000000..39de759c
--- /dev/null
+++ b/example/example/templates/uniform/allauth/account/email.html
@@ -0,0 +1,76 @@
+{% extends "account/base.html" %}
+
+{% load i18n %}
+{% load uni_form_tags %}
+
+{% block head_title %}{% trans "Account" %}{% endblock %}
+
+{% block content %}
+    <h1>{% trans "E-mail Addresses" %}</h1>
+
+{% if user.emailaddress_set.all %}
+<p>{% trans 'The following e-mail addresses are associated to your account:' %}</p>
+
+<form action="{% url 'account_email' %}" class="email_list uniForm" method="post">
+{% csrf_token %}
+<fieldset class="blockLabels">
+
+  {% for emailaddress in user.emailaddress_set.all %}
+<div class="ctrlHolder">
+      <label for="email_radio_{{ forloop.counter }}" class="{% if emailaddress.primary %}primary_email{% endif %}">
+
+      <input id="email_radio_{{ forloop.counter }}" type="radio" name="email" {% if emailaddress.primary %}checked="checked"{% endif %} value="{{ emailaddress.email }}"/>
+
+{{ emailaddress.email }}
+    {% if emailaddress.verified %}
+    <span class="verified">{% trans "Verified" %}</span>
+    {% else %}
+    <span class="unverified">{% trans "Unverified" %}</span>
+    {% endif %}
+      {% if emailaddress.primary %}<span class="primary">{% trans "Primary" %}</span>{% endif %}
+</label>
+</div>
+  {% endfor %}
+
+<div class="buttonHolder">
+      <button class="secondaryAction" type="submit" name="action_primary" >{% trans 'Make Primary' %}</button>
+      <button class="secondaryAction" type="submit" name="action_send" >{% trans 'Re-send Verification' %}</button>
+      <button class="primaryAction" type="submit" name="action_remove" >{% trans 'Remove' %}</button>
+</div>
+
+</fieldset>
+</form>
+
+{% else %}
+<p><strong>{% trans 'Warning:'%}</strong> {% trans "You currently do not have any e-mail address set up. You should really add an e-mail address so you can receive notifications, reset your password, etc." %}</p>
+
+{% endif %}
+
+
+    <h2>{% trans "Add E-mail Address" %}</h2>
+
+    <form method="post" action="" class="add_email uniForm">
+        {% csrf_token %}
+        <fieldset class="inlineLabels">
+            {{ add_email_form|as_uni_form }}
+             <div class = "buttonHolder">
+                 <button name="action_add" type="submit">{% trans "Add E-mail" %}</button>
+            </div>
+        </fieldset>
+    </form>
+
+{% endblock %}
+
+
+{% block extra_body %}
+<script type="text/javascript">
+$(function(){
+$("button[name='action_remove']").click(function(){
+if (confirm("{% trans 'Do you really want to remove the selected e-mail address?' %}")) {
+return true;
+}
+return false;
+});
+});
+</script>
+{% endblock %}
diff --git a/example/example/templates/uniform/allauth/account/login.html b/example/example/templates/uniform/allauth/account/login.html
new file mode 100644
index 00000000..d28c2c41
--- /dev/null
+++ b/example/example/templates/uniform/allauth/account/login.html
@@ -0,0 +1,50 @@
+{% extends "account/base.html" %}
+
+{% load i18n %}
+{% load uni_form_tags %}
+{% load account socialaccount %}
+
+{% block head_title %}{% trans "Sign In" %}{% endblock %}
+
+
+{% block content %}
+
+<h1>{% trans "Sign In" %}</h1>
+
+{% get_providers as socialaccount_providers %}
+{% if socialaccount_providers %}
+<p>{% blocktrans with site.name as site_name %}Please sign in with one
+of your existing third party accounts. Or, <a href="{{ signup_url }}">sign up</a>
+for a {{site_name}} account and sign in
+below:{% endblocktrans %}</p>
+
+<div class="socialaccount_ballot">
+
+  <ul class="socialaccount_providers">
+    {% include "socialaccount/snippets/provider_list.html" with process="login" %}
+  </ul>
+
+  <div class="login-or">{% trans 'or' %}</div>
+
+</div>
+
+{% include "socialaccount/snippets/login_extra.html" %}
+
+{% endif %}
+
+<form class="login uniForm" method="POST" action="{% url 'account_login' %}">
+  {% csrf_token %}
+  <fieldset class="inlineLabels">
+    {{ form|as_uni_form }}
+    {% if redirect_field_value %}
+    <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
+    {% endif %}
+    <div class="buttonHolder">
+      <a class="button secondaryAction" href="{% url 'account_reset_password' %}">{% trans "Forgot Password?" %}</a>
+
+      <button class="primaryAction" type="submit">{% trans "Sign In" %}</button>
+    </div>
+  </fieldset>
+</form>
+
+{% endblock %}
diff --git a/example/example/templates/uniform/allauth/account/password_change.html b/example/example/templates/uniform/allauth/account/password_change.html
new file mode 100644
index 00000000..9f0b1bb1
--- /dev/null
+++ b/example/example/templates/uniform/allauth/account/password_change.html
@@ -0,0 +1,19 @@
+{% extends "account/base.html" %}
+
+{% load i18n %}
+{% load uni_form_tags %}
+{% block head_title %}{% trans "Change Password" %}{% endblock %}
+
+{% block content %}
+    <h1>{% trans "Change Password" %}</h1>
+    
+    <form method="POST" action="" class="password_change uniForm">
+        {% csrf_token %}
+        <fieldset class="inlineLabels">
+            {{ password_change_form|as_uni_form }}
+             <div class = "buttonHolder">
+                 <button type="submit" name="action">{% trans "Change Password" %}</button>
+            </div>
+        </fieldset>
+    </form>
+{% endblock %}
diff --git a/example/example/templates/uniform/allauth/account/password_reset.html b/example/example/templates/uniform/allauth/account/password_reset.html
new file mode 100644
index 00000000..9a08de25
--- /dev/null
+++ b/example/example/templates/uniform/allauth/account/password_reset.html
@@ -0,0 +1,35 @@
+{% extends "account/base.html" %}
+
+{% load i18n %}
+{% load uni_form_tags %}
+{% load account %}
+
+{% block head_title %}{% trans "Password Reset" %}{% endblock %}
+
+{% block content %}
+
+<h1>{% trans "Password Reset" %}</h1>
+{% if user.is_authenticated %}
+{% include "account/snippets/already_logged_in.html" %}
+{% endif %}
+
+<p>{% trans "Forgotten your password? Enter your e-mail address below, and we'll send you an e-mail allowing you to reset it." %}</p>
+
+<form method="POST" action="" class="password_reset uniForm">
+  {% csrf_token %}
+  <fieldset class="inlineLabels">
+    {{ password_reset_form|as_uni_form }}
+    <div class = "buttonHolder">
+      <input type="submit" value="{% trans "Reset My Password" %}" />
+    </div>
+  </fieldset>
+</form>
+
+<p>{% blocktrans %}Please contact us if you have any trouble resetting your password.{% endblocktrans %}</p>
+{% endblock %}
+
+{% block extra_body %}
+<script>
+  $("#id_email").focus();
+</script>
+{% endblock %}
diff --git a/example/example/templates/uniform/allauth/account/password_reset_from_key.html b/example/example/templates/uniform/allauth/account/password_reset_from_key.html
new file mode 100644
index 00000000..a7322afc
--- /dev/null
+++ b/example/example/templates/uniform/allauth/account/password_reset_from_key.html
@@ -0,0 +1,28 @@
+{% extends "account/base.html" %}
+
+{% load i18n %}
+{% load uni_form_tags %}
+{% block head_title %}{% trans "Change Password" %}{% endblock %}
+
+{% block content %}
+    <h1>{% if token_fail %}{% trans "Bad Token" %}{% else %}{% trans "Change Password" %}{% endif %}</h1>
+
+    {% if token_fail %}
+        {% url 'account_reset_password' as passwd_reset_url %}
+        <p>{% blocktrans %}The password reset link was invalid, possibly because it has already been used.  Please request a <a href="{{ passwd_reset_url }}">new password reset</a>.{% endblocktrans %}</p>
+    {% else %}
+        {% if form %}
+            <form method="POST" action="" class="uniForm">
+                {% csrf_token %}
+                <fieldset class="inlineLabels">
+                    {{ form|as_uni_form }}
+                     <div class = "form_block">
+                         <input type="submit" name="action" value="{% trans "change password" %}"/>
+                    </div>
+                </fieldset>
+            </form>
+        {% else %}
+            <p>{% trans 'Your password is now changed.' %}</p>
+        {% endif %}
+    {% endif %}
+{% endblock %}
diff --git a/example/example/templates/uniform/allauth/account/password_set.html b/example/example/templates/uniform/allauth/account/password_set.html
new file mode 100644
index 00000000..23658f78
--- /dev/null
+++ b/example/example/templates/uniform/allauth/account/password_set.html
@@ -0,0 +1,20 @@
+{% extends "account/base.html" %}
+
+{% load i18n %}
+{% load uni_form_tags %}
+
+{% block head_title %}{% trans "Set Password" %}{% endblock %}
+
+{% block content %}
+    <h1>{% trans "Set Password" %}</h1>
+    
+    <form method="POST" action="" class="password_set uniForm">
+        {% csrf_token %}
+        <fieldset class="inlineLabels">
+            {{ password_set_form|as_uni_form }}
+             <div class="buttonHolder">
+                 <input type="submit" name="action" value="{% trans "Set Password" %}"/>
+            </div>
+        </fieldset>
+    </form>
+{% endblock %}
diff --git a/example/example/templates/uniform/allauth/account/signup.html b/example/example/templates/uniform/allauth/account/signup.html
new file mode 100644
index 00000000..c8e27d20
--- /dev/null
+++ b/example/example/templates/uniform/allauth/account/signup.html
@@ -0,0 +1,26 @@
+{% extends "account/base.html" %}
+
+{% load i18n %}
+{% load uni_form_tags %}
+
+{% block head_title %}{% trans "Signup" %}{% endblock %}
+
+{% block content %}
+<h1>{% trans "Sign Up" %}</h1>
+
+<p>{% blocktrans %}Already have an account? Then please <a href="{{ login_url }}">sign in</a>.{% endblocktrans %}</p>
+
+<form class="signup uniForm" id="signup_form" method="post" action="{% url 'account_signup' %}">
+  {% csrf_token %}
+  <fieldset class="inlineLabels">
+    {{ form|as_uni_form }}
+    {% if redirect_field_value %}
+    <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
+    {% endif %}
+    <div class="buttonHolder">
+      <button class="primaryAction" type="submit">{% trans "Sign Up" %} &raquo;</button>
+    </div>
+  </fieldset>
+</form>
+
+{% endblock %}
diff --git a/example/example/templates/uniform/allauth/openid/login.html b/example/example/templates/uniform/allauth/openid/login.html
new file mode 100644
index 00000000..e069dd69
--- /dev/null
+++ b/example/example/templates/uniform/allauth/openid/login.html
@@ -0,0 +1,24 @@
+{% extends "openid/base.html" %}
+
+{% load i18n %}
+{% load uni_form_tags %}
+
+{% block head_title %}OpenID Sign In{% endblock %}
+
+{% block content %}
+
+<h1>{% trans 'OpenID Sign In' %}</h1>
+
+
+<form id="openid_login_form" class="openid_login uniForm" method="post" action="{% url 'openid_login' %}">
+{% csrf_token %}
+<fieldset class="inlineLabels">
+{{ form|as_uni_form }}
+
+<div class="buttonHolder">
+<button type="submit">Sign In</button>
+</div>
+</fieldset>
+</form>
+
+{% endblock %}
diff --git a/example/example/templates/uniform/allauth/socialaccount/connections.html b/example/example/templates/uniform/allauth/socialaccount/connections.html
new file mode 100644
index 00000000..104503b7
--- /dev/null
+++ b/example/example/templates/uniform/allauth/socialaccount/connections.html
@@ -0,0 +1,56 @@
+{% extends "socialaccount/base.html" %}
+
+{% load i18n %}
+
+{% block head_title %}{% trans "Account Connections" %}{% endblock %}
+
+{% block content %}
+<h1>{% trans "Account Connections" %}</h1>
+
+{% if form.accounts %}
+<p>{% blocktrans %}You can sign in to your account using any of the following third party accounts:{% endblocktrans %}</p>
+
+
+<form class="uniForm" method="post">
+{% csrf_token %}
+
+<fieldset class="blockLabels">
+{% if form.non_field_errors %}
+<div id="errorMsg">{{form.non_field_errors}}</div>
+{% endif %}
+
+{% for base_account in form.accounts %}
+{% with base_account.get_provider_account as account %}
+<div class="ctrlHolder">
+<label for="id_account_{{base_account.id}}">
+<input id="id_account_{{base_account.id}}" type="radio" name="account" value="{{base_account.id}}"/>
+<span class="socialaccount_provider {{base_account.provider}} {{account.get_brand.id}}">{{account.get_brand.name}}</span>
+{{account}}
+</label>
+</div>
+{% endwith %}
+{% endfor %}
+
+<div class="buttonHolder">
+<button type="submit">Remove</button>
+</div>
+
+</fieldset>
+
+</form>
+
+{% else %}
+<p>You currently have no social network accounts connected to this account.</p>
+{% endif %}
+
+<h2>{% trans 'Add a 3rd Party Account' %}</h2>
+
+<ul class="socialaccount_providers">
+{% include "socialaccount/snippets/provider_list.html" with process="connect" %}
+</ul>
+
+{% include "socialaccount/snippets/login_extra.html" %}
+
+{% endblock %}
+
+
diff --git a/example/example/templates/uniform/allauth/socialaccount/signup.html b/example/example/templates/uniform/allauth/socialaccount/signup.html
new file mode 100644
index 00000000..af570121
--- /dev/null
+++ b/example/example/templates/uniform/allauth/socialaccount/signup.html
@@ -0,0 +1,30 @@
+{% extends "socialaccount/base.html" %}
+
+{% load i18n %}
+{% load uni_form_tags %}
+
+{% block head_title %}{% trans "Signup" %}{% endblock %}
+
+{% block content %}
+    <h1>{% trans "Sign Up" %}</h1>
+
+<p>{% blocktrans with provider_name=account.get_provider.name site_name=site.name %}You are about to use your {{provider_name}} account to login to 
+{{site_name}}. As a final step, please complete the following form:{% endblocktrans %}</p>
+    
+<form class="signup uniForm" id="signup_form" method="post" action="">
+  {% csrf_token %}
+  <fieldset class="inlineLabels">
+    {{ form|as_uni_form }}
+    {% if redirect_field_value %}
+    <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
+    {% endif %}
+    <div class="buttonHolder">
+      <button class="primaryAction" type="submit">{% trans "Sign Up" %} &raquo;</button>
+    </div>
+  </fieldset>
+</form>
+        
+
+{% endblock %}
+
+
diff --git a/example/example/urls.py b/example/example/urls.py
new file mode 100644
index 00000000..a0826813
--- /dev/null
+++ b/example/example/urls.py
@@ -0,0 +1,13 @@
+from django.urls import include, path
+from django.contrib import admin
+from django.views.generic.base import TemplateView
+
+admin.autodiscover()
+
+urlpatterns = [
+    path('', TemplateView.as_view(template_name='index.html')),
+    path('accounts/', include('allauth.urls')),
+    path('accounts/profile/',
+         TemplateView.as_view(template_name='profile.html')),
+    path('admin/', admin.site.urls),
+]
diff --git a/example/manage.py b/example/manage.py
new file mode 100644
index 00000000..2605e376
--- /dev/null
+++ b/example/manage.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python
+import os
+import sys
+
+if __name__ == "__main__":
+    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "example.settings")
+
+    from django.core.management import execute_from_command_line
+
+    execute_from_command_line(sys.argv)
diff --git a/manage.py b/manage.py
new file mode 100644
index 00000000..6e87d35a
--- /dev/null
+++ b/manage.py
@@ -0,0 +1,6 @@
+#!/usr/bin/env python
+import os
+os.environ['DJANGO_SETTINGS_MODULE'] = 'test_settings'
+from django.core import management
+if __name__ == "__main__":
+    management.execute_from_command_line()
diff --git a/setup.cfg b/setup.cfg
deleted file mode 100644
index 8bfd5a12..00000000
--- a/setup.cfg
+++ /dev/null
@@ -1,4 +0,0 @@
-[egg_info]
-tag_build = 
-tag_date = 0
-
diff --git a/test_settings.py b/test_settings.py
index da51b902..53beebd9 100644
--- a/test_settings.py
+++ b/test_settings.py
@@ -78,6 +78,7 @@ INSTALLED_APPS = (
     'allauth.socialaccount.providers.dropbox',
     'allauth.socialaccount.providers.dwolla',
     'allauth.socialaccount.providers.edmodo',
+    'allauth.socialaccount.providers.edx',
     'allauth.socialaccount.providers.eveonline',
     'allauth.socialaccount.providers.evernote',
     'allauth.socialaccount.providers.eventbrite',
@@ -141,6 +142,7 @@ INSTALLED_APPS = (
     'allauth.socialaccount.providers.windowslive',
     'allauth.socialaccount.providers.xing',
     'allauth.socialaccount.providers.yahoo',
+    'allauth.socialaccount.providers.yandex',
     'allauth.socialaccount.providers.ynab',
 )
 
diff --git a/tox.ini b/tox.ini
new file mode 100644
index 00000000..5a322a23
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,57 @@
+[tox]
+envlist =
+    py{35,36,37}-django20
+    py{35,36,37}-django21
+    py{35,36,37,38}-django22
+    py{36,37,38}-django30
+    py{36,37,38}-djangomaster
+    docs
+    checkqa
+    standardjs
+
+[testenv]
+setenv =
+    PYTHONWARNINGS = all
+deps =
+    coverage
+    py27: mock >= 1.0.1
+    django20: Django==2.0.*
+    django21: Django==2.1.*
+    django22: Django==2.2.*
+    django30: Django==3.0.*
+    djangomaster: https://github.com/django/django/archive/master.tar.gz
+commands =
+    coverage run manage.py test {posargs:allauth}
+    coverage report
+    coverage html
+
+[testenv:docs]
+skip_install = True
+deps =
+    Sphinx
+whitelist_externals = make
+commands =
+    make -C {toxinidir}/docs html
+
+[testenv:checkqa]
+skip_install = True
+ignore_errors = True
+deps =
+    flake8
+    isort
+commands =
+    flake8 {posargs:{toxinidir}/allauth}
+    isort --check-only --skip-glob '*/migrations/*' --recursive --diff {posargs:{toxinidir}/allauth}
+
+[testenv:standardjs]
+skip_install = True
+commands =
+    /usr/bin/env bash -c "mkdir -p {toxinidir}/node_modules"
+    /usr/bin/env npm install standard --no-lockfile --no-progress --non-interactive --silent
+    /usr/bin/env bash -c "find {toxinidir}/allauth -name '*.js' | xargs {toxinidir}/node_modules/.bin/standard"
+
+[coverage:run]
+include = allauth*
+
+[flake8]
+exclude = migrations