[Pkg-giraffe-maintainers] Bug#865320: [PATCH] inetmapi: adjust for vmime 0.9.2 API

Dimitri John Ledkov xnox at ubuntu.com
Tue Jul 25 17:41:58 UTC 2017


From: Jan Engelhardt <development at kopano.io>

References: KC-263
---
 Rebased this patch onto 8.1.0 upstream release. - xnox.

 inetmapi/ECVMIMEUtils.cpp            |  40 ++---
 inetmapi/ECVMIMEUtils.h              |   5 +-
 inetmapi/MAPISMTPTransport.cpp       | 102 +++++-------
 inetmapi/MAPISMTPTransport.h         |  17 +-
 inetmapi/MAPIToVMIME.cpp             | 155 +++++++++---------
 inetmapi/MAPIToVMIME.h               |  19 +--
 inetmapi/SMIMEMessage.cpp            |   8 +-
 inetmapi/SMIMEMessage.h              |   3 +-
 inetmapi/VMIMEToMAPI.cpp             | 295 ++++++++++++++++++-----------------
 inetmapi/VMIMEToMAPI.h               |  46 +++---
 inetmapi/inetmapi.cpp                |   4 +-
 inetmapi/inputStreamMAPIAdapter.cpp  |   7 +-
 inetmapi/inputStreamMAPIAdapter.h    |  10 +-
 inetmapi/mapiAttachment.cpp          |  17 +-
 inetmapi/mapiAttachment.h            |   4 +-
 inetmapi/mapiTextPart.cpp            | 159 +++++++++----------
 inetmapi/mapiTextPart.h              |  56 +++----
 inetmapi/outputStreamMAPIAdapter.cpp |   4 +-
 inetmapi/outputStreamMAPIAdapter.h   |   7 +-
 inetmapi/serviceRegistration.inl     |  10 +-
 20 files changed, 479 insertions(+), 489 deletions(-)

--- a/inetmapi/ECVMIMEUtils.cpp
+++ b/inetmapi/ECVMIMEUtils.cpp
@@ -19,7 +19,7 @@
 
 // Damn windows header defines max which break C++ header files
 #undef max
-
+#include <memory>
 #include <iostream>
 
 #include "ECVMIMEUtils.h"
@@ -38,6 +38,7 @@
 #include <kopano/EMSAbTag.h>
 #include <kopano/ECABEntryID.h>
 #include <kopano/mapi_ptr.h>
+#include <vmime/base.hpp>
 
 using namespace std;
 
@@ -63,8 +64,9 @@
 class mapiTimeoutHandlerFactory : public vmime::net::timeoutHandlerFactory
 {
 public:
-	vmime::ref<vmime::net::timeoutHandler> create() {
-		return vmime::create<mapiTimeoutHandler>();
+	vmime::shared_ptr<vmime::net::timeoutHandler> create(void)
+	{
+		return vmime::make_shared<mapiTimeoutHandler>();
 	};
 };
 
@@ -106,7 +108,7 @@
 
 		if (bAddrFetchSuccess && bItemIsAUser) {
 			if (setRecips.find(strEmail) == setRecips.end()) {
-				recipients.appendMailbox(vmime::create<vmime::mailbox>(convert_to<string>(strEmail)));
+				recipients.appendMailbox(vmime::make_shared<vmime::mailbox>(convert_to<string>(strEmail)));
 				setRecips.insert(strEmail);
 				lpLogger->Log(EC_LOGLEVEL_DEBUG, "RCPT TO: %ls", strEmail.c_str());	
 			}
@@ -146,7 +148,7 @@
 				}
 			} else {
 				if (setRecips.find(strEmail) == setRecips.end()) {
-					recipients.appendMailbox(vmime::create<vmime::mailbox>(convert_to<string>(strEmail)));
+					recipients.appendMailbox(vmime::make_shared<vmime::mailbox>(convert_to<string>(strEmail)));
 					setRecips.insert(strEmail);
 
 					lpLogger->Log(EC_LOGLEVEL_DEBUG, "Sending to group-address %s instead of expanded list", convert_to<std::string>(strEmail).c_str());
@@ -266,7 +268,10 @@
 	return hr;
 }
 
-HRESULT ECVMIMESender::HrMakeRecipientsList(LPADRBOOK lpAdrBook, LPMESSAGE lpMessage, vmime::ref<vmime::message> vmMessage, vmime::mailboxList &recipients, bool bAllowEveryone, bool bAlwaysExpandDistrList)
+HRESULT ECVMIMESender::HrMakeRecipientsList(LPADRBOOK lpAdrBook,
+    LPMESSAGE lpMessage, vmime::shared_ptr<vmime::message> vmMessage,
+    vmime::mailboxList &recipients, bool bAllowEveryone,
+    bool bAlwaysExpandDistrList)
 {
 	HRESULT hr = hrSuccess;
 	SRestriction sRestriction;
@@ -318,14 +323,16 @@
 // This function does not catch the vmime exception
 // it should be handled by the calling party.
 
-HRESULT ECVMIMESender::sendMail(LPADRBOOK lpAdrBook, LPMESSAGE lpMessage, vmime::ref<vmime::message> vmMessage, bool bAllowEveryone, bool bAlwaysExpandDistrList)
+HRESULT ECVMIMESender::sendMail(LPADRBOOK lpAdrBook, LPMESSAGE lpMessage,
+    vmime::shared_ptr<vmime::message> vmMessage, bool bAllowEveryone,
+    bool bAlwaysExpandDistrList)
 {
 	HRESULT hr = hrSuccess;
 	vmime::mailbox expeditor;
 	vmime::mailboxList recipients;
-	vmime::ref<vmime::messaging::session> vmSession;
-	vmime::ref<vmime::messaging::transport>	vmTransport;
-	vmime::ref<vmime::net::smtp::MAPISMTPTransport> mapiTransport = NULL;
+	vmime::shared_ptr<vmime::messaging::session> vmSession;
+	vmime::shared_ptr<vmime::messaging::transport> vmTransport;
+	vmime::shared_ptr<vmime::net::smtp::MAPISMTPTransport> mapiTransport;
 
 	if (lpMessage == NULL || vmMessage == NULL)
 		return MAPI_E_INVALID_PARAMETER;
@@ -335,23 +342,20 @@
 
 	try {
 		// Session initialization (global properties)
-		vmSession = vmime::create <vmime::net::session>();
+		vmSession = vmime::net::session::create();
 
 		// set the server address and port, plus type of service by use of url
 		// and get our special mapismtp mailer
 		vmime::utility::url url("mapismtp", smtphost, smtpport);
 		vmTransport = vmSession->getTransport(url);
-		vmTransport->setTimeoutHandlerFactory(vmime::create<mapiTimeoutHandlerFactory>());
+		vmTransport->setTimeoutHandlerFactory(vmime::make_shared<mapiTimeoutHandlerFactory>());
 
 		// cast to access interface extra's
-		mapiTransport = vmTransport.dynamicCast<vmime::net::smtp::MAPISMTPTransport>();
+		mapiTransport = vmime::dynamicCast<vmime::net::smtp::MAPISMTPTransport>(vmTransport);
 
 		// get expeditor for 'mail from:' smtp command
 		try {
-			const vmime::mailbox& mbox = *vmMessage->getHeader()->findField(vmime::fields::FROM)->
-				getValue().dynamicCast <const vmime::mailbox>();
-
-			expeditor = mbox;
+			expeditor = *vmime::dynamicCast<vmime::mailbox>(vmMessage->getHeader()->findField(vmime::fields::FROM)->getValue());
 		}
 		catch (vmime::exceptions::no_such_field&) {
 			throw vmime::exceptions::no_expeditor();
@@ -375,7 +379,7 @@
 
         // Remove BCC headers from the message we're about to send
         try {
-			vmime::ref <vmime::headerField> bcc = vmMessage->getHeader()->findField(vmime::fields::BCC);
+		auto bcc = vmMessage->getHeader()->findField(vmime::fields::BCC);
 			vmMessage->getHeader()->removeField(bcc);
         }
         catch (vmime::exceptions::no_such_field&) { }
--- a/inetmapi/ECVMIMEUtils.h
+++ b/inetmapi/ECVMIMEUtils.h
@@ -18,6 +18,7 @@
 #ifndef ECVMIMEUTILS
 #define ECVMIMEUTILS
 
+#include <memory>
 #include <string>
 #include <set>
 #include <kopano/zcdefs.h>
@@ -27,13 +28,13 @@
 
 class ECVMIMESender _kc_final : public ECSender {
 private:
-	HRESULT HrMakeRecipientsList(LPADRBOOK lpAdrBook, LPMESSAGE lpMessage, vmime::ref<vmime::message> vmMessage, vmime::mailboxList &recipients, bool bAllowEveryone, bool bAlwaysExpandDistrList);
+	HRESULT HrMakeRecipientsList(LPADRBOOK lpAdrBook, LPMESSAGE lpMessage, vmime::shared_ptr<vmime::message> vmMessage, vmime::mailboxList &recipients, bool bAllowEveryone, bool bAlwaysExpandDistrList);
 	HRESULT HrExpandGroup(LPADRBOOK lpAdrBook, LPSPropValue lpGroupName, LPSPropValue lpGroupEntryID, vmime::mailboxList &recipients, std::set<std::wstring> &setGroups, std::set<std::wstring> &setRecips, bool bAllowEveryone);
 	HRESULT HrAddRecipsFromTable(LPADRBOOK lpAdrBook, IMAPITable *lpTable, vmime::mailboxList &recipients, std::set<std::wstring> &setGroups, std::set<std::wstring> &setRecips, bool bAllowEveryone, bool bAlwaysExpandDistrList);
 
 public:
 	ECVMIMESender(ECLogger *newlpLogger, std::string strSMTPHost, int port);
-	HRESULT sendMail(LPADRBOOK lpAdrBook, LPMESSAGE lpMessage, vmime::ref<vmime::message> vmMessage, bool bAllowEveryone, bool bAlwaysExpandDistrList);
+	HRESULT sendMail(LPADRBOOK lpAdrBook, LPMESSAGE lpMessage, vmime::shared_ptr<vmime::message> vmMessage, bool bAllowEveryone, bool bAlwaysExpandDistrList);
 };
 
 #endif
--- a/inetmapi/MAPISMTPTransport.cpp
+++ b/inetmapi/MAPISMTPTransport.cpp
@@ -51,6 +51,8 @@
 #include "vmime/mailboxList.hpp"
 
 #include "vmime/utility/filteredStream.hpp"
+#include <vmime/utility/outputStreamSocketAdapter.hpp>
+#include <vmime/utility/streamUtils.hpp>
 #include "vmime/utility/stringUtils.hpp"
 #include "vmime/net/defaultConnectionInfos.hpp"
 
@@ -83,7 +85,7 @@
 namespace net {
 namespace smtp {
 
-MAPISMTPTransport::MAPISMTPTransport(ref <session> sess, ref <security::authenticator> auth, const bool secured)
+MAPISMTPTransport::MAPISMTPTransport(vmime::shared_ptr <session> sess, vmime::shared_ptr <security::authenticator> auth, const bool secured)
 	: transport(sess, getInfosInstance(), auth), m_socket(NULL),
 	  m_authentified(false), m_extendedSMTP(false), m_timeoutHandler(NULL),
 	  m_isSMTPS(secured), m_secured(false), m_lpLogger(NULL),
@@ -129,21 +131,17 @@
 #if VMIME_HAVE_TLS_SUPPORT
 	if (m_isSMTPS)  // dedicated port/SMTPS
 	{
-		ref <tls::TLSSession> tlsSession =
-			vmime::create <tls::TLSSession>(getCertificateVerifier());
-
-		ref <tls::TLSSocket> tlsSocket =
-			tlsSession->getSocket(m_socket);
-
+		auto tlsSession = tls::TLSSession::create(getCertificateVerifier(), getSession()->getTLSProperties());
+		auto tlsSocket = tlsSession->getSocket(m_socket);
 		m_socket = tlsSocket;
 
 		m_secured = true;
-		m_cntInfos = vmime::create <tls::TLSSecuredConnectionInfos>(address, port, tlsSession, tlsSocket);
+		m_cntInfos = vmime::make_shared<tls::TLSSecuredConnectionInfos>(address, port, tlsSession, tlsSocket);
 	}
 	else
 #endif // VMIME_HAVE_TLS_SUPPORT
 	{
-		m_cntInfos = vmime::create <defaultConnectionInfos>(address, port);
+		m_cntInfos = vmime::make_shared<defaultConnectionInfos>(address, port);
 	}
 
 	if (m_lpLogger && m_lpLogger->Log(EC_LOGLEVEL_DEBUG))
@@ -159,7 +157,7 @@
 	// eg:  C: <connection to server>
 	// ---  S: 220 smtp.domain.com Service ready
 
-	ref <SMTPResponse> resp;
+	vmime::shared_ptr<SMTPResponse> resp;
 
 	if ((resp = readResponse())->getCode() != 220)
 	{
@@ -225,8 +223,7 @@
 
 	sendRequest("EHLO " + platform::getHandler()->getHostName());
 
-	ref <SMTPResponse> resp;
-
+	vmime::shared_ptr<SMTPResponse> resp;
 	if ((resp = readResponse())->getCode() != 250)
 	{
 		// Next, try "Basic" SMTP
@@ -286,7 +283,7 @@
 		throw exceptions::command_error("AUTH", "ESMTP not supported.");
 	}
 
-	getAuthenticator()->setService(thisRef().dynamicCast <service>());
+	getAuthenticator()->setService(vmime::dynamicCast<service>(shared_from_this()));
 
 #if VMIME_HAVE_SASL_SUPPORT
 	// First, try SASL authentication
@@ -328,7 +325,7 @@
 
 void MAPISMTPTransport::authenticateSASL()
 {
-	if (!getAuthenticator().dynamicCast <security::sasl::SASLAuthenticator>())
+	if (!vmime::dynamicCast<security::sasl::SASLAuthenticator>(getAuthenticator()))
 		throw exceptions::authentication_error("No SASL authenticator available.");
 
 	// Obtain SASL mechanisms supported by server from ESMTP extensions
@@ -339,10 +336,8 @@
 	if (saslMechs.empty())
 		throw exceptions::authentication_error("No SASL mechanism available.");
 
-	std::vector <ref <security::sasl::SASLMechanism> > mechList;
-
-	ref <security::sasl::SASLContext> saslContext =
-		vmime::create <security::sasl::SASLContext>();
+	std::vector<vmime::shared_ptr<security::sasl::SASLMechanism> > mechList;
+	auto saslContext = security::sasl::SASLContext::create();
 
 	for (unsigned int i = 0 ; i < saslMechs.size() ; ++i)
 	{
@@ -361,14 +356,12 @@
 		throw exceptions::authentication_error("No SASL mechanism available.");
 
 	// Try to suggest a mechanism among all those supported
-	ref <security::sasl::SASLMechanism> suggestedMech =
-		saslContext->suggestMechanism(mechList);
-
+	auto suggestedMech = saslContext->suggestMechanism(mechList);
 	if (!suggestedMech)
 		throw exceptions::authentication_error("Unable to suggest SASL mechanism.");
 
 	// Allow application to choose which mechanisms to use
-	mechList = getAuthenticator().dynamicCast <security::sasl::SASLAuthenticator>()->
+	mechList = vmime::dynamicCast<security::sasl::SASLAuthenticator>(getAuthenticator())->
 		getAcceptableMechanisms(mechList, suggestedMech);
 
 	if (mechList.empty())
@@ -377,19 +370,15 @@
 	// Try each mechanism in the list in turn
 	for (unsigned int i = 0 ; i < mechList.size() ; ++i)
 	{
-		ref <security::sasl::SASLMechanism> mech = mechList[i];
-
-		ref <security::sasl::SASLSession> saslSession =
-			saslContext->createSession("smtp", getAuthenticator(), mech);
-
+		auto mech = mechList[i];
+		auto saslSession = saslContext->createSession("smtp", getAuthenticator(), mech);
 		saslSession->init();
 
 		sendRequest("AUTH " + mech->getName());
 
 		for (bool cont = true ; cont ; )
 		{
-			ref <SMTPResponse> response = readResponse();
-
+			auto response = readResponse();
 			switch (response->getCode())
 			{
 			case 235:
@@ -400,10 +389,10 @@
 			case 334:
 			{
 				byte_t* challenge = 0;
-				int challengeLen = 0;
+				size_t challengeLen = 0;
 
 				byte_t* resp = 0;
-				int respLen = 0;
+				size_t respLen = 0;
 
 				try
 				{
@@ -458,24 +447,18 @@
 	try
 	{
 		sendRequest("STARTTLS");
-
-		ref <SMTPResponse> resp = readResponse();
-
+		auto resp = readResponse();
 		if (resp->getCode() != 220)
 			throw exceptions::command_error("STARTTLS", resp->getText());
 
-		ref <tls::TLSSession> tlsSession =
-			vmime::create <tls::TLSSession>(getCertificateVerifier());
-
-		ref <tls::TLSSocket> tlsSocket =
-			tlsSession->getSocket(m_socket);
-
-		tlsSocket->handshake(m_timeoutHandler);
+		auto tlsSession = tls::TLSSession::create(getCertificateVerifier(), getSession()->getTLSProperties());
+		auto tlsSocket = tlsSession->getSocket(m_socket);
+		tlsSocket->handshake();
 
 		m_socket = tlsSocket;
 
 		m_secured = true;
-		m_cntInfos = vmime::create <tls::TLSSecuredConnectionInfos>
+		m_cntInfos = vmime::make_shared<tls::TLSSecuredConnectionInfos>
 			(m_cntInfos->getHost(), m_cntInfos->getPort(), tlsSession, tlsSocket);
 	}
 	catch (exceptions::command_error&)
@@ -536,8 +519,7 @@
 
 	sendRequest("NOOP");
 
-	ref <SMTPResponse> resp = readResponse();
-
+	auto resp = readResponse();
 	if (resp->getCode() != 250)
 		throw exceptions::command_error("NOOP", resp->getText());
 }
@@ -545,9 +527,9 @@
 //                             
 // Only this function is altered, to return per recipient failure.
 //                             
-void MAPISMTPTransport::send(const mailbox& expeditor, const mailboxList& recipients,
-                         utility::inputStream& is, const utility::stream::size_type size,
-                         utility::progressListener* progress)
+void MAPISMTPTransport::send(const mailbox &expeditor,
+    const mailboxList &recipients, utility::inputStream &is, size_t size,
+    utility::progressListener *progress, const mailbox &sender)
 {
 	if (!isConnected())
 		throw exceptions::not_connected();
@@ -559,7 +541,7 @@
 		throw exceptions::no_expeditor();
 
 	// Emit the "MAIL" command
-	ref <SMTPResponse> resp;
+	vmime::shared_ptr<SMTPResponse> resp;
 	string strSend;
 	bool bDSN = m_bDSNRequest;
 	
@@ -568,7 +550,7 @@
 		bDSN = false; // Disable DSN because the server does not support this.
 	}
 
-	strSend = "MAIL FROM: <" + expeditor.getEmail() + ">";
+	strSend = "MAIL FROM: <" + expeditor.getEmail().toString() + ">";
 	if (bDSN) {
 		strSend += " RET=HDRS";
 		if (!m_strDSNTrackid.empty())
@@ -586,12 +568,11 @@
 	// Emit a "RCPT TO" command for each recipient
 	mTemporaryFailedRecipients.clear();
 	mPermanentFailedRecipients.clear();
-	for (int i = 0 ; i < recipients.getMailboxCount() ; ++i)
-	{
+	for (size_t i = 0 ; i < recipients.getMailboxCount(); ++i) {
 		const mailbox& mbox = *recipients.getMailboxAt(i);
 		unsigned int code;
 
-		strSend = "RCPT TO: <" + mbox.getEmail() + ">";
+		strSend = "RCPT TO: <" + mbox.getEmail().toString() + ">";
 		if (bDSN)
 			 strSend += " NOTIFY=SUCCESS,DELAY";
 
@@ -601,7 +582,7 @@
 
 		sFailedRecip entry;
 		entry.strRecipName = (WCHAR*)mbox.getName().getConvertedText(charset(CHARSET_WCHAR)).c_str(); // does this work?, or convert to utf-8 then wstring?
-		entry.strRecipEmail = mbox.getEmail();
+		entry.strRecipEmail = mbox.getEmail().toString();
 		entry.ulSMTPcode = code;
 		entry.strSMTPResponse = resp->getText();
 
@@ -655,7 +636,7 @@
 	fos.flush();
 
 	// Send end-of-data delimiter
-	m_socket->sendRaw("\r\n.\r\n", 5);
+	m_socket->sendRaw(reinterpret_cast<const vmime::byte_t *>("\r\n.\r\n"), 5);
 
 	if ((resp = readResponse())->getCode() != 250)
 	{
@@ -695,9 +676,11 @@
 		m_socket->send(buffer);
 }
 
-ref <SMTPResponse> MAPISMTPTransport::readResponse()
+vmime::shared_ptr <SMTPResponse> MAPISMTPTransport::readResponse(void)
 {
-	ref <SMTPResponse> resp = SMTPResponse::readResponse(m_socket, m_timeoutHandler);
+    vmime::shared_ptr<tracer> t;
+    auto resp = SMTPResponse::readResponse(t, m_socket, m_timeoutHandler, m_response_state);
+    m_response_state = resp->getCurrentState();
 	if (m_lpLogger && m_lpLogger->Log(EC_LOGLEVEL_DEBUG))
 		m_lpLogger->Log(EC_LOGLEVEL_DEBUG, "> %d %s", resp->getCode(), resp->getText().c_str());
 	return resp;
--- a/inetmapi/MAPISMTPTransport.h
+++ b/inetmapi/MAPISMTPTransport.h
@@ -51,6 +51,7 @@
 #include "vmime/net/socket.hpp"
 #include "vmime/net/timeoutHandler.hpp"
 
+#include <vmime/net/smtp/SMTPResponse.hpp>
 #include "vmime/net/smtp/SMTPServiceInfos.hpp"
 
 #include <inetmapi/inetmapi.h>
@@ -69,7 +70,7 @@
 class MAPISMTPTransport _kc_final : public transport {
 public:
 
-	MAPISMTPTransport(ref <session> sess, ref <security::authenticator> auth, const bool secured = false);
+	MAPISMTPTransport(vmime::shared_ptr<session> sess, vmime::shared_ptr<security::authenticator> auth, const bool secured = false);
 	~MAPISMTPTransport();
 
 	const std::string getProtocolName(void) const { return "mapismtp"; }
@@ -83,10 +84,10 @@
 
 	void noop();
 
-	void send(const mailbox& expeditor, const mailboxList& recipients, utility::inputStream& is, const utility::stream::size_type size, utility::progressListener* progress = NULL);
+	void send(const mailbox &expeditor, const mailboxList &recipients, utility::inputStream &, size_t, utility::progressListener * = NULL, const mailbox &sender = mailbox());
 
 	bool isSecuredConnection(void) const { return m_secured; }
-	ref<connectionInfos> getConnectionInfos(void) const { return m_cntInfos; }
+	vmime::shared_ptr<connectionInfos> getConnectionInfos(void) const { return m_cntInfos; }
 
 	// additional functions
 	const std::vector<sFailedRecip> &getPermanentFailedRecipients(void) const { return mPermanentFailedRecipients; }
@@ -97,7 +98,7 @@
 private:
 
 	void sendRequest(const string& buffer, const bool end = true);
-	ref <SMTPResponse> readResponse();
+	vmime::shared_ptr<SMTPResponse> readResponse(void);
 
 	void internalDisconnect();
 
@@ -111,18 +112,17 @@
 	void startTLS();
 #endif // VMIME_HAVE_TLS_SUPPORT
 
-	ref <socket> m_socket;
+	vmime::shared_ptr<socket> m_socket;
 	bool m_authentified;
 
 	bool m_extendedSMTP;
 	std::map <string, std::vector <string> > m_extensions;
-
-	ref <timeoutHandler> m_timeoutHandler;
+	vmime::shared_ptr<timeoutHandler> m_timeoutHandler;
 
 	const bool m_isSMTPS;
 
 	bool m_secured;
-	ref <connectionInfos> m_cntInfos;
+	vmime::shared_ptr<connectionInfos> m_cntInfos;
 
 
 	// Service infos
@@ -135,6 +135,7 @@
 	ECLogger *m_lpLogger;
 	bool m_bDSNRequest;
 	std::string m_strDSNTrackid;
+	SMTPResponse::state m_response_state;
 };
 
 
--- a/inetmapi/MAPIToVMIME.cpp
+++ b/inetmapi/MAPIToVMIME.cpp
@@ -191,7 +191,7 @@
 HRESULT MAPIToVMIME::processRecipients(IMessage *lpMessage, vmime::messageBuilder *lpVMMessageBuilder)
 {
 	HRESULT			hr					= hrSuccess;
-	vmime::ref<vmime::address>	vmMailbox;
+	vmime::shared_ptr<vmime::address> vmMailbox;
 	LPMAPITABLE		lpRecipientTable	= NULL;
 	LPSRowSet		pRows				= NULL;
 	LPSPropValue	pPropRecipType		= NULL;
@@ -269,7 +269,7 @@
 			}
 
 			// No recipients were in the 'To' .. add 'undisclosed recipients'
-			vmime::ref<vmime::mailboxGroup> undisclosed = vmime::create<vmime::mailboxGroup>(vmime::text("undisclosed-recipients"));
+			vmime::shared_ptr<vmime::mailboxGroup> undisclosed = vmime::make_shared<vmime::mailboxGroup>(vmime::text("undisclosed-recipients"));
 			lpVMMessageBuilder->getRecipients().appendAddress(undisclosed);
 		}
 			
@@ -323,9 +323,9 @@
 	ULONG			ulAttachmentMethod	= 0;
 	IMessage*		lpAttachedMessage	= NULL;
 
-	vmime::ref<vmime::utility::inputStream> inputDataStream = NULL;
-	vmime::ref<mapiAttachment> vmMapiAttach = NULL;
-	vmime::ref<vmime::attachment> vmMsgAtt = NULL;
+	vmime::shared_ptr<vmime::utility::inputStream> inputDataStream;
+	vmime::shared_ptr<mapiAttachment> vmMapiAttach;
+	vmime::shared_ptr<vmime::attachment> vmMsgAtt;
 	std::string		strContentId;
 	std::string		strContentLocation;
 	bool			bHidden = false;
@@ -358,7 +358,7 @@
 	}
 
 	if (ulAttachmentMethod == ATTACH_EMBEDDED_MSG) {
-		vmime::ref<vmime::message> vmNewMess;
+		vmime::shared_ptr<vmime::message> vmNewMess;
 		std::string strBuff;
 		vmime::utility::outputStreamStringAdapter mout(strBuff);
 
@@ -408,7 +408,7 @@
 		}
 		sopt = sopt_keep;
 
-		vmMsgAtt = vmime::create<vmime::parsedMessageAttachment>(vmNewMess);
+		vmMsgAtt = vmime::make_shared<vmime::parsedMessageAttachment>(vmNewMess);
 		lpVMMessageBuilder->appendAttachment(vmMsgAtt);
 	} else if (ulAttachmentMethod == ATTACH_BY_VALUE) {
 		hr = lpMessage->OpenAttach(ulAttachmentNum, NULL, MAPI_BEST_ACCESS, &lpAttach);
@@ -438,7 +438,8 @@
         }
         	
 		try {
-			inputDataStream = vmime::create<inputStreamMAPIAdapter>(lpStream);	// add ref to lpStream
+			// add ref to lpStream
+			inputDataStream = vmime::make_shared<inputStreamMAPIAdapter>(lpStream);
 
 			// Set filename
 			szFilename = L"data.bin";
@@ -466,9 +467,9 @@
 				vmime::mapiTextPart& textPart = dynamic_cast<vmime::mapiTextPart&>(*lpVMMessageBuilder->getTextPart());
 				// had szFilename .. but how, on inline?
 				// @todo find out how Content-Disposition receives highchar filename... always utf-8?
-				textPart.addObject(vmime::create<vmime::streamContentHandler>(inputDataStream, 0), vmime::encoding("base64"), vmMIMEType, strContentId, string(), strContentLocation);
+				textPart.addObject(vmime::make_shared<vmime::streamContentHandler>(inputDataStream, 0), vmime::encoding("base64"), vmMIMEType, strContentId, string(), strContentLocation);
 			} else {
-				vmMapiAttach = vmime::create<mapiAttachment>(vmime::create<vmime::streamContentHandler>(inputDataStream, 0),
+				vmMapiAttach = make_shared<mapiAttachment>(vmime::make_shared<vmime::streamContentHandler>(inputDataStream, 0),
 															 bSendBinary ? vmime::encoding("base64") : vmime::encoding("quoted-printable"),
 															 vmMIMEType, strContentId,
 															 vmime::word(m_converter.convert_to<string>(m_strCharset.c_str(), szFilename, rawsize(szFilename), CHARSET_WCHAR), m_vmCharset));
@@ -709,27 +710,26 @@
  * @param[in]	boundary	new boundary string to use.
  * @return Always hrSuccess
  */
-HRESULT MAPIToVMIME::setBoundaries(vmime::ref<vmime::header> vmHeader, vmime::ref<vmime::body> vmBody, const std::string& boundary)
+HRESULT MAPIToVMIME::setBoundaries(vmime::shared_ptr<vmime::header> vmHeader,
+    vmime::shared_ptr<vmime::body> vmBody, const std::string& boundary)
 {
-	int i = 0;
-	vmime::ref<vmime::contentTypeField> vmCTF;
+	vmime::shared_ptr<vmime::contentTypeField> vmCTF;
 
 	try {
-		vmCTF = vmHeader->findField(vmime::fields::CONTENT_TYPE).dynamicCast <vmime::contentTypeField>();
+		vmCTF = vmime::dynamicCast<vmime::contentTypeField>(vmHeader->findField(vmime::fields::CONTENT_TYPE));
 	}
 	catch (vmime::exceptions::no_such_field) {
 		return hrSuccess;
 	}
 
-	if(vmCTF->getValue().dynamicCast<vmime::mediaType>()->getType() == vmime::mediaTypes::MULTIPART) {
+	if (vmime::dynamicCast<vmime::mediaType>(vmCTF->getValue())->getType() == vmime::mediaTypes::MULTIPART) {
 		// This is a multipart, so set the boundary for this part
 		vmCTF->setBoundary(boundary);
         
 		// Set boundaries on children also
-		for (i = 0; i < vmBody->getPartCount(); ++i) {
+		for (size_t i = 0; i < vmBody->getPartCount(); ++i) {
 			std::ostringstream os;
-
-			vmime::ref<vmime::bodyPart> vmBodyPart = vmBody->getPartAt(i);
+			vmime::shared_ptr<vmime::bodyPart> vmBodyPart = vmBody->getPartAt(i);
 
 			os << boundary << "_" << i;
             
@@ -748,13 +748,13 @@
  * @param[out]	lpvmMessage		vmime message version of lpMessage
  * @return Mapi error code
  */
-HRESULT MAPIToVMIME::BuildNoteMessage(IMessage *lpMessage, bool bSkipContent, vmime::ref<vmime::message> *lpvmMessage)
+HRESULT MAPIToVMIME::BuildNoteMessage(IMessage *lpMessage, bool bSkipContent, vmime::shared_ptr<vmime::message> *lpvmMessage)
 {
 	HRESULT					hr					= hrSuccess;
 	LPSPropValue			lpDeliveryDate		= NULL;
 	LPSPropValue			lpTransportHeaders	= NULL;
 	vmime::messageBuilder   vmMessageBuilder;
-	vmime::ref<vmime::message>			vmMessage;
+	vmime::shared_ptr<vmime::message>			vmMessage;
 
 	// construct the message..
 	try {
@@ -766,7 +766,7 @@
 		vmMessage = vmMessageBuilder.construct();
 		// message builder has set Date header to now(). this will be overwritten.
 
-		vmime::ref<vmime::header> vmHeader = vmMessage->getHeader();
+		auto vmHeader = vmMessage->getHeader();
 
 		hr = handleExtraHeaders(lpMessage, vmHeader);
 		if (hr!= hrSuccess)
@@ -810,8 +810,8 @@
 				strHeaders += "\r\n\r\n";
 				headers.parse(strHeaders);
 				
-				for (int i = 0; i < headers.getFieldCount(); ++i) {
-					vmime::ref<vmime::headerField> vmField = headers.getFieldAt(i);
+				for (size_t i = 0; i < headers.getFieldCount(); ++i) {
+					vmime::shared_ptr<vmime::headerField> vmField = headers.getFieldAt(i);
 					std::string name = vmField->getName();
 
 					// Received checks start of string to accept Received-SPF
@@ -822,7 +822,7 @@
 					} else if (strncasecmp(name.c_str(), "list-", strlen("list-")) == 0 ||
 							   strcasecmp(name.c_str(), "precedence") == 0) {
 						// Just append at the end of this list, order is not important
-						vmHeader->appendField(vmField->clone().dynamicCast<vmime::headerField>());
+						vmHeader->appendField(vmime::dynamicCast<vmime::headerField>(vmField->clone()));
 					}
 				}
 			} catch (vmime::exception& e) {
@@ -835,9 +835,9 @@
 
 		// POP3 wants the delivery date as received header to correctly show in outlook
 		if (sopt.add_received_date && lpDeliveryDate) {
-			vmime::headerFieldFactory* hff = vmime::headerFieldFactory::getInstance();
-			vmime::ref<vmime::headerField> rf = hff->create(vmime::fields::RECEIVED);
-			rf->getValue().dynamicCast<vmime::relay>()->setDate(FiletimeTovmimeDatetime(lpDeliveryDate->Value.ft));
+			auto hff = vmime::headerFieldFactory::getInstance();
+			vmime::shared_ptr<vmime::headerField> rf = hff->create(vmime::fields::RECEIVED);
+			vmime::dynamicCast<vmime::relay>(rf->getValue())->setDate(FiletimeTovmimeDatetime(lpDeliveryDate->Value.ft));
 			// set received header at the start
 			vmHeader->insertFieldBefore(0, rf);
 		}
@@ -880,10 +880,11 @@
  * @param[out]	lpvmMessage		vmime message version of lpMessage
  * @return Mapi error code
  */
-HRESULT MAPIToVMIME::BuildMDNMessage(IMessage *lpMessage, vmime::ref<vmime::message> *lpvmMessage)
+HRESULT MAPIToVMIME::BuildMDNMessage(IMessage *lpMessage,
+    vmime::shared_ptr<vmime::message> *lpvmMessage)
 {
 	HRESULT				hr = hrSuccess;
-	vmime::ref<vmime::message>	vmMessage = NULL;
+	vmime::shared_ptr<vmime::message> vmMessage;
 	IStream*			lpBodyStream = NULL;
 	LPSPropValue		lpiNetMsgId = NULL;
 	LPSPropValue		lpMsgClass = NULL;
@@ -896,8 +897,8 @@
 	vmime::disposition	dispo;
 	string				reportingUA; //empty
 	std::vector<string>	reportingUAProducts; //empty
-	vmime::ref<vmime::message>	vmMsgOriginal;
-	vmime::ref<vmime::address>	vmRecipientbox;
+	vmime::shared_ptr<vmime::message> vmMsgOriginal;
+	vmime::shared_ptr<vmime::address> vmRecipientbox;
 	string				strActionMode;
 	std::wstring		strOut;
 
@@ -911,7 +912,7 @@
 	}
 
 	try {
-		vmMsgOriginal = vmime::create<vmime::message>();
+		vmMsgOriginal = vmime::make_shared<vmime::message>();
 
 		// Create original vmime message
 		if (HrGetOneProp(lpMessage, PR_INTERNET_MESSAGE_ID_A, &lpiNetMsgId) == hrSuccess)
@@ -940,7 +941,7 @@
 				goto exit;
 			} else {
 				// no recipient, but need to continue ... is this correct??
-				vmRecipientbox = vmime::create<vmime::mailbox>(string("undisclosed-recipients"));
+				vmRecipientbox = vmime::make_shared<vmime::mailbox>(string("undisclosed-recipients"));
 			}
 		} else {
 			hr = getMailBox(&pRows->aRow[0], &vmRecipientbox);
@@ -956,7 +957,7 @@
 			goto exit;
 		}
 
-		vmime::mdn::sendableMDNInfos mdnInfos(vmMsgOriginal, *vmRecipientbox.dynamicCast<vmime::mailbox>().get());
+		vmime::mdn::sendableMDNInfos mdnInfos(vmMsgOriginal, *vmime::dynamicCast<vmime::mailbox>(vmRecipientbox).get());
 		
 		//FIXME: Get the ActionMode and sending mode from the property 0x0081001E.
 		//		And the type in property 0x0080001E.
@@ -1080,11 +1081,11 @@
  * @param[out]	lpvmMessage		message to send to SMTP or Gateway client
  * @return Mapi error code
  */
-HRESULT MAPIToVMIME::convertMAPIToVMIME(IMessage *lpMessage, vmime::ref<vmime::message> *lpvmMessage) {
+HRESULT MAPIToVMIME::convertMAPIToVMIME(IMessage *lpMessage, vmime::shared_ptr<vmime::message> *lpvmMessage) {
 	HRESULT					hr					= hrSuccess;
 	LPSPropValue			lpInternetCPID		= NULL;
 	LPSPropValue			lpMsgClass			= NULL;
-	vmime::ref<vmime::message> 	vmMessage;
+	vmime::shared_ptr<vmime::message> 	vmMessage;
 	const char *lpszCharset = NULL;
 	char *					lpszRawSMTP			= NULL;
 	LPMAPITABLE				lpAttachmentTable	= NULL;
@@ -1212,7 +1213,7 @@
 
 		if (strcasecmp(lpMsgClass->Value.lpszA, "IPM.Note.SMIME") != 0) {
 			std::string strRawSMTP = lpszRawSMTP;
-			vmime::ref<SMIMEMessage> vmSMIMEMessage = vmime::create<SMIMEMessage>();
+			auto vmSMIMEMessage = vmime::make_shared<SMIMEMessage>();
 			
 			// not sure why this was needed, and causes problems, eg ZCP-12994.
 			//vmMessage->getHeader()->removeField(vmMessage->getHeader()->findField(vmime::fields::MIME_VERSION));
@@ -1260,7 +1261,7 @@
 
 			// copy via string so we can set the size of the string since it's binary
 			vmime::string inString(lpszRawSMTP, (size_t)sStreamStat.cbSize.QuadPart);
-			vmMessage->getBody()->setContents(vmime::create<vmime::stringContentHandler>(inString));
+			vmMessage->getBody()->setContents(vmime::make_shared<vmime::stringContentHandler>(inString));
 
 			// vmime now encodes the body too, so I don't have to
 			vmMessage->getHeader()->appendField(vmime::headerFieldFactory::getInstance()->create(vmime::fields::CONTENT_TRANSFER_ENCODING, "base64"));
@@ -1397,10 +1398,11 @@
  * @return MAPI error code
  * @retval MAPI_E_INVALID_PARAMTER email address in row is not usable for the SMTP protocol
  */
-HRESULT MAPIToVMIME::getMailBox(LPSRow lpRow, vmime::ref<vmime::address> *lpvmMailbox)
+HRESULT MAPIToVMIME::getMailBox(LPSRow lpRow,
+    vmime::shared_ptr<vmime::address> *lpvmMailbox)
 {
 	HRESULT hr;
-	vmime::ref<vmime::address> vmMailboxNew;
+	vmime::shared_ptr<vmime::address> vmMailboxNew;
 	std::wstring strName, strEmail, strType;
 	LPSPropValue pPropObjectType = NULL;
 
@@ -1414,18 +1416,18 @@
 
 	if (strName.empty() && !strEmail.empty()) {
 		// email address only
-		vmMailboxNew = vmime::create<vmime::mailbox>(m_converter.convert_to<string>(strEmail));
+		vmMailboxNew = vmime::make_shared<vmime::mailbox>(m_converter.convert_to<string>(strEmail));
 	} else if (strEmail.find('@') != string::npos) {
 		// email with fullname
-		vmMailboxNew = vmime::create<vmime::mailbox>(getVmimeTextFromWide(strName), m_converter.convert_to<string>(strEmail));
+		vmMailboxNew = vmime::make_shared<vmime::mailbox>(getVmimeTextFromWide(strName), m_converter.convert_to<string>(strEmail));
 	} else if (pPropObjectType && pPropObjectType->Value.ul == MAPI_DISTLIST) {
 		// if mailing to a group without email address
-		vmMailboxNew = vmime::create<vmime::mailboxGroup>(getVmimeTextFromWide(strName));
+		vmMailboxNew = vmime::make_shared<vmime::mailboxGroup>(getVmimeTextFromWide(strName));
 	} else if (sopt.no_recipients_workaround == true) {
 		// gateway must always return an mailbox object
 		if (strEmail.empty())
 			strEmail = L"@";	// force having an address to avoid vmime problems
-		vmMailboxNew = vmime::create<vmime::mailbox>(getVmimeTextFromWide(strName), m_converter.convert_to<string>(strEmail));
+		vmMailboxNew = vmime::make_shared<vmime::mailbox>(getVmimeTextFromWide(strName), m_converter.convert_to<string>(strEmail));
 	} else {
 		if (strEmail.empty()) {
 			// not an email address and not a group: invalid
@@ -1465,7 +1467,7 @@
 	// set the encoder of plaintext body part
 	vmime::encoding bodyEncoding("quoted-printable");
 	// will skip enters in q-p encoding, "fixes" plaintext mails to be more plain text
-	vmime::ref<vmime::utility::encoder::encoder> vmBodyEncoder = bodyEncoding.getEncoder();
+	vmime::shared_ptr<vmime::utility::encoder::encoder> vmBodyEncoder = bodyEncoding.getEncoder();
 	vmBodyEncoder->getProperties().setProperty("text", true);
 
 	*bestBody = plaintext;
@@ -1540,11 +1542,11 @@
 				// convert from HTML charset to vmime output charset
 				strHTMLOut = m_converter.convert_to<string>(m_vmCharset.getName().c_str(), strHTMLOut, rawsize(strHTMLOut), m_strHTMLCharset.c_str());
 			}
-			vmime::ref<vmime::mapiTextPart> textPart = lpVMMessageBuilder->getTextPart().dynamicCast<vmime::mapiTextPart>();
-			textPart->setText(vmime::create<vmime::stringContentHandler>(strHTMLOut));
+			vmime::shared_ptr<vmime::mapiTextPart> textPart = vmime::dynamicCast<vmime::mapiTextPart>(lpVMMessageBuilder->getTextPart());
+			textPart->setText(vmime::make_shared<vmime::stringContentHandler>(strHTMLOut));
 			textPart->setCharset(m_vmCharset);
 			if (!strBodyConverted.empty())
-				textPart->setPlainText(vmime::create<vmime::stringContentHandler>(strBodyConverted));
+				textPart->setPlainText(vmime::make_shared<vmime::stringContentHandler>(strBodyConverted));
 		} else { // else just plaintext
 			if (!strBodyConverted.empty()) {
 				// make sure we give vmime CRLF data, so SMTP servers (qmail) won't complain on the forced plaintext
@@ -1563,7 +1565,7 @@
 				vmBodyEncoder->encode(in, out);
 
 				lpVMMessageBuilder->getTextPart()->setCharset(m_vmCharset);
-				lpVMMessageBuilder->getTextPart().dynamicCast<vmime::mapiTextPart>()->setPlainText(vmime::create<vmime::stringContentHandler>(outString, bodyEncoding));
+				vmime::dynamicCast<vmime::mapiTextPart>(lpVMMessageBuilder->getTextPart())->setPlainText(vmime::make_shared<vmime::stringContentHandler>(outString, bodyEncoding));
 			}
 		}
 	}
@@ -1610,7 +1612,7 @@
  * @param[in]	vmHeader	vmime header object to add X headers to
  * @return Mapi error code
  */
-HRESULT MAPIToVMIME::handleXHeaders(IMessage *lpMessage, vmime::ref<vmime::header> vmHeader) {
+HRESULT MAPIToVMIME::handleXHeaders(IMessage *lpMessage, vmime::shared_ptr<vmime::header> vmHeader) {
 	HRESULT hr;
 	ULONG i;
 	ULONG cValues;
@@ -1619,7 +1621,7 @@
 	LPSPropValue lpPropArray = NULL;
 	ULONG cNames;
 	LPMAPINAMEID *lppNames = NULL;
-	vmime::headerFieldFactory* hff = vmime::headerFieldFactory::getInstance();
+	auto hff = vmime::headerFieldFactory::getInstance();
 
 	// get all props on message
 	hr = lpMessage->GetPropList(0, &lpsAllTags);
@@ -1713,7 +1715,7 @@
  * @param[in]	vmHeader	Add headers to this vmime header object
  * @return always hrSuccess
  */
-HRESULT MAPIToVMIME::handleExtraHeaders(IMessage *lpMessage, vmime::ref<vmime::header> vmHeader) {
+HRESULT MAPIToVMIME::handleExtraHeaders(IMessage *lpMessage, vmime::shared_ptr<vmime::header> vmHeader) {
 	HRESULT hr = hrSuccess;
 	SPropValuePtr ptrMessageId;
 	LPSPropValue lpImportance = NULL;
@@ -1722,13 +1724,13 @@
 	LPSPropValue lpConversationTopic = NULL;
 	LPSPropValue lpNormSubject = NULL;
 	LPSPropValue lpSensitivity = NULL;
-	vmime::headerFieldFactory* hff = vmime::headerFieldFactory::getInstance();
+	auto hff = vmime::headerFieldFactory::getInstance();
 	LPSPropValue lpExpiryTime = NULL;
 
 	// Conversation headers. New Message-Id header is set just before sending.
 	if (HrGetOneProp(lpMessage, PR_IN_REPLY_TO_ID_A, &ptrMessageId) == hrSuccess && ptrMessageId->Value.lpszA[0]) {
-		vmime::ref<vmime::messageId> mid = vmime::create<vmime::messageId>(ptrMessageId->Value.lpszA);
-		vmHeader->InReplyTo()->getValue().dynamicCast<vmime::messageIdSequence>()->appendMessageId(mid);
+		vmime::shared_ptr<vmime::messageId> mid = vmime::make_shared<vmime::messageId>(ptrMessageId->Value.lpszA);
+		vmime::dynamicCast<vmime::messageIdSequence>(vmHeader->InReplyTo()->getValue())->appendMessageId(mid);
 	}
 
 	// Outlook never adds this property
@@ -1738,9 +1740,8 @@
 
 		const size_t n = ids.size();
 		for (size_t i = 0; i < n; ++i) {
-			vmime::ref<vmime::messageId> mid = vmime::create<vmime::messageId>(ids.at(i));
-
-			vmHeader->References()->getValue().dynamicCast<vmime::messageIdSequence>()->appendMessageId(mid);
+			vmime::shared_ptr<vmime::messageId> mid = vmime::make_shared<vmime::messageId>(ids.at(i));
+			vmime::dynamicCast<vmime::messageIdSequence>(vmHeader->References()->getValue())->appendMessageId(mid);
 		}
 	}
 
@@ -1764,7 +1765,7 @@
 		vmime::string inString;
 		inString.assign((const char*)lpConversationIndex->Value.bin.lpb, lpConversationIndex->Value.bin.cb);
 
-		vmime::ref<vmime::utility::encoder::encoder> enc = vmime::utility::encoder::encoderFactory::getInstance()->create("base64");
+		vmime::shared_ptr<vmime::utility::encoder::encoder> enc = vmime::utility::encoder::encoderFactory::getInstance()->create("base64");
 		vmime::utility::inputStreamStringAdapter in(inString);
 		vmime::string outString;
 		vmime::utility::outputStreamStringAdapter out(outString);
@@ -1922,7 +1923,7 @@
  * @param[in]	vmHeader	vmime header object to modify.
  * @return Mapi error code
  */
-HRESULT MAPIToVMIME::handleSenderInfo(IMessage *lpMessage, vmime::ref<vmime::header> vmHeader) {
+HRESULT MAPIToVMIME::handleSenderInfo(IMessage *lpMessage, vmime::shared_ptr<vmime::header> vmHeader) {
 	HRESULT hr = hrSuccess;
 	ULONG cValues;
 	LPSPropValue lpProps = NULL;
@@ -2017,14 +2018,14 @@
 		if (!strResEmail.empty() && strResEmail != strEmail) {
 			// use user added from address
 			if (strResName.empty() || strName == strResEmail)
-				mbl.appendMailbox(vmime::create<vmime::mailbox>(m_converter.convert_to<string>(strResEmail)));
+				mbl.appendMailbox(vmime::make_shared<vmime::mailbox>(m_converter.convert_to<string>(strResEmail)));
 			else
-				mbl.appendMailbox(vmime::create<vmime::mailbox>(getVmimeTextFromWide(strResName), m_converter.convert_to<string>(strResEmail)));
+				mbl.appendMailbox(vmime::make_shared<vmime::mailbox>(getVmimeTextFromWide(strResName), m_converter.convert_to<string>(strResEmail)));
 		} else {
 			if (strName.empty() || strName == strEmail)
-				mbl.appendMailbox(vmime::create<vmime::mailbox>(m_converter.convert_to<string>(strEmail)));
+				mbl.appendMailbox(vmime::make_shared<vmime::mailbox>(m_converter.convert_to<string>(strEmail)));
 			else
-				mbl.appendMailbox(vmime::create<vmime::mailbox>(getVmimeTextFromWide(strName), m_converter.convert_to<string>(strEmail)));
+				mbl.appendMailbox(vmime::make_shared<vmime::mailbox>(getVmimeTextFromWide(strName), m_converter.convert_to<string>(strEmail)));
 		}
 		vmHeader->DispositionNotificationTo()->setValue(mbl);
 	}
@@ -2048,7 +2049,9 @@
  * @param[in]	vmHeader	vmime header object to modify.
  * @return Mapi error code
  */
-HRESULT MAPIToVMIME::handleReplyTo(IMessage *lpMessage, vmime::ref<vmime::header> vmHeader) {
+HRESULT MAPIToVMIME::handleReplyTo(IMessage *lpMessage,
+    vmime::shared_ptr<vmime::header> vmHeader)
+{
 	HRESULT			hr = hrSuccess;
 	LPSPropValue	lpReplyTo = NULL;
 	FLATENTRYLIST	*lpEntryList = NULL;
@@ -2144,9 +2147,9 @@
 
 	// vmime can only set 1 email address in the ReplyTo field.
 	if (!strName.empty() && strName != strEmail)
-		vmHeader->ReplyTo()->setValue(vmime::create<vmime::mailbox>(getVmimeTextFromWide(strName), m_converter.convert_to<string>(strEmail)));
+		vmHeader->ReplyTo()->setValue(vmime::make_shared<vmime::mailbox>(getVmimeTextFromWide(strName), m_converter.convert_to<string>(strEmail)));
 	else
-		vmHeader->ReplyTo()->setValue(vmime::create<vmime::mailbox>(m_converter.convert_to<string>(strEmail)));
+		vmHeader->ReplyTo()->setValue(vmime::make_shared<vmime::mailbox>(m_converter.convert_to<string>(strEmail)));
 
 	hr = hrSuccess;
 
@@ -2287,9 +2290,8 @@
 			bestBody == realRTF)
 		{
 		    // Send either TNEF or iCal data
-		    
-			vmime::ref<vmime::attachment> vmTNEFAtt;
-			vmime::ref<vmime::utility::inputStream> inputDataStream = NULL;
+			vmime::shared_ptr<vmime::attachment> vmTNEFAtt;
+			vmime::shared_ptr<vmime::utility::inputStream> inputDataStream = NULL;
 
 			/* 
 			 * Send TNEF information for this message if we really need to, or otherwise iCal
@@ -2298,7 +2300,7 @@
 			if (lstOLEAttach.size() == 0 && iUseTnef <= 0 && lpMessageClass && (strncasecmp("IPM.Note", lpMessageClass->Value.lpszA, 8) != 0)) {
 				// iCAL
 				string ical, method;
-				vmime::ref<mapiAttachment> vmAttach = NULL;
+				vmime::shared_ptr<mapiAttachment> vmAttach = NULL;
 
 				lpLogger->Log(EC_LOGLEVEL_INFO, "Adding ICS attachment for extra information");
 
@@ -2316,8 +2318,8 @@
 					goto tnef_anyway;
 				}
 
-				vmime::ref<vmime::mapiTextPart> lpvmMapiText = lpVMMessageBuilder->getTextPart().dynamicCast<vmime::mapiTextPart>();
-				lpvmMapiText->setOtherText(vmime::create<vmime::stringContentHandler>(ical));
+				vmime::shared_ptr<vmime::mapiTextPart> lpvmMapiText = vmime::dynamicCast<vmime::mapiTextPart>(lpVMMessageBuilder->getTextPart());
+				lpvmMapiText->setOtherText(vmime::make_shared<vmime::stringContentHandler>(ical));
 				lpvmMapiText->setOtherContentType(vmime::mediaType(vmime::mediaTypes::TEXT, "calendar"));
 				lpvmMapiText->setOtherContentEncoding(vmime::encoding(vmime::encodingTypes::EIGHT_BIT));
 				lpvmMapiText->setOtherMethod(method);
@@ -2368,11 +2370,11 @@
 				// Write the stream
 				hr = tnef.Finish();
 
-				inputDataStream = vmime::create<inputStreamMAPIAdapter>(lpStream);
+				inputDataStream = vmime::make_shared<inputStreamMAPIAdapter>(lpStream);
 			
 				// Now, add the stream as an attachment to the message, filename winmail.dat 
 				// and MIME type 'application/ms-tnef', no content-id
-				vmTNEFAtt = vmime::create<mapiAttachment>(vmime::create<vmime::streamContentHandler>(inputDataStream, 0),
+				vmTNEFAtt = make_shared<mapiAttachment>(vmime::make_shared<vmime::streamContentHandler>(inputDataStream, 0),
 														  vmime::encoding("base64"), vmime::mediaType("application/ms-tnef"), string(),
 														  vmime::word("winmail.dat"));
 											  
--- a/inetmapi/MAPIToVMIME.h
+++ b/inetmapi/MAPIToVMIME.h
@@ -18,6 +18,7 @@
 #ifndef MAPITOVMIME
 #define MAPITOVMIME
 
+#include <memory>
 #include <mapix.h>
 
 #include <string>
@@ -36,7 +37,7 @@
 	MAPIToVMIME(IMAPISession *lpSession, IAddrBook *lpAddrBook, ECLogger *newlogger, sending_options sopt);
 	~MAPIToVMIME();
 
-	HRESULT convertMAPIToVMIME(IMessage *lpMessage, vmime::ref<vmime::message> *lpvmMessage);
+	HRESULT convertMAPIToVMIME(IMessage *lpMessage, vmime::shared_ptr<vmime::message> *lpvmMessage);
 	std::wstring getConversionError(void) const;
 
 private:
@@ -55,23 +56,23 @@
 	HRESULT fillVMIMEMail(IMessage *lpMessage, bool bSkipContent, vmime::messageBuilder* lpVMMessageBuilder);
 
 	HRESULT handleTextparts(IMessage* lpMessage, vmime::messageBuilder* lpVMMessageBuilder, eBestBody *bestBody);
-	HRESULT getMailBox(LPSRow lpRow, vmime::ref<vmime::address> *lpvmMailbox);
+	HRESULT getMailBox(LPSRow lpRow, vmime::shared_ptr<vmime::address> *lpvmMailbox);
 	HRESULT processRecipients(IMessage* lpMessage, vmime::messageBuilder* lpVMMessageBuilder);
-	HRESULT handleExtraHeaders(IMessage *lpMessage, vmime::ref<vmime::header> vmHeader);
-	HRESULT handleReplyTo(IMessage* lpMessage, vmime::ref<vmime::header> vmHeader);
+	HRESULT handleExtraHeaders(IMessage *lpMessage, vmime::shared_ptr<vmime::header> vmHeader);
+	HRESULT handleReplyTo(IMessage* lpMessage, vmime::shared_ptr<vmime::header> vmHeader);
 	HRESULT handleContactEntryID(ULONG cValues, LPSPropValue lpProps, std::wstring &strName, std::wstring &strType, std::wstring &strEmail);
-	HRESULT handleSenderInfo(IMessage* lpMessage, vmime::ref<vmime::header> vmHeader);
+	HRESULT handleSenderInfo(IMessage* lpMessage, vmime::shared_ptr<vmime::header> vmHeader);
 
 	HRESULT handleAttachments(IMessage* lpMessage, vmime::messageBuilder* lpVMMessageBuilder);
 	HRESULT handleSingleAttachment(IMessage* lpMessage, LPSRow lpRow, vmime::messageBuilder* lpVMMessageBuilder);
 	HRESULT parseMimeTypeFromFilename(std::wstring strFilename, vmime::mediaType *lpMT, bool *lpbSendBinary);
-	HRESULT setBoundaries(vmime::ref<vmime::header> vmHeader, vmime::ref<vmime::body> vmBody, const std::string& boundary);
-	HRESULT handleXHeaders(IMessage* lpMessage, vmime::ref<vmime::header> vmHeader);
+	HRESULT setBoundaries(vmime::shared_ptr<vmime::header> vmHeader, vmime::shared_ptr<vmime::body> vmBody, const std::string& boundary);
+	HRESULT handleXHeaders(IMessage* lpMessage, vmime::shared_ptr<vmime::header> vmHeader);
 	HRESULT handleTNEF(IMessage* lpMessage, vmime::messageBuilder* lpVMMessageBuilder, eBestBody bestBody);
 
 	// build Messages
-	HRESULT BuildNoteMessage(IMessage *lpMessage, bool bSkipContent, vmime::ref<vmime::message> *lpvmMessage);
-	HRESULT BuildMDNMessage(IMessage *lpMessage, vmime::ref<vmime::message> *lpvmMessage);
+	HRESULT BuildNoteMessage(IMessage *lpMessage, bool bSkipContent, vmime::shared_ptr<vmime::message> *lpvmMessage);
+	HRESULT BuildMDNMessage(IMessage *lpMessage, vmime::shared_ptr<vmime::message> *lpvmMessage);
 
 	// util
 	void capitalize(char *s);
--- a/inetmapi/SMIMEMessage.cpp
+++ b/inetmapi/SMIMEMessage.cpp
@@ -24,11 +24,13 @@
 {
 }
 
-void SMIMEMessage::generate(vmime::utility::outputStream& os, const std::string::size_type maxLineLength, const std::string::size_type curLinePos, std::string::size_type* newLinePos) const
+void SMIMEMessage::generateImpl(const vmime::generationContext &ctx,
+    vmime::utility::outputStream &os, size_t curLinePos,
+    size_t *newLinePos) const
 {
     if(!m_body.empty()) {
         // Generate headers
-        getHeader()->generate(os, maxLineLength);
+        getHeader()->generate(ctx, os);
 
         // Concatenate S/MIME body without CRLF since it also contains some additional headers
         os << m_body;
@@ -37,7 +39,7 @@
 	    	*newLinePos = 0;
     } else {
         // Normal generation
-        vmime::message::generate(os, maxLineLength, curLinePos, newLinePos);
+        vmime::message::generate(ctx, os, curLinePos, newLinePos);
     }
 }
 
--- a/inetmapi/SMIMEMessage.h
+++ b/inetmapi/SMIMEMessage.h
@@ -20,6 +20,7 @@
 
 #include <vmime/message.hpp>
 #include <vmime/utility/stream.hpp>
+#include <vmime/generationContext.hpp>
 
 /**
  * We are adding a bit of functionality to vmime::message here for S/MIME support.
@@ -46,7 +47,7 @@
 public:
     SMIMEMessage();
 
-	void generate(vmime::utility::outputStream& os, const std::string::size_type maxLineLength = vmime::options::getInstance()->message.maxLineLength(), const std::string::size_type curLinePos = 0, std::string::size_type* newLinePos = NULL) const;
+	void generateImpl(const vmime::generationContext &, vmime::utility::outputStream &, size_t curLinePos = 0, size_t *newLinePos = NULL) const;
 
     void setSMIMEBody(std::string &body);    
     
--- a/inetmapi/VMIMEToMAPI.cpp
+++ b/inetmapi/VMIMEToMAPI.cpp
@@ -131,7 +131,7 @@
  */
 HRESULT VMIMEToMAPI::createIMAPProperties(const std::string &input, std::string *lpEnvelope, std::string *lpBody, std::string *lpBodyStructure)
 {
-	vmime::ref<vmime::message> vmMessage = vmime::create<vmime::message>();
+	auto vmMessage = vmime::make_shared<vmime::message>();
 	vmMessage->parse(input);
 
 	if (lpBody || lpBodyStructure)
@@ -197,7 +197,7 @@
 		}
 
 		// turn buffer into a message
-		vmime::ref<vmime::message> vmMessage = vmime::create<vmime::message>();
+		auto vmMessage = vmime::make_shared<vmime::message>();
 		vmMessage->parse(input);
 
 		// save imap data first, seems vmMessage may be altered in the rest of the code.
@@ -228,8 +228,7 @@
 			}
 			
 			// Include the entire rfc822 data in an attachment for the client to check
-			vmime::ref<vmime::header> vmHeader = vmMessage->getHeader();
-
+			auto vmHeader = vmMessage->getHeader();
 			hr = lpMessage->CreateAttach(NULL, 0, &ulAttNr, &lpAtt);
 			if (hr != hrSuccess)
 				goto exit;
@@ -361,7 +360,9 @@
  * @return		MAPI error code.
  * @retval		MAPI_E_CALL_FAILED	Caught an exception, which breaks the conversion.
  */
-HRESULT VMIMEToMAPI::fillMAPIMail(vmime::ref<vmime::message> vmMessage, IMessage *lpMessage) {
+HRESULT VMIMEToMAPI::fillMAPIMail(vmime::shared_ptr<vmime::message> vmMessage,
+    IMessage *lpMessage)
+{
 	HRESULT	hr;
 	SPropValue sPropDefaults[3];
 
@@ -390,9 +391,9 @@
 		// turn buffer into a message
 
 		// get the part header and find out what it is...
-		vmime::ref<vmime::header> vmHeader = vmMessage->getHeader();
-		vmime::ref<vmime::body> vmBody = vmMessage->getBody();
-		vmime::ref<vmime::mediaType> mt = vmHeader->ContentType()->getValue().dynamicCast<vmime::mediaType>();
+		auto vmHeader = vmMessage->getHeader();
+		auto vmBody = vmMessage->getBody();
+		auto mt = vmime::dynamicCast<vmime::mediaType>(vmHeader->ContentType()->getValue());
 
 		// pass recipients somewhere else 
 		hr = handleRecipients(vmHeader, lpMessage);
@@ -411,21 +412,19 @@
 		if (vmime::mdn::MDNHelper::isMDN(vmMessage) == true)
 		{
 			vmime::mdn::receivedMDNInfos receivedMDN = vmime::mdn::MDNHelper::getReceivedMDN(vmMessage);
-
-			vmime::ref<vmime::body> myBody = vmMessage->getBody();
+			auto myBody = vmMessage->getBody();
 			// it is possible to get 3 bodyparts.
 			// text/plain, message/disposition-notification, text/rfc822-headers
 			// the third part seems optional. and some clients send multipart/alternative instead of text/plain.
 			// Loop to get text/plain body or multipart/alternative.
-			for (int i = 0; i < myBody->getPartCount(); ++i) {
-				vmime::ref<vmime::bodyPart> bPart = myBody->getPartAt(i);
-				vmime::ref<vmime::headerField> ctf = bPart->getHeader()->findField(vmime::fields::CONTENT_TYPE);
-
-				if( (ctf->getValue().dynamicCast <vmime::mediaType>()->getType() == vmime::mediaTypes::TEXT &&
-				     ctf->getValue().dynamicCast <vmime::mediaType>()->getSubType() == vmime::mediaTypes::TEXT_PLAIN)
-				||  (ctf->getValue().dynamicCast <vmime::mediaType>()->getType() == vmime::mediaTypes::MULTIPART &&
-				     ctf->getValue().dynamicCast <vmime::mediaType>()->getSubType() == vmime::mediaTypes::MULTIPART_ALTERNATIVE) )
-				{
+			for (size_t i = 0; i < myBody->getPartCount(); ++i) {
+				auto bPart = myBody->getPartAt(i);
+				auto ctf = bPart->getHeader()->findField(vmime::fields::CONTENT_TYPE);
+
+				if ((vmime::dynamicCast<vmime::mediaType>(ctf->getValue())->getType() == vmime::mediaTypes::TEXT &&
+				     vmime::dynamicCast<vmime::mediaType>(ctf->getValue())->getSubType() == vmime::mediaTypes::TEXT_PLAIN) ||
+				    (vmime::dynamicCast<vmime::mediaType>(ctf->getValue())->getType() == vmime::mediaTypes::MULTIPART &&
+				     vmime::dynamicCast<vmime::mediaType>(ctf->getValue())->getSubType() == vmime::mediaTypes::MULTIPART_ALTERNATIVE)) {
 					hr = dissect_body(bPart->getHeader(), bPart->getBody(), lpMessage);
 					if (hr != hrSuccess) {
 						lpLogger->Log(EC_LOGLEVEL_ERROR, "Unable to parse MDN mail body");
@@ -496,7 +495,9 @@
  * @return		MAPI error code.
  * @retval		MAPI_E_CALL_FAILED	Caught an exception, which breaks the conversion.
  */
-HRESULT VMIMEToMAPI::handleHeaders(vmime::ref<vmime::header> vmHeader, IMessage* lpMessage) {
+HRESULT VMIMEToMAPI::handleHeaders(vmime::shared_ptr<vmime::header> vmHeader,
+    IMessage *lpMessage)
+{
 	HRESULT			hr = hrSuccess;
 	std::string		strInternetMessageId, strInReplyTos, strReferences;
 	std::wstring	wstrSubject;
@@ -562,16 +563,16 @@
 
 		// set subject
 		if(vmHeader->hasField(vmime::fields::SUBJECT)) {
-			wstrSubject = getWideFromVmimeText(*vmHeader->Subject()->getValue().dynamicCast<vmime::text>());
+			wstrSubject = getWideFromVmimeText(*vmime::dynamicCast<vmime::text>(vmHeader->Subject()->getValue()));
 			msgProps[nProps].ulPropTag = PR_SUBJECT_W;
 			msgProps[nProps++].Value.lpszW = (WCHAR *)wstrSubject.c_str();
 		}
 
 		// set ReplyTo
-		if (!vmHeader->ReplyTo()->getValue().dynamicCast<vmime::mailbox>()->isEmpty()) {
+		if (!vmime::dynamicCast<vmime::mailbox>(vmHeader->ReplyTo()->getValue())->isEmpty()) {
 			// First, set PR_REPLY_RECIPIENT_NAMES
-			wstrReplyTo = getWideFromVmimeText(vmHeader->ReplyTo()->getValue().dynamicCast<vmime::mailbox>()->getName());
-			wstrReplyToMail = m_converter.convert_to<wstring>(vmHeader->ReplyTo()->getValue().dynamicCast<vmime::mailbox>()->getEmail());
+			wstrReplyTo = getWideFromVmimeText(vmime::dynamicCast<vmime::mailbox>(vmHeader->ReplyTo()->getValue())->getName());
+			wstrReplyToMail = m_converter.convert_to<wstring>(vmime::dynamicCast<vmime::mailbox>(vmHeader->ReplyTo()->getValue())->getEmail().toString());
 			if (wstrReplyTo.empty())
 				wstrReplyTo = wstrReplyToMail;
 
@@ -611,10 +612,10 @@
 		// setting sent time
 		if(vmHeader->hasField(vmime::fields::DATE)) {
 			msgProps[nProps].ulPropTag = PR_CLIENT_SUBMIT_TIME;
-			msgProps[nProps++].Value.ft = vmimeDatetimeToFiletime(*vmHeader->Date()->getValue().dynamicCast<vmime::datetime>());
+			msgProps[nProps++].Value.ft = vmimeDatetimeToFiletime(*vmime::dynamicCast<vmime::datetime>(vmHeader->Date()->getValue()));
 
 			// set sent date (actual send date, disregarding timezone)
-			vmime::datetime d = *vmHeader->Date()->getValue().dynamicCast<vmime::datetime>();
+			vmime::datetime d = *vmime::dynamicCast<vmime::datetime>(vmHeader->Date()->getValue());
 			d.setTime(0,0,0,0);
 			msgProps[nProps].ulPropTag = PR_EC_CLIENT_SUBMIT_DATE;
 			msgProps[nProps++].Value.ft = vmimeDatetimeToFiletime(d);
@@ -626,7 +627,7 @@
 		bool found_date = false;
 		if (m_dopt.use_received_date || m_mailState.ulMsgInMsg) {
 			try {
-				vmime::ref<vmime::relay> recv = vmHeader->findField("Received")->getValue().dynamicCast<vmime::relay>();
+				auto recv = vmime::dynamicCast<vmime::relay>(vmHeader->findField("Received")->getValue());
 				if (recv) {
 					date = recv->getDate();
 					found_date = true;
@@ -634,7 +635,7 @@
 			}
 			catch (...) {
 				if (m_mailState.ulMsgInMsg) {
-					date = *vmHeader->Date()->getValue().dynamicCast<vmime::datetime>();
+					date = *vmime::dynamicCast<vmime::datetime>(vmHeader->Date()->getValue());
 					found_date = true;
 				} else {
 					date = vmime::datetime::now();
@@ -657,10 +658,9 @@
 
 		// The real sender of the mail
 		if(vmHeader->hasField(vmime::fields::FROM)) {
-			strFromEmail = vmHeader->From()->getValue().dynamicCast<vmime::mailbox>()->getEmail();
-			if (!vmHeader->From()->getValue().dynamicCast<vmime::mailbox>()->getName().isEmpty()) {
-				wstrFromName = getWideFromVmimeText(vmHeader->From()->getValue().dynamicCast<vmime::mailbox>()->getName());
-			}
+			strFromEmail = vmime::dynamicCast<vmime::mailbox>(vmHeader->From()->getValue())->getEmail().toString();
+			if (!vmime::dynamicCast<vmime::mailbox>(vmHeader->From()->getValue())->getName().isEmpty())
+				wstrFromName = getWideFromVmimeText(vmime::dynamicCast<vmime::mailbox>(vmHeader->From()->getValue())->getName());
 
 			hr = modifyFromAddressBook(&lpRecipProps, &ulRecipProps, strFromEmail.c_str(), wstrFromName.c_str(), MAPI_ORIG, (LPSPropTagArray)&sptaRecipPropsSentRepr);
 			if (hr == hrSuccess) {
@@ -703,14 +703,14 @@
 		
 		if (vmHeader->hasField(vmime::fields::SENDER) || vmHeader->hasField(vmime::fields::FROM)) {
 			// The original sender of the mail account (if non sender exist then the FROM)
-			strSenderEmail = vmHeader->Sender()->getValue().dynamicCast<vmime::mailbox>()->getEmail();
-			if(vmHeader->Sender()->getValue().dynamicCast<vmime::mailbox>()->getName().isEmpty() && strSenderEmail.empty()) {
+			strSenderEmail = vmime::dynamicCast<vmime::mailbox>(vmHeader->Sender()->getValue())->getEmail().toString();
+			if (vmime::dynamicCast<vmime::mailbox>(vmHeader->Sender()->getValue())->getName().isEmpty() && strSenderEmail.empty()) {
 				// Fallback on the original from address
 				wstrSenderName = wstrFromName;
 				strSenderEmail = strFromEmail;
 			} else {
-				if (!vmHeader->Sender()->getValue().dynamicCast<vmime::mailbox>()->getName().isEmpty()) {
-					wstrSenderName = getWideFromVmimeText(vmHeader->Sender()->getValue().dynamicCast<vmime::mailbox>()->getName());
+				if (!vmime::dynamicCast<vmime::mailbox>(vmHeader->Sender()->getValue())->getName().isEmpty()) {
+					wstrSenderName = getWideFromVmimeText(vmime::dynamicCast<vmime::mailbox>(vmHeader->Sender()->getValue())->getName());
 				} else {
 					wstrSenderName = m_converter.convert_to<wstring>(strSenderEmail);
 				}
@@ -757,7 +757,7 @@
 		//Conversation topic
 		if (vmHeader->hasField("Thread-Topic"))
 		{
-			wstring convTT = getWideFromVmimeText(*vmHeader->findField("Thread-Topic")->getValue().dynamicCast<vmime::text>());
+			wstring convTT = getWideFromVmimeText(*vmime::dynamicCast<vmime::text>(vmHeader->findField("Thread-Topic")->getValue()));
 
 			sConTopic.ulPropTag = PR_CONVERSATION_TOPIC_W;
 			sConTopic.Value.lpszW = (WCHAR *)convTT.c_str();
@@ -784,8 +784,7 @@
 
 			string threadIndex = vmHeader->findField("Thread-Index")->getValue()->generate();
 
-			vmime::ref<vmime::utility::encoder::encoder> enc = vmime::utility::encoder::encoderFactory::getInstance()->create("base64");
-
+			auto enc = vmime::utility::encoder::encoderFactory::getInstance()->create("base64");
 			vmime::utility::inputStreamStringAdapter in(threadIndex);			
 			vmime::utility::outputStreamStringAdapter out(outString);
 
@@ -906,13 +905,13 @@
 		// read receipt	request
 		// note: vmime never checks if the given pos to getMailboxAt() and similar functions is valid, so we check if the list is empty before using it
 		if (vmHeader->hasField("Disposition-Notification-To") &&
-			!vmHeader->DispositionNotificationTo()->getValue().dynamicCast<vmime::mailboxList>()->isEmpty())
+		    !vmime::dynamicCast<vmime::mailboxList>(vmHeader->DispositionNotificationTo()->getValue())->isEmpty())
 		{
-			vmime::ref<vmime::mailbox> mbReadReceipt = vmHeader->DispositionNotificationTo()->getValue().dynamicCast<vmime::mailboxList>()->getMailboxAt(0); // we only use the 1st
+			auto mbReadReceipt = vmime::dynamicCast<vmime::mailboxList>(vmHeader->DispositionNotificationTo()->getValue())->getMailboxAt(0); // we only use the 1st
 			if (mbReadReceipt && !mbReadReceipt->isEmpty())
 			{
 				wstring wstrRRName = getWideFromVmimeText(mbReadReceipt->getName());
-				wstring wstrRREmail = m_converter.convert_to<wstring>(mbReadReceipt->getEmail());
+				wstring wstrRREmail = m_converter.convert_to<wstring>(mbReadReceipt->getEmail().toString());
 
 				if (wstrRRName.empty())
 					wstrRRName = wstrRREmail;
@@ -944,8 +943,8 @@
 			}
 		}
 
-		std::vector<vmime::ref<vmime::headerField> > hf = vmHeader->getFieldList();
-		std::vector<vmime::ref<vmime::headerField> >::const_iterator hfi;
+		std::vector<vmime::shared_ptr<vmime::headerField> > hf = vmHeader->getFieldList();
+		std::vector<vmime::shared_ptr<vmime::headerField> >::const_iterator hfi;
 		for (hfi = hf.begin(); hfi != hf.end(); ++hfi) {
 			string value, name = (*hfi)->getName();
 			
@@ -1092,15 +1091,16 @@
  * @return		MAPI error code.
  * @retval		MAPI_E_CALL_FAILED	Caught an exception, which breaks the conversion.
  */
-HRESULT VMIMEToMAPI::handleRecipients(vmime::ref<vmime::header> vmHeader, IMessage* lpMessage) {
+HRESULT VMIMEToMAPI::handleRecipients(vmime::shared_ptr<vmime::header> vmHeader,
+    IMessage *lpMessage)
+{
 	HRESULT		hr				= hrSuccess;
 	LPADRLIST 	lpRecipients	= NULL;
 
 	try {
-		vmime::ref<vmime::addressList> lpVMAListRecip = vmHeader->To()->getValue().dynamicCast<vmime::addressList>();
-		vmime::ref<vmime::addressList> lpVMAListCopyRecip = vmHeader->Cc()->getValue().dynamicCast<vmime::addressList>();
-		vmime::ref<vmime::addressList> lpVMAListBlCpRecip = vmHeader->Bcc()->getValue().dynamicCast<vmime::addressList>();
-
+		auto lpVMAListRecip = vmime::dynamicCast<vmime::addressList>(vmHeader->To()->getValue());
+		auto lpVMAListCopyRecip = vmime::dynamicCast<vmime::addressList>(vmHeader->Cc()->getValue());
+		auto lpVMAListBlCpRecip = vmime::dynamicCast<vmime::addressList>(vmHeader->Bcc()->getValue());
 		int iAdresCount = lpVMAListRecip->getAddressCount() + lpVMAListCopyRecip->getAddressCount() + lpVMAListBlCpRecip->getAddressCount();
 
 		if (iAdresCount == 0)
@@ -1180,14 +1180,16 @@
  * @return		MAPI error code.
  * @retval		MAPI_E_CALL_FAILED	Caught an exception, which breaks the conversion.
  */
-HRESULT VMIMEToMAPI::modifyRecipientList(LPADRLIST lpRecipients, vmime::ref<vmime::addressList> vmAddressList, ULONG ulRecipType) {
+HRESULT VMIMEToMAPI::modifyRecipientList(LPADRLIST lpRecipients,
+    vmime::shared_ptr<vmime::addressList> vmAddressList, ULONG ulRecipType)
+{
 	HRESULT			hr				= hrSuccess;
 	int				iAddressCount	= vmAddressList->getAddressCount();
 	ULONG			cbEntryID		= 0;
 	LPENTRYID		lpEntryID		= NULL;
-	vmime::ref<vmime::mailbox> mbx	= NULL;
-	vmime::ref<vmime::mailboxGroup> grp	= NULL;
-	vmime::ref<vmime::address> vmAddress = NULL;
+	vmime::shared_ptr<vmime::mailbox> mbx;
+	vmime::shared_ptr<vmime::mailboxGroup> grp;
+	vmime::shared_ptr<vmime::address> vmAddress;
 	std::wstring	wstrName;
 	std::string		strEmail, strSearch;
 	unsigned int 	iRecipNum		= 0;
@@ -1208,7 +1210,7 @@
 			vmAddress = vmAddressList->getAddressAt(iRecip);
 			
 			if (vmAddress->isGroup()) {
-				grp = vmAddress.dynamicCast<vmime::mailboxGroup>();
+				grp = vmime::dynamicCast<vmime::mailboxGroup>(vmAddress);
 				if (!grp)
 					continue;
 				strEmail.clear();
@@ -1216,10 +1218,10 @@
 				if (grp->isEmpty() && vmText == vmime::text("undisclosed-recipients"))
 					continue;
 			} else {
-				mbx = vmAddress.dynamicCast<vmime::mailbox>();
+				mbx = vmime::dynamicCast<vmime::mailbox>(vmAddress);
 				if (!mbx)
 					continue;
-				strEmail = mbx->getEmail();
+				strEmail = mbx->getEmail().toString();
 				vmText = mbx->getName();
 			}
 
@@ -1553,14 +1555,15 @@
  * ordered from boring-to-interesting, the list returned by this function is
  * interesting-to-boring.
  */
-static std::list<unsigned int> vtm_order_alternatives(vmime::ref<vmime::body> vmBody)
+static std::list<unsigned int>
+vtm_order_alternatives(vmime::shared_ptr<vmime::body> vmBody)
 {
-	vmime::ref<vmime::header> vmHeader;
-	vmime::ref<vmime::bodyPart> vmBodyPart;
-	vmime::ref<vmime::mediaType> mt;
+	vmime::shared_ptr<vmime::header> vmHeader;
+	vmime::shared_ptr<vmime::bodyPart> vmBodyPart;
+	vmime::shared_ptr<vmime::mediaType> mt;
 	std::list<unsigned int> lBodies, pgtext;
 
-	for (int i = 0; i < vmBody->getPartCount(); ++i) {
+	for (size_t i = 0; i < vmBody->getPartCount(); ++i) {
 		vmBodyPart = vmBody->getPartAt(i);
 		vmHeader = vmBodyPart->getHeader();
 		if (!vmHeader->hasField(vmime::fields::CONTENT_TYPE)) {
@@ -1568,7 +1571,7 @@
 			lBodies.push_front(i);
 			continue;
 		}
-		mt = vmHeader->ContentType()->getValue().dynamicCast<vmime::mediaType>();
+		mt = vmime::dynamicCast<vmime::mediaType>(vmHeader->ContentType()->getValue());
 		// mostly better alternatives for text/plain, so try that last
 		if (mt->getType() == vmime::mediaTypes::TEXT && mt->getSubType() == vmime::mediaTypes::TEXT_PLAIN)
 			lBodies.push_back(i);
@@ -1578,8 +1581,8 @@
 	return lBodies;
 }
 
-HRESULT VMIMEToMAPI::dissect_multipart(vmime::ref<vmime::header> vmHeader,
-    vmime::ref<vmime::body> vmBody, IMessage *lpMessage,
+HRESULT VMIMEToMAPI::dissect_multipart(vmime::shared_ptr<vmime::header> vmHeader,
+    vmime::shared_ptr<vmime::body> vmBody, IMessage *lpMessage,
     bool bFilterDouble, bool bAppendBody)
 {
 	bool bAlternative = false;
@@ -1594,7 +1597,7 @@
 	}
 
 	// check new multipart type
-	vmime::ref<vmime::mediaType> mt = vmHeader->ContentType()->getValue().dynamicCast<vmime::mediaType>();
+	auto mt = vmime::dynamicCast<vmime::mediaType>(vmHeader->ContentType()->getValue());
 	if (mt->getSubType() == "appledouble")
 		bFilterDouble = true;
 	else if (mt->getSubType() == "mixed")
@@ -1613,12 +1616,12 @@
 
 	if (!bAlternative) {
 		// recursively process multipart message
-		for (int i = 0; i < vmBody->getPartCount(); ++i) {
-			vmime::ref<vmime::bodyPart> vmBodyPart = vmBody->getPartAt(i);
+		for (size_t i = 0; i < vmBody->getPartCount(); ++i) {
+			auto vmBodyPart = vmBody->getPartAt(i);
 
 			hr = dissect_body(vmBodyPart->getHeader(), vmBodyPart->getBody(), lpMessage, bFilterDouble, bAppendBody);
 			if (hr != hrSuccess) {
-				lpLogger->Log(EC_LOGLEVEL_ERROR, "dissect_multipart: Unable to parse sub multipart %d of mail body", i);
+				lpLogger->Log(EC_LOGLEVEL_ERROR, "dissect_multipart: Unable to parse sub multipart %zu of mail body", i);
 				return hr;
 			}
 		}
@@ -1629,7 +1632,7 @@
 
 	// recursively process multipart alternatives in reverse to select best body first
 	for (list<unsigned int>::const_iterator i = lBodies.begin(); i != lBodies.end(); ++i) {
-		vmime::ref<vmime::bodyPart> vmBodyPart = vmBody->getPartAt(*i);
+		auto vmBodyPart = vmBody->getPartAt(*i);
 
 		lpLogger->Log(EC_LOGLEVEL_DEBUG, "Trying to parse alternative multipart %d of mail body", *i);
 
@@ -1644,7 +1647,8 @@
 	return hr;
 }
 
-void VMIMEToMAPI::dissect_message(vmime::ref<vmime::body> vmBody, IMessage *lpMessage)
+void VMIMEToMAPI::dissect_message(vmime::shared_ptr<vmime::body> vmBody,
+    IMessage *lpMessage)
 {
 	// Create Attach
 	ULONG ulAttNr = 0;
@@ -1712,8 +1716,9 @@
 		pAtt->Release();
 }
 
-HRESULT VMIMEToMAPI::dissect_ical(vmime::ref<vmime::header> vmHeader,
-    vmime::ref<vmime::body> vmBody, IMessage *lpMessage, bool bIsAttachment)
+HRESULT VMIMEToMAPI::dissect_ical(vmime::shared_ptr<vmime::header> vmHeader,
+    vmime::shared_ptr<vmime::body> vmBody, IMessage *lpMessage,
+    bool bIsAttachment)
 {
 	HRESULT hr;
 	// ical file
@@ -1849,9 +1854,9 @@
  * @return		MAPI error code.
  * @retval		MAPI_E_CALL_FAILED	Caught an exception, which breaks the conversion.
  */
-HRESULT VMIMEToMAPI::dissect_body(vmime::ref<vmime::header> vmHeader,
-    vmime::ref<vmime::body> vmBody, IMessage *lpMessage, bool filterDouble,
-    bool appendBody)
+HRESULT VMIMEToMAPI::dissect_body(vmime::shared_ptr<vmime::header> vmHeader,
+    vmime::shared_ptr<vmime::body> vmBody, IMessage *lpMessage,
+    bool filterDouble, bool appendBody)
 {
 	HRESULT	hr = hrSuccess;
 	IStream *lpStream = NULL;
@@ -1864,11 +1869,11 @@
 		++m_mailState.mime_vtag_nest;
 
 	try {
-		vmime::ref<vmime::mediaType> mt = vmHeader->ContentType()->getValue().dynamicCast<vmime::mediaType>();
+		auto mt = vmime::dynamicCast<vmime::mediaType>(vmHeader->ContentType()->getValue());
 		bool force_raw = false;
 
 		try {
-			bIsAttachment = vmHeader->ContentDisposition()->getValue().dynamicCast<vmime::contentDisposition>()->getName() == vmime::contentDispositionTypes::ATTACHMENT;
+			bIsAttachment = vmime::dynamicCast<vmime::contentDisposition>(vmHeader->ContentDisposition()->getValue())->getName() == vmime::contentDispositionTypes::ATTACHMENT;
 		} catch (vmime::exception) {
 			// ignore exception, a header needed to detect attachment status could not be used
 			// probably can not happen, but better safe than sorry.
@@ -1969,8 +1974,8 @@
 				goto exit;
 			}
 		} else if (mt->getType() == vmime::mediaTypes::APPLICATION && mt->getSubType() == vmime::mediaTypes::APPLICATION_OCTET_STREAM) {
-			if (vmHeader->ContentDisposition().dynamicCast<vmime::contentDispositionField>()->hasParameter("filename") ||
-				vmHeader->ContentType().dynamicCast<vmime::contentTypeField>()->hasParameter("name")) {
+			if (vmime::dynamicCast<vmime::contentDispositionField>(vmHeader->ContentDisposition())->hasParameter("filename") ||
+			    vmime::dynamicCast<vmime::contentTypeField>(vmHeader->ContentType())->hasParameter("name")) {
 				// should be attachment
 				hr = handleAttachment(vmHeader, vmBody, lpMessage);
 				if (hr != hrSuccess)
@@ -2028,13 +2033,12 @@
  * Returns the transfer-decoded data.
  */
 std::string
-VMIMEToMAPI::content_transfer_decode(vmime::ref<vmime::body> im_body) const
+VMIMEToMAPI::content_transfer_decode(vmime::shared_ptr<vmime::body> im_body) const
 {
 	/* TODO: Research how conversion could be minimized using streams. */
 	std::string data;
 	vmime::utility::outputStreamStringAdapter str_adap(data);
-	vmime::ref<const vmime::contentHandler> im_cont =
-		im_body->getContents();
+	auto im_cont = im_body->getContents();
 
 	try {
 		im_cont->extract(str_adap);
@@ -2057,11 +2061,10 @@
  * new character set for it.
  */
 vmime::charset
-VMIMEToMAPI::get_mime_encoding(vmime::ref<vmime::header> im_header,
-    vmime::ref<vmime::body> im_body) const
+VMIMEToMAPI::get_mime_encoding(vmime::shared_ptr<vmime::header> im_header,
+    vmime::shared_ptr<vmime::body> im_body) const
 {
-	vmime::ref<const vmime::contentTypeField> ctf =
-		im_header->ContentType().dynamicCast<vmime::contentTypeField>();
+	auto ctf = vmime::dynamicCast<vmime::contentTypeField>(im_header->ContentType());
 
 	if (ctf != NULL && ctf->hasParameter("charset"))
 		return im_body->getCharset();
@@ -2144,7 +2147,9 @@
  * @return		MAPI error code.
  * @retval		MAPI_E_CALL_FAILED	Caught an exception, which breaks the conversion.
  */
-HRESULT VMIMEToMAPI::handleTextpart(vmime::ref<vmime::header> vmHeader, vmime::ref<vmime::body> vmBody, IMessage* lpMessage, bool bAppendBody) {
+HRESULT VMIMEToMAPI::handleTextpart(vmime::shared_ptr<vmime::header> vmHeader,
+    vmime::shared_ptr<vmime::body> vmBody, IMessage* lpMessage, bool bAppendBody)
+{
 	HRESULT hr = S_OK;
 	IStream *lpStream = NULL;
 
@@ -2337,7 +2342,9 @@
  * But with conversion to MAPI, we have this seemingly lossy conversion
  * stage. :-(
  */
-HRESULT VMIMEToMAPI::handleHTMLTextpart(vmime::ref<vmime::header> vmHeader, vmime::ref<vmime::body> vmBody, IMessage* lpMessage, bool bAppendBody) {
+HRESULT VMIMEToMAPI::handleHTMLTextpart(vmime::shared_ptr<vmime::header> vmHeader,
+    vmime::shared_ptr<vmime::body> vmBody, IMessage *lpMessage, bool bAppendBody)
+{
 	HRESULT		hr				= hrSuccess;
 	IStream*	lpHTMLStream	= NULL; 
 	ULONG		cbWritten		= 0;
@@ -2485,7 +2492,8 @@
 		HrSetOneProp(lpMessage, &sCodepage);
 
 		// we may have received a text part to append to the HTML body
-		if (vmHeader->ContentType()->getValue().dynamicCast<vmime::mediaType>()->getSubType() == vmime::mediaTypes::TEXT_PLAIN) {
+		if (vmime::dynamicCast<vmime::mediaType>(vmHeader->ContentType()->getValue())->getSubType() ==
+		    vmime::mediaTypes::TEXT_PLAIN) {
 			// escape and wrap with <pre> tags
 			std::wstring strwBody = m_converter.convert_to<std::wstring>(CHARSET_WCHAR "//IGNORE", strHTML, rawsize(strHTML), mime_charset.getName().c_str());
 			strHTML = "<pre>";
@@ -2559,7 +2567,9 @@
  * @return		MAPI error code.
  * @retval		MAPI_E_CALL_FAILED	Caught an exception, which breaks the conversion.
  */
-HRESULT VMIMEToMAPI::handleAttachment(vmime::ref<vmime::header> vmHeader, vmime::ref<vmime::body> vmBody, IMessage* lpMessage, bool bAllowEmpty) {
+HRESULT VMIMEToMAPI::handleAttachment(vmime::shared_ptr<vmime::header> vmHeader,
+    vmime::shared_ptr<vmime::body> vmBody, IMessage *lpMessage, bool bAllowEmpty)
+{
 	HRESULT		hr			= hrSuccess;
 	IStream		*lpStream	= NULL; 
 	LPATTACH	lpAtt		= NULL;
@@ -2568,10 +2578,10 @@
 	std::wstring strLongFilename;
 	int			nProps = 0;
 	SPropValue	attProps[12];
-	vmime::ref<vmime::contentDispositionField> cdf;	// parameters of Content-Disposition header
-	vmime::ref<vmime::contentDisposition> cdv;		// value of Content-Disposition header
-	vmime::ref<vmime::contentTypeField> ctf;	
-	vmime::ref<vmime::mediaType> mt;
+	vmime::shared_ptr<vmime::contentDispositionField> cdf;	// parameters of Content-Disposition header
+	vmime::shared_ptr<vmime::contentDisposition> cdv;		// value of Content-Disposition header
+	vmime::shared_ptr<vmime::contentTypeField> ctf;
+	vmime::shared_ptr<vmime::mediaType> mt;
 
 	memset(attProps, 0, sizeof(attProps));
 
@@ -2589,10 +2599,10 @@
 	try {
 		// attach adapter, generate in right encoding
 		outputStreamMAPIAdapter osMAPI(lpStream);
-		cdf = vmHeader->ContentDisposition().dynamicCast<vmime::contentDispositionField>();
-		cdv = cdf->getValue().dynamicCast<vmime::contentDisposition>();
-		ctf = vmHeader->ContentType().dynamicCast<vmime::contentTypeField>();
-		mt = ctf->getValue().dynamicCast<vmime::mediaType>();
+		cdf = vmime::dynamicCast<vmime::contentDispositionField>(vmHeader->ContentDisposition());
+		cdv = vmime::dynamicCast<vmime::contentDisposition>(cdf->getValue());
+		ctf = vmime::dynamicCast<vmime::contentTypeField>(vmHeader->ContentType());
+		mt = vmime::dynamicCast<vmime::mediaType>(ctf->getValue());
 
 		try {
 			vmBody->getContents()->generate(osMAPI, vmime::encoding(vmime::encodingTypes::BINARY));
@@ -2630,7 +2640,7 @@
 		attProps[nProps++].Value.ul = ATTACH_BY_VALUE;
 
 		// vmHeader->ContentId() is headerField ->getValue() returns headerFieldValue, which messageId is.
-		strId = vmHeader->ContentId()->getValue().dynamicCast<vmime::messageId>()->getId();
+		strId = vmime::dynamicCast<vmime::messageId>(vmHeader->ContentId()->getValue())->getId();
 		if (!strId.empty()) {
 			// only set this property when string is present
 			// otherwise, you don't get the 'save attachments' list in the main menu of outlook
@@ -2639,7 +2649,7 @@
 		}
 
 		try {
-			strLocation = vmHeader->ContentLocation()->getValue().dynamicCast<vmime::text>()->getConvertedText(MAPI_CHARSET);
+			strLocation = vmime::dynamicCast<vmime::text>(vmHeader->ContentLocation()->getValue())->getConvertedText(MAPI_CHARSET);
 		}
 		catch (vmime::exceptions::charset_conv_error) { }
 		if (!strLocation.empty()) {
@@ -2964,8 +2974,8 @@
 	std::string myword;
 	std::wstring ret;
 
-	const std::vector<vmime::ref<const vmime::word> >& words = vmText.getWordList();
-	std::vector<vmime::ref<const vmime::word> >::const_iterator i, j;
+	const auto &words = vmText.getWordList();
+	std::vector<vmime::shared_ptr<const vmime::word> >::const_iterator i, j;
 	for (i = words.begin(); i != words.end(); ++i) {
 		/*
 		 * RFC 5322 §2.2 specifies header field bodies consist of
@@ -3289,7 +3299,7 @@
  * 
  * @return string with IMAP envelope list part
  */
-std::string VMIMEToMAPI::mailboxToEnvelope(vmime::ref<vmime::mailbox> mbox)
+std::string VMIMEToMAPI::mailboxToEnvelope(vmime::shared_ptr<vmime::mailbox> mbox)
 {
 	vector<string> lMBox;
 	string buffer;
@@ -3308,7 +3318,7 @@
 
 	lMBox.push_back("NIL");	// at-domain-list (source route) ... whatever that means
 
-	buffer = "\"" + mbox->getEmail() + "\"";
+	buffer = "\"" + mbox->getEmail().toString() + "\"";
 	pos = buffer.find("@");
 	if (pos != string::npos)
 		boost::algorithm::replace_first(buffer, "@", "\" \"");
@@ -3327,7 +3337,7 @@
  * 
  * @return string with IMAP envelope list part
  */
-std::string VMIMEToMAPI::addressListToEnvelope(vmime::ref<vmime::addressList> aList)
+std::string VMIMEToMAPI::addressListToEnvelope(vmime::shared_ptr<vmime::addressList> aList)
 {
 	list<string> lAddr;
 	string buffer;
@@ -3342,7 +3352,7 @@
 		
 	for (int i = 0; i < aCount; ++i) {
 		try {
-			buffer += mailboxToEnvelope(aList->getAddressAt(i).dynamicCast<vmime::mailbox>());
+			buffer += mailboxToEnvelope(vmime::dynamicCast<vmime::mailbox>(aList->getAddressAt(i)));
 			lAddr.push_back(buffer);
 		} catch (vmime::exception &e) {
 		}
@@ -3367,7 +3377,8 @@
  * 
  * @return MAPI Error code
  */
-HRESULT VMIMEToMAPI::createIMAPEnvelope(vmime::ref<vmime::message> vmMessage, IMessage* lpMessage)
+HRESULT VMIMEToMAPI::createIMAPEnvelope(vmime::shared_ptr<vmime::message> vmMessage,
+    IMessage *lpMessage)
 {
 	HRESULT hr = hrSuccess;
 	std::string buffer;
@@ -3394,21 +3405,21 @@
  * 
  * @return ENVELOPE data
  */
-std::string VMIMEToMAPI::createIMAPEnvelope(vmime::ref<vmime::message> vmMessage)
+std::string VMIMEToMAPI::createIMAPEnvelope(vmime::shared_ptr<vmime::message> vmMessage)
 {
 	vector<string> lItems;
-	vmime::ref<vmime::header> vmHeader = vmMessage->getHeader();
+	auto vmHeader = vmMessage->getHeader();
 	std::string buffer;
 	vmime::utility::outputStreamStringAdapter os(buffer);
 
 	// date
 	try {
-		vmime::ref<vmime::datetime> date;
+		vmime::shared_ptr<vmime::datetime> date;
 		try {
-			date = vmHeader->Date()->getValue().dynamicCast<vmime::datetime>();
+			date = vmime::dynamicCast<vmime::datetime>(vmHeader->Date()->getValue());
 		} catch (vmime::exception &e) {
 			// date must not be empty, so force now() as the timestamp
-			date = vmime::create<vmime::datetime>(vmime::datetime::now());
+			date = vmime::make_shared<vmime::datetime>(vmime::datetime::now());
 		}
 		date->generate(os);
 		lItems.push_back("\"" + buffer + "\"");
@@ -3431,7 +3442,7 @@
 
 	// from
 	try {
-		buffer = mailboxToEnvelope(vmHeader->From()->getValue().dynamicCast<vmime::mailbox>());
+		buffer = mailboxToEnvelope(vmime::dynamicCast<vmime::mailbox>(vmHeader->From()->getValue()));
 		lItems.push_back("(" + buffer + ")");
 	} catch (vmime::exception &e) {
 		// this is not allowed, but better than nothing
@@ -3441,7 +3452,7 @@
 
 	// sender
 	try {
-		buffer = mailboxToEnvelope(vmHeader->Sender()->getValue().dynamicCast<vmime::mailbox>());
+		buffer = mailboxToEnvelope(vmime::dynamicCast<vmime::mailbox>(vmHeader->Sender()->getValue()));
 		lItems.push_back("(" + buffer + ")");
 	} catch (vmime::exception &e) {
 		lItems.push_back(lItems.back());
@@ -3450,7 +3461,7 @@
 
 	// reply-to
 	try {
-		buffer = mailboxToEnvelope(vmHeader->ReplyTo()->getValue().dynamicCast<vmime::mailbox>());
+		buffer = mailboxToEnvelope(vmime::dynamicCast<vmime::mailbox>(vmHeader->ReplyTo()->getValue()));
 		lItems.push_back("(" + buffer + ")");
 	} catch (vmime::exception &e) {
 		lItems.push_back(lItems.back());
@@ -3459,7 +3470,7 @@
 
 	// ((to),(to))
 	try {
-		buffer = addressListToEnvelope(vmHeader->To()->getValue().dynamicCast<vmime::addressList>());
+		buffer = addressListToEnvelope(vmime::dynamicCast<vmime::addressList>(vmHeader->To()->getValue()));
 		lItems.push_back(buffer);
 	} catch (vmime::exception &e) {
 		lItems.push_back("NIL");
@@ -3468,10 +3479,10 @@
 
 	// ((cc),(cc))
 	try {
-		vmime::ref<vmime::addressList> aList = vmHeader->Cc()->getValue().dynamicCast<vmime::addressList>();
+		auto aList = vmime::dynamicCast<vmime::addressList>(vmHeader->Cc()->getValue());
 		int aCount = aList->getAddressCount();
 		for (int i = 0; i < aCount; ++i)
-			buffer += mailboxToEnvelope(aList->getAddressAt(i).dynamicCast<vmime::mailbox>());
+			buffer += mailboxToEnvelope(vmime::dynamicCast<vmime::mailbox>(aList->getAddressAt(i)));
 		lItems.push_back(buffer.empty() ? "NIL" : "(" + buffer + ")");
 	} catch (vmime::exception &e) {
 		lItems.push_back("NIL");
@@ -3480,10 +3491,10 @@
 
 	// ((bcc),(bcc))
 	try {
-		vmime::ref<vmime::addressList> aList = vmHeader->Bcc()->getValue().dynamicCast<vmime::addressList>();
+		auto aList = vmime::dynamicCast<vmime::addressList>(vmHeader->Bcc()->getValue());
 		int aCount = aList->getAddressCount();
 		for (int i = 0; i < aCount; ++i)
-			buffer += mailboxToEnvelope(aList->getAddressAt(i).dynamicCast<vmime::mailbox>());
+			buffer += mailboxToEnvelope(vmime::dynamicCast<vmime::mailbox>(aList->getAddressAt(i)));
 		lItems.push_back(buffer.empty() ? "NIL" : "(" + buffer + ")");
 	} catch (vmime::exception &e) {
 		lItems.push_back("NIL");
@@ -3522,7 +3533,8 @@
  * 
  * @return MAPI error code
  */
-HRESULT VMIMEToMAPI::createIMAPBody(const string &input, vmime::ref<vmime::message> vmMessage, IMessage* lpMessage)
+HRESULT VMIMEToMAPI::createIMAPBody(const string &input,
+    vmime::shared_ptr<vmime::message> vmMessage, IMessage *lpMessage)
 {
 	SPropValue sProps[4];
 	string strBody;
@@ -3555,24 +3567,25 @@
  * 
  * @return always success
  */
-HRESULT VMIMEToMAPI::messagePartToStructure(const string &input, vmime::ref<vmime::bodyPart> vmBodyPart, std::string *lpSimple, std::string *lpExtended)
+HRESULT VMIMEToMAPI::messagePartToStructure(const string &input,
+    vmime::shared_ptr<vmime::bodyPart> vmBodyPart, std::string *lpSimple,
+    std::string *lpExtended)
 {
 	HRESULT hr = hrSuccess;
 	list<string> lBody;
 	list<string> lBodyStructure;
-	vmime::ref<vmime::header> vmHeaderPart = vmBodyPart->getHeader();
+	auto vmHeaderPart = vmBodyPart->getHeader();
 
 	try {
-		vmime::ref<vmime::contentTypeField> ctf;
+		vmime::shared_ptr<vmime::contentTypeField> ctf;
 		if (vmHeaderPart->hasField(vmime::fields::CONTENT_TYPE)) {
 			// use Content-Type header from part
-			ctf = vmHeaderPart->ContentType().dynamicCast<vmime::contentTypeField>();
+			ctf = vmime::dynamicCast<vmime::contentTypeField>(vmHeaderPart->ContentType());
 		} else {
 			// create empty default Content-Type header
-			ctf = vmime::headerFieldFactory::getInstance()->create("Content-Type", "").dynamicCast<vmime::contentTypeField>();
+			ctf = vmime::dynamicCast<vmime::contentTypeField>(vmime::headerFieldFactory::getInstance()->create("Content-Type", ""));
 		}
-		vmime::ref<vmime::mediaType> mt = ctf->getValue().dynamicCast<vmime::mediaType>();
-
+		auto mt = vmime::dynamicCast<vmime::mediaType>(ctf->getValue());
 		if (mt->getType() == vmime::mediaTypes::MULTIPART) {
 			// handle multipart
 			// alternative, mixed, related
@@ -3583,7 +3596,7 @@
 			// function please:
 			string strBody;
 			string strBodyStructure;
-			for (int i = 0; i < vmBodyPart->getBody()->getPartCount(); ++i) {
+			for (size_t i = 0; i < vmBodyPart->getBody()->getPartCount(); ++i) {
 				messagePartToStructure(input, vmBodyPart->getBody()->getPartAt(i), &strBody, &strBodyStructure);
 				lBody.push_back(strBody);
 				lBodyStructure.push_back(strBodyStructure);
@@ -3641,21 +3654,22 @@
  * 
  * @return always success
  */
-HRESULT VMIMEToMAPI::bodyPartToStructure(const string &input, vmime::ref<vmime::bodyPart> vmBodyPart, std::string *lpSimple, std::string *lpExtended)
+HRESULT VMIMEToMAPI::bodyPartToStructure(const string &input,
+    vmime::shared_ptr<vmime::bodyPart> vmBodyPart, std::string *lpSimple,
+    std::string *lpExtended)
 {
 	string strPart;
 	list<string> lBody;
 	list<string> lBodyStructure;
 	string buffer;
 	vmime::utility::outputStreamStringAdapter os(buffer);
-	vmime::ref<vmime::header> vmHeaderPart = vmBodyPart->getHeader();
-
-	vmime::ref<vmime::contentTypeField> ctf;
-	vmime::ref<vmime::mediaType> mt;
+	auto vmHeaderPart = vmBodyPart->getHeader();
+	vmime::shared_ptr<vmime::contentTypeField> ctf;
+	vmime::shared_ptr<vmime::mediaType> mt;
 
 	try {
-		ctf = vmHeaderPart->findField(vmime::fields::CONTENT_TYPE).dynamicCast<vmime::contentTypeField>();
-		mt = ctf->getValue().dynamicCast<vmime::mediaType>();
+		ctf = vmime::dynamicCast<vmime::contentTypeField>(vmHeaderPart->findField(vmime::fields::CONTENT_TYPE));
+		mt = vmime::dynamicCast<vmime::mediaType>(ctf->getValue());
 	}
 	catch (vmime::exception &e) {
 		// create with text/plain; charset=us-ascii ?
@@ -3671,7 +3685,7 @@
 	lBody.push_back(parameterizedFieldToStructure(ctf));
 
 	try {
-		buffer = vmHeaderPart->findField(vmime::fields::CONTENT_ID)->getValue().dynamicCast<vmime::messageId>()->getId();
+		buffer = vmime::dynamicCast<vmime::messageId>(vmHeaderPart->findField(vmime::fields::CONTENT_ID)->getValue())->getId();
 		lBody.push_back(buffer.empty() ? "NIL" : "\"<" + buffer + ">\"");
 	}
 	catch (vmime::exception &e) {
@@ -3716,7 +3730,7 @@
 	if (mt->getType() == vmime::mediaTypes::MESSAGE && mt->getSubType() == vmime::mediaTypes::MESSAGE_RFC822) {
 		string strSubSingle;
 		string strSubExtended;
-		vmime::ref<vmime::message> subMessage = vmime::create<vmime::message>();
+		auto subMessage = vmime::make_shared<vmime::message>();
 
 		// From RFC:
 		// A body type of type MESSAGE and subtype RFC822 contains,
@@ -3765,7 +3779,7 @@
  * 
  * @return IMAP list part
  */
-std::string VMIMEToMAPI::getStructureExtendedFields(vmime::ref<vmime::header> vmHeaderPart)
+std::string VMIMEToMAPI::getStructureExtendedFields(vmime::shared_ptr<vmime::header> vmHeaderPart)
 {
 	list<string> lItems;
 	string buffer;
@@ -3774,9 +3788,8 @@
 	// content-disposition header
 	try {
 		// use findField because we want an exception when missing
-		vmime::ref<vmime::contentDispositionField> cdf = vmHeaderPart->findField(vmime::fields::CONTENT_DISPOSITION).dynamicCast<vmime::contentDispositionField>();
-		vmime::ref<vmime::contentDisposition> cd = cdf->getValue().dynamicCast<vmime::contentDisposition>();
-
+		auto cdf = vmime::dynamicCast<vmime::contentDispositionField>(vmHeaderPart->findField(vmime::fields::CONTENT_DISPOSITION));
+		auto cd = vmime::dynamicCast<vmime::contentDisposition>(cdf->getValue());
 		lItems.push_back("(\"" + cd->getName() + "\" " + parameterizedFieldToStructure(cdf) + ")");
 	}
 	catch (vmime::exception &e) {
@@ -3806,15 +3819,15 @@
  * 
  * @return IMAP list
  */
-std::string VMIMEToMAPI::parameterizedFieldToStructure(vmime::ref<vmime::parameterizedHeaderField> vmParamField)
+std::string VMIMEToMAPI::parameterizedFieldToStructure(vmime::shared_ptr<vmime::parameterizedHeaderField> vmParamField)
 {
 	list<string> lParams;
 	string buffer;
 	vmime::utility::outputStreamStringAdapter os(buffer);
 
 	try {
-		vector <vmime::ref<vmime::parameter> > vParams = vmParamField->getParameterList();
-		std::vector<vmime::ref<vmime::parameter> >::const_iterator iParam;
+		vector <vmime::shared_ptr<vmime::parameter> > vParams = vmParamField->getParameterList();
+		std::vector<vmime::shared_ptr<vmime::parameter> >::const_iterator iParam;
 
 		for (iParam = vParams.begin(); iParam != vParams.end(); ++iParam) {
 			lParams.push_back("\"" + (*iParam)->getName() + "\"");
--- a/inetmapi/VMIMEToMAPI.h
+++ b/inetmapi/VMIMEToMAPI.h
@@ -75,25 +75,25 @@
 	sMailState m_mailState;
 	convert_context m_converter;
 
-	HRESULT fillMAPIMail(vmime::ref<vmime::message> vmMessage, IMessage *lpMessage);
-	HRESULT dissect_body(vmime::ref<vmime::header> vmHeader, vmime::ref<vmime::body> vmBody, IMessage *lpMessage, bool filterDouble = false, bool appendBody = false);
-	void dissect_message(vmime::ref<vmime::body>, IMessage *);
-	HRESULT dissect_multipart(vmime::ref<vmime::header>, vmime::ref<vmime::body>, IMessage *, bool filterDouble = false, bool appendBody = false);
-	HRESULT dissect_ical(vmime::ref<vmime::header>, vmime::ref<vmime::body>, IMessage *, bool bIsAttachment);
-
-	HRESULT handleHeaders(vmime::ref<vmime::header> vmHeader, IMessage* lpMessage);
-	HRESULT handleRecipients(vmime::ref<vmime::header> vmHeader, IMessage* lpMessage);
-	HRESULT modifyRecipientList(LPADRLIST lpRecipients, vmime::ref<vmime::addressList> vmAddressList, ULONG ulRecipType);
+	HRESULT fillMAPIMail(vmime::shared_ptr<vmime::message>, IMessage *lpMessage);
+	HRESULT dissect_body(vmime::shared_ptr<vmime::header>, vmime::shared_ptr<vmime::body>, IMessage *lpMessage, bool filterDouble = false, bool appendBody = false);
+	void dissect_message(vmime::shared_ptr<vmime::body>, IMessage *);
+	HRESULT dissect_multipart(vmime::shared_ptr<vmime::header>, vmime::shared_ptr<vmime::body>, IMessage *, bool filterDouble = false, bool appendBody = false);
+	HRESULT dissect_ical(vmime::shared_ptr<vmime::header>, vmime::shared_ptr<vmime::body>, IMessage *, bool bIsAttachment);
+
+	HRESULT handleHeaders(vmime::shared_ptr<vmime::header>, IMessage* lpMessage);
+	HRESULT handleRecipients(vmime::shared_ptr<vmime::header>, IMessage* lpMessage);
+	HRESULT modifyRecipientList(LPADRLIST lpRecipients, vmime::shared_ptr<vmime::addressList>, ULONG ulRecipType);
 	HRESULT modifyFromAddressBook(LPSPropValue *lppPropVals, ULONG *lpulValues, const char *email, const WCHAR *fullname, ULONG ulRecipType, LPSPropTagArray lpPropsList);
 
-	std::string content_transfer_decode(vmime::ref<vmime::body>) const;
-	vmime::charset get_mime_encoding(vmime::ref<vmime::header>, vmime::ref<vmime::body>) const;
+	std::string content_transfer_decode(vmime::shared_ptr<vmime::body>) const;
+	vmime::charset get_mime_encoding(vmime::shared_ptr<vmime::header>, vmime::shared_ptr<vmime::body>) const;
 	int renovate_encoding(std::string &, const std::vector<std::string> &);
 	int renovate_encoding(std::wstring &, std::string &, const std::vector<std::string> &);
 
-	HRESULT handleTextpart(vmime::ref<vmime::header> vmHeader, vmime::ref<vmime::body> vmBody, IMessage* lpMessage, bool bAppendBody);
-	HRESULT handleHTMLTextpart(vmime::ref<vmime::header> vmHeader, vmime::ref<vmime::body> vmBody, IMessage* lpMessage, bool bAppendBody);
-	HRESULT handleAttachment(vmime::ref<vmime::header> vmHeader, vmime::ref<vmime::body> vmBody, IMessage* lpMessage, bool bAllowEmpty = true);
+	HRESULT handleTextpart(vmime::shared_ptr<vmime::header>, vmime::shared_ptr<vmime::body>, IMessage* lpMessage, bool bAppendBody);
+	HRESULT handleHTMLTextpart(vmime::shared_ptr<vmime::header>, vmime::shared_ptr<vmime::body>, IMessage* lpMessage, bool bAppendBody);
+	HRESULT handleAttachment(vmime::shared_ptr<vmime::header>, vmime::shared_ptr<vmime::body>, IMessage* lpMessage, bool bAllowEmpty = true);
 	HRESULT handleMessageToMeProps(IMessage *lpMessage, LPADRLIST lpRecipients);
 
 	int getCharsetFromHTML(const std::string &strHTML, vmime::charset *htmlCharset);
@@ -102,17 +102,17 @@
 	
 	HRESULT postWriteFixups(IMessage *lpMessage);
 
-	std::string mailboxToEnvelope(vmime::ref<vmime::mailbox> mbox);
-	std::string addressListToEnvelope(vmime::ref<vmime::addressList> mbox);
-	HRESULT createIMAPEnvelope(vmime::ref<vmime::message> vmMessage, IMessage* lpMessage);
-	std::string createIMAPEnvelope(vmime::ref<vmime::message> vmMessage);
-
-	HRESULT createIMAPBody(const std::string &input, vmime::ref<vmime::message> vmMessage, IMessage* lpMessage);
-
-	HRESULT messagePartToStructure(const std::string &input, vmime::ref<vmime::bodyPart> vmBodyPart, std::string *lpSimple, std::string *lpExtended);
-	HRESULT bodyPartToStructure(const std::string &input, vmime::ref<vmime::bodyPart> vmBodyPart, std::string *lpSimple, std::string *lpExtended);
-	std::string getStructureExtendedFields(vmime::ref<vmime::header> vmHeaderPart);
-	std::string parameterizedFieldToStructure(vmime::ref<vmime::parameterizedHeaderField> vmParamField);
+	std::string mailboxToEnvelope(vmime::shared_ptr<vmime::mailbox>);
+	std::string addressListToEnvelope(vmime::shared_ptr<vmime::addressList> mbox);
+	HRESULT createIMAPEnvelope(vmime::shared_ptr<vmime::message>, IMessage* lpMessage);
+	std::string createIMAPEnvelope(vmime::shared_ptr<vmime::message>);
+
+	HRESULT createIMAPBody(const std::string &input, vmime::shared_ptr<vmime::message>, IMessage* lpMessage);
+
+	HRESULT messagePartToStructure(const std::string &input, vmime::shared_ptr<vmime::bodyPart>, std::string *lpSimple, std::string *lpExtended);
+	HRESULT bodyPartToStructure(const std::string &input, vmime::shared_ptr<vmime::bodyPart>, std::string *lpSimple, std::string *lpExtended);
+	std::string getStructureExtendedFields(vmime::shared_ptr<vmime::header> vmHeaderPart);
+	std::string parameterizedFieldToStructure(vmime::shared_ptr<vmime::parameterizedHeaderField>);
 	std::string::size_type countBodyLines(const std::string &input, std::string::size_type start, std::string::size_type length);
 };
 
--- a/inetmapi/inetmapi.cpp
+++ b/inetmapi/inetmapi.cpp
@@ -180,7 +180,7 @@
 	LPSPropValue	lpTime		= NULL;
 	LPSPropValue	lpMessageId	= NULL;
 	MAPIToVMIME*	mToVM		= new MAPIToVMIME(lpSession, lpAddrBook, lpLogger, sopt);
-	vmime::ref<vmime::message>	lpVMMessage	= NULL;
+	vmime::shared_ptr<vmime::message>	lpVMMessage	= NULL;
 	vmime::utility::outputStreamAdapter adapter(os);
 
 	InitializeVMime();
@@ -224,7 +224,7 @@
 {
 	HRESULT			hr	= hrSuccess;
 	MAPIToVMIME		*mToVM	= new MAPIToVMIME(lpSession, lpAddrBook, lpLogger, sopt);
-	vmime::ref<vmime::message>	vmMessage;
+	vmime::shared_ptr<vmime::message>	vmMessage;
 	ECVMIMESender		*mailer	= dynamic_cast<ECVMIMESender*>(mailer_base);
 	wstring			wstrError;
 	SPropArrayPtr	ptrProps;
--- a/inetmapi/inputStreamMAPIAdapter.cpp
+++ b/inetmapi/inputStreamMAPIAdapter.cpp
@@ -36,12 +36,11 @@
 		lpStream->Release();
 }
 
-vmime::utility::stream::size_type inputStreamMAPIAdapter::read(value_type* data, const size_type count)
+size_t inputStreamMAPIAdapter::read(unsigned char *data, size_t count)
 {
 	ULONG ulSize = 0;
 
-	lpStream->Read((unsigned char *)data, count, &ulSize);
-
+	lpStream->Read(data, count, &ulSize);
 	if (ulSize != count)
 		this->ateof = true;
 
@@ -59,7 +58,7 @@
 	this->ateof = false;
 }
 
-vmime::utility::stream::size_type inputStreamMAPIAdapter::skip(const size_type count)
+size_t inputStreamMAPIAdapter::skip(size_t count)
 {
 	ULARGE_INTEGER ulSize;
 	LARGE_INTEGER move;
--- a/inetmapi/inputStreamMAPIAdapter.h
+++ b/inetmapi/inputStreamMAPIAdapter.h
@@ -20,17 +20,17 @@
 
 #include <kopano/zcdefs.h>
 #include <mapidefs.h>
-#include <vmime/utility/stream.hpp>
+#include <vmime/utility/inputStream.hpp>
 
 class inputStreamMAPIAdapter _kc_final : public vmime::utility::inputStream {
 public:
 	inputStreamMAPIAdapter(IStream *lpStream);
 	virtual ~inputStreamMAPIAdapter();
 
-	virtual size_type read(value_type* const data, const size_type count);
-	virtual size_type skip(const size_type count);
-	virtual void reset();
-	virtual bool eof(void) const { return this->ateof; }
+	virtual size_t read(vmime::byte_t *, size_t) _kc_override;
+	virtual size_t skip(size_t) _kc_override;
+	virtual void reset(void) _kc_override;
+	virtual bool eof(void) const _kc_override { return this->ateof; }
 
 private:
 	bool	ateof;
--- a/inetmapi/mapiAttachment.cpp
+++ b/inetmapi/mapiAttachment.cpp
@@ -14,14 +14,18 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  */
-
+#include <memory>
 #include "mapiAttachment.h"
 
 #include <vmime/contentDispositionField.hpp>
 #include <vmime/contentTypeField.hpp>
 #include <vmime/messageId.hpp>
 
-mapiAttachment::mapiAttachment(vmime::ref <const vmime::contentHandler> data, const vmime::encoding& enc, const vmime::mediaType& type, const std::string& contentid, const vmime::word filename, const vmime::text& desc, const vmime::word& name) : defaultAttachment(data, enc, type, desc, name)
+mapiAttachment::mapiAttachment(vmime::shared_ptr<const vmime::contentHandler> data,
+    const vmime::encoding &enc, const vmime::mediaType &type,
+    const std::string &contentid, const vmime::word filename,
+    const vmime::text &desc, const vmime::word &name) :
+	defaultAttachment(data, enc, type, desc, name)
 {
 	m_filename = filename;
 	m_contentid = contentid;
@@ -34,14 +38,11 @@
 	m_charset = ch;
 }
 
-void mapiAttachment::generatePart(vmime::ref<vmime::bodyPart> part) const
+void mapiAttachment::generatePart(vmime::shared_ptr<vmime::bodyPart> part) const
 {
 	vmime::defaultAttachment::generatePart(part);
-
-	part->getHeader()->ContentDisposition().dynamicCast <vmime::contentDispositionField>()->setFilename(m_filename);
-
-	vmime::ref<vmime::contentTypeField> ctf = part->getHeader()->ContentType().dynamicCast <vmime::contentTypeField>();
-
+	vmime::dynamicCast<vmime::contentDispositionField>(part->getHeader()->ContentDisposition())->setFilename(m_filename);
+	auto ctf = vmime::dynamicCast<vmime::contentTypeField>(part->getHeader()->ContentType());
 	ctf->getParameter("name")->setValue(m_filename);
 	if (m_hasCharset)
 		ctf->setCharset(vmime::charset(m_charset));
--- a/inetmapi/mapiAttachment.h
+++ b/inetmapi/mapiAttachment.h
@@ -26,7 +26,7 @@
 {
 public:
 
-	mapiAttachment(vmime::ref <const vmime::contentHandler> data,
+	mapiAttachment(vmime::shared_ptr<const vmime::contentHandler> data,
 				   const vmime::encoding& enc,
 				   const vmime::mediaType& type,
 				   const std::string& contentid,
@@ -44,7 +44,7 @@
 	bool m_hasCharset;
 	vmime::charset m_charset;
 
-	void generatePart(vmime::ref<vmime::bodyPart> part) const;
+	void generatePart(vmime::shared_ptr<vmime::bodyPart> part) const;
 };
 
 #endif
--- a/inetmapi/mapiTextPart.cpp
+++ b/inetmapi/mapiTextPart.cpp
@@ -41,6 +41,7 @@
 // the GNU General Public License cover the whole combination.
 //
 
+#include <memory>
 #include "mapiTextPart.h"
 #include "vmime/exception.hpp"
 
@@ -51,25 +52,15 @@
 
 #include "vmime/emptyContentHandler.hpp"
 #include "vmime/stringContentHandler.hpp"
+#include <vmime/utility/outputStreamAdapter.hpp>
 
 namespace vmime
 {
 
-	/** Create a new object and return a reference to it.
-	 * vmime only goes as far as p4... 
-	 * @return reference to the new object
-	 */
-	template <class T, class P0, class P1, class P2, class P3, class P4, class P5>
-	static ref <T> create(const P0& p0, const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) { 
-		return ref <T>::fromPtr(new T(p0, p1, p2, p3, p4, p5));
-	}
-                                            
-                                            
-
 mapiTextPart::mapiTextPart()
-	: m_plainText(vmime::create <emptyContentHandler>()),
-	  m_text(vmime::create <emptyContentHandler>()),
-	  m_otherText(vmime::create <emptyContentHandler>())
+	: m_plainText(vmime::make_shared<emptyContentHandler>()),
+	  m_text(vmime::make_shared<emptyContentHandler>()),
+	  m_otherText(vmime::make_shared<emptyContentHandler>())
 {
 	m_bHaveOtherCharset = false;
 }
@@ -83,7 +74,7 @@
 		return (mediaType(mediaTypes::TEXT, mediaTypes::TEXT_HTML));
 }
 
-int mapiTextPart::getPartCount() const
+size_t mapiTextPart::getPartCount() const
 {
 	int count = 0;
 	if (!m_plainText->isEmpty())
@@ -95,13 +86,14 @@
 	return count;
 }
 
-void mapiTextPart::generateIn(ref <bodyPart> /* message */, ref <bodyPart> parent) const
+void mapiTextPart::generateIn(vmime::shared_ptr<bodyPart> /* message */,
+    vmime::shared_ptr<bodyPart> parent) const
 {
 	// Plain text
 	if (!m_plainText->isEmpty())
 	{
 		// -- Create a new part
-		ref <bodyPart> part = vmime::create <bodyPart>();
+		auto part = vmime::make_shared<bodyPart>();
 		parent->getBody()->appendPart(part);
 
 		// -- Set contents
@@ -114,7 +106,7 @@
 	// -- Create a new part
 	if (!m_text->isEmpty())
 	{
-	ref <bodyPart> htmlPart = vmime::create <bodyPart>();
+		auto htmlPart = vmime::make_shared<bodyPart>();
 
 	// -- Set contents
 	htmlPart->getBody()->setContents(m_text,
@@ -125,7 +117,7 @@
 	if (!m_objects.empty())
 	{
 		// Create a "multipart/related" body part
-		ref <bodyPart> relPart = vmime::create <bodyPart>();
+		auto relPart = vmime::make_shared<bodyPart>();
 		parent->getBody()->appendPart(relPart);
 
 		relPart->getHeader()->ContentType()->
@@ -135,10 +127,10 @@
 		relPart->getBody()->appendPart(htmlPart);
 
 		// Also add objects into this part
-		for (std::vector <ref <embeddedObject> >::const_iterator it = m_objects.begin() ;
+		for (std::vector <vmime::shared_ptr <embeddedObject> >::const_iterator it = m_objects.begin() ;
 		     it != m_objects.end() ; ++it)
 		{
-			ref <bodyPart> objPart = vmime::create <bodyPart>();
+			auto objPart = vmime::make_shared <bodyPart>();
 			relPart->getBody()->appendPart(objPart);
 
 			string id = (*it)->getId();
@@ -159,7 +151,7 @@
 			//encoding(encodingTypes::BASE64);
 
 			if (!name.empty())
-				objPart->getHeader()->ContentDisposition().dynamicCast<contentDispositionField>()->setFilename(name);
+				vmime::dynamicCast<vmime::contentDispositionField>(objPart->getHeader()->ContentDisposition())->setFilename(vmime::word(name));
 
 			objPart->getBody()->setContents((*it)->getData()->clone());
 		}
@@ -175,16 +167,15 @@
 	if (!m_otherText->isEmpty())
 	{
 		// -- Create a new part
-		ref <bodyPart> otherPart = vmime::create <bodyPart>();
-
+		auto otherPart = vmime::make_shared<bodyPart>();
 		parent->getBody()->appendPart(otherPart);
 
 		// used by ical
 		if (!m_otherMethod.empty())
 		{
-			vmime::ref<vmime::parameter> p = vmime::create<parameter>("method");
-			p->parse(m_otherMethod);
-			otherPart->getHeader()->ContentType().dynamicCast<contentTypeField>()->appendParameter(p);
+			auto p = vmime::make_shared<vmime::parameter>("method");
+			p->component::parse(m_otherMethod);
+			vmime::dynamicCast<contentTypeField>(otherPart->getHeader()->ContentType())->appendParameter(p);
 		}
 
 		// -- Set contents
@@ -193,11 +184,12 @@
 }
 
 void mapiTextPart::findEmbeddedParts(const bodyPart& part,
-	std::vector <ref <const bodyPart> >& cidParts, std::vector <ref <const bodyPart> >& locParts)
+	std::vector<vmime::shared_ptr<const bodyPart> > &cidParts,
+	std::vector<vmime::shared_ptr<const bodyPart> > &locParts)
 {
-	for (int i = 0 ; i < part.getBody()->getPartCount() ; ++i)
+	for (size_t i = 0 ; i < part.getBody()->getPartCount() ; ++i)
 	{
-		ref <const bodyPart> p = part.getBody()->getPartAt(i);
+		auto p = part.getBody()->getPartAt(i);
 
 		// For a part to be an embedded object, it must have a
 		// Content-Id field or a Content-Location field.
@@ -236,24 +228,26 @@
 
 	try
 	{
-		const ref <const headerField> ctf = part.getHeader()->ContentType();
-		type = *ctf->getValue().dynamicCast <const mediaType>();
+		auto ctf = part.getHeader()->ContentType();
+		type = *vmime::dynamicCast<const vmime::mediaType>(ctf->getValue());
 	}
 	catch (exceptions::no_such_field)
 	{
 		// No "Content-type" field: assume "application/octet-stream".
 	}
 
-	m_objects.push_back(vmime::create <embeddedObject>
-		(part.getBody()->getContents()->clone().dynamicCast <contentHandler>(),
-		 part.getBody()->getEncoding(), id, type, string(), string()));
+	m_objects.push_back(vmime::make_shared<embeddedObject>(
+		vmime::dynamicCast<vmime::contentHandler>(part.getBody()->getContents()->clone()),
+		part.getBody()->getEncoding(), id, type, string(), string()));
 }
 
-void mapiTextPart::parse(ref <const bodyPart> message, ref <const bodyPart> parent, ref <const bodyPart> textPart)
+void mapiTextPart::parse(vmime::shared_ptr<const vmime::bodyPart> message,
+    vmime::shared_ptr<const vmime::bodyPart> parent,
+    vmime::shared_ptr<const vmime::bodyPart> textPart)
 {
 	// Search for possible embedded objects in the _whole_ message.
-	std::vector <ref <const bodyPart> > cidParts;
-	std::vector <ref <const bodyPart> > locParts;
+	std::vector<vmime::shared_ptr<const vmime::bodyPart> > cidParts;
+	std::vector<vmime::shared_ptr<const vmime::bodyPart> > locParts;
 
 	findEmbeddedParts(*message, cidParts, locParts);
 
@@ -269,58 +263,50 @@
 
 	try
 	{
-		const ref <const contentTypeField> ctf =
-			textPart->getHeader()->findField(fields::CONTENT_TYPE).dynamicCast <contentTypeField>();
-
+		auto ctf = vmime::dynamicCast<vmime::contentTypeField>(textPart->getHeader()->findField(fields::CONTENT_TYPE));
 		m_charset = ctf->getCharset();
 	}
 	catch (exceptions::no_such_field)
 	{
 		// No "Content-type" field.
 	}
-	catch (exceptions::no_such_parameter)
+	catch (std::out_of_range)
 	{
 		// No "charset" parameter.
 	}
 
 	// Extract embedded objects. The algorithm is quite simple: for each previously
 	// found inline part, we check if its CID/Location is contained in the HTML text.
-	for (std::vector <ref <const bodyPart> >::const_iterator p = cidParts.begin() ; p != cidParts.end() ; ++p)
-	{
-		const ref <const headerField> midField =
-			(*p)->getHeader()->findField(fields::CONTENT_ID);
-
-		const messageId mid = *midField->getValue().dynamicCast <const messageId>();
+ 	for (const auto &part : cidParts) {
+		auto midField = part->getHeader()->findField(fields::CONTENT_ID);
+		auto mid = *vmime::dynamicCast<const vmime::messageId>(midField->getValue());
 
 		if (data.find("CID:" + mid.getId()) != string::npos ||
 		    data.find("cid:" + mid.getId()) != string::npos)
 		{
 			// This part is referenced in the HTML text.
 			// Add it to the embedded object list.
-			addEmbeddedObject(**p, mid.getId());
+			addEmbeddedObject(*part, mid.getId());
 		}
 	}
 
-	for (std::vector <ref <const bodyPart> >::const_iterator p = locParts.begin() ; p != locParts.end() ; ++p)
-	{
-		const ref <const headerField> locField =
-			(*p)->getHeader()->findField(fields::CONTENT_LOCATION);
-
-		const text loc = *locField->getValue().dynamicCast <const text>();
+ 	for (const auto &part : locParts) {
+		auto locField = part->getHeader()->findField(fields::CONTENT_LOCATION);
+		auto loc = *vmime::dynamicCast<const vmime::text>(locField->getValue());
 		const string locStr = loc.getWholeBuffer();
 
 		if (data.find(locStr) != string::npos)
 		{
 			// This part is referenced in the HTML text.
 			// Add it to the embedded object list.
-			addEmbeddedObject(**p, locStr);
+			addEmbeddedObject(*part, locStr);
 		}
 	}
 
 	// Extract plain text, if any.
 	if (!findPlainTextPart(*message, *parent, *textPart))
 	{
-		m_plainText = vmime::create <emptyContentHandler>();
+		m_plainText = vmime::make_shared<vmime::emptyContentHandler>();
 	}
 }
 
@@ -329,22 +315,18 @@
 	// We search for the nearest "multipart/alternative" part.
 	try
 	{
-		const ref <const headerField> ctf =
-			part.getHeader()->findField(fields::CONTENT_TYPE);
-
-		const mediaType type = *ctf->getValue().dynamicCast <const mediaType>();
+		auto ctf = part.getHeader()->findField(fields::CONTENT_TYPE);
+		auto type = *vmime::dynamicCast<const vmime::mediaType>(ctf->getValue());
 
 		if (type.getType() == mediaTypes::MULTIPART &&
 		    type.getSubType() == mediaTypes::MULTIPART_ALTERNATIVE)
 		{
-			ref <const bodyPart> foundPart = NULL;
-
-			for (int i = 0 ; i < part.getBody()->getPartCount() ; ++i)
-			{
-				const ref <const bodyPart> p = part.getBody()->getPartAt(i);
+			vmime::shared_ptr<const vmime::bodyPart> foundPart;
 
-				if (p == &parent ||     // if "text/html" is in "multipart/related"
-				    p == &textPart)     // if not...
+			for (size_t i = 0; i < part.getBody()->getPartCount(); ++i) {
+				auto p = part.getBody()->getPartAt(i);
+				if (p.get() == &parent ||     // if "text/html" is in "multipart/related"
+				    p.get() == &textPart)     // if not...
 				{
 					foundPart = p;
 				}
@@ -355,16 +337,13 @@
 				bool found = false;
 
 				// Now, search for the alternative plain text part
-				for (int i = 0 ; !found && i < part.getBody()->getPartCount() ; ++i)
-				{
-					const ref <const bodyPart> p = part.getBody()->getPartAt(i);
+				for (size_t i = 0; !found && i < part.getBody()->getPartCount(); ++i) {
+					auto p = part.getBody()->getPartAt(i);
 
 					try
 					{
-						const ref <const headerField> ctf =
-							p->getHeader()->findField(fields::CONTENT_TYPE);
-
-						const mediaType type = *ctf->getValue().dynamicCast <const mediaType>();
+						auto ctf = p->getHeader()->findField(fields::CONTENT_TYPE);
+						auto type = *vmime::dynamicCast<const vmime::mediaType>(ctf->getValue());
 
 						if (type.getType() == mediaTypes::TEXT &&
 						    type.getSubType() == mediaTypes::TEXT_PLAIN)
@@ -393,10 +372,8 @@
 
 	bool found = false;
 
-	for (int i = 0 ; !found && i < part.getBody()->getPartCount() ; ++i)
-	{
+	for (size_t i = 0; !found && i < part.getBody()->getPartCount(); ++i)
 		found = findPlainTextPart(*part.getBody()->getPartAt(i), parent, textPart);
-	}
 
 	return found;
 }
@@ -406,12 +383,12 @@
 	m_charset = ch;
 }
 
-void mapiTextPart::setPlainText(ref <contentHandler> plainText)
+void mapiTextPart::setPlainText(vmime::shared_ptr<vmime::contentHandler> plainText)
 {
 	m_plainText = plainText->clone();
 }
 
-void mapiTextPart::setOtherText(ref <contentHandler> otherText)
+void mapiTextPart::setOtherText(vmime::shared_ptr<vmime::contentHandler> otherText)
 {
 	m_otherText = otherText->clone();
 }
@@ -437,30 +414,31 @@
        m_bHaveOtherCharset = true;
 }
 
-void mapiTextPart::setText(ref <contentHandler> text)
+void mapiTextPart::setText(vmime::shared_ptr<vmime::contentHandler> text)
 {
 	m_text = text->clone();
 }
 
-const ref <const mapiTextPart::embeddedObject> mapiTextPart::findObject(const string& id_) const
+vmime::shared_ptr<const mapiTextPart::embeddedObject>
+mapiTextPart::findObject(const std::string &id_) const
 {
 	const string id = cleanId(id_);
 
-	for (std::vector <ref <embeddedObject> >::const_iterator o = m_objects.begin() ;
+	for (std::vector <vmime::shared_ptr <embeddedObject> >::const_iterator o = m_objects.begin() ;
 	     o != m_objects.end() ; ++o)
 	{
 		if ((*o)->getId() == id)
 			return *o;
 	}
 
-	throw exceptions::no_object_found();
+	throw vmime::null;
 }
 
 bool mapiTextPart::hasObject(const string& id_) const
 {
 	const string id = cleanId(id_);
 
-	for (std::vector <ref <embeddedObject> >::const_iterator o = m_objects.begin() ;
+	for (std::vector <vmime::shared_ptr <embeddedObject> >::const_iterator o = m_objects.begin() ;
 	     o != m_objects.end() ; ++o)
 	{
 		if ((*o)->getId() == id)
@@ -470,8 +448,9 @@
 	return false;
 }
 
-const string mapiTextPart::addObject(ref <contentHandler> data,
-	const encoding& enc, const mediaType& type)
+const std::string
+mapiTextPart::addObject(vmime::shared_ptr<vmime::contentHandler> data,
+    const vmime::encoding &enc, const vmime::mediaType &type)
 {
 	const messageId mid(messageId::generateId());
 	const string id = mid.getId();
@@ -479,20 +458,23 @@
 	return "CID:" + addObject(data, enc, type, id);
 }
 
-const string mapiTextPart::addObject(ref <contentHandler> data, const mediaType& type)
+const string mapiTextPart::addObject(vmime::shared_ptr<vmime::contentHandler> data,
+    const vmime::mediaType &type)
 {
 	return addObject(data, encoding::decide(data), type);
 }
 
 const string mapiTextPart::addObject(const string& data, const mediaType& type)
 {
-	ref <stringContentHandler> cts = vmime::create <stringContentHandler>(data);
+	auto cts = vmime::make_shared<vmime::stringContentHandler>(data);
 	return addObject(cts, encoding::decide(cts), type);
 }
 
-const string mapiTextPart::addObject(ref <contentHandler> data, const encoding& enc, const mediaType& type, const string& id, const string& name, const string& loc)
+const string mapiTextPart::addObject(vmime::shared_ptr<vmime::contentHandler> data,
+    const vmime::encoding &enc, const vmime::mediaType &type,
+    const std::string &id, const std::string &name, const std::string &loc)
 {
-	m_objects.push_back(vmime::create <embeddedObject>(data, enc, id, type, name, loc));
+	m_objects.push_back(vmime::make_shared<embeddedObject>(data, enc, id, type, name, loc));
 	return (id);
 }
 
@@ -517,11 +499,12 @@
 // mapiTextPart::embeddedObject
 //
 
-mapiTextPart::embeddedObject::embeddedObject
-	(ref <contentHandler> data, const encoding& enc,
-	 const string& id, const mediaType& type, const string& name, const string& loc)
-	: m_data(data->clone().dynamicCast <contentHandler>()),
-	  m_encoding(enc), m_id(id), m_type(type), m_name(name), m_loc(loc)
+mapiTextPart::embeddedObject::embeddedObject(vmime::shared_ptr<vmime::contentHandler> data,
+    const vmime::encoding &enc, const std::string &id,
+    const vmime::mediaType &type, const std::string &name,
+    const std::string &loc) :
+	m_data(vmime::dynamicCast<vmime::contentHandler>(data->clone())),
+	m_encoding(enc), m_id(id), m_type(type), m_name(name), m_loc(loc)
 {
 }
 
--- a/inetmapi/mapiTextPart.h
+++ b/inetmapi/mapiTextPart.h
@@ -45,6 +45,7 @@
 #define VMIME_MAPITEXTPART_HPP_INCLUDED
 
 #include <kopano/zcdefs.h>
+#include <memory>
 #include "vmime/textPart.hpp"
 #include "vmime/messageId.hpp"
 #include "vmime/encoding.hpp"
@@ -63,17 +64,17 @@
 public:
 
 	mapiTextPart();
-	const mediaType getType() const;
-	const charset &getCharset(void) const { return m_charset; }
-	void setCharset(const charset& ch);
+	const mediaType getType(void) const _kc_override;
+	const charset &getCharset(void) const _kc_override { return m_charset; }
+	void setCharset(const charset &ch) _kc_override;
 
 	/* plain text */
-	const ref<const contentHandler> getPlainText(void) const { return m_plainText; }
-	void setPlainText(ref <contentHandler> plainText);
+	vmime::shared_ptr<const contentHandler> getPlainText(void) const { return m_plainText; }
+	void setPlainText(vmime::shared_ptr<contentHandler> plainText);
 
 	/* 'other' text */
-	const ref<const contentHandler> getOtherText(void) const { return m_otherText; }
-	void setOtherText(ref <contentHandler> otherText);
+	vmime::shared_ptr<const contentHandler> getOtherText(void) const { return m_otherText; }
+	void setOtherText(vmime::shared_ptr<contentHandler> otherText);
 	/* extra 'other' properties */
 	void setOtherContentType(const mediaType& type);
 	void setOtherContentEncoding(const encoding& enc);
@@ -81,8 +82,8 @@
 	void setOtherCharset(const charset& ch);
 
 	/* html + plain + 'other' text */
-	const ref<const contentHandler> getText(void) const { return m_text; }
-	void setText(ref <contentHandler> text);
+	const vmime::shared_ptr<const contentHandler> getText(void) const { return m_text; }
+	void setText(vmime::shared_ptr<contentHandler> text);
 
 	/** Embedded object (eg: image for <IMG> tag).
 	  */
@@ -90,14 +91,14 @@
 	{
 	public:
 
-		embeddedObject(ref <contentHandler> data, const encoding& enc,
+	    embeddedObject(vmime::shared_ptr<contentHandler> data, const encoding& enc,
 		               const string& id, const mediaType& type, const string& name, const string& loc);
 
 		/** Return data stored in this embedded object.
 		  *
 		  * @return stored data
 		  */
-		const ref<const contentHandler> getData(void) const { return m_data; }
+	    const vmime::shared_ptr<const contentHandler> getData(void) const { return m_data; }
 
 		/** Return the encoding used for data in this
 		  * embedded object.
@@ -132,8 +133,7 @@
 		const std::string &getName(void) const { return m_name; }
 
 	private:
-
-		ref <contentHandler> m_data;
+		vmime::shared_ptr<contentHandler> m_data;
 		encoding m_encoding;
 		string m_id;
 		mediaType m_type;
@@ -156,7 +156,7 @@
 	  * @param id object identifier
 	  * @return embedded object with the specified identifier
 	  */
-	const ref <const embeddedObject> findObject(const string& id) const;
+	vmime::shared_ptr<const embeddedObject> findObject(const string &id) const;
 
 	/** Return the number of embedded objects.
 	  *
@@ -169,7 +169,7 @@
 	  * @param pos position of the embedded object
 	  * @return embedded object at position 'pos'
 	  */
-	const ref<const embeddedObject> getObjectAt(int pos) const { return m_objects[pos]; }
+	vmime::shared_ptr<const embeddedObject> getObjectAt(int pos) const { return m_objects[pos]; }
 
 	/** Embed an object and returns a string which identifies it.
 	  * The returned identifier is suitable for use in the 'src' attribute
@@ -194,7 +194,7 @@
 	  * @return an unique object identifier used to identify the new
 	  * object among all other embedded objects
 	  */
-	const string addObject(ref <contentHandler> data, const mediaType& type);
+	const string addObject(vmime::shared_ptr<contentHandler> data, const mediaType &type);
 
 	/** Embed an object and returns a string which identifies it.
 	  * The returned identifier is suitable for use in the 'src' attribute
@@ -206,7 +206,7 @@
 	  * @return an unique object identifier used to identify the new
 	  * object among all other embedded objects
 	  */
-	const string addObject(ref <contentHandler> data, const encoding& enc, const mediaType& type);
+	const string addObject(vmime::shared_ptr<contentHandler> data, const encoding &enc, const mediaType &type);
 
 	/** Embed an object and returns a string which identifies it.
 	 *
@@ -219,29 +219,27 @@
 	 * @return an unique object identifier used to identify the new
 	 * object among all other embedded objects
 	 */
-	const string addObject(ref <contentHandler> data, const encoding& enc, const mediaType& type, const string& id, const string& name = string(), const string& loc = string());
+	const string addObject(vmime::shared_ptr<contentHandler> data, const encoding &enc, const mediaType &type, const string &id, const string &name = string(), const string &loc = string());
 
-	int getPartCount() const;
+	size_t getPartCount() const _kc_override;
 
-	void generateIn(ref <bodyPart> message, ref <bodyPart> parent) const;
-	void parse(ref <const bodyPart> message, ref <const bodyPart> parent, ref <const bodyPart> textPart);
+	void generateIn(vmime::shared_ptr<bodyPart> message, vmime::shared_ptr<bodyPart> parent) const _kc_override;
+	void parse(vmime::shared_ptr<const bodyPart> message, vmime::shared_ptr<const bodyPart> parent, vmime::shared_ptr<const bodyPart> textPart) _kc_override;
 
 private:
-
-	ref <contentHandler> m_plainText;
-	ref <contentHandler> m_text;	/* htmlText */
+	vmime::shared_ptr<contentHandler> m_plainText;
+	vmime::shared_ptr<contentHandler> m_text; /* htmlText */
 	charset m_charset;
-
-	ref <contentHandler> m_otherText;
+	vmime::shared_ptr<contentHandler> m_otherText;
 	mediaType m_otherMediaType;
 	encoding m_otherEncoding;
 	string m_otherMethod;			/* ical special */
 	charset m_otherCharset;
 	bool m_bHaveOtherCharset;
 
-	std::vector <ref <embeddedObject> > m_objects;
+	std::vector<vmime::shared_ptr<embeddedObject> > m_objects;
 
-	void findEmbeddedParts(const bodyPart& part, std::vector <ref <const bodyPart> >& cidParts, std::vector <ref <const bodyPart> >& locParts);
+	void findEmbeddedParts(const bodyPart& part, std::vector<vmime::shared_ptr<const bodyPart> > &cidParts, std::vector<vmime::shared_ptr<const bodyPart> > &locParts);
 	void addEmbeddedObject(const bodyPart& part, const string& id);
 
 	bool findPlainTextPart(const bodyPart& part, const bodyPart& parent, const bodyPart& textPart);
--- a/inetmapi/outputStreamMAPIAdapter.cpp
+++ b/inetmapi/outputStreamMAPIAdapter.cpp
@@ -35,9 +35,9 @@
 		lpStream->Release();
 }
 
-void outputStreamMAPIAdapter::write(const value_type* const data, const size_type count)
+void outputStreamMAPIAdapter::writeImpl(const vmime::byte_t *data, size_t count)
 {
-	lpStream->Write((unsigned char *)data,count,NULL);
+	lpStream->Write(data, count, NULL);
 }
 
 void outputStreamMAPIAdapter::flush()
--- a/inetmapi/outputStreamMAPIAdapter.h
+++ b/inetmapi/outputStreamMAPIAdapter.h
@@ -19,14 +19,15 @@
 #define OUTPUT_STREAM_MAPI_ADAPTER_H
 
 #include <mapidefs.h>
-#include <vmime/utility/stream.hpp>
+#include <sys/types.h>
+#include <vmime/utility/outputStream.hpp>
 
 class outputStreamMAPIAdapter : public vmime::utility::outputStream {
 public:
 	outputStreamMAPIAdapter(IStream *lpStream);
 	virtual ~outputStreamMAPIAdapter();
-	void write(const value_type* const data, const size_type count);
-	void flush();
+	virtual void writeImpl(const unsigned char *, const size_t);
+	virtual void flush(void) override;
 
 private:
 	IStream *lpStream;
--- a/inetmapi/serviceRegistration.inl
+++ b/inetmapi/serviceRegistration.inl
@@ -21,6 +21,7 @@
 // the GNU General Public License cover the whole combination.
 //
 
+#include <memory>
 #include "vmime/net/serviceFactory.hpp"
 
 
@@ -41,11 +42,10 @@
 	{
 	}
 
-	ref <service> create
-		(ref <session> sess,
-		 ref <security::authenticator> auth) const
+	vmime::shared_ptr<service> create(vmime::shared_ptr<session> sess,
+	    vmime::shared_ptr<security::authenticator> auth) const
 	{
-		return vmime::create <S>(sess, auth);
+		return vmime::make_shared<S>(sess, auth);
 	}
 
 	const serviceInfos& getInfos() const
@@ -80,7 +80,7 @@
 	serviceRegisterer(const string& protocol, const service::Type type)
 	{
 		serviceFactory::getInstance()->registerService
-			(vmime::create <vmime::net::registeredServiceImpl <S> >(protocol, type));
+			(vmime::make_shared<net::registeredServiceImpl<S> >(protocol, type));
 	}
 };
 



More information about the Pkg-giraffe-maintainers mailing list