diff --git a/Documentation/Doxyfile.in b/Documentation/Doxyfile.in
index 8305f56af7a8..a79d37706faf 100644
--- a/Documentation/Doxyfile.in
+++ b/Documentation/Doxyfile.in
@@ -834,7 +834,7 @@ RECURSIVE              = YES
 # Note that relative paths are relative to the directory from which doxygen is
 # run.
 
-EXCLUDE                = @TOP_SRCDIR@/include/libcamera/span.h \
+EXCLUDE                = @TOP_SRCDIR@/include/libcamera/base/span.h \
 			 @TOP_SRCDIR@/include/libcamera/internal/device_enumerator_sysfs.h \
 			 @TOP_SRCDIR@/include/libcamera/internal/device_enumerator_udev.h \
 			 @TOP_SRCDIR@/include/libcamera/internal/ipc_pipe_unixsocket.h \
diff --git a/include/libcamera/base/file.h b/include/libcamera/base/file.h
index cecbb254591f..c3c7ca6013a8 100644
--- a/include/libcamera/base/file.h
+++ b/include/libcamera/base/file.h
@@ -13,8 +13,7 @@
 
 #include <libcamera/base/class.h>
 #include <libcamera/base/private.h>
-
-#include <libcamera/span.h>
+#include <libcamera/base/span.h>
 
 namespace libcamera {
 
diff --git a/include/libcamera/base/meson.build b/include/libcamera/base/meson.build
index aaac324d7149..7c499b558fb0 100644
--- a/include/libcamera/base/meson.build
+++ b/include/libcamera/base/meson.build
@@ -15,6 +15,7 @@ libcamera_base_headers = files([
     'private.h',
     'semaphore.h',
     'signal.h',
+    'span.h',
     'thread.h',
     'timer.h',
     'utils.h',
diff --git a/include/libcamera/span.h b/include/libcamera/base/span.h
similarity index 100%
rename from include/libcamera/span.h
rename to include/libcamera/base/span.h
diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
index f62b6cf055d6..1bc958a43b22 100644
--- a/include/libcamera/controls.h
+++ b/include/libcamera/controls.h
@@ -15,9 +15,9 @@
 #include <vector>
 
 #include <libcamera/base/class.h>
+#include <libcamera/base/span.h>
 
 #include <libcamera/geometry.h>
-#include <libcamera/span.h>
 
 namespace libcamera {
 
diff --git a/include/libcamera/internal/buffer.h b/include/libcamera/internal/buffer.h
index 91dd24969385..beae0cb98544 100644
--- a/include/libcamera/internal/buffer.h
+++ b/include/libcamera/internal/buffer.h
@@ -11,9 +11,9 @@
 #include <vector>
 
 #include <libcamera/base/class.h>
+#include <libcamera/base/span.h>
 
 #include <libcamera/buffer.h>
-#include <libcamera/span.h>
 
 namespace libcamera {
 
diff --git a/include/libcamera/internal/byte_stream_buffer.h b/include/libcamera/internal/byte_stream_buffer.h
index 7eefb1a71f07..d0f0df5ee87b 100644
--- a/include/libcamera/internal/byte_stream_buffer.h
+++ b/include/libcamera/internal/byte_stream_buffer.h
@@ -12,8 +12,7 @@
 #include <type_traits>
 
 #include <libcamera/base/class.h>
-
-#include <libcamera/span.h>
+#include <libcamera/base/span.h>
 
 namespace libcamera {
 
diff --git a/include/libcamera/internal/pub_key.h b/include/libcamera/internal/pub_key.h
index f5f988b58f74..9261c9c2a0ee 100644
--- a/include/libcamera/internal/pub_key.h
+++ b/include/libcamera/internal/pub_key.h
@@ -9,7 +9,7 @@
 
 #include <stdint.h>
 
-#include <libcamera/span.h>
+#include <libcamera/base/span.h>
 
 #if HAVE_GNUTLS
 struct gnutls_pubkey_st;
diff --git a/include/libcamera/internal/v4l2_device.h b/include/libcamera/internal/v4l2_device.h
index 1edd664a9aef..77b835b3cb80 100644
--- a/include/libcamera/internal/v4l2_device.h
+++ b/include/libcamera/internal/v4l2_device.h
@@ -15,9 +15,9 @@
 
 #include <libcamera/base/log.h>
 #include <libcamera/base/signal.h>
+#include <libcamera/base/span.h>
 
 #include <libcamera/controls.h>
-#include <libcamera/span.h>
 
 namespace libcamera {
 
diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
index d08bb3096aff..9a120d13346e 100644
--- a/include/libcamera/meson.build
+++ b/include/libcamera/meson.build
@@ -12,7 +12,6 @@ libcamera_public_headers = files([
     'logging.h',
     'pixel_format.h',
     'request.h',
-    'span.h',
     'stream.h',
     'transform.h',
 ])
diff --git a/src/android/camera_buffer.h b/src/android/camera_buffer.h
index e850c4e36668..2617ff6b11a1 100644
--- a/src/android/camera_buffer.h
+++ b/src/android/camera_buffer.h
@@ -10,8 +10,7 @@
 #include <hardware/camera3.h>
 
 #include <libcamera/base/class.h>
-
-#include <libcamera/span.h>
+#include <libcamera/base/span.h>
 
 class CameraBuffer final : public libcamera::Extensible
 {
diff --git a/src/android/jpeg/encoder.h b/src/android/jpeg/encoder.h
index 8d449369869f..28e7f92a3ecb 100644
--- a/src/android/jpeg/encoder.h
+++ b/src/android/jpeg/encoder.h
@@ -7,8 +7,9 @@
 #ifndef __ANDROID_JPEG_ENCODER_H__
 #define __ANDROID_JPEG_ENCODER_H__
 
+#include <libcamera/base/span.h>
+
 #include <libcamera/buffer.h>
-#include <libcamera/span.h>
 #include <libcamera/stream.h>
 
 class Encoder
diff --git a/src/android/jpeg/exif.h b/src/android/jpeg/exif.h
index 8aa1b123a737..23b0e0974459 100644
--- a/src/android/jpeg/exif.h
+++ b/src/android/jpeg/exif.h
@@ -13,8 +13,9 @@
 
 #include <libexif/exif-data.h>
 
+#include <libcamera/base/span.h>
+
 #include <libcamera/geometry.h>
-#include <libcamera/span.h>
 
 class Exif
 {
diff --git a/src/ipa/libipa/histogram.h b/src/ipa/libipa/histogram.h
index e06f1884395e..c2761cb29e7a 100644
--- a/src/ipa/libipa/histogram.h
+++ b/src/ipa/libipa/histogram.h
@@ -13,7 +13,7 @@
 
 #include <vector>
 
-#include <libcamera/span.h>
+#include <libcamera/base/span.h>
 
 namespace libcamera {
 
diff --git a/src/ipa/raspberrypi/cam_helper.hpp b/src/ipa/raspberrypi/cam_helper.hpp
index a66648197140..b19c95f67453 100644
--- a/src/ipa/raspberrypi/cam_helper.hpp
+++ b/src/ipa/raspberrypi/cam_helper.hpp
@@ -8,8 +8,7 @@
 
 #include <string>
 
-#include <libcamera/span.h>
-
+#include <libcamera/base/span.h>
 #include <libcamera/base/utils.h>
 
 #include "camera_mode.h"
diff --git a/src/ipa/raspberrypi/md_parser.hpp b/src/ipa/raspberrypi/md_parser.hpp
index 65aab02d51b6..8497216f8db7 100644
--- a/src/ipa/raspberrypi/md_parser.hpp
+++ b/src/ipa/raspberrypi/md_parser.hpp
@@ -8,7 +8,7 @@
 
 #include <stdint.h>
 
-#include <libcamera/span.h>
+#include <libcamera/base/span.h>
 
 /*
  * Camera metadata parser class. Usage as shown below.
diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
index a3f014495e80..4d09a84f6532 100644
--- a/src/ipa/raspberrypi/raspberrypi.cpp
+++ b/src/ipa/raspberrypi/raspberrypi.cpp
@@ -16,6 +16,7 @@
 #include <linux/bcm2835-isp.h>
 
 #include <libcamera/base/log.h>
+#include <libcamera/base/span.h>
 
 #include <libcamera/buffer.h>
 #include <libcamera/control_ids.h>
@@ -26,7 +27,6 @@
 #include <libcamera/ipa/raspberrypi.h>
 #include <libcamera/ipa/raspberrypi_ipa_interface.h>
 #include <libcamera/request.h>
-#include <libcamera/span.h>
 
 #include "libcamera/internal/buffer.h"
 
diff --git a/src/libcamera/control_serializer.cpp b/src/libcamera/control_serializer.cpp
index dd5a26083747..300466285a57 100644
--- a/src/libcamera/control_serializer.cpp
+++ b/src/libcamera/control_serializer.cpp
@@ -12,11 +12,11 @@
 #include <vector>
 
 #include <libcamera/base/log.h>
+#include <libcamera/base/span.h>
 
 #include <libcamera/control_ids.h>
 #include <libcamera/controls.h>
 #include <libcamera/ipa/ipa_controls.h>
-#include <libcamera/span.h>
 
 #include "libcamera/internal/byte_stream_buffer.h"
 
diff --git a/src/libcamera/ipa_module.cpp b/src/libcamera/ipa_module.cpp
index 984c1fed9bdb..adfb8d407697 100644
--- a/src/libcamera/ipa_module.cpp
+++ b/src/libcamera/ipa_module.cpp
@@ -21,10 +21,9 @@
 #include <sys/types.h>
 #include <unistd.h>
 
-#include <libcamera/span.h>
-
 #include <libcamera/base/file.h>
 #include <libcamera/base/log.h>
+#include <libcamera/base/span.h>
 #include <libcamera/base/utils.h>
 
 #include "libcamera/internal/pipeline_handler.h"
diff --git a/src/libcamera/pipeline/rkisp1/rkisp1_path.h b/src/libcamera/pipeline/rkisp1/rkisp1_path.h
index c185ac3992dd..91757600ccdc 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1_path.h
+++ b/src/libcamera/pipeline/rkisp1/rkisp1_path.h
@@ -11,11 +11,11 @@
 #include <vector>
 
 #include <libcamera/base/signal.h>
+#include <libcamera/base/span.h>
 
 #include <libcamera/camera.h>
 #include <libcamera/geometry.h>
 #include <libcamera/pixel_format.h>
-#include <libcamera/span.h>
 
 #include "libcamera/internal/media_object.h"
 #include "libcamera/internal/v4l2_videodevice.h"
diff --git a/test/span.cpp b/test/span.cpp
index ca037c8f02fa..abf3a5d681bf 100644
--- a/test/span.cpp
+++ b/test/span.cpp
@@ -9,7 +9,7 @@
  * Include first to ensure the header is self-contained, as there's no span.cpp
  * in libcamera.
  */
-#include <libcamera/span.h>
+#include <libcamera/base/span.h>
 
 #include <array>
 #include <iostream>
diff --git a/test/utils.cpp b/test/utils.cpp
index 9cd2cd070cb9..d7f810e95e7a 100644
--- a/test/utils.cpp
+++ b/test/utils.cpp
@@ -11,11 +11,11 @@
 #include <string>
 #include <vector>
 
-#include <libcamera/geometry.h>
-#include <libcamera/span.h>
-
+#include <libcamera/base/span.h>
 #include <libcamera/base/utils.h>
 
+#include <libcamera/geometry.h>
+
 #include "test.h"
 
 using namespace std;
