Keep rewrites
diff --git a/mapper/mapper.go b/mapper/mapper.go
index 9d32042..fa75bd6 100644
--- a/mapper/mapper.go
+++ b/mapper/mapper.go
@@ -115,6 +115,15 @@
 		return jsonData, nil
 	}
 
+	// Store rewrites if they exist
+	var oldRewrites any
+	if queryMap, ok := queryData.(map[string]any); ok {
+		if rewrites, exists := queryMap["rewrites"]; exists {
+			oldRewrites = rewrites
+			delete(queryMap, "rewrites")
+		}
+	}
+
 	// Convert input JSON to AST
 	jsonBytes, err := json.Marshal(queryData)
 	if err != nil {
@@ -192,6 +201,13 @@
 		return nil, fmt.Errorf("failed to parse result JSON: %w", err)
 	}
 
+	// Restore rewrites if they existed
+	if oldRewrites != nil {
+		if resultMap, ok := resultData.(map[string]any); ok {
+			resultMap["rewrites"] = oldRewrites
+		}
+	}
+
 	// If we had a query wrapper, put the transformed data back in it
 	if hasQueryWrapper {
 		if wrapper, ok := jsonData.(map[string]any); ok {
diff --git a/mapper/mapper_test.go b/mapper/mapper_test.go
index 74696ec..39389c9 100644
--- a/mapper/mapper_test.go
+++ b/mapper/mapper_test.go
@@ -222,6 +222,95 @@
 	}
 }
 
+func TestTokenToTermGroupWithRewrites(t *testing.T) {
+	// Create test mapping list specifically for token to termGroup test
+	mappingList := config.MappingList{
+		ID:       "test-token-to-termgroup",
+		FoundryA: "opennlp",
+		LayerA:   "p",
+		FoundryB: "opennlp", // Keep the same foundry for both sides
+		LayerB:   "p",
+		Mappings: []config.MappingRule{
+			"[PIDAT] <> [opennlp/p=PIDAT & opennlp/p=AdjType:Pdt]",
+		},
+	}
+
+	// Create a new mapper
+	m, err := NewMapper([]config.MappingList{mappingList})
+	require.NoError(t, err)
+
+	input := `{
+		"@type": "koral:token",
+		"rewrites": [
+			{
+				"@type": "koral:rewrite",
+				"_comment": "This rewrite should be preserved",
+				"editor": "TestEditor",
+				"operation": "operation:test",
+				"src": "TestSource"
+			}
+		],
+		"wrap": {
+			"@type": "koral:term",
+			"foundry": "opennlp",
+			"key": "PIDAT",
+			"layer": "p",
+			"match": "match:eq"
+		}
+	}`
+
+	expected := `{
+		"@type": "koral:token",
+		"rewrites": [
+			{
+				"@type": "koral:rewrite",
+				"_comment": "This rewrite should be preserved",
+				"editor": "TestEditor",
+				"operation": "operation:test",
+				"src": "TestSource"
+			}
+		],
+		"wrap": {
+			"@type": "koral:termGroup",
+			"operands": [
+				{
+					"@type": "koral:term",
+					"foundry": "opennlp",
+					"key": "PIDAT",
+					"layer": "p",
+					"match": "match:eq"
+				},
+				{
+					"@type": "koral:term",
+					"foundry": "opennlp",
+					"key": "AdjType",
+					"layer": "p",
+					"match": "match:eq",
+					"value": "Pdt"
+				}
+			],
+			"relation": "relation:and"
+		}
+	}`
+
+	// Parse input JSON
+	var inputData interface{}
+	err = json.Unmarshal([]byte(input), &inputData)
+	require.NoError(t, err)
+
+	// Apply mappings
+	result, err := m.ApplyQueryMappings("test-token-to-termgroup", MappingOptions{Direction: AtoB}, inputData)
+	require.NoError(t, err)
+
+	// Parse expected JSON
+	var expectedData interface{}
+	err = json.Unmarshal([]byte(expected), &expectedData)
+	require.NoError(t, err)
+
+	// Compare results
+	assert.Equal(t, expectedData, result)
+}
+
 func TestMatchComplexPatterns(t *testing.T) {
 	tests := []struct {
 		name        string
@@ -393,7 +482,7 @@
 		expectError bool
 	}{
 		{
-			name:      "Query wrapper case",
+			name:      "Query wrapper case with rewrites preservation",
 			mappingID: "test-wrapper",
 			opts: MappingOptions{
 				Direction: AtoB,
@@ -404,20 +493,20 @@
 					"@type": "koral:doc",
 					"key": "availability",
 					"match": "match:eq",
-					"rewrites": [
-						{
-							"@type": "koral:rewrite",
-							"_comment": "Free corpus access policy has been added.",
-							"editor": "Kustvakt",
-							"operation": "operation:injection",
-							"src": "Kustvakt"
-						}
-					],
 					"type": "type:regex",
 					"value": "CC.*"
 				},
 				"query": {
 					"@type": "koral:token",
+					"rewrites": [
+						{
+							"@type": "koral:rewrite",
+							"_comment": "Original rewrite that should be preserved",
+							"editor": "Original",
+							"operation": "operation:original",
+							"src": "Original"
+						}
+					],
 					"wrap": {
 						"@type": "koral:term",
 						"foundry": "opennlp",
@@ -433,20 +522,20 @@
 					"@type": "koral:doc",
 					"key": "availability",
 					"match": "match:eq",
-					"rewrites": [
-						{
-							"@type": "koral:rewrite",
-							"_comment": "Free corpus access policy has been added.",
-							"editor": "Kustvakt",
-							"operation": "operation:injection",
-							"src": "Kustvakt"
-						}
-					],
 					"type": "type:regex",
 					"value": "CC.*"
 				},
 				"query": {
 					"@type": "koral:token",
+					"rewrites": [
+						{
+							"@type": "koral:rewrite",
+							"_comment": "Original rewrite that should be preserved",
+							"editor": "Original",
+							"operation": "operation:original",
+							"src": "Original"
+						}
+					],
 					"wrap": {
 						"@type": "koral:term",
 						"foundry": "opennlp",
@@ -506,6 +595,51 @@
 				"query": "invalid"
 			}`,
 		},
+		{
+			name:      "Query with rewrites in nested token",
+			mappingID: "test-wrapper",
+			opts: MappingOptions{
+				Direction: AtoB,
+			},
+			input: `{
+				"@type": "koral:token",
+				"rewrites": [
+					{
+						"@type": "koral:rewrite",
+						"_comment": "Nested rewrite that should be preserved",
+						"editor": "Nested",
+						"operation": "operation:nested",
+						"src": "Nested"
+					}
+				],
+				"wrap": {
+					"@type": "koral:term",
+					"foundry": "opennlp",
+					"key": "Baum",
+					"layer": "orth",
+					"match": "match:eq"
+				}
+			}`,
+			expected: `{
+				"@type": "koral:token",
+				"rewrites": [
+					{
+						"@type": "koral:rewrite",
+						"_comment": "Nested rewrite that should be preserved",
+						"editor": "Nested",
+						"operation": "operation:nested",
+						"src": "Nested"
+					}
+				],
+				"wrap": {
+					"@type": "koral:term",
+					"foundry": "opennlp",
+					"key": "X",
+					"layer": "orth",
+					"match": "match:eq"
+				}
+			}`,
+		},
 	}
 
 	for _, tt := range tests {