diff --git a/src/main/jastadd/backend/Generation.jadd b/src/main/jastadd/backend/Generation.jadd
index 81e2dabe41761ef3e1b3058adb2809be90f6ac1d..abce6a07b80fb96313de4760511c5339e9da92a0 100644
--- a/src/main/jastadd/backend/Generation.jadd
+++ b/src/main/jastadd/backend/Generation.jadd
@@ -141,16 +141,23 @@ aspect AspectGeneration {
     sb.append(ind(indent + 1)).append(preemptiveReturnStatement()).append("\n");
     sb.append(ind(indent)).append("}\n");
     if (!getAlwaysApply()) {
-      sb.append(ind(indent)).append("if (").append(preemptiveExpectedValue());
-      if (getToken().isPrimitiveType()) {
-        sb.append(" == ").append(inputVariableName);
-      } else if (effectiveMappings().get(effectiveMappings().size() - 1).isDefaultMappingDefinition()) {
-        sb.append(" != null && ").append(preemptiveExpectedValue()).append(".equals(")
-          .append(inputVariableName).append(")");
+      MappingDefinition lastMapping = effectiveMappings().get(effectiveMappings().size() - 1);
+      sb.append(ind(indent)).append("if (");
+      if (lastMapping.getToType().isArray()) {
+        sb.append("java.util.Arrays.equals(").append(preemptiveExpectedValue())
+          .append(", ").append(inputVariableName).append(")");
       } else {
-        sb.append(" != null ? ").append(preemptiveExpectedValue()).append(".equals(")
-          .append(inputVariableName).append(")").append(" : ")
-          .append(inputVariableName).append(" == null");
+        sb.append(preemptiveExpectedValue());
+        if (getToken().isPrimitiveType() && lastMapping.getToType().isPrimitiveType()) {
+          sb.append(" == ").append(inputVariableName);
+        } else if (lastMapping.isDefaultMappingDefinition()) {
+          sb.append(" != null && ").append(preemptiveExpectedValue()).append(".equals(")
+            .append(inputVariableName).append(")");
+        } else {
+          sb.append(" != null ? ").append(preemptiveExpectedValue()).append(".equals(")
+            .append(inputVariableName).append(")").append(" : ")
+            .append(inputVariableName).append(" == null");
+        }
       }
       sb.append(") { ").append(preemptiveReturnStatement()).append(" }\n");
     }
diff --git a/src/main/jastadd/backend/Mappings.jrag b/src/main/jastadd/backend/Mappings.jrag
index 7add42fa7e3d3f7c71cb35b5a34c8c5d05b83628..fd40385d9e8879dd188362f6a0acd802652f511e 100644
--- a/src/main/jastadd/backend/Mappings.jrag
+++ b/src/main/jastadd/backend/Mappings.jrag
@@ -151,6 +151,12 @@ aspect Mappings {
       default: return false;
     }
   }
+  syn boolean MappingDefinitionType.isPrimitiveType() = false;
+  eq JavaMappingDefinitionType.isPrimitiveType() = getType().isPrimitiveType();
+
+  // --- isArray ---
+  syn boolean MappingDefinitionType.isArray() = false;
+  eq JavaArrayMappingDefinitionType.isArray() = true;
 
   // --- suitableDefaultMapping ---
   syn DefaultMappingDefinition UpdateDefinition.suitableDefaultMapping();
diff --git a/src/main/resources/MqttUpdater.jadd b/src/main/resources/MqttUpdater.jadd
index 394735cc78595ad0ebe15b5ab1fa6e73ef435b13..df1dc10054722b249c10637781bc896eebdaf37f 100644
--- a/src/main/resources/MqttUpdater.jadd
+++ b/src/main/resources/MqttUpdater.jadd
@@ -231,8 +231,16 @@ public class MqttUpdater {
   }
 
   public void publish(String topic, byte[] bytes) {
+    publish(topic, bytes, false);
+  }
+
+  public void publish(String topic, byte[] bytes, boolean retain) {
+    publish(topic, bytes, this.qos, retain);
+  }
+
+  public void publish(String topic, byte[] bytes, org.fusesource.mqtt.client.QoS qos, boolean retain) {
     connection.getDispatchQueue().execute(() -> {
-      connection.publish(topic, bytes, qos, false, new org.fusesource.mqtt.client.Callback<Void>() {
+      connection.publish(topic, bytes, qos, retain, new org.fusesource.mqtt.client.Callback<Void>() {
         @Override
         public void onSuccess(Void value) {
           logger.debug("Published some bytes to {}", topic);