diff --git a/app/Controllers/Admin/EpisodeController.php b/app/Controllers/Admin/EpisodeController.php
index ab2e21b99cb46f72cb22a732aa9215c59a4fa617..b2f55d18192a8a24d669ef5e6b3291814728be1e 100644
--- a/app/Controllers/Admin/EpisodeController.php
+++ b/app/Controllers/Admin/EpisodeController.php
@@ -22,7 +22,6 @@ use App\Models\SoundbiteModel;
 use CodeIgniter\Exceptions\PageNotFoundException;
 use CodeIgniter\HTTP\RedirectResponse;
 use CodeIgniter\I18n\Time;
-use Config\Database;
 
 class EpisodeController extends BaseController
 {
@@ -192,10 +191,12 @@ class EpisodeController extends BaseController
         }
 
         // update podcast's episode_description_footer_markdown if changed
-        $podcastModel = new PodcastModel();
+        $this->podcast->episode_description_footer_markdown = $this->request->getPost(
+            'description_footer'
+        ) === '' ? null : $this->request->getPost('description_footer');
 
         if ($this->podcast->hasChanged('episode_description_footer_markdown')) {
-            $this->podcast->episode_description_footer_markdown = $this->request->getPost('description_footer');
+            $podcastModel = new PodcastModel();
 
             if (! $podcastModel->update($this->podcast->id, $this->podcast)) {
                 return redirect()
@@ -313,9 +314,14 @@ class EpisodeController extends BaseController
             $this->episode->chapters_file_remote_url = $chaptersFileRemoteUrl;
         }
 
+        $db = db_connect();
+        $db->transStart();
+
         $episodeModel = new EpisodeModel();
 
         if (! $episodeModel->update($this->episode->id, $this->episode)) {
+            $db->transRollback();
+
             return redirect()
                 ->back()
                 ->withInput()
@@ -323,11 +329,15 @@ class EpisodeController extends BaseController
         }
 
         // update podcast's episode_description_footer_markdown if changed
-        $this->podcast->episode_description_footer_markdown = $this->request->getPost('description_footer');
+        $this->podcast->episode_description_footer_markdown = $this->request->getPost(
+            'description_footer'
+        ) === '' ? null : $this->request->getPost('description_footer');
 
         if ($this->podcast->hasChanged('episode_description_footer_markdown')) {
             $podcastModel = new PodcastModel();
             if (! $podcastModel->update($this->podcast->id, $this->podcast)) {
+                $db->transRollback();
+
                 return redirect()
                     ->back()
                     ->withInput()
@@ -335,6 +345,8 @@ class EpisodeController extends BaseController
             }
         }
 
+        $db->transComplete();
+
         return redirect()->route('episode-view', [$this->podcast->id, $this->episode->id]);
     }
 
@@ -407,7 +419,7 @@ class EpisodeController extends BaseController
                 ->with('errors', $this->validator->getErrors());
         }
 
-        $db = Database::connect();
+        $db = db_connect();
         $db->transStart();
 
         $newNote = new Note([
@@ -503,7 +515,7 @@ class EpisodeController extends BaseController
                 ->with('errors', $this->validator->getErrors());
         }
 
-        $db = Database::connect();
+        $db = db_connect();
         $db->transStart();
 
         $publishMethod = $this->request->getPost('publication_method');
@@ -589,7 +601,7 @@ class EpisodeController extends BaseController
                 ->with('errors', $this->validator->getErrors());
         }
 
-        $db = Database::connect();
+        $db = db_connect();
 
         $db->transStart();
 
diff --git a/app/Controllers/Admin/PodcastController.php b/app/Controllers/Admin/PodcastController.php
index 2b294778feba89c68639e119e1ef74be55b12a1b..0fe70a48bbe3d91c67cecaf1619d8f9ac1695d10 100644
--- a/app/Controllers/Admin/PodcastController.php
+++ b/app/Controllers/Admin/PodcastController.php
@@ -19,7 +19,6 @@ use App\Models\LanguageModel;
 use App\Models\PodcastModel;
 use CodeIgniter\Exceptions\PageNotFoundException;
 use CodeIgniter\HTTP\RedirectResponse;
-use Config\Database;
 use Config\Services;
 
 class PodcastController extends BaseController
@@ -226,7 +225,7 @@ class PodcastController extends BaseController
         ]);
 
         $podcastModel = new PodcastModel();
-        $db = Database::connect();
+        $db = db_connect();
 
         $db->transStart();
 
@@ -334,7 +333,7 @@ class PodcastController extends BaseController
         $this->podcast->is_locked = $this->request->getPost('lock') === 'yes';
         $this->podcast->updated_by = (int) user_id();
 
-        $db = Database::connect();
+        $db = db_connect();
         $db->transStart();
 
         $podcastModel = new PodcastModel();
diff --git a/app/Controllers/Admin/PodcastImportController.php b/app/Controllers/Admin/PodcastImportController.php
index 908a1b4d82bee910bdbb9b84652cdb09127dd980..fbc0cca288ae9b10708aad04341145345b313d2b 100644
--- a/app/Controllers/Admin/PodcastImportController.php
+++ b/app/Controllers/Admin/PodcastImportController.php
@@ -23,7 +23,6 @@ use App\Models\PlatformModel;
 use App\Models\PodcastModel;
 use CodeIgniter\Exceptions\PageNotFoundException;
 use CodeIgniter\HTTP\RedirectResponse;
-use Config\Database;
 use Config\Services;
 use ErrorException;
 use League\HTMLToMarkdown\HtmlConverter;
@@ -182,7 +181,7 @@ class PodcastImportController extends BaseController
         }
 
         $podcastModel = new PodcastModel();
-        $db = Database::connect();
+        $db = db_connect();
 
         $db->transStart();
 
diff --git a/app/Controllers/InstallController.php b/app/Controllers/InstallController.php
index 828a6bbd928db1c81c98ac6cafe00e13ba4e2d5f..09bf9044c665d74fd6d743a3d2d75c76e57f5e33 100644
--- a/app/Controllers/InstallController.php
+++ b/app/Controllers/InstallController.php
@@ -303,7 +303,7 @@ class InstallController extends Controller
         // Activate user
         $user->activate();
 
-        $db = Database::connect();
+        $db = db_connect();
 
         $db->transStart();
         if (! ($userId = $userModel->insert($user, true))) {
diff --git a/app/Entities/Podcast.php b/app/Entities/Podcast.php
index ddde24bf0f90a00bf987465a2ce2097a4c1512fc..20dd2840890ec9939e3d17ff404ecf9c87dc972c 100644
--- a/app/Entities/Podcast.php
+++ b/app/Entities/Podcast.php
@@ -299,20 +299,29 @@ class Podcast extends Entity
 
     public function setEpisodeDescriptionFooterMarkdown(?string $episodeDescriptionFooterMarkdown = null): static
     {
-        if ($episodeDescriptionFooterMarkdown) {
-            $converter = new CommonMarkConverter([
-                'html_input' => 'strip',
-                'allow_unsafe_links' => false,
-            ]);
-
+        if ($episodeDescriptionFooterMarkdown === null || $episodeDescriptionFooterMarkdown === '') {
             $this->attributes[
                 'episode_description_footer_markdown'
-            ] = $episodeDescriptionFooterMarkdown;
+            ] = null;
             $this->attributes[
                 'episode_description_footer_html'
-            ] = $converter->convertToHtml($episodeDescriptionFooterMarkdown);
+            ] = null;
+
+            return $this;
         }
 
+        $converter = new CommonMarkConverter([
+            'html_input' => 'strip',
+            'allow_unsafe_links' => false,
+        ]);
+
+        $this->attributes[
+            'episode_description_footer_markdown'
+        ] = $episodeDescriptionFooterMarkdown;
+        $this->attributes[
+            'episode_description_footer_html'
+        ] = $converter->convertToHtml($episodeDescriptionFooterMarkdown);
+
         return $this;
     }
 
diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php
index fd2af8d7c7d34fe556823bd0e06d46116a345e55..eeb24254da1a78cd5396439e84d26a2155e4221e 100644
--- a/app/Helpers/rss_helper.php
+++ b/app/Helpers/rss_helper.php
@@ -386,9 +386,9 @@ if (! function_exists('array_to_rss')) {
                 $childXmlNode = $xmlNode->addChild(
                     $childArrayNode['name'],
                     $childArrayNode['content'] ?? null,
-                    array_key_exists('namespace', $childArrayNode)
-                        ? current($childArrayNode['namespace'])
-                        : null,
+                    $childArrayNode['namespace'] === []
+                        ? null
+                        : current($childArrayNode['namespace'])
                 );
                 if (array_key_exists('attributes', $childArrayNode)) {
                     foreach (
diff --git a/app/Libraries/ActivityPub/Helpers/activitypub_helper.php b/app/Libraries/ActivityPub/Helpers/activitypub_helper.php
index 7902c55680e1595dc36dc7420751e28d96a60e69..697801493aeb52f52c995c86bf05afffe9d8d0dc 100644
--- a/app/Libraries/ActivityPub/Helpers/activitypub_helper.php
+++ b/app/Libraries/ActivityPub/Helpers/activitypub_helper.php
@@ -67,7 +67,7 @@ if (! function_exists('accept_follow')) {
         $acceptActivity->set('actor', $actor->uri)
             ->set('object', $objectId);
 
-        $db = Database::connect();
+        $db = db_connect();
         $db->transStart();
 
         $activityModel = model('ActivityModel');
diff --git a/app/Libraries/Analytics/AnalyticsTrait.php b/app/Libraries/Analytics/AnalyticsTrait.php
index 6aa3cd5d50e6fd3b223ff00b3f9338c6c42ac034..18fa9addd530f09c70879f761a8e4495aea59902 100644
--- a/app/Libraries/Analytics/AnalyticsTrait.php
+++ b/app/Libraries/Analytics/AnalyticsTrait.php
@@ -10,7 +10,6 @@ declare(strict_types=1);
 
 namespace Analytics;
 
-use Config\Database;
 use Config\Services;
 
 trait AnalyticsTrait
@@ -28,7 +27,7 @@ trait AnalyticsTrait
         $session->start();
 
         if (! $session->get('denyListIp')) {
-            $db = Database::connect();
+            $db = db_connect();
 
             $referer = $session->get('referer');
             $domain =
diff --git a/app/Libraries/Analytics/Helpers/analytics_helper.php b/app/Libraries/Analytics/Helpers/analytics_helper.php
index 726e4db7255c8a37e74fe96be155d02580891c9f..789cb4092fff09b9a4aff7aa4ac73a5847106ff2 100644
--- a/app/Libraries/Analytics/Helpers/analytics_helper.php
+++ b/app/Libraries/Analytics/Helpers/analytics_helper.php
@@ -159,7 +159,7 @@ if (! function_exists('set_user_session_player')) {
                 ]);
                 // Add to unknown list
                 try {
-                    $db = Database::connect();
+                    $db = db_connect();
                     $procedureNameAnalyticsUnknownUseragents = $db->prefixTable('analytics_unknown_useragents');
                     $db->query("CALL {$procedureNameAnalyticsUnknownUseragents}(?)", [$userAgent]);
                     // If things go wrong the show must go on and the user must be able to download the file
@@ -321,7 +321,7 @@ if (! function_exists('podcast_hit')) {
 
                 // If more that 1mn was downloaded, that's a hit, we send that to the database:
                 if ($downloadedBytes >= $bytesThreshold) {
-                    $db = Database::connect();
+                    $db = db_connect();
                     $procedureName = $db->prefixTable('analytics_podcasts');
 
                     $age = intdiv(time() - $publicationTime, 86400);