diff --git a/Changes b/Changes
index b586e14..26308d1 100644
--- a/Changes
+++ b/Changes
@@ -2,6 +2,7 @@
 
 - Reactivate Query Serializer Web-service (#903)
 - Fix deprecated URL constructor (AI assisted)
+- Fix Jackson and serialization deprecated methods (AI assisted)
 
 # version 1.1
 
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/CollectionCleanRewrite.java b/src/main/java/de/ids_mannheim/korap/rewrite/CollectionCleanRewrite.java
index 3955209..69e1d04 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/CollectionCleanRewrite.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/CollectionCleanRewrite.java
@@ -24,7 +24,7 @@
     public KoralNode rewriteQuery (KoralNode node, KustvaktConfiguration config,
             User user, double apiVersion) {
         JsonNode jsonNode = process(node.rawNode());
-        return node.wrapNode(jsonNode);
+        return KoralNode.wrapNode(jsonNode);
     }
 
     private JsonNode process (JsonNode root) {
@@ -55,7 +55,7 @@
                     ObjectNode ob = (ObjectNode) root;
                     ob.remove(Arrays.asList(
                             new String[] { "@type", "operation", "operands" }));
-                    ob.putAll((ObjectNode) sub);
+                    ob.setAll((ObjectNode) sub);
                 }
             }
         }
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/IdWriter.java b/src/main/java/de/ids_mannheim/korap/rewrite/IdWriter.java
index bc98530..e0685f6 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/IdWriter.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/IdWriter.java
@@ -23,7 +23,7 @@
         if (node.get("@type").equals("koral:token")) {
             String s = extractToken(node.rawNode());
             if (s != null && !s.isEmpty())
-                node.put("idn", s + "_" + counter++);
+                node.set("idn", s + "_" + counter++, null);
         }
         return node;
     }
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/KoralNode.java b/src/main/java/de/ids_mannheim/korap/rewrite/KoralNode.java
index fb99954..e7c1a0a 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/KoralNode.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/KoralNode.java
@@ -3,9 +3,6 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import de.ids_mannheim.korap.utils.JsonUtils;
-
-import java.util.*;
 
 /**
  * @author hanl
@@ -71,7 +68,7 @@
             else if (value instanceof Integer)
                 n.put(name, (Integer) value);
             else if (value instanceof JsonNode)
-                n.put(name, (JsonNode) value);
+                n.set(name, (JsonNode) value);
 
             this.rewrites.add("override", ident);
         }
@@ -91,13 +88,8 @@
                 !this.node.at(path).isMissingNode()) {
             ObjectNode n = (ObjectNode) this.node.at(path);
             n.removeAll();
-            n.putAll((ObjectNode) value);
-
-            String name = path;
-            if (ident != null)
-                name = ident.toString(); // scope is simply RewriteIdentifier ?? 
-
-            this.rewrites.add("override", name);
+            n.setAll((ObjectNode) value);
+            this.rewrites.add("override", ident);
         }
     }
     
@@ -174,7 +166,7 @@
     }
 
     public void removeNode (RewriteIdentifier ident) {
-        this.rewrites.add("deletion", ident.toString());
+        this.rewrites.add("deletion", ident);
         this.remove = true;
     }
 
@@ -197,7 +189,7 @@
 
     public KoralNode get (int i) {
         //        this.node = this.node.get(i);
-        return this.wrapNode(this.node.get(i));
+        return KoralNode.wrapNode(this.node.get(i));
     }
 
     public int asInt() {
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/KoralRewriteBuilder.java b/src/main/java/de/ids_mannheim/korap/rewrite/KoralRewriteBuilder.java
index 83979d8..1f4d69f 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/KoralRewriteBuilder.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/KoralRewriteBuilder.java
@@ -32,14 +32,16 @@
 	public KoralRewriteBuilder add (String op, RewriteIdentifier ri) {
 		KoralRewrite rewrite = new KoralRewrite();
 		rewrite.setOperation(op);
-		if (ri.getScope() != null) {
-			rewrite.setScope(ri.getScope());
-		}
-		if (ri.getOriginal() != null) {
-			rewrite.setOriginal(ri.getOriginal());
-		}
-		if (ri.getComment() != null) {
-			rewrite.setComment(ri.getComment());
+		if (ri != null) {
+    		if (ri.getScope() != null) {
+    			rewrite.setScope(ri.getScope());
+    		}
+    		if (ri.getOriginal() != null) {
+    			rewrite.setOriginal(ri.getOriginal());
+    		}
+    		if (ri.getComment() != null) {
+    			rewrite.setComment(ri.getComment());
+    		}
 		}
 		this.rewrites.add(rewrite);
 		return this;
@@ -57,9 +59,9 @@
 			}
 			else if (node.isObject()) {
 				ObjectNode n = (ObjectNode) node;
-				List l = new LinkedList<>();
+				List<Object> l = new LinkedList<>();
 				l.add(JsonUtils.valueToTree(rewrite.map));
-				n.put("rewrites", JsonUtils.valueToTree(l));
+				n.set("rewrites", JsonUtils.valueToTree(l));
 			}
 			else {
 				//fixme: matches in result will land here. rewrites need to be placed under root node - though then there might be unclear where they belong to
diff --git a/src/main/java/de/ids_mannheim/korap/rewrite/RewriteHandler.java b/src/main/java/de/ids_mannheim/korap/rewrite/RewriteHandler.java
index 29e27cb..e528805 100644
--- a/src/main/java/de/ids_mannheim/korap/rewrite/RewriteHandler.java
+++ b/src/main/java/de/ids_mannheim/korap/rewrite/RewriteHandler.java
@@ -103,7 +103,7 @@
     public boolean add (Class<? extends RewriteTask> rewriter) {
         RewriteTask task;
         try {
-            Constructor c = rewriter.getConstructor();
+            Constructor<? extends RewriteTask> c = rewriter.getConstructor();
             task = (RewriteTask) c.newInstance();
         }
         catch (NoSuchMethodException | InvocationTargetException
@@ -202,7 +202,7 @@
                 jlog.debug("Running rewrite process on query " + root);
             }
             if (root != null) {
-                Iterator<Map.Entry<String, JsonNode>> it = root.fields();
+                Iterator<Map.Entry<String, JsonNode>> it = root.properties().iterator();
                 while (it.hasNext()) {
                     Map.Entry<String, JsonNode> next = it.next();
                     processNode(next.getKey(), next.getValue(), result, apiVersion);
diff --git a/src/main/java/de/ids_mannheim/korap/utils/KoralCollectionQueryBuilder.java b/src/main/java/de/ids_mannheim/korap/utils/KoralCollectionQueryBuilder.java
index 286920d..8a503e7 100644
--- a/src/main/java/de/ids_mannheim/korap/utils/KoralCollectionQueryBuilder.java
+++ b/src/main/java/de/ids_mannheim/korap/utils/KoralCollectionQueryBuilder.java
@@ -164,7 +164,7 @@
                                     ? this.mergeOperator.toLowerCase()
                                     : "and", result, tobase);
                 }
-                ((ObjectNode) base).put(nodeName, result);
+                ((ObjectNode) base).set(nodeName, result);
                 return base;
             }
             return this.base;
@@ -219,7 +219,7 @@
             node.put("operation", "operation:" + op);
             ArrayNode ops = JsonUtils.createArrayNode();
             ops.addAll(Arrays.asList(groups));
-            node.put("operands", ops);
+            node.set("operands", ops);
             return node;
         }
 
