[pim/mimetreeparser] /: Fix ODR by instead assigning new namespaces

Claudio Cambra <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit a6ab2e8ac54e288e1ca30fd96965af6efc0553cd by Claudio Cambra.
Committed on 16/08/2026 at 12:53.
Pushed by clau-cambra into branch 'master'.

Fix ODR by instead assigning new namespaces

Avoids test fail

M  +1    -0    autotests/core/attachmenttest.cpp
M  +5    -4    autotests/core/cryptohelpertest.cpp
M  +7    -7    autotests/core/gpgerrortest.cpp
M  +125  -125  autotests/core/mimetreeparsertest.cpp
M  +1    -1    autotests/core/partmodeltest.cpp
M  +0    -2    src/core/CMakeLists.txt
M  +10   -10   src/core/attachmentmodel.cpp
M  +6    -6    src/core/attachmentmodel.h
M  +2    -2    src/core/bodypartformatter.cpp
M  +1    -1    src/core/bodypartformatter.h
M  +15   -15   src/core/bodypartformatter_impl.cpp
M  +1    -1    src/core/bodypartformatterbasefactory.cpp
M  +2    -2    src/core/bodypartformatterbasefactory.h
M  +1    -1    src/core/bodypartformatterbasefactory_p.h
M  +9    -8    src/core/cryptohelper.cpp
M  +4    -4    src/core/cryptohelper.h
M  +1    -1    src/core/enums.h
M  +1    -1    src/core/htmlutils.cpp
M  +1    -1    src/core/htmlutils.h
M  +3    -3    src/core/messageparser.cpp
M  +1    -1    src/core/messageparser.h
M  +3    -3    src/core/messagepart.cpp
M  +10   -10   src/core/messagepart.h
M  +16   -16   src/core/objecttreeparser.cpp
M  +2    -2    src/core/objecttreeparser.h
M  +1    -1    src/core/partmetadata.h
M  +55   -55   src/core/partmodel.cpp
M  +8    -8    src/core/partmodel.h
M  +1    -1    src/core/urlhandler.h
M  +5    -5    src/core/utils.cpp
M  +1    -1    src/core/utils.h
M  +0    -2    src/widgets/CMakeLists.txt
M  +4    -4    src/widgets/messagecontainerwidget.cpp
M  +1    -1    src/widgets/messagecontainerwidget_p.h
M  +16   -15   src/widgets/messageviewer.cpp
M  +7    -3    src/widgets/messageviewer.h
M  +1    -0    src/widgets/messageviewerbase_p.cpp
M  +1    -1    src/widgets/messageviewerdialog.h
M  +1    -1    src/widgets/messageviewerwindow.h

https://invent.kde.org/pim/mimetreeparser/-/commit/a6ab2e8ac54e288e1ca30fd96965af6efc0553cd

diff --git a/autotests/core/attachmenttest.cpp b/autotests/core/attachmenttest.cpp
index 067196e..f2c3114 100644
--- a/autotests/core/attachmenttest.cpp
+++ b/autotests/core/attachmenttest.cpp
@@ -8,6 +8,7 @@
 #include <QTest>
 
 using namespace MimeTreeParser;
+using namespace MimeTreeParser::Core;
 
 class AttachmentTest : public QObject
 {
diff --git a/autotests/core/cryptohelpertest.cpp b/autotests/core/cryptohelpertest.cpp
index 050ed37..595e1c9 100644
--- a/autotests/core/cryptohelpertest.cpp
+++ b/autotests/core/cryptohelpertest.cpp
@@ -10,6 +10,7 @@
 #include <QTest>
 
 using namespace MimeTreeParser;
+using namespace MimeTreeParser::Core;
 using namespace Qt::Literals::StringLiterals;
 
 static QByteArray readMailFromFile(const QString &mailFile)
@@ -204,7 +205,7 @@ void CryptoHelperTest::testDecryptInlineMessage()
                         "asdasd asd asd asdf sadf sdaf sadf \xF6\xE4\xFC\nNot signed.\n"));
 }
 
-static bool hasEncryptedContents(QSharedPointer<MimeTreeParser::MessagePart> part)
+static bool hasEncryptedContents(QSharedPointer<MimeTreeParser::Core::MessagePart> part)
 {
     const auto subparts = part->subParts();
     for (const auto &subpart : subparts) {
@@ -212,7 +213,7 @@ static bool hasEncryptedContents(QSharedPointer<MimeTreeParser::MessagePart> par
             return true;
         }
     }
-    return part.dynamicCast<MimeTreeParser::EncryptedMessagePart>().get();
+    return part.dynamicCast<MimeTreeParser::Core::EncryptedMessagePart>().get();
 }
 
 void CryptoHelperTest::testSaveDecrypted_data()
@@ -236,7 +237,7 @@ void CryptoHelperTest::testSaveDecrypted()
     QFETCH(bool, hasInlinePGPBlocks);
     const auto originalMessage = MimeTreeParser::Core::FileOpener::openFile(QLatin1StringView(MAIL_DATA_DIR) + u'/' + mailFile).value(0);
 
-    MimeTreeParser::ObjectTreeParser originalOtp;
+    MimeTreeParser::Core::ObjectTreeParser originalOtp;
     originalOtp.parseObjectTree(originalMessage.get());
     originalOtp.decryptAndVerify();
     const auto originalContents = originalOtp.collectContentParts();
@@ -245,7 +246,7 @@ void CryptoHelperTest::testSaveDecrypted()
     MessagePart::Error error = MessagePart::NoError;
     const auto decryptedMessage = CryptoUtils::decryptMessage(originalMessage, wasEncrypted, error);
 
-    MimeTreeParser::ObjectTreeParser decryptedOtp;
+    MimeTreeParser::Core::ObjectTreeParser decryptedOtp;
     decryptedOtp.parseObjectTree(decryptedMessage.get());
     decryptedOtp.decryptAndVerify(); // we still need to verify signatures
     QVERIFY(!hasEncryptedContents(decryptedOtp.parsedPart()));
diff --git a/autotests/core/gpgerrortest.cpp b/autotests/core/gpgerrortest.cpp
index 6f932ca..c58f051 100644
--- a/autotests/core/gpgerrortest.cpp
+++ b/autotests/core/gpgerrortest.cpp
@@ -42,7 +42,7 @@ private Q_SLOTS:
     {
         setEnv("GNUPGHOME", GNUPGHOME);
 
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile(QStringLiteral("openpgp-inline-charset-encrypted.mbox")));
         otp.print();
         otp.decryptAndVerify();
@@ -55,7 +55,7 @@ private Q_SLOTS:
         QVERIFY(part->text().startsWith(QStringLiteral("asdasd")));
         QCOMPARE(part->encryptions().size(), 1);
         auto enc = part->encryptions()[0];
-        QCOMPARE(enc->error(), MimeTreeParser::MessagePart::NoError);
+        QCOMPARE(enc->error(), MimeTreeParser::Core::MessagePart::NoError);
         // QCOMPARE((int) enc->recipients().size(), 2);
     }
 
@@ -75,20 +75,20 @@ private Q_SLOTS:
         setEnv("PATH", "/nonexististing");
         setGpgMEfname("/nonexisting/gpg", "");
 
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile(mailFileName));
         otp.print();
         otp.decryptAndVerify();
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
 
         QCOMPARE(part->encryptions().size(), 1);
         QVERIFY(part->text().isEmpty());
         auto enc = part->encryptions()[0];
-        QCOMPARE(enc->error(), MimeTreeParser::MessagePart::NoKeyError);
+        QCOMPARE(enc->error(), MimeTreeParser::Core::MessagePart::NoKeyError);
     }
 
     void testGpgIncorrectGPGHOME_data()
@@ -105,14 +105,14 @@ private Q_SLOTS:
         QFETCH(QString, mailFileName);
         setEnv("GNUPGHOME", QByteArray(GNUPGHOME) + QByteArray("noexist"));
 
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile(mailFileName));
         otp.print();
         otp.decryptAndVerify();
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
 
         QCOMPARE(part->encryptions().size(), 1);
diff --git a/autotests/core/mimetreeparsertest.cpp b/autotests/core/mimetreeparsertest.cpp
index 436d98d..79971e3 100644
--- a/autotests/core/mimetreeparsertest.cpp
+++ b/autotests/core/mimetreeparsertest.cpp
@@ -30,11 +30,11 @@ private Q_SLOTS:
             u"If you can see this text it means that your email client couldn't display our newsletter properly.\nPlease visit this link to view the "
             u"newsletter "
             "on our website: http://www.gog.com/newsletter/"_s;
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("plaintext.mbox"_L1));
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QCOMPARE(part->text(), expectedText);
         QCOMPARE(part->charset(), u"utf-8"_s.toLocal8Bit());
 
@@ -49,7 +49,7 @@ private Q_SLOTS:
 
     void testAlternative()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("alternative.mbox"_L1));
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
@@ -68,12 +68,12 @@ private Q_SLOTS:
     void testTextHtml()
     {
         auto expectedText = u"<html><body><p><span>HTML</span> text</p></body></html>"_s;
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("html.mbox"_L1));
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::HtmlMessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::HtmlMessagePart>();
         QVERIFY(bool(part));
         QCOMPARE(part->htmlContent(), expectedText);
         QCOMPARE(part->charset(), u"windows-1252"_s.toLocal8Bit());
@@ -88,14 +88,14 @@ private Q_SLOTS:
 
     void testSMimeEncrypted()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("smime-encrypted.mbox"_L1));
         otp.print();
         otp.decryptAndVerify();
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
         QCOMPARE(part->text(), u"The quick brown fox jumped over the lazy dog."_s);
         QCOMPARE(part->charset(), u"us-ascii"_s.toLocal8Bit());
@@ -107,47 +107,47 @@ private Q_SLOTS:
 
     void testOpenPGPEncryptedAttachment()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox"_L1));
         otp.print();
         otp.decryptAndVerify();
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
         QCOMPARE(part->text(), u"test text"_s);
         QCOMPARE(part->charset(), u"us-ascii"_s.toLocal8Bit());
         QCOMPARE(part->encryptions().size(), 1);
         QCOMPARE(part->signatures().size(), 1);
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgFullyEncrypted);
-        QCOMPARE(part->signatureState(), MimeTreeParser::KMMsgFullySigned);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgFullyEncrypted);
+        QCOMPARE(part->signatureState(), MimeTreeParser::Core::KMMsgFullySigned);
         auto contentAttachmentList = otp.collectAttachmentParts();
         QCOMPARE(contentAttachmentList.size(), 2);
         //     QCOMPARE(contentAttachmentList[0]->availableContents(), QList<QByteArray>() << "text/plain");
         // QCOMPARE(contentAttachmentList[0]->content().size(), 1);
         QCOMPARE(contentAttachmentList[0]->encryptions().size(), 1);
         QCOMPARE(contentAttachmentList[0]->signatures().size(), 1);
-        QCOMPARE(contentAttachmentList[0]->encryptionState(), MimeTreeParser::KMMsgFullyEncrypted);
-        QCOMPARE(contentAttachmentList[0]->signatureState(), MimeTreeParser::KMMsgFullySigned);
+        QCOMPARE(contentAttachmentList[0]->encryptionState(), MimeTreeParser::Core::KMMsgFullyEncrypted);
+        QCOMPARE(contentAttachmentList[0]->signatureState(), MimeTreeParser::Core::KMMsgFullySigned);
         //     QCOMPARE(contentAttachmentList[1]->availableContents(), QList<QByteArray>() << "image/png");
         //     QCOMPARE(contentAttachmentList[1]->content().size(), 1);
         QCOMPARE(contentAttachmentList[1]->encryptions().size(), 0);
         QCOMPARE(contentAttachmentList[1]->signatures().size(), 0);
-        QCOMPARE(contentAttachmentList[1]->encryptionState(), MimeTreeParser::KMMsgNotEncrypted);
-        QCOMPARE(contentAttachmentList[1]->signatureState(), MimeTreeParser::KMMsgNotSigned);
+        QCOMPARE(contentAttachmentList[1]->encryptionState(), MimeTreeParser::Core::KMMsgNotEncrypted);
+        QCOMPARE(contentAttachmentList[1]->signatureState(), MimeTreeParser::Core::KMMsgNotSigned);
     }
 
     void testOpenPGPInline()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("openpgp-inline-charset-encrypted.mbox"_L1));
         otp.print();
         otp.decryptAndVerify();
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
         QCOMPARE(part->charset(), u"ISO-8859-15"_s.toLocal8Bit());
         QCOMPARE(part->text(), QString::fromUtf8("asdasd asd asd asdf sadf sdaf sadf öäü"));
@@ -159,7 +159,7 @@ private Q_SLOTS:
 
     void testMultipartAlternativeOpenPGPInline()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("multipart-mixed-alternative-inline-pgp.mbox"_L1));
         otp.print();
         otp.decryptAndVerify();
@@ -168,25 +168,25 @@ private Q_SLOTS:
         QCOMPARE(partList.size(), 3);
         auto part = partList[0];
         QVERIFY(bool(part));
-        QCOMPARE(part->parentPart()->encryptionState(), MimeTreeParser::KMMsgNotEncrypted);
+        QCOMPARE(part->parentPart()->encryptionState(), MimeTreeParser::Core::KMMsgNotEncrypted);
         QVERIFY(part->text().contains(u"Some text before PGP block"));
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgNotEncrypted);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgNotEncrypted);
         QCOMPARE(part->encryptions().size(), 0);
         part = partList[1];
         QVERIFY(bool(part));
         QVERIFY(part->text().contains(u"encrypted message text"));
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgFullyEncrypted);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgFullyEncrypted);
         QCOMPARE(part->encryptions().size(), 1);
         part = partList[2];
         QVERIFY(bool(part));
         QVERIFY(part->text().contains(u"Some text after PGP block"));
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgNotEncrypted);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgNotEncrypted);
         QCOMPARE(part->encryptions().size(), 0);
     }
 
     void testOpenPPGInlineWithNonEncText()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("openpgp-inline-encrypted+nonenc.mbox"_L1));
         otp.print();
         otp.decryptAndVerify();
@@ -196,46 +196,46 @@ private Q_SLOTS:
         auto part = partList[0];
         QVERIFY(bool(part));
         QCOMPARE(part->text().trimmed(), u"Not encrypted not signed :("_s);
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgNotEncrypted);
-        QCOMPARE(part->signatureState(), MimeTreeParser::KMMsgNotSigned);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgNotEncrypted);
+        QCOMPARE(part->signatureState(), MimeTreeParser::Core::KMMsgNotSigned);
 
         part = partList[1];
         QVERIFY(bool(part));
         QCOMPARE(part->text().trimmed(), u"some random text"_s);
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgFullyEncrypted);
-        QCOMPARE(part->signatureState(), MimeTreeParser::KMMsgNotSigned);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgFullyEncrypted);
+        QCOMPARE(part->signatureState(), MimeTreeParser::Core::KMMsgNotSigned);
 
         part = partList[2];
         QVERIFY(bool(part));
         QCOMPARE(part->text().trimmed(), u"A signed part follows, but this text here is not signed, at all."_s);
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgNotEncrypted);
-        QCOMPARE(part->signatureState(), MimeTreeParser::KMMsgNotSigned);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgNotEncrypted);
+        QCOMPARE(part->signatureState(), MimeTreeParser::Core::KMMsgNotSigned);
 
         part = partList[3];
         QVERIFY(bool(part));
         QCOMPARE(part->text().trimmed(), u"asdasd asd asd asdf sadf sdaf sadf öäü"_s);
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgFullyEncrypted);
-        QCOMPARE(part->signatureState(), MimeTreeParser::KMMsgFullySigned);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgFullyEncrypted);
+        QCOMPARE(part->signatureState(), MimeTreeParser::Core::KMMsgFullySigned);
 
         part = partList[4];
         QVERIFY(bool(part));
         QCOMPARE(part->text().trimmed(), u"Not signed."_s);
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgNotEncrypted);
-        QCOMPARE(part->signatureState(), MimeTreeParser::KMMsgNotSigned);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgNotEncrypted);
+        QCOMPARE(part->signatureState(), MimeTreeParser::Core::KMMsgNotSigned);
 
         QCOMPARE(otp.collectAttachmentParts().size(), 0);
     }
 
     void testEncryptionBlock()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox"_L1));
         otp.print();
         otp.decryptAndVerify();
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part1 = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part1 = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part1));
         QCOMPARE(part1->encryptions().size(), 1);
         //     auto enc = contentList[0]->encryptions()[0];
@@ -264,14 +264,14 @@ private Q_SLOTS:
 
     void testSignatureBlock()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("openpgp-encrypted-attachment-and-non-encrypted-attachment.mbox"_L1));
         otp.print();
         otp.decryptAndVerify();
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
 
         // QCOMPARE(contentList[0]->signatures().size(), 1);
@@ -289,12 +289,12 @@ private Q_SLOTS:
 
     void testRelatedAlternative()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("cid-links.mbox"_L1));
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
         QCOMPARE(part->encryptions().size(), 0);
         QCOMPARE(part->signatures().size(), 0);
@@ -303,12 +303,12 @@ private Q_SLOTS:
 
     void testAttachmentPart()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("attachment.mbox"_L1));
         otp.print();
         auto partList = otp.collectAttachmentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
         QCOMPARE(part->mimeType(), "image/jpeg");
         QCOMPARE(part->filename(), u"aqnaozisxya.jpeg"_s);
@@ -316,12 +316,12 @@ private Q_SLOTS:
 
     void testAttachment2Part()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("attachment2.mbox"_L1));
         otp.print();
         auto partList = otp.collectAttachmentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
         QCOMPARE(part->mimeType(), "image/jpeg");
         QCOMPARE(part->filename(), u"aqnaozisxya.jpeg"_s);
@@ -329,7 +329,7 @@ private Q_SLOTS:
 
     void testCidLink()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("cid-links.mbox"_L1));
         otp.print();
         auto partList = otp.collectContentParts();
@@ -342,7 +342,7 @@ private Q_SLOTS:
 
     void testCidLinkInForwardedInline()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("cid-links-forwarded-inline.mbox"_L1));
         otp.print();
         auto partList = otp.collectContentParts();
@@ -355,38 +355,38 @@ private Q_SLOTS:
 
     void testOpenPGPInlineError()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("inlinepgpgencrypted-error.mbox"_L1));
         otp.print();
         otp.decryptAndVerify();
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::EncryptedMessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::EncryptedMessagePart>();
         QVERIFY(bool(part));
         QVERIFY(part->error());
     }
 
     void testEncapsulated()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("encapsulated-with-attachment.mbox"_L1));
         otp.decryptAndVerify();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 2);
-        auto part = partList[1].dynamicCast<MimeTreeParser::EncapsulatedRfc822MessagePart>();
+        auto part = partList[1].dynamicCast<MimeTreeParser::Core::EncapsulatedRfc822MessagePart>();
         QVERIFY(bool(part));
         QCOMPARE(part->from(), "Thomas McGuire <[email protected]>"_L1);
         QCOMPARE(part->date().toString(), "Wed Aug 5 10:57:58 2009 GMT+0200"_L1);
         auto subPartList = otp.collectContentParts(part);
         QCOMPARE(subPartList.size(), 1);
-        auto textPart = qobject_cast<MimeTreeParser::TextMessagePart *>(subPartList[0]->parentPart());
+        auto textPart = qobject_cast<MimeTreeParser::Core::TextMessagePart *>(subPartList[0]->parentPart());
         QVERIFY(bool(textPart));
     }
 
     void testGpgOLencapsulatedMime()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("internal-pgpencrypted-mime.mbox"_L1));
         otp.decryptAndVerify();
 
@@ -395,7 +395,7 @@ private Q_SLOTS:
         auto partList = otp.collectContentParts();
         // NOTE: The test message contains an initial empty text/plain part. In this test
         //       we don't want to assume whether or not that gets stripped.
-        auto part = partList.last().dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList.last().dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
         QCOMPARE(part->encryptions().size(), 1);
         QCOMPARE(part->signatures().size(), 1);
@@ -407,7 +407,7 @@ private Q_SLOTS:
 
     void test8bitEncodedInPlaintext()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("8bitencoded.mbox"_L1));
         QVERIFY(otp.plainTextContent().contains(QString::fromUtf8("Why Pisa’s Tower")));
         QVERIFY(otp.htmlContent().contains(QString::fromUtf8("Why Pisa’s Tower"_L1)));
@@ -415,7 +415,7 @@ private Q_SLOTS:
 
     void testInlineSigned()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("openpgp-inline-signed.mbox"_L1));
         otp.decryptAndVerify();
         otp.print();
@@ -424,14 +424,14 @@ private Q_SLOTS:
         QCOMPARE(partList.size(), 2);
         auto part = partList[0];
         QCOMPARE(part->signatures().size(), 0);
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgNotEncrypted);
-        QCOMPARE(part->signatureState(), MimeTreeParser::KMMsgNotSigned);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgNotEncrypted);
+        QCOMPARE(part->signatureState(), MimeTreeParser::Core::KMMsgNotSigned);
         QCOMPARE(part->text().trimmed(), u"Unsigned part"_s);
 
         part = partList[1];
         QCOMPARE(part->signatures().size(), 1);
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgNotEncrypted);
-        QCOMPARE(part->signatureState(), MimeTreeParser::KMMsgFullySigned);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgNotEncrypted);
+        QCOMPARE(part->signatureState(), MimeTreeParser::Core::KMMsgFullySigned);
         QCOMPARE(part->text().trimmed(), u"ohno öäü"_s);
         const auto details = PartModel::signatureDetails(part.get());
         const QString detailsWithoutTimestamp = QString{details}.replace(QRegularExpression{u"on .* with"_s}, u"on TIMESTAMP with"_s);
@@ -444,7 +444,7 @@ private Q_SLOTS:
     void testInlineSignedBroken()
     {
         // cryptographically bad signature in wellformed inline PGP block
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("openpgp-inline-signed-broken.mbox"_L1));
         otp.decryptAndVerify();
         otp.print();
@@ -452,8 +452,8 @@ private Q_SLOTS:
         QCOMPARE(partList.size(), 1);
         auto part = partList[0];
         QCOMPARE(part->signatures().size(), 1);
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgNotEncrypted);
-        QCOMPARE(part->signatureState(), MimeTreeParser::KMMsgFullySigned);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgNotEncrypted);
+        QCOMPARE(part->signatureState(), MimeTreeParser::Core::KMMsgFullySigned);
         QCOMPARE(part->text().trimmed(), u"ohno break it öäü"_s);
         const auto details = PartModel::signatureDetails(part.get());
         QVERIFY(details.contains(u"Bad signature"_s));
@@ -463,7 +463,7 @@ private Q_SLOTS:
     void testInlineSignedBroken2()
     {
         // cryptographically "valid" signature, in a non-parsable inline PGP block
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("openpgp-inline-signed-broken2.mbox"_L1));
         otp.decryptAndVerify();
         otp.print();
@@ -471,14 +471,14 @@ private Q_SLOTS:
         QCOMPARE(partList.size(), 1);
         auto part = partList[0];
         QCOMPARE(part->signatures().size(), 1);
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgNotEncrypted);
-        QCOMPARE(part->signatureState(), MimeTreeParser::KMMsgFullySigned);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgNotEncrypted);
+        QCOMPARE(part->signatureState(), MimeTreeParser::Core::KMMsgFullySigned);
         QCOMPARE(PartModel::signatureSecurityLevel(part.get()), PartModel::SecurityLevel::Bad);
     }
 
     void testSignedSenderMismatch()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("openpgp-signed-sender-mismatch.mbox"_L1));
         otp.print();
         otp.decryptAndVerify();
@@ -486,20 +486,20 @@ private Q_SLOTS:
         QVERIFY(otp.hasSignedParts());
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QCOMPARE(PartModel::signatureSecurityLevel(part.get()), PartModel::NotSoGood);
     }
 
     void testEncapsulatedMessageWithoutFrom()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("forward-openpgp-signed-encrypted-no-from.mbox"_L1));
         otp.print();
         otp.decryptAndVerify();
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 2);
-        auto part = partList[1].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[1].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
 
         auto encapsulated = part->subParts().at(0)->subParts().at(0);
@@ -510,16 +510,16 @@ private Q_SLOTS:
 
     void testEncryptedAndSigned()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("openpgp-encrypted+signed.mbox"_L1));
         otp.decryptAndVerify();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QCOMPARE(part->signatures().size(), 1);
         QCOMPARE(part->encryptions().size(), 1);
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgFullyEncrypted);
-        QCOMPARE(part->signatureState(), MimeTreeParser::KMMsgFullySigned);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgFullyEncrypted);
+        QCOMPARE(part->signatureState(), MimeTreeParser::Core::KMMsgFullySigned);
         QVERIFY(otp.plainTextContent().contains("encrypted message text"_L1));
 
         const auto details = PartModel::signatureDetails(part.get());
@@ -532,31 +532,31 @@ private Q_SLOTS:
 
     void testOpenpgpMultipartEmbedded()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("openpgp-multipart-embedded.mbox"_L1));
         otp.print();
         otp.decryptAndVerify();
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QCOMPARE(part->encryptions().size(), 1);
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgFullyEncrypted);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgFullyEncrypted);
         QCOMPARE(otp.plainTextContent(), "sdflskjsdf\n\n-- \nThis is a HTML signature.\n"_L1);
     }
 
     void testOpenpgpMultipartEmbeddedSigned()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("openpgp-multipart-embedded-signed.mbox"_L1));
         otp.decryptAndVerify();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QCOMPARE(part->encryptions().size(), 1);
         QCOMPARE(part->signatures().size(), 1);
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgFullyEncrypted);
-        QCOMPARE(part->signatureState(), MimeTreeParser::KMMsgFullySigned);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgFullyEncrypted);
+        QCOMPARE(part->signatureState(), MimeTreeParser::Core::KMMsgFullySigned);
         QCOMPARE(otp.plainTextContent(), "test\n\n-- \nThis is a HTML signature.\n"_L1);
 
         const auto details = PartModel::signatureDetails(part.get());
@@ -570,14 +570,14 @@ private Q_SLOTS:
 
     void testOpenpgpMaybeMangled()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("openpgp-encrypted-ambiguous-mime.mbox"_L1));
         otp.decryptAndVerify();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 2); // initial text/plain, followed by encrypted message parrt
-        auto part = partList[1].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[1].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QCOMPARE(part->encryptions().size(), 1);
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgFullyEncrypted);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgFullyEncrypted);
         QVERIFY(otp.plainTextContent().contains(u"First message part"_s));
         QVERIFY(otp.plainTextContent().contains(u"this is the main body part"_s));
 
@@ -588,7 +588,7 @@ private Q_SLOTS:
 
     void testAppleHtmlWithAttachments()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("applehtmlwithattachments.mbox"_L1));
         otp.decryptAndVerify();
         auto partList = otp.collectContentParts();
@@ -615,7 +615,7 @@ private Q_SLOTS:
 
     void testAppleHtmlWithAttachmentsMixed()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("applehtmlwithattachmentsmixed.mbox"_L1));
         otp.decryptAndVerify();
         otp.print();
@@ -641,7 +641,7 @@ private Q_SLOTS:
 
     void testInvitation()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("invitation.mbox"_L1));
         otp.decryptAndVerify();
         otp.print();
@@ -652,7 +652,7 @@ private Q_SLOTS:
         QCOMPARE(part->encryptions().size(), 0);
         QCOMPARE(part->signatures().size(), 0);
         QVERIFY(!part->isHtml());
-        QVERIFY(part->availableModes().contains(MimeTreeParser::AlternativeMessagePart::MultipartIcal));
+        QVERIFY(part->availableModes().contains(MimeTreeParser::Core::AlternativeMessagePart::MultipartIcal));
 
         auto attachments = otp.collectAttachmentParts();
         QCOMPARE(attachments.size(), 0);
@@ -660,7 +660,7 @@ private Q_SLOTS:
 
     void testGmailInvitation()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("gmail-invitation.mbox"_L1));
         otp.decryptAndVerify();
         otp.print();
@@ -672,7 +672,7 @@ private Q_SLOTS:
         qWarning() << part;
         QCOMPARE(part->signatures().size(), 0);
         QVERIFY(part->isHtml());
-        QVERIFY(part->availableModes().contains(MimeTreeParser::AlternativeMessagePart::MultipartIcal));
+        QVERIFY(part->availableModes().contains(MimeTreeParser::Core::AlternativeMessagePart::MultipartIcal));
 
         auto attachments = otp.collectAttachmentParts();
         QCOMPARE(attachments.size(), 1);
@@ -680,14 +680,14 @@ private Q_SLOTS:
 
     void testMemoryHole()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("openpgp-encrypted-memoryhole.mbox"_L1));
         otp.decryptAndVerify();
         otp.print();
 
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
 
         QCOMPARE(part->text(), u"very secret mesage\n"_s);
@@ -707,7 +707,7 @@ private Q_SLOTS:
      */
     void testMemoryHoleWithList()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("cid-links-forwarded-inline.mbox"_L1));
         const auto parts = otp.collectContentParts();
         auto part = parts[0];
@@ -717,14 +717,14 @@ private Q_SLOTS:
 
     void testMemoryHoleMultipartMixed()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("openpgp-encrypted-memoryhole2.mbox"_L1));
         otp.decryptAndVerify();
         otp.print();
 
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
 
         QCOMPARE(part->text(), "\n\n  Fsdflkjdslfj\n\n\nHappy Monday!\n\nBelow you will find a quick overview of the current on-goings. Remember\n"_L1);
@@ -734,7 +734,7 @@ private Q_SLOTS:
 
     void testMIMESignature()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("text+html-maillinglist.mbox"_L1));
         otp.decryptAndVerify();
         otp.print();
@@ -760,7 +760,7 @@ private Q_SLOTS:
 
     void testCRLFEncryptedWithSignature()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("crlf-encrypted-with-signature.mbox"_L1));
         otp.decryptAndVerify();
         otp.print();
@@ -770,7 +770,7 @@ private Q_SLOTS:
 
     void testCRLFEncryptedWithSignatureMultipart()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("crlf-encrypted-with-signature-multipart.mbox"_L1));
         otp.decryptAndVerify();
         otp.print();
@@ -782,7 +782,7 @@ private Q_SLOTS:
 
     void testCRLFOutlook()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("outlook.mbox"_L1));
         otp.decryptAndVerify();
         otp.print();
@@ -794,45 +794,45 @@ private Q_SLOTS:
 
     void testOpenPGPEncryptedSignedThunderbird()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("openpgp-encrypted-signed-thunderbird.mbox"_L1));
         otp.print();
         otp.decryptAndVerify();
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
         QCOMPARE(part->text(), "sdfsdf\n"_L1);
         QCOMPARE(part->charset(), u"utf-8"_s.toLocal8Bit());
         QCOMPARE(part->encryptions().size(), 1);
         QCOMPARE(part->signatures().size(), 1);
         QCOMPARE(PartModel::signatureSecurityLevel(part.get()), PartModel::Good);
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgFullyEncrypted);
-        QCOMPARE(part->signatureState(), MimeTreeParser::KMMsgFullySigned);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgFullyEncrypted);
+        QCOMPARE(part->signatureState(), MimeTreeParser::Core::KMMsgFullySigned);
         auto contentAttachmentList = otp.collectAttachmentParts();
         QCOMPARE(contentAttachmentList.size(), 1);
         // QCOMPARE(contentAttachmentList[0]->content().size(), 1);
         QCOMPARE(contentAttachmentList[0]->encryptions().size(), 1);
         QCOMPARE(contentAttachmentList[0]->signatures().size(), 1);
-        QCOMPARE(contentAttachmentList[0]->encryptionState(), MimeTreeParser::KMMsgFullyEncrypted);
-        QCOMPARE(contentAttachmentList[0]->signatureState(), MimeTreeParser::KMMsgFullySigned);
+        QCOMPARE(contentAttachmentList[0]->encryptionState(), MimeTreeParser::Core::KMMsgFullyEncrypted);
+        QCOMPARE(contentAttachmentList[0]->signatureState(), MimeTreeParser::Core::KMMsgFullySigned);
     }
 
     void testSignedForwardOpenpgpSignedEncrypted()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("signed-forward-openpgp-signed-encrypted.mbox"_L1));
         otp.print();
         otp.decryptAndVerify();
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 2);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
         QCOMPARE(part->text(), "bla bla bla"_L1);
 
-        part = partList[1].dynamicCast<MimeTreeParser::MessagePart>();
+        part = partList[1].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
         QCOMPARE(part->text(), QString());
         QCOMPARE(part->charset(), u"UTF-8"_s.toLocal8Bit());
@@ -844,77 +844,77 @@ private Q_SLOTS:
 
     void testSmimeOpaqueSign()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("smime-opaque-sign.mbox"_L1));
         otp.print();
         otp.decryptAndVerify();
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
         QCOMPARE(part->text(), "A simple signed only test."_L1);
     }
 
     void testSmimeEncrypted()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("smime-encrypted.mbox"_L1));
         otp.print();
         otp.decryptAndVerify();
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
         QCOMPARE(part->text(), "The quick brown fox jumped over the lazy dog."_L1);
     }
 
     void testSmimeSignedApple()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("smime-signed-apple.mbox"_L1));
         otp.print();
         otp.decryptAndVerify();
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
         // QCOMPARE(part->text(), u"A simple signed only test."_s);
     }
 
     void testSmimeSignedCharset()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("smime-signed-charset.mbox"_L1));
         otp.print();
         otp.decryptAndVerify();
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
         QCOMPARE(part->charset().toLower(), u"iso-8859-1"_s.toLocal8Bit());
     }
 
     void testSmimeEncryptedOctetStream()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("smime-encrypted-octet-stream.mbox"_L1));
         otp.print();
         otp.decryptAndVerify();
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
         QCOMPARE(part->text(), "The quick brown fox jumped over the lazy dog."_L1);
     }
 
     void testSmimeOpaqueSignedEncryptedAttachment()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("smime-opaque-signed-encrypted-attachment.mbox"_L1));
         otp.print();
         QVERIFY(otp.hasEncryptedParts());
@@ -922,14 +922,14 @@ private Q_SLOTS:
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
         QCOMPARE(part->text(), "This is an Opaque S/MIME encrypted and signed message with attachment"_L1);
     }
 
     void testSmimeOpaqueEncSign()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("smime-opaque-enc+sign.mbox"_L1));
         otp.print();
         QVERIFY(otp.hasEncryptedParts());
@@ -939,30 +939,30 @@ private Q_SLOTS:
         otp.print();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 1);
-        auto part = partList[0].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[0].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QVERIFY(bool(part));
         QCOMPARE(part->text(), "Encrypted and signed mail."_L1);
     }
 
     void testSmimeMaybeMangled()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("smime-encrypted-ambiguous-mime.mbox"_L1));
         otp.decryptAndVerify();
         auto partList = otp.collectContentParts();
         QCOMPARE(partList.size(), 2); // initial text/plain, followed by encrypted message part
-        auto part = partList[1].dynamicCast<MimeTreeParser::MessagePart>();
+        auto part = partList[1].dynamicCast<MimeTreeParser::Core::MessagePart>();
         QCOMPARE(part->encryptions().size(), 1);
         QCOMPARE(part->signatures().size(), 1);
-        QCOMPARE(part->encryptionState(), MimeTreeParser::KMMsgFullyEncrypted);
-        QCOMPARE(part->signatureState(), MimeTreeParser::KMMsgFullySigned);
+        QCOMPARE(part->encryptionState(), MimeTreeParser::Core::KMMsgFullyEncrypted);
+        QCOMPARE(part->signatureState(), MimeTreeParser::Core::KMMsgFullySigned);
         QVERIFY(otp.plainTextContent().contains(u"First message part"_s));
         QVERIFY(otp.plainTextContent().contains(u"Encrypted and signed mail."_s));
     }
 
     void testSmimeMaybeMangled2()
     {
-        MimeTreeParser::ObjectTreeParser otp;
+        MimeTreeParser::Core::ObjectTreeParser otp;
         otp.parseObjectTree(readMailFromFile("smime-encrypted-not-so-ambiguous-mime.mbox"_L1));
         otp.decryptAndVerify();
         auto partList = otp.collectContentParts();
diff --git a/autotests/core/partmodeltest.cpp b/autotests/core/partmodeltest.cpp
index f8ef465..be5ada8 100644
--- a/autotests/core/partmodeltest.cpp
+++ b/autotests/core/partmodeltest.cpp
@@ -94,7 +94,7 @@ private Q_SLOTS:
         }
 
         auto encapsulatedIndex = partModel->index(1, 0);
-        auto encapsulatedPart = partModel->part<MimeTreeParser::EncapsulatedRfc822MessagePart>(encapsulatedIndex);
+        auto encapsulatedPart = partModel->part<MimeTreeParser::Core::EncapsulatedRfc822MessagePart>(encapsulatedIndex);
         QVERIFY(encapsulatedPart);
         QCOMPARE(encapsulatedPart->subject(), QStringLiteral("OpenPGP signed and encrypted"));
     }
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 84b5534..9681650 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -94,8 +94,6 @@ set_target_properties(
             MimeTreeParserCore
 )
 
-target_link_options(KPim6MimeTreeParserCore PRIVATE "LINKER:-Bsymbolic")
-
 ecm_generate_pri_file(BASE_NAME MimeTreeParserCore
     LIB_NAME KPim6MimeTreeParserCore
     DEPS "MimeTreeParserCore"
diff --git a/src/core/attachmentmodel.cpp b/src/core/attachmentmodel.cpp
index d2c7844..1961e91 100644
--- a/src/core/attachmentmodel.cpp
+++ b/src/core/attachmentmodel.cpp
@@ -131,26 +131,26 @@ struct WindowFile {
 class AttachmentModelPrivate
 {
 public:
-    AttachmentModelPrivate(AttachmentModel *q_ptr, const std::shared_ptr<MimeTreeParser::ObjectTreeParser> &parser);
+    AttachmentModelPrivate(AttachmentModel *q_ptr, const std::shared_ptr<MimeTreeParser::Core::ObjectTreeParser> &parser);
 
     AttachmentModel *const q;
     QMimeDatabase mimeDb;
-    std::shared_ptr<MimeTreeParser::ObjectTreeParser> mParser;
-    QList<QSharedPointer<MimeTreeParser::MessagePart>> mAttachments;
+    std::shared_ptr<MimeTreeParser::Core::ObjectTreeParser> mParser;
+    QList<QSharedPointer<MimeTreeParser::Core::MessagePart>> mAttachments;
 
 #ifdef Q_OS_WIN
     std::vector<WindowFile> mOpenFiles;
 #endif
 };
 
-AttachmentModelPrivate::AttachmentModelPrivate(AttachmentModel *q_ptr, const std::shared_ptr<MimeTreeParser::ObjectTreeParser> &parser)
+AttachmentModelPrivate::AttachmentModelPrivate(AttachmentModel *q_ptr, const std::shared_ptr<MimeTreeParser::Core::ObjectTreeParser> &parser)
     : q(q_ptr)
     , mParser(parser)
 {
     mAttachments = mParser->collectAttachmentParts();
 }
 
-AttachmentModel::AttachmentModel(std::shared_ptr<MimeTreeParser::ObjectTreeParser> parser)
+AttachmentModel::AttachmentModel(std::shared_ptr<MimeTreeParser::Core::ObjectTreeParser> parser)
     : QAbstractTableModel()
     , d(std::unique_ptr<AttachmentModelPrivate>(new AttachmentModelPrivate(this, parser)))
 {
@@ -234,7 +234,7 @@ QVariant AttachmentModel::data(const QModelIndex &index, int role) const
             return mimetype.name();
         case Qt::DisplayRole:
         case NameRole:
-            return part->filename(MimeTreeParser::MessagePart::FallbackToNameOrPlaceholder);
+            return part->filename(MimeTreeParser::Core::MessagePart::FallbackToNameOrPlaceholder);
         case IconRole:
             return mimetype.iconName();
         case Qt::DecorationRole:
@@ -282,7 +282,7 @@ QString AttachmentModel::saveAttachmentToPath(const int row, const QString &path
     return saveAttachmentToPath(part, path);
 }
 
-QString AttachmentModel::saveAttachmentToPath(const QSharedPointer<MimeTreeParser::MessagePart> &part, const QString &path)
+QString AttachmentModel::saveAttachmentToPath(const QSharedPointer<MimeTreeParser::Core::MessagePart> &part, const QString &path)
 {
     Q_ASSERT(part);
     auto node = part->node();
@@ -317,9 +317,9 @@ bool AttachmentModel::openAttachment(const int row)
     return openAttachment(part);
 }
 
-bool AttachmentModel::openAttachment(const QSharedPointer<MimeTreeParser::MessagePart> &message)
+bool AttachmentModel::openAttachment(const QSharedPointer<MimeTreeParser::Core::MessagePart> &message)
 {
-    QString fileName = message->filename(MimeTreeParser::MessagePart::FallbackToNameOrPlaceholder);
+    QString fileName = message->filename(MimeTreeParser::Core::MessagePart::FallbackToNameOrPlaceholder);
     QTemporaryDir tempDir(QDir::tempPath() + QLatin1Char('/') + qGuiApp->applicationName() + u".XXXXXX"_s);
     // TODO: We need some cleanup here. Otherwise the files will stay forever on Windows.
     tempDir.setAutoRemove(false);
@@ -374,7 +374,7 @@ bool AttachmentModel::importPublicKey(const int row)
     return importPublicKey(part);
 }
 
-bool AttachmentModel::importPublicKey(const QSharedPointer<MimeTreeParser::MessagePart> &part)
+bool AttachmentModel::importPublicKey(const QSharedPointer<MimeTreeParser::Core::MessagePart> &part)
 {
     Q_ASSERT(part);
     const QByteArray certData = part->node()->decodedBody();
diff --git a/src/core/attachmentmodel.h b/src/core/attachmentmodel.h
index 1b69362..53a5d77 100644
--- a/src/core/attachmentmodel.h
+++ b/src/core/attachmentmodel.h
@@ -11,13 +11,13 @@
 
 #include <memory>
 
-namespace MimeTreeParser
+namespace MimeTreeParser::Core
 {
 class ObjectTreeParser;
 }
 class AttachmentModelPrivate;
 /*!
- * \class MimeTreeParser::AttachmentModel
+ * \class AttachmentModel
  * \inmodule MimeTreeParserCore
  * \inheaderfile MimeTreeParserCore/AttachmentModel
  */
@@ -29,7 +29,7 @@ public:
      * \brief AttachmentModel
      * \param parser
      */
-    explicit AttachmentModel(std::shared_ptr<MimeTreeParser::ObjectTreeParser> parser);
+    explicit AttachmentModel(std::shared_ptr<MimeTreeParser::Core::ObjectTreeParser> parser);
     /*!
      */
     ~AttachmentModel() override;
@@ -96,12 +96,12 @@ public:
      * \brief Opens the attachment from the message part
      * \param message The message part containing the attachment
      */
-    bool openAttachment(const QSharedPointer<MimeTreeParser::MessagePart> &message);
+    bool openAttachment(const QSharedPointer<MimeTreeParser::Core::MessagePart> &message);
     /*!
      * \brief Imports the public key from the message part
      * \param message The message part containing the public key
      */
-    bool importPublicKey(const QSharedPointer<MimeTreeParser::MessagePart> &message);
+    bool importPublicKey(const QSharedPointer<MimeTreeParser::Core::MessagePart> &message);
 
     /*!
      * \brief Saves the attachment at the given row to the specified path
@@ -114,7 +114,7 @@ public:
      * \param part The message part containing the attachment
      * \param path The destination path
      */
-    QString saveAttachmentToPath(const QSharedPointer<MimeTreeParser::MessagePart> &part, const QString &path);
+    QString saveAttachmentToPath(const QSharedPointer<MimeTreeParser::Core::MessagePart> &part, const QString &path);
 
 Q_SIGNALS:
     /*!
diff --git a/src/core/bodypartformatter.cpp b/src/core/bodypartformatter.cpp
index e128383..becdae2 100644
--- a/src/core/bodypartformatter.cpp
+++ b/src/core/bodypartformatter.cpp
@@ -3,9 +3,9 @@
 
 #include "bodypartformatter.h"
 
-using namespace MimeTreeParser::Interface;
+using namespace MimeTreeParser::Core::Interface;
 
-namespace MimeTreeParser
+namespace MimeTreeParser::Core
 {
 namespace Interface
 {
diff --git a/src/core/bodypartformatter.h b/src/core/bodypartformatter.h
index e33a4c3..2ed3858 100644
--- a/src/core/bodypartformatter.h
+++ b/src/core/bodypartformatter.h
@@ -11,7 +11,7 @@ namespace KMime
 class Content;
 }
 
-namespace MimeTreeParser
+namespace MimeTreeParser::Core
 {
 class ObjectTreeParser;
 
diff --git a/src/core/bodypartformatter_impl.cpp b/src/core/bodypartformatter_impl.cpp
index f0810bc..2ce8fca 100644
--- a/src/core/bodypartformatter_impl.cpp
+++ b/src/core/bodypartformatter_impl.cpp
@@ -15,12 +15,12 @@
 #include <KMime/Content>
 #include <QGpgME/Protocol>
 
-using namespace MimeTreeParser;
-using namespace MimeTreeParser::Interface;
+using namespace MimeTreeParser::Core;
+using namespace MimeTreeParser::Core::Interface;
 using namespace Qt::Literals::StringLiterals;
-namespace MimeTreeParser
+namespace MimeTreeParser::Core
 {
-class AnyTypeBodyPartFormatter : public MimeTreeParser::Interface::BodyPartFormatter
+class AnyTypeBodyPartFormatter : public MimeTreeParser::Core::Interface::BodyPartFormatter
 {
     QSharedPointer<MessagePart> process(ObjectTreeParser *objectTreeParser, KMime::Content *node) const override
     {
@@ -39,7 +39,7 @@ class AnyTypeBodyPartFormatter : public MimeTreeParser::Interface::BodyPartForma
     }
 };
 
-class MessageRfc822BodyPartFormatter : public MimeTreeParser::Interface::BodyPartFormatter
+class MessageRfc822BodyPartFormatter : public MimeTreeParser::Core::Interface::BodyPartFormatter
 {
 public:
     QSharedPointer<MessagePart> process(ObjectTreeParser *objectTreeParser, KMime::Content *node) const override
@@ -48,7 +48,7 @@ public:
     }
 };
 
-class HeadersBodyPartFormatter : public MimeTreeParser::Interface::BodyPartFormatter
+class HeadersBodyPartFormatter : public MimeTreeParser::Core::Interface::BodyPartFormatter
 {
 public:
     QSharedPointer<MessagePart> process(ObjectTreeParser *objectTreeParser, KMime::Content *node) const override
@@ -57,7 +57,7 @@ public:
     }
 };
 
-class MultiPartRelatedBodyPartFormatter : public MimeTreeParser::Interface::BodyPartFormatter
+class MultiPartRelatedBodyPartFormatter : public MimeTreeParser::Core::Interface::BodyPartFormatter
 {
 public:
     QList<QSharedPointer<MessagePart>> processList(ObjectTreeParser *objectTreeParser, KMime::Content *node) const override
@@ -103,7 +103,7 @@ contentsAsEncryptedMessagePart(ObjectTreeParser *objectTreeParser, KMime::Conten
     return {};
 }
 
-class MultiPartMixedBodyPartFormatter : public MimeTreeParser::Interface::BodyPartFormatter
+class MultiPartMixedBodyPartFormatter : public MimeTreeParser::Core::Interface::BodyPartFormatter
 {
 public:
     QSharedPointer<MessagePart> process(ObjectTreeParser *objectTreeParser, KMime::Content *node) const override
@@ -153,7 +153,7 @@ public:
     }
 };
 
-class ApplicationPGPEncryptedBodyPartFormatter : public MimeTreeParser::Interface::BodyPartFormatter
+class ApplicationPGPEncryptedBodyPartFormatter : public MimeTreeParser::Core::Interface::BodyPartFormatter
 {
 public:
     QSharedPointer<MessagePart> process(ObjectTreeParser *objectTreeParser, KMime::Content *node) const override
@@ -178,7 +178,7 @@ public:
     }
 };
 
-class ApplicationPkcs7MimeBodyPartFormatter : public MimeTreeParser::Interface::BodyPartFormatter
+class ApplicationPkcs7MimeBodyPartFormatter : public MimeTreeParser::Core::Interface::BodyPartFormatter
 {
 public:
     QSharedPointer<MessagePart> process(ObjectTreeParser *objectTreeParser, KMime::Content *node) const override
@@ -265,7 +265,7 @@ public:
     }
 };
 
-class MultiPartAlternativeBodyPartFormatter : public MimeTreeParser::Interface::BodyPartFormatter
+class MultiPartAlternativeBodyPartFormatter : public MimeTreeParser::Core::Interface::BodyPartFormatter
 {
 public:
     QSharedPointer<MessagePart> process(ObjectTreeParser *objectTreeParser, KMime::Content *node) const override
@@ -282,7 +282,7 @@ public:
     }
 };
 
-class MultiPartEncryptedBodyPartFormatter : public MimeTreeParser::Interface::BodyPartFormatter
+class MultiPartEncryptedBodyPartFormatter : public MimeTreeParser::Core::Interface::BodyPartFormatter
 {
 public:
     QSharedPointer<MessagePart> process(ObjectTreeParser *objectTreeParser, KMime::Content *node) const override
@@ -320,7 +320,7 @@ public:
     }
 };
 
-class MultiPartSignedBodyPartFormatter : public MimeTreeParser::Interface::BodyPartFormatter
+class MultiPartSignedBodyPartFormatter : public MimeTreeParser::Core::Interface::BodyPartFormatter
 {
 public:
     static const QGpgME::Protocol *detectProtocol(const QString &protocolContentType_, const QString &signatureContentType)
@@ -370,7 +370,7 @@ public:
     }
 };
 
-class TextHtmlBodyPartFormatter : public MimeTreeParser::Interface::BodyPartFormatter
+class TextHtmlBodyPartFormatter : public MimeTreeParser::Core::Interface::BodyPartFormatter
 {
 public:
     QSharedPointer<MessagePart> process(ObjectTreeParser *objectTreeParser, KMime::Content *node) const override
@@ -379,7 +379,7 @@ public:
     }
 };
 
-class TextPlainBodyPartFormatter : public MimeTreeParser::Interface::BodyPartFormatter
+class TextPlainBodyPartFormatter : public MimeTreeParser::Core::Interface::BodyPartFormatter
 {
 public:
     QSharedPointer<MessagePart> process(ObjectTreeParser *objectTreeParser, KMime::Content *node) const override
diff --git a/src/core/bodypartformatterbasefactory.cpp b/src/core/bodypartformatterbasefactory.cpp
index 2fcff52..1ab4c78 100644
--- a/src/core/bodypartformatterbasefactory.cpp
+++ b/src/core/bodypartformatterbasefactory.cpp
@@ -8,7 +8,7 @@
 
 #include <assert.h>
 
-using namespace MimeTreeParser;
+using namespace MimeTreeParser::Core;
 
 BodyPartFormatterBaseFactoryPrivate::BodyPartFormatterBaseFactoryPrivate(BodyPartFormatterBaseFactory *factory)
     : q(factory)
diff --git a/src/core/bodypartformatterbasefactory.h b/src/core/bodypartformatterbasefactory.h
index 830b202..09f160e 100644
--- a/src/core/bodypartformatterbasefactory.h
+++ b/src/core/bodypartformatterbasefactory.h
@@ -8,7 +8,7 @@
 #include <map>
 #include <memory>
 
-namespace MimeTreeParser
+namespace MimeTreeParser::Core
 {
 
 namespace Interface
@@ -24,7 +24,7 @@ struct ltstr {
 };
 
 typedef std::multimap<const char *, std::shared_ptr<Interface::BodyPartFormatter>, ltstr> SubtypeRegistry;
-typedef std::map<const char *, MimeTreeParser::SubtypeRegistry, MimeTreeParser::ltstr> TypeRegistry;
+typedef std::map<const char *, MimeTreeParser::Core::SubtypeRegistry, MimeTreeParser::Core::ltstr> TypeRegistry;
 
 class BodyPartFormatterBaseFactoryPrivate;
 
diff --git a/src/core/bodypartformatterbasefactory_p.h b/src/core/bodypartformatterbasefactory_p.h
index ffd0329..d89a309 100644
--- a/src/core/bodypartformatterbasefactory_p.h
+++ b/src/core/bodypartformatterbasefactory_p.h
@@ -8,7 +8,7 @@
 #include <memory>
 #include <optional>
 
-namespace MimeTreeParser
+namespace MimeTreeParser::Core
 {
 class BodyPartFormatterBaseFactory;
 
diff --git a/src/core/cryptohelper.cpp b/src/core/cryptohelper.cpp
index 1ef1120..d4a58ea 100644
--- a/src/core/cryptohelper.cpp
+++ b/src/core/cryptohelper.cpp
@@ -18,7 +18,7 @@
 #include <gpgme++/decryptionresult.h>
 #include <gpgme++/verificationresult.h>
 
-using namespace MimeTreeParser;
+using namespace MimeTreeParser::Core;
 
 PGPBlockType Block::determineType() const
 {
@@ -48,7 +48,7 @@ PGPBlockType Block::determineType() const
     }
 }
 
-QList<Block> MimeTreeParser::prepareMessageForDecryption(const QByteArray &msg)
+QList<Block> MimeTreeParser::Core::prepareMessageForDecryption(const QByteArray &msg)
 {
     PGPBlockType pgpBlock = NoPgpBlock;
     QList<Block> blocks;
@@ -148,7 +148,7 @@ Block::Block(const QByteArray &m, PGPBlockType t)
 {
 }
 
-QByteArray MimeTreeParser::Block::text() const
+QByteArray MimeTreeParser::Core::Block::text() const
 {
     return msg;
 }
@@ -184,7 +184,7 @@ void copyHeader(const KMime::Headers::Base *header, KMime::Content *msg)
 // representation. Those, we want to keep, the others we can strip.
 /////////////////////////////////////////////////////////////////////
 
-static QSet<KMime::Content *> representedNodes(MimeTreeParser::MessagePart *part)
+static QSet<KMime::Content *> representedNodes(MimeTreeParser::Core::MessagePart *part)
 {
     QSet<KMime::Content *> ret;
     ret.insert(part->node());
@@ -216,9 +216,10 @@ static void copyMissingHeaders(const KMime::Content *from, KMime::Content *to)
     }
 }
 
-static void decryptNodes(MimeTreeParser::MessagePart *part, const QSet<KMime::Content *> &nonRemovableNodes, bool &wasEncrypted, MessagePart::Error &error)
+static void
+decryptNodes(MimeTreeParser::Core::MessagePart *part, const QSet<KMime::Content *> &nonRemovableNodes, bool &wasEncrypted, MessagePart::Error &error)
 {
-    if (auto enc = qobject_cast<MimeTreeParser::EncryptedMessagePart *>(part)) {
+    if (auto enc = qobject_cast<MimeTreeParser::Core::EncryptedMessagePart *>(part)) {
         wasEncrypted = true;
         if (enc->error()) {
             error = enc->error();
@@ -255,7 +256,7 @@ static void decryptNodes(MimeTreeParser::MessagePart *part, const QSet<KMime::Co
                 decryptedNode->parse(); // Do this _after_ the node has a parent, and thereby depth()
             }
         }
-    } else if (auto text = qobject_cast<MimeTreeParser::TextMessagePart *>(part)) {
+    } else if (auto text = qobject_cast<MimeTreeParser::Core::TextMessagePart *>(part)) {
         if (text->encryptionState()) {
             wasEncrypted = true;
         }
@@ -284,7 +285,7 @@ std::shared_ptr<KMime::Message> CryptoUtils::decryptMessage(const std::shared_pt
 {
     auto decryptedCopy = std::shared_ptr<KMime::Message>(static_cast<KMime::Message *>(message->clone().release()));
 
-    MimeTreeParser::ObjectTreeParser otp;
+    MimeTreeParser::Core::ObjectTreeParser otp;
     otp.parseObjectTree(decryptedCopy.get());
     otp.decryptAndVerify();
 
diff --git a/src/core/cryptohelper.h b/src/core/cryptohelper.h
index 1c0ee94..26b43d3 100644
--- a/src/core/cryptohelper.h
+++ b/src/core/cryptohelper.h
@@ -14,7 +14,7 @@
 #include <QList>
 #include <gpgme++/global.h>
 
-namespace MimeTreeParser
+namespace MimeTreeParser::Core
 {
 enum PGPBlockType {
     UnknownBlock = -1, // BEGIN PGP ???
@@ -27,7 +27,7 @@ enum PGPBlockType {
     PrivateKeyBlock = 6, // BEGIN PGP PRIVATE KEY BLOCK (PGP 2.x: ...SECRET...)
 };
 /*!
- * \class MimeTreeParser::Block
+ * \class MimeTreeParser::Core::Block
  * \inmodule MimeTreeParserCore
  * \inheaderfile MimeTreeParserCore/CryptoHelper
  */
@@ -82,6 +82,6 @@ namespace CryptoUtils
 decryptMessage(const std::shared_ptr<KMime::Message> &decrypt, bool &wasEncrypted, MessagePart::Error &error);
 }
 
-} // namespace MimeTreeParser
+} // namespace MimeTreeParser::Core
 
-Q_DECLARE_TYPEINFO(MimeTreeParser::Block, Q_RELOCATABLE_TYPE);
+Q_DECLARE_TYPEINFO(MimeTreeParser::Core::Block, Q_RELOCATABLE_TYPE);
diff --git a/src/core/enums.h b/src/core/enums.h
index c118ab3..d159de1 100644
--- a/src/core/enums.h
+++ b/src/core/enums.h
@@ -3,7 +3,7 @@
 
 #pragma once
 
-namespace MimeTreeParser
+namespace MimeTreeParser::Core
 {
 
 /**
diff --git a/src/core/htmlutils.cpp b/src/core/htmlutils.cpp
index 3be888b..4f4a772 100644
--- a/src/core/htmlutils.cpp
+++ b/src/core/htmlutils.cpp
@@ -112,7 +112,7 @@ static bool linkify_okEmail(const QString &addy)
  * takes a richtext string and heuristically adds links for uris of common protocols
  * @return a richtext string with link markup added
  */
-QString MimeTreeParser::linkify(const QString &in)
+QString MimeTreeParser::Core::linkify(const QString &in)
 {
     QString out = in;
     int x1, x2;
diff --git a/src/core/htmlutils.h b/src/core/htmlutils.h
index 81bdba3..18d78d3 100644
--- a/src/core/htmlutils.h
+++ b/src/core/htmlutils.h
@@ -5,7 +5,7 @@
 
 #include <QString>
 
-namespace MimeTreeParser
+namespace MimeTreeParser::Core
 {
 [[nodiscard]] QString linkify(const QString &in);
 }
diff --git a/src/core/messageparser.cpp b/src/core/messageparser.cpp
index fec6036..40d556d 100644
--- a/src/core/messageparser.cpp
+++ b/src/core/messageparser.cpp
@@ -57,7 +57,7 @@ QString mailboxesToHtml(const QList<KMime::Types::Mailbox> &mailboxes)
 class MessagePartPrivate
 {
 public:
-    std::shared_ptr<MimeTreeParser::ObjectTreeParser> mParser;
+    std::shared_ptr<MimeTreeParser::Core::ObjectTreeParser> mParser;
     std::shared_ptr<KMime::Message> mMessage;
     KMime::Content *protectedHeaderNode = nullptr;
     std::unique_ptr<KMime::Content> ownedContent;
@@ -91,7 +91,7 @@ void MessageParser::setMessage(const std::shared_ptr<KMime::Message> message)
 
     QElapsedTimer time;
     time.start();
-    auto parser = std::make_shared<MimeTreeParser::ObjectTreeParser>();
+    auto parser = std::make_shared<MimeTreeParser::Core::ObjectTreeParser>();
     parser->parseObjectTree(message.get());
     qCDebug(MIMETREEPARSER_CORE_LOG) << "Message parsing took: " << time.elapsed();
     parser->decryptAndVerify();
@@ -124,7 +124,7 @@ void MessageParser::setMessage(const std::shared_ptr<KMime::Message> message)
     Q_EMIT htmlChanged();
 }
 
-std::shared_ptr<MimeTreeParser::ObjectTreeParser> MessageParser::parser() const
+std::shared_ptr<MimeTreeParser::Core::ObjectTreeParser> MessageParser::parser() const
 {
     return d->mParser;
 }
diff --git a/src/core/messageparser.h b/src/core/messageparser.h
index ca10243..f024311 100644
--- a/src/core/messageparser.h
+++ b/src/core/messageparser.h
@@ -60,7 +60,7 @@ public:
      *
      * \return A shared pointer to the parser of the last message set via setMessage()
      */
-    std::shared_ptr<MimeTreeParser::ObjectTreeParser> parser() const;
+    std::shared_ptr<MimeTreeParser::Core::ObjectTreeParser> parser() const;
     /*!
      * \brief Returns the part model
      * \return A pointer to the parts model
diff --git a/src/core/messagepart.cpp b/src/core/messagepart.cpp
index 44c52ec..8c62528 100644
--- a/src/core/messagepart.cpp
+++ b/src/core/messagepart.cpp
@@ -29,7 +29,7 @@
 #include <gpgme.h>
 using namespace Qt::Literals::StringLiterals;
 
-using namespace MimeTreeParser;
+using namespace MimeTreeParser::Core;
 
 //------MessagePart-----------------------
 MessagePart::MessagePart(ObjectTreeParser *otp, const QString &text, KMime::Content *node)
@@ -333,7 +333,7 @@ void MessagePart::bindLifetime(KMime::Content *node)
     mNodesToDelete << node;
 }
 
-KMime::Headers::Base *MimeTreeParser::MessagePart::header(const char *header) const
+KMime::Headers::Base *MimeTreeParser::Core::MessagePart::header(const char *header) const
 {
     if (node() && node()->hasHeader(header)) {
         return node()->headerByType(header);
@@ -392,7 +392,7 @@ void TextMessagePart::parseContent()
                 continue;
             }
 
-            QSharedPointer<MimeTreeParser::MessagePart> mp;
+            QSharedPointer<MimeTreeParser::Core::MessagePart> mp;
             auto content = std::make_unique<KMime::Content>();
             content->setBody(block.text());
             content->parse();
diff --git a/src/core/messagepart.h b/src/core/messagepart.h
index 8680f55..c91f0e6 100644
--- a/src/core/messagepart.h
+++ b/src/core/messagepart.h
@@ -27,7 +27,7 @@ namespace QGpgME
 class Protocol;
 }
 
-namespace MimeTreeParser
+namespace MimeTreeParser::Core
 {
 
 class ObjectTreeParser;
@@ -37,7 +37,7 @@ class AlternativeMessagePart;
 class SignedMessagePart;
 class EncryptedMessagePart;
 /*!
- * \class MimeTreeParser::MessagePart
+ * \class MimeTreeParser::Core::MessagePart
  * \inmodule MimeTreeParserCore
  * \inheaderfile MimeTreeParserCore/MessagePart
  */
@@ -280,7 +280,7 @@ public:
      * \param node The MIME content node
      * \param onlyOneMimePart If true, only parse one MIME part
      */
-    MimeMessagePart(MimeTreeParser::ObjectTreeParser *otp, KMime::Content *node, bool onlyOneMimePart = false);
+    MimeMessagePart(MimeTreeParser::Core::ObjectTreeParser *otp, KMime::Content *node, bool onlyOneMimePart = false);
     /*!
      * \brief Destroys the MimeMessagePart
      */
@@ -316,7 +316,7 @@ public:
      * \param otp The object tree parser
      * \param node The MIME content node
      */
-    MessagePartList(MimeTreeParser::ObjectTreeParser *otp, KMime::Content *node);
+    MessagePartList(MimeTreeParser::Core::ObjectTreeParser *otp, KMime::Content *node);
     /*!
      * \brief Destroys the MessagePartList
      */
@@ -345,7 +345,7 @@ public:
      * \param otp The object tree parser
      * \param node The MIME content node
      */
-    TextMessagePart(MimeTreeParser::ObjectTreeParser *otp, KMime::Content *node);
+    TextMessagePart(MimeTreeParser::Core::ObjectTreeParser *otp, KMime::Content *node);
     /*!
      * \brief Destroys the TextMessagePart
      */
@@ -364,7 +364,7 @@ public:
      * \param otp The object tree parser
      * \param node The MIME content node
      */
-    AttachmentMessagePart(MimeTreeParser::ObjectTreeParser *otp, KMime::Content *node);
+    AttachmentMessagePart(MimeTreeParser::Core::ObjectTreeParser *otp, KMime::Content *node);
     /*!
      * \brief Destroys the AttachmentMessagePart
      */
@@ -388,7 +388,7 @@ public:
      * \param otp The object tree parser
      * \param node The MIME content node
      */
-    HtmlMessagePart(MimeTreeParser::ObjectTreeParser *otp, KMime::Content *node);
+    HtmlMessagePart(MimeTreeParser::Core::ObjectTreeParser *otp, KMime::Content *node);
 
     /*!
      * \brief Destroys the HtmlMessagePart
@@ -421,7 +421,7 @@ public:
      * \param otp The object tree parser
      * \param node The MIME content node
      */
-    AlternativeMessagePart(MimeTreeParser::ObjectTreeParser *otp, KMime::Content *node);
+    AlternativeMessagePart(MimeTreeParser::Core::ObjectTreeParser *otp, KMime::Content *node);
     /*!
      * \brief Destroys the AlternativeMessagePart
      */
@@ -478,7 +478,7 @@ public:
      * \param node The MIME content node
      * \param cryptoProto The cryptography protocol handler
      */
-    CertMessagePart(MimeTreeParser::ObjectTreeParser *otp, KMime::Content *node, QGpgME::Protocol *cryptoProto);
+    CertMessagePart(MimeTreeParser::Core::ObjectTreeParser *otp, KMime::Content *node, QGpgME::Protocol *cryptoProto);
     /*!
      * \brief Destroys the CertMessagePart
      */
@@ -505,7 +505,7 @@ public:
      * \param node The MIME content node
      * \param message The RFC 822 message
      */
-    EncapsulatedRfc822MessagePart(MimeTreeParser::ObjectTreeParser *otp, KMime::Content *node, const std::shared_ptr<KMime::Message> &message);
+    EncapsulatedRfc822MessagePart(MimeTreeParser::Core::ObjectTreeParser *otp, KMime::Content *node, const std::shared_ptr<KMime::Message> &message);
     /*!
      * \brief Destroys the EncapsulatedRfc822MessagePart
      */
diff --git a/src/core/objecttreeparser.cpp b/src/core/objecttreeparser.cpp
index 7fdd1e6..756a983 100644
--- a/src/core/objecttreeparser.cpp
+++ b/src/core/objecttreeparser.cpp
@@ -22,7 +22,7 @@
 #include <QTextStream>
 #include <QUrl>
 
-using namespace MimeTreeParser;
+using namespace MimeTreeParser::Core;
 using namespace Qt::Literals::StringLiterals;
 /*
  * Collect message parts bottom up.
@@ -64,10 +64,10 @@ QString ObjectTreeParser::plainTextContent()
                 if (part->isAttachment()) {
                     return false;
                 }
-                if (dynamic_cast<MimeTreeParser::TextMessagePart *>(part.data())) {
+                if (dynamic_cast<MimeTreeParser::Core::TextMessagePart *>(part.data())) {
                     return true;
                 }
-                if (dynamic_cast<MimeTreeParser::AlternativeMessagePart *>(part.data())) {
+                if (dynamic_cast<MimeTreeParser::Core::AlternativeMessagePart *>(part.data())) {
                     return true;
                 }
                 return false;
@@ -89,16 +89,16 @@ QString ObjectTreeParser::htmlContent()
                 return true;
             },
             [](const QSharedPointer<MessagePart> &part) {
-                if (dynamic_cast<MimeTreeParser::HtmlMessagePart *>(part.data())) {
+                if (dynamic_cast<MimeTreeParser::Core::HtmlMessagePart *>(part.data())) {
                     return true;
                 }
-                if (dynamic_cast<MimeTreeParser::AlternativeMessagePart *>(part.data())) {
+                if (dynamic_cast<MimeTreeParser::Core::AlternativeMessagePart *>(part.data())) {
                     return true;
                 }
                 return false;
             });
         for (const auto &part : std::as_const(contentParts)) {
-            if (auto p = dynamic_cast<MimeTreeParser::AlternativeMessagePart *>(part.data())) {
+            if (auto p = dynamic_cast<MimeTreeParser::Core::AlternativeMessagePart *>(part.data())) {
                 content += p->htmlContent();
             } else {
                 content += part->text();
@@ -118,7 +118,7 @@ bool ObjectTreeParser::hasEncryptedParts() const
             return true;
         },
         [&result](const QSharedPointer<MessagePart> &part) {
-            if (dynamic_cast<MimeTreeParser::EncryptedMessagePart *>(part.data())) {
+            if (dynamic_cast<MimeTreeParser::Core::EncryptedMessagePart *>(part.data())) {
                 result = true;
             }
             return false;
@@ -137,7 +137,7 @@ bool ObjectTreeParser::hasSignedParts() const
             return true;
         },
         [&result](const QSharedPointer<MessagePart> &part) {
-            if (dynamic_cast<MimeTreeParser::SignedMessagePart *>(part.data())) {
+            if (dynamic_cast<MimeTreeParser::Core::SignedMessagePart *>(part.data())) {
                 result = true;
             }
             return false;
@@ -228,19 +228,19 @@ QList<QSharedPointer<MessagePart>> ObjectTreeParser::collectContentParts(QShared
             if (start.data() == part.data()) {
                 return true;
             }
-            if (auto encapsulatedPart = part.dynamicCast<MimeTreeParser::EncapsulatedRfc822MessagePart>()) {
+            if (auto encapsulatedPart = part.dynamicCast<MimeTreeParser::Core::EncapsulatedRfc822MessagePart>()) {
                 return false;
             }
             return true;
         },
         [start](const QSharedPointer<MessagePart> &part) {
-            if (const auto attachment = dynamic_cast<MimeTreeParser::AttachmentMessagePart *>(part.data())) {
+            if (const auto attachment = dynamic_cast<MimeTreeParser::Core::AttachmentMessagePart *>(part.data())) {
                 return attachment->mimeType() == "text/calendar"_ba;
-            } else if (dynamic_cast<MimeTreeParser::AlternativeMessagePart *>(part.data())) {
+            } else if (dynamic_cast<MimeTreeParser::Core::AlternativeMessagePart *>(part.data())) {
                 return true;
-            } else if (dynamic_cast<MimeTreeParser::HeadersPart *>(part.data())) {
+            } else if (dynamic_cast<MimeTreeParser::Core::HeadersPart *>(part.data())) {
                 return false;
-            } else if (dynamic_cast<MimeTreeParser::EncapsulatedRfc822MessagePart *>(part.data())) {
+            } else if (dynamic_cast<MimeTreeParser::Core::EncapsulatedRfc822MessagePart *>(part.data())) {
                 if (start.data() == part.data()) {
                     return false;
                 }
@@ -276,7 +276,7 @@ void ObjectTreeParser::decryptAndVerify()
             return true;
         },
         [](const QSharedPointer<MessagePart> &part) {
-            if (const auto enc = dynamic_cast<MimeTreeParser::EncryptedMessagePart *>(part.data())) {
+            if (const auto enc = dynamic_cast<MimeTreeParser::Core::EncryptedMessagePart *>(part.data())) {
                 enc->startDecryption();
             }
             return false;
@@ -288,7 +288,7 @@ void ObjectTreeParser::decryptAndVerify()
             return true;
         },
         [](const QSharedPointer<MessagePart> &part) {
-            if (const auto enc = dynamic_cast<MimeTreeParser::SignedMessagePart *>(part.data())) {
+            if (const auto enc = dynamic_cast<MimeTreeParser::Core::SignedMessagePart *>(part.data())) {
                 enc->startVerification();
             }
             return false;
@@ -373,7 +373,7 @@ QSharedPointer<MessagePart> ObjectTreeParser::parsedPart() const
  */
 QList<QSharedPointer<MessagePart>> ObjectTreeParser::processType(KMime::Content *node, const QByteArray &mediaType, const QByteArray &subType)
 {
-    static MimeTreeParser::BodyPartFormatterBaseFactory factory;
+    static MimeTreeParser::Core::BodyPartFormatterBaseFactory factory;
     const auto sub = factory.subtypeRegistry(mediaType.constData());
     const auto range = sub.equal_range(subType.constData());
     for (auto it = range.first; it != range.second; ++it) {
diff --git a/src/core/objecttreeparser.h b/src/core/objecttreeparser.h
index 8cea1de..d0a9a9d 100644
--- a/src/core/objecttreeparser.h
+++ b/src/core/objecttreeparser.h
@@ -19,11 +19,11 @@ namespace KMime
 class Content;
 }
 
-namespace MimeTreeParser
+namespace MimeTreeParser::Core
 {
 
 /*!
-    \class MimeTreeParser::ObjectTreeParser
+    \class MimeTreeParser::Core::ObjectTreeParser
     \inmodule MimeTreeParserCore
     \inheaderfile MimeTreeParserCore/ObjectTreeParser
 
diff --git a/src/core/partmetadata.h b/src/core/partmetadata.h
index 1821578..61bce4d 100644
--- a/src/core/partmetadata.h
+++ b/src/core/partmetadata.h
@@ -9,7 +9,7 @@
 #include <gpgme++/context.h>
 #include <gpgme++/verificationresult.h>
 
-namespace MimeTreeParser
+namespace MimeTreeParser::Core
 {
 
 class PartMetaData
diff --git a/src/core/partmodel.cpp b/src/core/partmodel.cpp
index 951182c..a66d0a7 100644
--- a/src/core/partmodel.cpp
+++ b/src/core/partmodel.cpp
@@ -21,10 +21,10 @@
 
 #include <gpgme++/verificationresult.h>
 using namespace Qt::Literals::StringLiterals;
-static std::optional<GpgME::Signature> signatureFromMessagePart(MimeTreeParser::MessagePart *messagePart)
+static std::optional<GpgME::Signature> signatureFromMessagePart(MimeTreeParser::Core::MessagePart *messagePart)
 {
     const auto signatureState = messagePart->signatureState();
-    const bool messageIsSigned = signatureState == MimeTreeParser::KMMsgFullySigned;
+    const bool messageIsSigned = signatureState == MimeTreeParser::Core::KMMsgFullySigned;
 
     if (!messageIsSigned) {
         return std::nullopt;
@@ -117,7 +117,7 @@ static QString addCss(const QString &s)
 class PartModelPrivate
 {
 public:
-    PartModelPrivate(PartModel *q_ptr, const std::shared_ptr<MimeTreeParser::ObjectTreeParser> &parser)
+    PartModelPrivate(PartModel *q_ptr, const std::shared_ptr<MimeTreeParser::Core::ObjectTreeParser> &parser)
         : q(q_ptr)
         , mParser(parser)
     {
@@ -126,7 +126,7 @@ public:
 
     ~PartModelPrivate() = default;
 
-    void checkPart(const QSharedPointer<MimeTreeParser::MessagePart> part)
+    void checkPart(const QSharedPointer<MimeTreeParser::Core::MessagePart> part)
     {
         mMimeTypeCache[part.data()] = part->mimeType();
         // Extract the content of the part and
@@ -134,22 +134,22 @@ public:
     }
 
     // Recursively find encapsulated messages
-    void findEncapsulated(const QSharedPointer<MimeTreeParser::EncapsulatedRfc822MessagePart> &e)
+    void findEncapsulated(const QSharedPointer<MimeTreeParser::Core::EncapsulatedRfc822MessagePart> &e)
     {
         mEncapsulatedParts[e.data()] = mParser->collectContentParts(e);
         for (const auto &subPart : std::as_const(mEncapsulatedParts[e.data()])) {
             checkPart(subPart);
             mParents[subPart.data()] = e.data();
-            if (auto encapsulatedSub = subPart.dynamicCast<MimeTreeParser::EncapsulatedRfc822MessagePart>()) {
+            if (auto encapsulatedSub = subPart.dynamicCast<MimeTreeParser::Core::EncapsulatedRfc822MessagePart>()) {
                 findEncapsulated(encapsulatedSub);
             }
         }
     }
 
-    QVariant extractContent(MimeTreeParser::MessagePart *messagePart)
+    QVariant extractContent(MimeTreeParser::Core::MessagePart *messagePart)
     {
-        if (auto alternativePart = dynamic_cast<MimeTreeParser::AlternativeMessagePart *>(messagePart)) {
-            if (alternativePart->availableModes().contains(MimeTreeParser::AlternativeMessagePart::MultipartIcal)) {
+        if (auto alternativePart = dynamic_cast<MimeTreeParser::Core::AlternativeMessagePart *>(messagePart)) {
+            if (alternativePart->availableModes().contains(MimeTreeParser::Core::AlternativeMessagePart::MultipartIcal)) {
                 return alternativePart->icalContent();
             }
         }
@@ -171,13 +171,13 @@ public:
                 const auto result = PartModel::trim(html);
                 isTrimmed = result.second;
                 Q_EMIT q->trimMailChanged();
-                return MimeTreeParser::linkify(result.first);
+                return MimeTreeParser::Core::linkify(result.first);
             }
-            return MimeTreeParser::linkify(html);
+            return MimeTreeParser::Core::linkify(html);
         };
 
         if (messagePart->isHtml()) {
-            if (dynamic_cast<MimeTreeParser::AlternativeMessagePart *>(messagePart)) {
+            if (dynamic_cast<MimeTreeParser::Core::AlternativeMessagePart *>(messagePart)) {
                 containsHtmlAndPlain = true;
                 Q_EMIT q->containsHtmlChanged();
                 if (!showHtml) {
@@ -187,7 +187,7 @@ public:
             return addCss(mParser->resolveCidLinks(messagePart->htmlContent()));
         }
 
-        if (auto attachmentPart = dynamic_cast<MimeTreeParser::AttachmentMessagePart *>(messagePart)) {
+        if (auto attachmentPart = dynamic_cast<MimeTreeParser::Core::AttachmentMessagePart *>(messagePart)) {
             auto node = attachmentPart->node();
             if (node && mMimeTypeCache[attachmentPart] == "text/calendar"_ba) {
                 return node->decodedBody();
@@ -197,7 +197,7 @@ public:
         return preprocessPlaintext(messagePart->text());
     }
 
-    QVariant contentForPart(MimeTreeParser::MessagePart *messagePart) const
+    QVariant contentForPart(MimeTreeParser::Core::MessagePart *messagePart) const
     {
         return mContents.value(messagePart);
     }
@@ -211,7 +211,7 @@ public:
         isTrimmed = false;
 
         const auto parts = mParser->collectContentParts();
-        QList<QSharedPointer<MimeTreeParser::MessagePart>> filteredParts;
+        QList<QSharedPointer<MimeTreeParser::Core::MessagePart>> filteredParts;
 
         for (const auto &part : parts) {
             if (part->node()) {
@@ -229,7 +229,7 @@ public:
 
         for (const auto &part : std::as_const(filteredParts)) {
             checkPart(part);
-            if (auto encapsulatedPart = part.dynamicCast<MimeTreeParser::EncapsulatedRfc822MessagePart>()) {
+            if (auto encapsulatedPart = part.dynamicCast<MimeTreeParser::Core::EncapsulatedRfc822MessagePart>()) {
                 findEncapsulated(encapsulatedPart);
             }
         }
@@ -244,19 +244,19 @@ public:
     }
 
     PartModel *const q;
-    QList<QSharedPointer<MimeTreeParser::MessagePart>> mParts;
-    QHash<MimeTreeParser::MessagePart *, QByteArray> mMimeTypeCache;
-    QHash<MimeTreeParser::MessagePart *, QList<QSharedPointer<MimeTreeParser::MessagePart>>> mEncapsulatedParts;
-    QHash<MimeTreeParser::MessagePart *, MimeTreeParser::MessagePart *> mParents;
-    QMap<MimeTreeParser::MessagePart *, QVariant> mContents;
-    std::shared_ptr<MimeTreeParser::ObjectTreeParser> mParser;
+    QList<QSharedPointer<MimeTreeParser::Core::MessagePart>> mParts;
+    QHash<MimeTreeParser::Core::MessagePart *, QByteArray> mMimeTypeCache;
+    QHash<MimeTreeParser::Core::MessagePart *, QList<QSharedPointer<MimeTreeParser::Core::MessagePart>>> mEncapsulatedParts;
+    QHash<MimeTreeParser::Core::MessagePart *, MimeTreeParser::Core::MessagePart *> mParents;
+    QMap<MimeTreeParser::Core::MessagePart *, QVariant> mContents;
+    std::shared_ptr<MimeTreeParser::Core::ObjectTreeParser> mParser;
     bool showHtml{false};
     bool containsHtmlAndPlain{false};
     bool trimMail{false};
     bool isTrimmed{false};
 };
 
-PartModel::PartModel(std::shared_ptr<MimeTreeParser::ObjectTreeParser> parser, QObject *parent)
+PartModel::PartModel(std::shared_ptr<MimeTreeParser::Core::ObjectTreeParser> parser, QObject *parent)
     : QAbstractItemModel(parent)
     , d(std::unique_ptr<PartModelPrivate>(new PartModelPrivate(this, parser)))
 {
@@ -333,8 +333,8 @@ QModelIndex PartModel::index(int row, int column, const QModelIndex &parent) con
         return QModelIndex();
     }
     if (parent.isValid()) {
-        const auto part = static_cast<MimeTreeParser::MessagePart *>(parent.internalPointer());
-        auto encapsulatedPart = dynamic_cast<MimeTreeParser::EncapsulatedRfc822MessagePart *>(part);
+        const auto part = static_cast<MimeTreeParser::Core::MessagePart *>(parent.internalPointer());
+        auto encapsulatedPart = dynamic_cast<MimeTreeParser::Core::EncapsulatedRfc822MessagePart *>(part);
 
         if (encapsulatedPart) {
             const auto parts = d->mEncapsulatedParts[encapsulatedPart];
@@ -350,7 +350,7 @@ QModelIndex PartModel::index(int row, int column, const QModelIndex &parent) con
     return QModelIndex();
 }
 
-SignatureInfo encryptionInfo(MimeTreeParser::MessagePart *messagePart)
+SignatureInfo encryptionInfo(MimeTreeParser::Core::MessagePart *messagePart)
 {
     SignatureInfo signatureInfo;
     const auto encryptions = messagePart->encryptions();
@@ -377,7 +377,7 @@ const T *findHeader(const KMime::Content *content)
     return findHeader<T>(content->parent());
 }
 
-PartModel::SecurityLevel PartModel::signatureSecurityLevel(MimeTreeParser::MessagePart *messagePart)
+PartModel::SecurityLevel PartModel::signatureSecurityLevel(MimeTreeParser::Core::MessagePart *messagePart)
 {
     auto signature = signatureFromMessagePart(messagePart);
     if (!signature) {
@@ -399,7 +399,7 @@ PartModel::SecurityLevel PartModel::signatureSecurityLevel(MimeTreeParser::Messa
     return SecurityLevel::NotSoGood;
 }
 
-QString PartModel::signatureDetails(MimeTreeParser::MessagePart *messagePart)
+QString PartModel::signatureDetails(MimeTreeParser::Core::MessagePart *messagePart)
 {
     auto signature = signatureFromMessagePart(messagePart);
     if (!signature) {
@@ -423,15 +423,15 @@ QString PartModel::signatureDetails(MimeTreeParser::MessagePart *messagePart)
     return Kleo::Formatting::prettySignature(*signature, {});
 }
 
-static bool isEncapsulatingPart(MimeTreeParser::MessagePart *part)
+static bool isEncapsulatingPart(MimeTreeParser::Core::MessagePart *part)
 {
-    return qobject_cast<MimeTreeParser::SignedMessagePart *>(part) || qobject_cast<MimeTreeParser::EncryptedMessagePart *>(part)
-        || qobject_cast<MimeTreeParser::EncapsulatedRfc822MessagePart *>(part);
+    return qobject_cast<MimeTreeParser::Core::SignedMessagePart *>(part) || qobject_cast<MimeTreeParser::Core::EncryptedMessagePart *>(part)
+        || qobject_cast<MimeTreeParser::Core::EncapsulatedRfc822MessagePart *>(part);
 }
 
-static QList<QSharedPointer<MimeTreeParser::MessagePart>> getAttachmentChildParts(MimeTreeParser::MessagePart *parentPart)
+static QList<QSharedPointer<MimeTreeParser::Core::MessagePart>> getAttachmentChildParts(MimeTreeParser::Core::MessagePart *parentPart)
 {
-    QList<QSharedPointer<MimeTreeParser::MessagePart>> ret;
+    QList<QSharedPointer<MimeTreeParser::Core::MessagePart>> ret;
     for (auto sub : parentPart->subParts()) {
         if (sub->isAttachment()) {
             ret.append(sub);
@@ -442,7 +442,7 @@ static QList<QSharedPointer<MimeTreeParser::MessagePart>> getAttachmentChildPart
     return ret;
 }
 
-static MimeTreeParser::MessagePart *encapsulatingPart(MimeTreeParser::MessagePart *part)
+static MimeTreeParser::Core::MessagePart *encapsulatingPart(MimeTreeParser::Core::MessagePart *part)
 {
     auto parent = part;
     while (parent->parentPart() && !isEncapsulatingPart(parent)) {
@@ -458,20 +458,20 @@ QVariant PartModel::data(const QModelIndex &index, int role) const
     }
 
     if (index.internalPointer()) {
-        const auto messagePart = static_cast<MimeTreeParser::MessagePart *>(index.internalPointer());
+        const auto messagePart = static_cast<MimeTreeParser::Core::MessagePart *>(index.internalPointer());
         // qWarning() << "Found message part " << messagePart->metaObject()->className() << messagePart->partMetaData()->status << messagePart->error();
         Q_ASSERT(messagePart);
         switch (role) {
         case Qt::DisplayRole:
             return u"Content%1"_s;
         case SenderRole: {
-            if (auto e = dynamic_cast<MimeTreeParser::EncapsulatedRfc822MessagePart *>(messagePart)) {
+            if (auto e = dynamic_cast<MimeTreeParser::Core::EncapsulatedRfc822MessagePart *>(messagePart)) {
                 return e->from();
             }
             return {};
         }
         case DateRole: {
-            if (auto e = dynamic_cast<MimeTreeParser::EncapsulatedRfc822MessagePart *>(messagePart)) {
+            if (auto e = dynamic_cast<MimeTreeParser::Core::EncapsulatedRfc822MessagePart *>(messagePart)) {
                 return e->date();
             }
             return {};
@@ -480,15 +480,15 @@ QVariant PartModel::data(const QModelIndex &index, int role) const
             if (messagePart->error()) {
                 return QVariant::fromValue(Types::Error);
             }
-            if (dynamic_cast<MimeTreeParser::EncapsulatedRfc822MessagePart *>(messagePart)) {
+            if (dynamic_cast<MimeTreeParser::Core::EncapsulatedRfc822MessagePart *>(messagePart)) {
                 return QVariant::fromValue(Types::Encapsulated);
             }
-            if (auto alternativePart = dynamic_cast<MimeTreeParser::AlternativeMessagePart *>(messagePart)) {
-                if (alternativePart->availableModes().contains(MimeTreeParser::AlternativeMessagePart::MultipartIcal)) {
+            if (auto alternativePart = dynamic_cast<MimeTreeParser::Core::AlternativeMessagePart *>(messagePart)) {
+                if (alternativePart->availableModes().contains(MimeTreeParser::Core::AlternativeMessagePart::MultipartIcal)) {
                     return QVariant::fromValue(Types::Ical);
                 }
             }
-            if (auto attachmentPart = dynamic_cast<MimeTreeParser::AttachmentMessagePart *>(messagePart)) {
+            if (auto attachmentPart = dynamic_cast<MimeTreeParser::Core::AttachmentMessagePart *>(messagePart)) {
                 auto node = attachmentPart->node();
                 if (!node) {
                     qWarning() << "no content for attachment";
@@ -546,7 +546,7 @@ QVariant PartModel::data(const QModelIndex &index, int role) const
             auto parentPart = encapsulatingPart(messagePart);
             // only show attachments after the last content part in a given parent
             if (index.row() < rowCount(parent(index)) - 1) {
-                auto nextPart = static_cast<MimeTreeParser::MessagePart *>(this->index(index.row() + 1, 0, parent(index)).internalPointer());
+                auto nextPart = static_cast<MimeTreeParser::Core::MessagePart *>(this->index(index.row() + 1, 0, parent(index)).internalPointer());
                 if (nextPart && encapsulatingPart(nextPart) == parentPart) {
                     return QVariant();
                 }
@@ -578,7 +578,7 @@ QVariant PartModel::data(const QModelIndex &index, int role) const
         case EncryptionSecurityLevelRole: {
             // Color displayed for the encryption info box
             const auto encryption = messagePart->encryptionState();
-            const bool messageIsEncrypted = encryption == MimeTreeParser::KMMsgFullyEncrypted;
+            const bool messageIsEncrypted = encryption == MimeTreeParser::Core::KMMsgFullyEncrypted;
 
             if (messagePart->error()) {
                 return SecurityLevel::Bad;
@@ -588,7 +588,7 @@ QVariant PartModel::data(const QModelIndex &index, int role) const
         }
         case EncryptionIconNameRole: {
             const auto encryption = messagePart->encryptionState();
-            const bool messageIsEncrypted = encryption == MimeTreeParser::KMMsgFullyEncrypted;
+            const bool messageIsEncrypted = encryption == MimeTreeParser::Core::KMMsgFullyEncrypted;
 
             if (messagePart->error()) {
                 return u"data-error"_s;
@@ -619,8 +619,8 @@ QVariant PartModel::data(const QModelIndex &index, int role) const
             return messagePart->error();
         case ErrorString: {
             switch (messagePart->error()) {
-            case MimeTreeParser::MessagePart::NoKeyError: {
-                if (auto encryptedMessagePart = dynamic_cast<MimeTreeParser::EncryptedMessagePart *>(messagePart)) {
+            case MimeTreeParser::Core::MessagePart::NoKeyError: {
+                if (auto encryptedMessagePart = dynamic_cast<MimeTreeParser::Core::EncryptedMessagePart *>(messagePart)) {
                     if (encryptedMessagePart->isNoSecKey()) {
                         QString errorMessage = i18ndc("mimetreeparser", "@info:status", "You cannot decrypt this message.");
                         if (!encryptedMessagePart->decryptRecipients().empty()) {
@@ -631,7 +631,7 @@ QVariant PartModel::data(const QModelIndex &index, int role) const
                                           "The message is encrypted for the following recipients:",
                                           encryptedMessagePart->decryptRecipients().size());
                             errorMessage +=
-                                MimeTreeParser::decryptRecipientsToHtml(encryptedMessagePart->decryptRecipients(), encryptedMessagePart->cryptoProto());
+                                MimeTreeParser::Core::decryptRecipientsToHtml(encryptedMessagePart->decryptRecipients(), encryptedMessagePart->cryptoProto());
                         }
                         return errorMessage;
                     }
@@ -640,11 +640,11 @@ QVariant PartModel::data(const QModelIndex &index, int role) const
 
                 return messagePart->errorString();
 
-            case MimeTreeParser::MessagePart::UserCancelled:
+            case MimeTreeParser::Core::MessagePart::UserCancelled:
                 return i18ndc("mimetreeparser", "@info:status", "Decryption was canceled");
-            case MimeTreeParser::MessagePart::PassphraseError:
+            case MimeTreeParser::Core::MessagePart::PassphraseError:
                 return i18ndc("mimetreeparser", "@info:status", "Wrong passphrase");
-            case MimeTreeParser::MessagePart::UnknownError:
+            case MimeTreeParser::Core::MessagePart::UnknownError:
                 break;
             default:
                 break;
@@ -659,7 +659,7 @@ QVariant PartModel::data(const QModelIndex &index, int role) const
 QModelIndex PartModel::parent(const QModelIndex &index) const
 {
     if (index.isValid()) {
-        if (auto indexPart = static_cast<MimeTreeParser::MessagePart *>(index.internalPointer())) {
+        if (auto indexPart = static_cast<MimeTreeParser::Core::MessagePart *>(index.internalPointer())) {
             for (const auto &part : std::as_const(d->mParts)) {
                 if (part.data() == indexPart) {
                     return QModelIndex();
@@ -685,8 +685,8 @@ QModelIndex PartModel::parent(const QModelIndex &index) const
 int PartModel::rowCount(const QModelIndex &parent) const
 {
     if (parent.isValid()) {
-        const auto part = static_cast<MimeTreeParser::MessagePart *>(parent.internalPointer());
-        auto encapsulatedPart = dynamic_cast<MimeTreeParser::EncapsulatedRfc822MessagePart *>(part);
+        const auto part = static_cast<MimeTreeParser::Core::MessagePart *>(parent.internalPointer());
+        auto encapsulatedPart = dynamic_cast<MimeTreeParser::Core::EncapsulatedRfc822MessagePart *>(part);
 
         if (encapsulatedPart) {
             const auto parts = d->mEncapsulatedParts[encapsulatedPart];
@@ -702,10 +702,10 @@ int PartModel::columnCount(const QModelIndex &) const
     return 1;
 }
 
-QSharedPointer<MimeTreeParser::MessagePart> PartModel::messagePart(const QModelIndex &index) const
+QSharedPointer<MimeTreeParser::Core::MessagePart> PartModel::messagePart(const QModelIndex &index) const
 {
     if (index.isValid()) {
-        auto nakedPointer = static_cast<MimeTreeParser::MessagePart *>(index.internalPointer());
+        auto nakedPointer = static_cast<MimeTreeParser::Core::MessagePart *>(index.internalPointer());
         for (const auto &sharedPointer : std::as_const(d->mParts)) {
             if (sharedPointer.data() == nakedPointer) {
                 return sharedPointer;
diff --git a/src/core/partmodel.h b/src/core/partmodel.h
index c55d643..7b5770e 100644
--- a/src/core/partmodel.h
+++ b/src/core/partmodel.h
@@ -20,13 +20,13 @@ namespace QGpgME
 class Protocol;
 }
 
-namespace MimeTreeParser
+namespace MimeTreeParser::Core
 {
 class ObjectTreeParser;
 }
 class PartModelPrivate;
 /*!
- * \class MimeTreeParser::PartModel
+ * \class PartModel
  * \inmodule MimeTreeParserCore
  * \inheaderfile MimeTreeParserCore/PartModel
  */
@@ -42,7 +42,7 @@ public:
      * \brief Constructs a PartModel
      * \param parser The object tree parser
      */
-    PartModel(std::shared_ptr<MimeTreeParser::ObjectTreeParser> parser, QObject *parent);
+    PartModel(std::shared_ptr<MimeTreeParser::Core::ObjectTreeParser> parser, QObject *parent);
     /*!
      * \brief Destroys the PartModel
      */
@@ -99,7 +99,7 @@ public:
     [[nodiscard]] int rowCount(const QModelIndex &parent = QModelIndex()) const override;
     [[nodiscard]] int columnCount(const QModelIndex &parent = QModelIndex()) const override;
 
-    template<typename T = MimeTreeParser::MessagePart>
+    template<typename T = MimeTreeParser::Core::MessagePart>
     [[nodiscard]] QSharedPointer<T> part(const QModelIndex &index) const
     {
         return messagePart(index).dynamicCast<T>();
@@ -141,13 +141,13 @@ public:
      * \param messagePart The message part to check
      * \return The signature security level
      */
-    static SecurityLevel signatureSecurityLevel(MimeTreeParser::MessagePart *messagePart);
+    static SecurityLevel signatureSecurityLevel(MimeTreeParser::Core::MessagePart *messagePart);
     /*!
      * \brief Returns the signature details for a message part
      * \param messagePart The message part to check
      * \return A string with signature details
      */
-    static QString signatureDetails(MimeTreeParser::MessagePart *messagePart);
+    static QString signatureDetails(MimeTreeParser::Core::MessagePart *messagePart);
 
 Q_SIGNALS:
     /*!
@@ -165,11 +165,11 @@ Q_SIGNALS:
 
 private:
     std::unique_ptr<PartModelPrivate> d;
-    QSharedPointer<MimeTreeParser::MessagePart> messagePart(const QModelIndex &index) const;
+    QSharedPointer<MimeTreeParser::Core::MessagePart> messagePart(const QModelIndex &index) const;
 };
 
 /*!
- * \class MimeTreeParser::SignatureInfo
+ * \class SignatureInfo
  * \inmodule MimeTreeParserCore
  * \inheaderfile MimeTreeParserCore/PartModel
  * \brief Contains information about a message signature
diff --git a/src/core/urlhandler.h b/src/core/urlhandler.h
index 54045e9..34f0517 100644
--- a/src/core/urlhandler.h
+++ b/src/core/urlhandler.h
@@ -9,7 +9,7 @@
 #include <QObject>
 #include <QWindow>
 /*!
- * \class MimeTreeParser::UrlHandler
+ * \class UrlHandler
  * \inmodule MimeTreeParserCore
  * \inheaderfile MimeTreeParserCore/UrlHandler
  */
diff --git a/src/core/utils.cpp b/src/core/utils.cpp
index 12c96b5..1f7cde4 100644
--- a/src/core/utils.cpp
+++ b/src/core/utils.cpp
@@ -11,9 +11,9 @@ using namespace Qt::Literals::StringLiterals;
 #include <Libkleo/DnAttributes>
 #include <Libkleo/Formatting>
 
-using namespace MimeTreeParser;
+using namespace MimeTreeParser::Core;
 
-KMime::Content *MimeTreeParser::findTypeInDirectChildren(KMime::Content *content, const QByteArray &mimeType)
+KMime::Content *MimeTreeParser::Core::findTypeInDirectChildren(KMime::Content *content, const QByteArray &mimeType)
 {
     const auto contents = content->contents();
     for (const auto child : contents) {
@@ -24,8 +24,8 @@ KMime::Content *MimeTreeParser::findTypeInDirectChildren(KMime::Content *content
     return nullptr;
 }
 
-QString MimeTreeParser::decryptRecipientsToHtml(const std::vector<std::pair<GpgME::DecryptionResult::Recipient, GpgME::Key>> &recipients,
-                                                const QGpgME::Protocol *cryptoProto)
+QString MimeTreeParser::Core::decryptRecipientsToHtml(const std::vector<std::pair<GpgME::DecryptionResult::Recipient, GpgME::Key>> &recipients,
+                                                      const QGpgME::Protocol *cryptoProto)
 {
     QString text = u"<ul>"_s;
     for (const auto &recipientIt : recipients) {
@@ -53,7 +53,7 @@ QString MimeTreeParser::decryptRecipientsToHtml(const std::vector<std::pair<GpgM
     return text;
 }
 
-QString MimeTreeParser::dnToDisplayName(const QGpgME::DN &dn)
+QString MimeTreeParser::Core::dnToDisplayName(const QGpgME::DN &dn)
 {
     QString displayName = dn[u"CN"_s];
     if (displayName.isEmpty()) {
diff --git a/src/core/utils.h b/src/core/utils.h
index d88e669..798b263 100644
--- a/src/core/utils.h
+++ b/src/core/utils.h
@@ -17,7 +17,7 @@
 
 #include "mimetreeparser_core_export.h"
 
-namespace MimeTreeParser
+namespace MimeTreeParser::Core
 {
 [[nodiscard]] KMime::Content *findTypeInDirectChildren(KMime::Content *content, const QByteArray &mimeType);
 
diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt
index e21833b..3a0c26c 100644
--- a/src/widgets/CMakeLists.txt
+++ b/src/widgets/CMakeLists.txt
@@ -82,8 +82,6 @@ set_target_properties(
             MimeTreeParserWidgets
 )
 
-target_link_options(KPim6MimeTreeParserWidgets PRIVATE "LINKER:-Bsymbolic")
-
 ecm_generate_pri_file(BASE_NAME MimeTreeParserWidgets
     LIB_NAME KPim6MimeTreeParserWidgets
     DEPS "MimeTreeParserWidgets"
diff --git a/src/widgets/messagecontainerwidget.cpp b/src/widgets/messagecontainerwidget.cpp
index 0d3ded6..beba18c 100644
--- a/src/widgets/messagecontainerwidget.cpp
+++ b/src/widgets/messagecontainerwidget.cpp
@@ -56,7 +56,7 @@ KMessageWidget::MessageType getType(PartModel::SecurityLevel securityLevel)
 class AttachmentBox : public QFrame
 {
 public:
-    AttachmentBox(const QList<QSharedPointer<MimeTreeParser::MessagePart>> &attachments, MessageWidgetContainer *parent)
+    AttachmentBox(const QList<QSharedPointer<MimeTreeParser::Core::MessagePart>> &attachments, MessageWidgetContainer *parent)
         : QFrame(parent)
         , maxWidgetWidth(50)
         , oldWidth(width())
@@ -81,7 +81,7 @@ public:
             option.initFrom(this);
             pic->setPixmap(icon.pixmap(style()->pixelMetric(QStyle::PM_SmallIconSize, &option, this)));
             innerLayout->addWidget(pic);
-            innerLayout->addWidget(new KSqueezedTextLabel(attachment->filename(MimeTreeParser::MessagePart::FallbackToNameOrPlaceholder)));
+            innerLayout->addWidget(new KSqueezedTextLabel(attachment->filename(MimeTreeParser::Core::MessagePart::FallbackToNameOrPlaceholder)));
             innerLayout->setStretch(1, 1);
 
             widget->setContextMenuPolicy(Qt::CustomContextMenu);
@@ -228,7 +228,7 @@ void MessageWidgetContainer::createLayout(const QModelIndex &idx)
             if (url.path() == QLatin1StringView("showDetails")) {
                 QString newText = text + QLatin1Char(' ') + i18n("The message is encrypted for the following recipients:");
 
-                newText += MimeTreeParser::decryptRecipientsToHtml(m_encryptionInfo.decryptRecipients, m_encryptionInfo.cryptoProto);
+                newText += MimeTreeParser::Core::decryptRecipientsToHtml(m_encryptionInfo.decryptRecipients, m_encryptionInfo.cryptoProto);
 
                 encryptionMessage->setText(newText);
                 return;
@@ -262,7 +262,7 @@ void MessageWidgetContainer::createLayout(const QModelIndex &idx)
     m_innerLayout->setContentsMargins({});
     vLayout->addLayout(m_innerLayout);
 
-    const auto attachments = idx.data(PartModel::OwnedAttachmentsRole).value<QList<QSharedPointer<MimeTreeParser::MessagePart>>>();
+    const auto attachments = idx.data(PartModel::OwnedAttachmentsRole).value<QList<QSharedPointer<MimeTreeParser::Core::MessagePart>>>();
     if (!attachments.isEmpty()) {
         vLayout->addWidget(new AttachmentBox(attachments, this));
     }
diff --git a/src/widgets/messagecontainerwidget_p.h b/src/widgets/messagecontainerwidget_p.h
index 739b6ee..dadcba7 100644
--- a/src/widgets/messagecontainerwidget_p.h
+++ b/src/widgets/messagecontainerwidget_p.h
@@ -31,7 +31,7 @@ public:
     QLayout *innerLayout() const;
 
 Q_SIGNALS:
-    void attachmentContextMenu(const QSharedPointer<MimeTreeParser::MessagePart> part, const QPoint &pos);
+    void attachmentContextMenu(const QSharedPointer<MimeTreeParser::Core::MessagePart> part, const QPoint &pos);
 
 protected:
     /*!
diff --git a/src/widgets/messageviewer.cpp b/src/widgets/messageviewer.cpp
index 3316306..05c9327 100644
--- a/src/widgets/messageviewer.cpp
+++ b/src/widgets/messageviewer.cpp
@@ -33,6 +33,7 @@
 #include <qnamespace.h>
 
 using namespace MimeTreeParser::Widgets;
+using namespace MimeTreeParser::Core;
 using namespace Qt::Literals::StringLiterals;
 
 class MessageViewer::Private
@@ -57,18 +58,18 @@ public:
     UrlHandler *urlHandler = nullptr;
     KMessageWidget *const messageWidget = nullptr;
 
-    QList<QSharedPointer<MimeTreeParser::MessagePart>> partsForActions;
+    QList<QSharedPointer<MimeTreeParser::Core::MessagePart>> partsForActions;
     bool fixedFont = false;
 
-    void openSelectedAttachments(const QList<QSharedPointer<MimeTreeParser::MessagePart>> &selectedParts);
-    void saveSelectedAttachments(const QList<QSharedPointer<MimeTreeParser::MessagePart>> &selectedParts);
-    void showContextMenu(const QList<QSharedPointer<MimeTreeParser::MessagePart>> &parts);
-    QList<QSharedPointer<MimeTreeParser::MessagePart>> partsSelectedInView() const;
-    void importPublicKey(const QSharedPointer<MimeTreeParser::MessagePart> &part);
+    void openSelectedAttachments(const QList<QSharedPointer<MimeTreeParser::Core::MessagePart>> &selectedParts);
+    void saveSelectedAttachments(const QList<QSharedPointer<MimeTreeParser::Core::MessagePart>> &selectedParts);
+    void showContextMenu(const QList<QSharedPointer<MimeTreeParser::Core::MessagePart>> &parts);
+    QList<QSharedPointer<MimeTreeParser::Core::MessagePart>> partsSelectedInView() const;
+    void importPublicKey(const QSharedPointer<MimeTreeParser::Core::MessagePart> &part);
     void recursiveBuildViewer(PartModel *parts, QVBoxLayout *layout, const QModelIndex &parent);
 };
 
-void MessageViewer::Private::openSelectedAttachments(const QList<QSharedPointer<MimeTreeParser::MessagePart>> &selectedParts)
+void MessageViewer::Private::openSelectedAttachments(const QList<QSharedPointer<MimeTreeParser::Core::MessagePart>> &selectedParts)
 {
     Q_ASSERT(parser);
     Q_ASSERT(selectedParts.count() >= 1);
@@ -77,7 +78,7 @@ void MessageViewer::Private::openSelectedAttachments(const QList<QSharedPointer<
     }
 }
 
-void MessageViewer::Private::saveSelectedAttachments(const QList<QSharedPointer<MimeTreeParser::MessagePart>> &selectedParts)
+void MessageViewer::Private::saveSelectedAttachments(const QList<QSharedPointer<MimeTreeParser::Core::MessagePart>> &selectedParts)
 {
     Q_ASSERT(parser);
     Q_ASSERT(selectedParts.count() >= 1);
@@ -91,13 +92,13 @@ void MessageViewer::Private::saveSelectedAttachments(const QList<QSharedPointer<
     }
 }
 
-void MessageViewer::Private::importPublicKey(const QSharedPointer<MimeTreeParser::MessagePart> &part)
+void MessageViewer::Private::importPublicKey(const QSharedPointer<MimeTreeParser::Core::MessagePart> &part)
 {
     Q_ASSERT(parser);
     parser->attachments()->importPublicKey(part);
 }
 
-void MessageViewer::Private::showContextMenu(const QList<QSharedPointer<MimeTreeParser::MessagePart>> &selectedParts)
+void MessageViewer::Private::showContextMenu(const QList<QSharedPointer<MimeTreeParser::Core::MessagePart>> &selectedParts)
 {
     const int numberOfParts(selectedParts.count());
     QMenu menu;
@@ -127,13 +128,13 @@ void MessageViewer::Private::showContextMenu(const QList<QSharedPointer<MimeTree
     menu.exec(QCursor::pos());
 }
 
-QList<QSharedPointer<MimeTreeParser::MessagePart>> MessageViewer::Private::partsSelectedInView() const
+QList<QSharedPointer<MimeTreeParser::Core::MessagePart>> MessageViewer::Private::partsSelectedInView() const
 {
     const QModelIndexList selectedRows = attachmentView->selectionModel()->selectedRows();
-    QList<QSharedPointer<MimeTreeParser::MessagePart>> selectedMessageParts;
+    QList<QSharedPointer<MimeTreeParser::Core::MessagePart>> selectedMessageParts;
     selectedMessageParts.reserve(selectedRows.count());
     for (const QModelIndex &index : selectedRows) {
-        auto part = attachmentView->model()->data(index, AttachmentModel::AttachmentPartRole).value<QSharedPointer<MimeTreeParser::MessagePart>>();
+        auto part = attachmentView->model()->data(index, AttachmentModel::AttachmentPartRole).value<QSharedPointer<MimeTreeParser::Core::MessagePart>>();
         selectedMessageParts.append(part);
     }
     return selectedMessageParts;
@@ -231,7 +232,7 @@ std::shared_ptr<KMime::Message> MessageViewer::message() const
     return d->parser ? d->parser->message() : std::shared_ptr<KMime::Message>{};
 }
 
-std::shared_ptr<MimeTreeParser::ObjectTreeParser> MessageViewer::parser() const
+std::shared_ptr<MimeTreeParser::Core::ObjectTreeParser> MessageViewer::parser() const
 {
     return d->parser ? d->parser->parser() : nullptr;
 }
@@ -256,7 +257,7 @@ void MessageViewer::Private::recursiveBuildViewer(PartModel *parts, QVBoxLayout
             container->innerLayout()->addWidget(label);
             lay->addWidget(container);
 
-            connect(container, &MessageWidgetContainer::attachmentContextMenu, q, [this](const QSharedPointer<MimeTreeParser::MessagePart> part) {
+            connect(container, &MessageWidgetContainer::attachmentContextMenu, q, [this](const QSharedPointer<MimeTreeParser::Core::MessagePart> part) {
                 showContextMenu({part});
             });
 
diff --git a/src/widgets/messageviewer.h b/src/widgets/messageviewer.h
index fc4d114..8806e63 100644
--- a/src/widgets/messageviewer.h
+++ b/src/widgets/messageviewer.h
@@ -14,14 +14,18 @@
 
 class QPainter;
 
-namespace MimeTreeParser
+namespace MimeTreeParser::Core
 {
 class ObjectTreeParser;
+}
+
+namespace MimeTreeParser
+{
 
 namespace Widgets
 {
 /*!
- * \class MimeTreeParser::MessageViewer
+ * \class MimeTreeParser::Widgets::MessageViewer
  * \inmodule MimeTreeParserWidgets
  * \inheaderfile MimeTreeParserWidgets/MessageViewer
  *
@@ -61,7 +65,7 @@ public:
      *
      * \return A shared pointer to the ObjectTreeParser
      */
-    [[nodiscard]] std::shared_ptr<MimeTreeParser::ObjectTreeParser> parser() const;
+    [[nodiscard]] std::shared_ptr<MimeTreeParser::Core::ObjectTreeParser> parser() const;
     /*!
      * \brief Returns whether a fixed width font is used
      * \return True if fixed font is enabled
diff --git a/src/widgets/messageviewerbase_p.cpp b/src/widgets/messageviewerbase_p.cpp
index e47fbe4..95c287e 100644
--- a/src/widgets/messageviewerbase_p.cpp
+++ b/src/widgets/messageviewerbase_p.cpp
@@ -36,6 +36,7 @@
 #include <mimetreeparser_widgets_debug.h>
 
 using namespace MimeTreeParser;
+using namespace MimeTreeParser::Core;
 using namespace Qt::Literals::StringLiterals;
 
 MessageViewerBasePrivate::MessageViewerBasePrivate(QWidget *qq)
diff --git a/src/widgets/messageviewerdialog.h b/src/widgets/messageviewerdialog.h
index a10a249..3ed1c80 100644
--- a/src/widgets/messageviewerdialog.h
+++ b/src/widgets/messageviewerdialog.h
@@ -19,7 +19,7 @@ namespace Widgets
 {
 
 /*!
- * \class MimeTreeParser::MessageViewerDialog
+ * \class MimeTreeParser::Widgets::MessageViewerDialog
  * \inmodule MimeTreeParserWidgets
  * \inheaderfile MimeTreeParserWidgets/MessageViewerDialog
  *
diff --git a/src/widgets/messageviewerwindow.h b/src/widgets/messageviewerwindow.h
index f72cb7c..0d39d14 100644
--- a/src/widgets/messageviewerwindow.h
+++ b/src/widgets/messageviewerwindow.h
@@ -19,7 +19,7 @@ namespace Widgets
 {
 
 /*!
- * \class MimeTreeParser::MessageViewerDialog
+ * \class MimeTreeParser::Widgets::MessageViewerWindow
  * \inmodule MimeTreeParserWidgets
  * \inheaderfile MimeTreeParserWidgets/MessageViewerDialog
  *
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.