diff --git a/Changelog b/Changelog
index 17c795bdc96f63b21e98fb95e362200e2dc4d674..8b2df7fd124ad5d1c18beecd298b1ed91a5661ff 100644
--- a/Changelog
+++ b/Changelog
@@ -1,21 +1,4 @@
-Version 3.9dev3, 2023-09-04
-
-  Enhancements:
-  * Docs: Update documentation (#3728)
-
-  Fixes:
-  * Correct ID and help-text for Daypassword (#3742, #3744)
-
-Version 3.9dev2, 2023-08-29
-
-  Enhancements:
-  * Update translations
-  * Update documentation (#3712, #3728)
-
-  Fixes:
-  * Fix calculation of TOTP values (#3734)
-
-Version 3.9dev1, 2023-07-28
+Version 3.9, 2023-09-12
 
   Features:
   * Tokentype: Application Specific password (#3260, #3585)
@@ -53,6 +36,8 @@ Version 3.9dev1, 2023-07-28
   * Docs: Improve policy mangle documentation (#3565)
   * Docs: Add a detailed plugin guide how to write fully functional plugins (#3650)
   * Docs: Fix description of preferred_client_mode (#3661)
+  * Docs: Update documentation (#3728, #3712, #3728)
+  * Update translations
   * Infrastructure: Add Bandit and GraphQL runs for pull requests
 
   Fixes:
@@ -83,6 +68,8 @@ Version 3.9dev1, 2023-07-28
   * Fixing response data of /auth endpoint to make the handling
     more consistent (#3436)
   * Fix parameter error in Webhook event handler (#3676)
+  * Fix calculation of TOTP values (#3734)
+  * Correct ID and help-text for Daypassword (#3742, #3744)
 
 Version 3.8.1, 2023-02-06
 
diff --git a/doc/conf.py b/doc/conf.py
index 7292966832cc4279e5c4aea8dd13e4974c35eb69..916ea51b17165be30845c84650993c4bc9824834 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -23,7 +23,7 @@ import functools
 # built documents.
 #
 # The short X.Y version.
-version = '3.9dev3'
+version = '3.9'
 # The full version, including alpha/beta/rc tags.
 #release = '2.16dev5'
 release = version
diff --git a/setup.py b/setup.py
index 26ba10d3c38f72e76a90883d93b9b70957b34ba1..05c4e3828fc26ad3799368ac617701830567f1e2 100644
--- a/setup.py
+++ b/setup.py
@@ -5,7 +5,7 @@ import stat
 import sys
 
 #VERSION = "2.1dev4"
-VERSION = "3.9dev3"
+VERSION = "3.9"
 
 # Taken from kennethreitz/requests/setup.py
 package_directory = os.path.realpath(os.path.dirname(__file__))