diff --git a/org.eclipse.osbp.utils.email.feature/feature.xml b/org.eclipse.osbp.utils.email.feature/feature.xml
index 4252f17..2d2adc0 100644
--- a/org.eclipse.osbp.utils.email.feature/feature.xml
+++ b/org.eclipse.osbp.utils.email.feature/feature.xml
@@ -3,7 +3,8 @@
         id="org.eclipse.osbp.utils.email.feature"
         label="%featureName"
         version="0.9.0.qualifier"
-        provider-name="%providerName">
+        provider-name="%providerName"
+		plugin="org.eclipse.osbp.license">
         
     <description>
         %description
diff --git a/org.eclipse.osbp.utils.email/src/org/eclipse/osbp/utils/email/common/Email.java b/org.eclipse.osbp.utils.email/src/org/eclipse/osbp/utils/email/common/Email.java
index f2ae505..7334386 100644
--- a/org.eclipse.osbp.utils.email/src/org/eclipse/osbp/utils/email/common/Email.java
+++ b/org.eclipse.osbp.utils.email/src/org/eclipse/osbp/utils/email/common/Email.java
@@ -32,7 +32,7 @@
 
 	private static Logger log = LoggerFactory.getLogger(Email.class);
 
-	private MultiPartEmail email;
+	private MultiPartEmail mail;
 	private List<String> toAddresses;
 	private String from;
    
@@ -40,27 +40,27 @@
 	public Email() {
 
 		log.debug("Instantiate Email");
-		email = new MultiPartEmail();
-		email.setDebug(log.isDebugEnabled());
+		mail = new MultiPartEmail();
+		mail.setDebug(log.isDebugEnabled());
 		
-		email.setHostName(ProductConfiguration.getEmailServerIp());
+		mail.setHostName(ProductConfiguration.getEmailServerIp());
 
 		if (ProductConfiguration.isEmailUseSslOnConnect()) {
 			Integer port = ProductConfiguration.getEmailSmtpPort();
-			email.setSslSmtpPort(port.toString());
-			email.setSSLOnConnect(true);
+			mail.setSslSmtpPort(port.toString());
+			mail.setSSLOnConnect(true);
 		} else {
-			email.setSmtpPort(ProductConfiguration.getEmailSmtpPort());
-			email.setSSLOnConnect(false);
+			mail.setSmtpPort(ProductConfiguration.getEmailSmtpPort());
+			mail.setSSLOnConnect(false);
 		}
 
 		if (!ProductConfiguration.getAdminEmailUsername().isEmpty()) {
-			email.setAuthenticator(new DefaultAuthenticator(ProductConfiguration.getAdminEmailUsername(),
+			mail.setAuthenticator(new DefaultAuthenticator(ProductConfiguration.getAdminEmailUsername(),
 					ProductConfiguration.getAdminEmailPassword()));
 		}
 
 		String charset = "utf-8";
-		email.setCharset(charset);
+		mail.setCharset(charset);
 
 		setFrom(ProductConfiguration.getAdminEmail());
 		toAddresses = new ArrayList<>();
@@ -72,7 +72,7 @@
 		try {
 			if (!from.isEmpty()) {
 				log.debug("set From: {}", from);
-				email.setFrom(from);
+				mail.setFrom(from);
 				this.from = from;
 			}
 		} catch (Exception e) {
@@ -92,7 +92,7 @@
 			if (!to.isEmpty() && !(toAddresses.contains(to))) {
 				log.debug("set To: {}", to);
 				toAddresses.add(to);
-				email.addTo(to);
+				mail.addTo(to);
 			} else {
 				log.debug("skip To: {}", to);
 			}
@@ -101,12 +101,12 @@
 		}
 	}
 
-	public void setCC(String to) {
+	public void setCc(String to) {
 		try {
 			if (!to.isEmpty() && !(toAddresses.contains(to))) {
 				log.debug("set CC: {}", to);
 				toAddresses.add(to);
-				email.addCc(to);
+				mail.addCc(to);
 			} else {
 				log.debug("skip CC: {}", to);
 			}
@@ -115,12 +115,12 @@
 		}
 	}
 
-	public void setBCC(String to) {
+	public void setBcc(String to) {
 		try {
 			if (!to.isEmpty() && !(toAddresses.contains(to))) {
 				log.debug("set BCC: {}", to);
 				toAddresses.add(to);
-				email.addBcc(to);
+				mail.addBcc(to);
 			} else {
 				log.debug("skip BCC: {}", to);
 			}
@@ -132,7 +132,7 @@
 	public void setSubject(String subject) {
 		try {
 			log.debug("set Subject: {}", subject);
-			email.setSubject(subject);
+			mail.setSubject(subject);
 		} catch (Exception e) {
 			log.error("set Subject: {}", e.getMessage());
 		}
@@ -145,14 +145,18 @@
 			MimeMultipart multiPart = new MimeMultipart("alternative");
 
 			MimeBodyPart textPart = new MimeBodyPart();
-			textPart.setText(body.replaceAll("</*b>", "*").replaceAll("<br>", "").replaceAll("</*t[r|h|d]>", "").replaceAll("</*table>", ""), "utf-8");
+			String text=body.replaceAll("</*b>", "").replaceAll("</div>", "\n ").replaceAll("<br>", "\n ").replaceAll("</*t[r|h|d]>", "").replaceAll("</*table>", "");
+			text=text.replaceAll("(?s)<[^>]*>(\\s*<[^>]*>)*", "");
+			textPart.setText(text, "utf-8");
+			textPart.setHeader("Content-Transfer-Encoding", "base64");
 
 			MimeBodyPart htmlPart = new MimeBodyPart();
 			htmlPart.setContent(body, "text/html; charset=utf-8");
+			htmlPart.setHeader("Content-Transfer-Encoding", "base64");
 
 			multiPart.addBodyPart(textPart); // <-- first
 			multiPart.addBodyPart(htmlPart); // <-- second
-			email.addPart(multiPart);
+			mail.addPart(multiPart);
 		} catch (Exception e) {
 			log.error("set Body: {}", e.getMessage());
 		}
@@ -163,9 +167,9 @@
 		try {
 			if (b) {
 				log.debug("set Highprio ");
-				email.addHeader("X-Priority","1");
-				email.addHeader("X-MSMail-Priority","High");
-				email.addHeader("Importance","High");
+				mail.addHeader("X-Priority","1");
+				mail.addHeader("X-MSMail-Priority","High");
+				mail.addHeader("Importance","High");
 			}
 		} catch (Exception e) {
 			log.error("set Highprio: {}", e.getMessage());
@@ -178,8 +182,8 @@
 		try {
 			// Send message
 			log.debug("send mail ...");
-			email.setSentDate(new Date());
-			email.send();
+			mail.setSentDate(new Date());
+			mail.send();
 		} catch (Exception e) {
 			log.error("Send mail: {}", e.getMessage());
 		}
