diff --git a/ChangeLog b/ChangeLog
index bb53339f726cb2aecf8f45fed8b2b24073f36906..d0d6da1e5a2dbf6bc79649296489350f996b619d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,10 @@
 	* Using CDI library version 2.5.0
 	* Version 2.5.0 release
 
+2024-11-14  Uwe Schulzweida
+
+	* intgridknn: added method arithmetic_average
+
 2024-11-12  Uwe Schulzweida
 
 	* New operator: intgridknn - k-nearest-neighbor remapping
diff --git a/src/knn_weights.h b/src/knn_weights.h
index 8fcb444c147ba836a03e9327a715dfe463822c1a..55592dbc0eb9747e3c474304ca706e4950e1b327 100644
--- a/src/knn_weights.h
+++ b/src/knn_weights.h
@@ -25,6 +25,23 @@ private:
   size_t m_maxNeighbors = 0;
   KnnMethod m_method{ KnnMethod::distanceWeighted };
 
+  void
+  apply_mask(const Vmask &gridMask)
+  {
+    size_t n = 0;
+    for (size_t i = 0; i < m_numNeighbors; ++i)
+      {
+        if (gridMask[m_indices[i]])
+          {
+            m_indices[n] = m_indices[i];
+            m_dist[n] = m_dist[i];
+            n++;
+          }
+      }
+
+    m_numNeighbors = n;
+  }
+
 public:
   size_t m_numNeighbors = 0;
   std::vector<size_t> m_indices;  // source indices at nearest neighbors
@@ -153,7 +170,13 @@ public:
   size_t
   compute_weights_arithmetic_average()
   {
-    return 0;
+    if (m_numNeighbors)
+      {
+        double weight = 1.0 / m_numNeighbors;
+        for (size_t i = 0; i < m_numNeighbors; ++i) { m_dist[i] = weight; }
+      }
+
+    return m_numNeighbors;
   }
 
   size_t
@@ -190,38 +213,16 @@ public:
   size_t
   compute_weights(const Vmask &gridMask)
   {
-    // Compute weights based on inverse distance if grid mask is false, eliminate those points
-    size_t n = 0;
-    for (size_t i = 0; i < m_numNeighbors; ++i)
-      {
-        if (gridMask[m_indices[i]])
-          {
-            m_indices[n] = m_indices[i];
-            m_dist[n] = m_dist[i];
-            n++;
-          }
-      }
-
-    m_numNeighbors = n;
+    // Compute weights if grid mask is false, eliminate those points
+    apply_mask(gridMask);
     return compute_weights();
   }
 
   size_t
   compute_weights(const Vmask &gridMask, double searchRadius, double weight0, double weightR)
   {
-    // Compute weights based on inverse distance if mask is false, eliminate those points
-    size_t n = 0;
-    for (size_t i = 0; i < m_numNeighbors; ++i)
-      {
-        if (gridMask[m_indices[i]])
-          {
-            m_indices[n] = m_indices[i];
-            m_dist[n] = m_dist[i];
-            n++;
-          }
-      }
-
-    m_numNeighbors = n;
+    // Compute weights if mask is false, eliminate those points
+    apply_mask(gridMask);
 
     double distTotal = 0.0;  // sum of neighbor distances (for normalizing)
     for (size_t i = 0; i < m_numNeighbors; ++i)