diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
index decf4ec0d4db..a4536c72a17e 100644
--- a/include/libcamera/camera.h
+++ b/include/libcamera/camera.h
@@ -21,6 +21,7 @@
 
 #include <libcamera/controls.h>
 #include <libcamera/geometry.h>
+#include <libcamera/orientation.h>
 #include <libcamera/request.h>
 #include <libcamera/stream.h>
 #include <libcamera/transform.h>
@@ -94,6 +95,7 @@ public:
 
 	std::optional<SensorConfiguration> sensorConfig;
 	Transform transform;
+	Orientation orientation;
 
 protected:
 	CameraConfiguration();
diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
index 408b7acf152c..a24c50d66a82 100644
--- a/include/libcamera/meson.build
+++ b/include/libcamera/meson.build
@@ -12,6 +12,7 @@ libcamera_public_headers = files([
     'framebuffer_allocator.h',
     'geometry.h',
     'logging.h',
+    'orientation.h',
     'pixel_format.h',
     'request.h',
     'stream.h',
diff --git a/include/libcamera/orientation.h b/include/libcamera/orientation.h
new file mode 100644
index 000000000000..ae19d4c44a55
--- /dev/null
+++ b/include/libcamera/orientation.h
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2023, Ideas On Board Oy
+ *
+ * orientation.h - Image orientation
+ */
+
+#pragma once
+
+#include <iostream>
+
+namespace libcamera {
+
+enum class Orientation {
+	/* EXIF tag 274 starts from '1' */
+	Rotate0 = 1,
+	Rotate0Mirror,
+	Rotate180,
+	Rotate180Mirror,
+	Rotate90Mirror,
+	Rotate270,
+	Rotate270Mirror,
+	Rotate90,
+};
+
+std::ostream &operator<<(std::ostream &out, const Orientation &orientation);
+
+} /* namespace libcamera */
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index b940647d8d09..59ee3c40dc8e 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -291,7 +291,8 @@ bool SensorConfiguration::isValid() const
  * \brief Create an empty camera configuration
  */
 CameraConfiguration::CameraConfiguration()
-	: transform(Transform::Identity), config_({})
+	: transform(Transform::Identity), orientation(Orientation::Rotate0),
+	  config_({})
 {
 }
 
@@ -552,6 +553,21 @@ CameraConfiguration::Status CameraConfiguration::validateColorSpaces(ColorSpaceF
  * may adjust this field at its discretion if the selection is not supported.
  */
 
+/**
+ * \var CameraConfiguration::orientation
+ * \brief The desired orientation of the images produced by the camera
+ *
+ * The orientation field is a user-specified 2D plane transformation that
+ * specifies how the application wants the camera images to be rotated in
+ * the memory buffers.
+ *
+ * If the orientation requested by the application cannot be obtained, the
+ * camera will not rotate or flip the images, and the validate() function will
+ * Adjust this value to the native image orientation produced by the camera.
+ *
+ * By default the orientation field is set to Orientation::Rotate0.
+ */
+
 /**
  * \var CameraConfiguration::config_
  * \brief The vector of stream configurations
diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
index b24f82965764..d0e26f6b4141 100644
--- a/src/libcamera/meson.build
+++ b/src/libcamera/meson.build
@@ -34,6 +34,7 @@ libcamera_sources = files([
     'mapped_framebuffer.cpp',
     'media_device.cpp',
     'media_object.cpp',
+    'orientation.cpp',
     'pipeline_handler.cpp',
     'pixel_format.cpp',
     'process.cpp',
diff --git a/src/libcamera/orientation.cpp b/src/libcamera/orientation.cpp
new file mode 100644
index 000000000000..61f26cfda31b
--- /dev/null
+++ b/src/libcamera/orientation.cpp
@@ -0,0 +1,62 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2023, Ideas On Board Oy
+ *
+ * orientation.cpp - Image orientation
+ */
+
+#include <libcamera/orientation.h>
+
+#include <array>
+#include <string>
+
+/**
+ * \file libcamera/orientation.h
+ * \brief Image orientation definition
+ */
+
+namespace libcamera {
+
+/**
+ * \enum Orientation
+ * \brief The image orientation in a memory buffer
+ *
+ * The Orientation enumeration describes the orientation of the images
+ * produced by the camera pipeline as they get received by the application
+ * inside memory buffers.
+ *
+ * The image orientation expressed using the Orientation enumeration can be then
+ * inferred by applying to a naturally oriented image a multiple of a 90 degrees
+ * rotation in the clockwise direction from the origin and then by applying an
+ * optional horizontal mirroring.
+ *
+ * The enumeration numerical values follow the ones defined by the EXIF
+ * Specification version 2.32, Tag 274 "Orientation", while the names of the
+ * enumerated values report the rotation and mirroring operations performed.
+ *
+ * In example Orientation::Rotate90Mirror describes the image transformation
+ * obtained by rotating 90 degrees clockwise first and then applying an
+ * horizontal mirroring.
+ */
+
+/**
+ * \brief Prints human-friendly names for Orientation items
+ * \param[in] out The output stream
+ * \param[in] orientation The Orientation item
+ * \return The output stream \a out
+ */
+std::ostream &operator<<(std::ostream &out, const Orientation &orientation)
+{
+	constexpr std::array<const char *, 9> orientationNames = {
+		"", /* Orientation starts counting from 1. */
+		"Rotate0", "rotate0Flip",
+		"Rotate180", "rotate180Flip",
+		"Rotate90Mirror", "Rotate270",
+		"Rotate270Mirror", "Rotate90",
+	};
+
+	out << orientationNames[static_cast<unsigned int>(orientation)];
+	return out;
+}
+
+} /* namespace libcamera */
