diff --git a/src/gstreamer/gstlibcameraprovider.cpp b/src/gstreamer/gstlibcameraprovider.cpp
index 5da96ea3..d3384c57 100644
--- a/src/gstreamer/gstlibcameraprovider.cpp
+++ b/src/gstreamer/gstlibcameraprovider.cpp
@@ -10,6 +10,7 @@
 
 #include "gstlibcameraprovider.h"
 
+#include <libcamera/libcamera.h>
 #include <libcamera/camera.h>
 #include <libcamera/camera_manager.h>
 
@@ -131,6 +132,7 @@ gst_libcamera_device_new(const std::shared_ptr<Camera> &camera)
 	static const std::array roles{ StreamRole::VideoRecording };
 	g_autoptr(GstCaps) caps = gst_caps_new_empty();
 	const gchar *name = camera->id().c_str();
+	const int32_t rotation = camera->properties().get(libcamera::properties::Rotation).value_or(0);
 
 	std::unique_ptr<CameraConfiguration> config = camera->generateConfiguration(roles);
 	if (!config || config->size() != roles.size()) {
@@ -150,6 +152,9 @@ gst_libcamera_device_new(const std::shared_ptr<Camera> &camera)
 				       "display-name", name,
 				       "caps", caps,
 				       "device-class", "Source/Video",
+					   "properties", gst_structure_new("device-properties",
+							"rotation", G_TYPE_INT, rotation,
+							NULL),
 				       nullptr));
 }
 
diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp
index 3aca4eed..fe3249ff 100644
--- a/src/gstreamer/gstlibcamerasrc.cpp
+++ b/src/gstreamer/gstlibcamerasrc.cpp
@@ -32,6 +32,7 @@
 #include <tuple>
 #include <utility>
 #include <vector>
+#include <sstream>
 
 #include <libcamera/camera.h>
 #include <libcamera/camera_manager.h>
@@ -146,6 +147,7 @@ struct _GstLibcameraSrc {
 	GstTask *task;
 
 	gchar *camera_name;
+	Orientation orientation;
 
 	std::atomic<GstEvent *> pending_eos;
 
@@ -157,6 +159,7 @@ struct _GstLibcameraSrc {
 enum {
 	PROP_0,
 	PROP_CAMERA_NAME,
+	PROP_ORIENTATION,
 	PROP_LAST
 };
 
@@ -616,9 +619,37 @@ gst_libcamera_src_negotiate(GstLibcameraSrc *self)
 		gst_libcamera_get_framerate_from_caps(caps, element_caps);
 	}
 
+	/* Set orientation control. */
+	state->config_->orientation = self->orientation;
+
 	/* Validate the configuration. */
-	if (state->config_->validate() == CameraConfiguration::Invalid)
+	switch(state->config_->validate()) {
+	case CameraConfiguration::Valid:
+		GST_DEBUG_OBJECT(self, "Camera configuration is valid");
+		break;
+	case CameraConfiguration::Adjusted:
+	{
+		/*
+		 * The configuration has been adjusted and is now valid.
+		 * Parameters may have changed for any stream, and stream configurations may have been removed.
+		 * Log the adjusted configuration.
+		 */
+		for (gsize i = 0; i < state->config_->size(); i++) {
+			const StreamConfiguration &cfg = state->config_->at(i);
+			GST_WARNING_OBJECT(self, "Camera configuration adjusted for stream %zu: %s", i, cfg.toString().c_str());
+		}
+		std::ostringstream oss;
+		oss << state->config_->orientation;
+		GST_WARNING_OBJECT(self, "Camera configuration adjusted orientation: %s", oss.str().c_str());
+		self->orientation = state->config_->orientation;
+		break;
+	}
+	case CameraConfiguration::Invalid:
+		GST_ELEMENT_ERROR(self, RESOURCE, SETTINGS,
+				  ("Camera configuration is not supported"),
+				  ("CameraConfiguration::validate() returned Invalid"));
 		return false;
+	}
 
 	int ret = state->cam_->configure(state->config_.get());
 	if (ret) {
@@ -926,6 +957,9 @@ gst_libcamera_src_set_property(GObject *object, guint prop_id,
 		g_free(self->camera_name);
 		self->camera_name = g_value_dup_string(value);
 		break;
+	case PROP_ORIENTATION:
+		self->orientation = (libcamera::Orientation)g_value_get_enum(value);
+		break;
 	default:
 		if (!state->controls_.setProperty(prop_id - PROP_LAST, value, pspec))
 			G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
@@ -945,6 +979,9 @@ gst_libcamera_src_get_property(GObject *object, guint prop_id, GValue *value,
 	case PROP_CAMERA_NAME:
 		g_value_set_string(value, self->camera_name);
 		break;
+	case PROP_ORIENTATION:
+		g_value_set_enum(value, (gint)self->orientation);
+		break;
 	default:
 		if (!state->controls_.getProperty(prop_id - PROP_LAST, value, pspec))
 			G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
@@ -1120,6 +1157,53 @@ gst_libcamera_src_release_pad(GstElement *element, GstPad *pad)
 	gst_element_remove_pad(element, pad);
 }
 
+static GType
+gst_libcamera_orientation_get_type()
+{
+	static GType type = 0;
+	static const GEnumValue values[] = {
+		{
+			static_cast<gint>(libcamera::Orientation::Rotate0),
+			"libcamera::Orientation::Rotate0",
+			"rotate-0",
+		}, {
+			static_cast<gint>(libcamera::Orientation::Rotate0Mirror),
+			"libcamera::Orientation::Rotate0Mirror",
+			"rotate-0-mirror",
+		}, {
+			static_cast<gint>(libcamera::Orientation::Rotate180),
+			"libcamera::Orientation::Rotate180",
+			"rotate-180",
+		}, {
+			static_cast<gint>(libcamera::Orientation::Rotate180Mirror),
+			"libcamera::Orientation::Rotate180Mirror",
+			"rotate-180-mirror",
+		}, {
+			static_cast<gint>(libcamera::Orientation::Rotate90Mirror),
+			"libcamera::Orientation::Rotate90Mirror",
+			"rotate-90-mirror",
+		}, {
+			static_cast<gint>(libcamera::Orientation::Rotate270),
+			"libcamera::Orientation::Rotate270",
+			"rotate-270",
+		}, {
+			static_cast<gint>(libcamera::Orientation::Rotate270Mirror),
+			"libcamera::Orientation::Rotate270Mirror",
+			"rotate-270-mirror",
+		}, {
+			static_cast<gint>(libcamera::Orientation::Rotate90),
+			"libcamera::Orientation::Rotate90",
+			"rotate-90",
+		},
+		{ 0, nullptr, nullptr }
+	};
+
+	if (!type)
+		type = g_enum_register_static("GstLibcameraOrientation", values);
+
+	return type;
+}
+
 static void
 gst_libcamera_src_class_init(GstLibcameraSrcClass *klass)
 {
@@ -1154,6 +1238,18 @@ gst_libcamera_src_class_init(GstLibcameraSrcClass *klass)
 							     | G_PARAM_STATIC_STRINGS));
 	g_object_class_install_property(object_class, PROP_CAMERA_NAME, spec);
 
+	/* Register the orientation enum type. */
+	GType orientation_type = gst_libcamera_orientation_get_type();
+	spec = g_param_spec_enum("orientation", "Orientation",
+					       "Select the orientation of the camera.",
+					       orientation_type,
+					       static_cast<gint>(libcamera::Orientation::Rotate0),
+					       (GParamFlags)(GST_PARAM_MUTABLE_READY
+							     | G_PARAM_CONSTRUCT
+							     | G_PARAM_READWRITE
+							     | G_PARAM_STATIC_STRINGS));
+	g_object_class_install_property(object_class, PROP_ORIENTATION, spec);
+
 	GstCameraControls::installProperties(object_class, PROP_LAST);
 }
 
