diff --git a/src/qcam/assets/feathericons/feathericons.qrc b/src/qcam/assets/feathericons/feathericons.qrc
index c5302040..3078c26f 100644
--- a/src/qcam/assets/feathericons/feathericons.qrc
+++ b/src/qcam/assets/feathericons/feathericons.qrc
@@ -5,6 +5,7 @@
 	<file>camera-off.svg</file>
 	<file>play-circle.svg</file>
 	<file>save.svg</file>
+	<file>settings.svg</file>
 	<file>stop-circle.svg</file>
 	<file>x-circle.svg</file>
 </qresource>
diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index ce70cc02..7861c34b 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -239,6 +239,12 @@ int MainWindow::createToolbars()
 	saveRaw_ = action;
 #endif
 
+	/* Settings Dialog open action */
+	action = toolbar_->addAction(QIcon::fromTheme("preferences-system",
+						      QIcon(":settings.svg")),
+				     "Open Settings Window");
+	connect(action, &QAction::triggered, this, &MainWindow::openSettingsDialog);
+
 	return 0;
 }
 
@@ -262,6 +268,17 @@ void MainWindow::updateTitle()
 	setWindowTitle(title_ + " : " + QString::number(fps, 'f', 2) + " fps");
 }
 
+void MainWindow::openSettingsDialog()
+{
+	if (settingsDialog_) {
+		settingsDialog_->show();
+		return;
+	}
+
+	settingsDialog_ = new SettingsDialog(camera_, this);
+	settingsDialog_->show();
+}
+
 /* -----------------------------------------------------------------------------
  * Camera Selection
  */
diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
index c7cba5e9..856a71b1 100644
--- a/src/qcam/main_window.h
+++ b/src/qcam/main_window.h
@@ -23,12 +23,14 @@
 #include <QMainWindow>
 #include <QMutex>
 #include <QObject>
+#include <QPointer>
 #include <QPushButton>
 #include <QQueue>
 #include <QTimer>
 
 #include "../cam/capture_script.h"
 #include "../cam/stream_options.h"
+#include "settings/settings_dialog.h"
 
 #include "cam_select_dialog.h"
 #include "viewfinder.h"
@@ -94,6 +96,8 @@ private:
 	void loadCaptureScript();
 	void stopCaptureScript();
 
+	void openSettingsDialog();
+
 	/* UI elements */
 	QToolBar *toolbar_;
 	QAction *startStopAction_;
@@ -108,6 +112,7 @@ private:
 	QTimer titleTimer_;
 
 	CameraSelectorDialog *cameraSelectorDialog_;
+	QPointer<SettingsDialog> settingsDialog_;
 
 	/* Options */
 	const OptionsParser::Options &options_;
diff --git a/src/qcam/meson.build b/src/qcam/meson.build
index 70a18d7e..7a785fd0 100644
--- a/src/qcam/meson.build
+++ b/src/qcam/meson.build
@@ -24,12 +24,17 @@ qcam_sources = files([
     'main.cpp',
     'main_window.cpp',
     'message_handler.cpp',
+    'settings/control_frame.cpp',
+    'settings/controls_tab.cpp',
     'viewfinder_qt.cpp',
 ])
 
 qcam_moc_headers = files([
     'cam_select_dialog.h',
     'main_window.h',
+    'settings/control_frame.h',
+    'settings/controls_tab.h',
+    'settings/settings_dialog.h',
     'viewfinder_qt.h',
 ])
 
diff --git a/src/qcam/settings/control_frame.cpp b/src/qcam/settings/control_frame.cpp
new file mode 100644
index 00000000..8b1162db
--- /dev/null
+++ b/src/qcam/settings/control_frame.cpp
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2022, Utkarsh Tiwari <utkarsh02t@gmail.com>
+ *
+ * control_frame.cpp - qcam - Control frame
+ */
+
+#include "control_frame.h"
+
+#include <libcamera/controls.h>
+
+#include <QFrame>
+#include <QLabel>
+#include <QString>
+#include <QVBoxLayout>
+
+using namespace libcamera;
+
+ControlFrame::ControlFrame(const ControlId *control, QWidget *parent)
+	: QFrame(parent), control_(control)
+{
+	/* Main layout for the frame */
+	QVBoxLayout *frameVLayout = new QVBoxLayout(this);
+
+	frameVLayout->addWidget(new QLabel(QString::fromStdString(control_->name())));
+
+	setFrameStyle(QFrame::StyledPanel);
+}
diff --git a/src/qcam/settings/control_frame.h b/src/qcam/settings/control_frame.h
new file mode 100644
index 00000000..10690674
--- /dev/null
+++ b/src/qcam/settings/control_frame.h
@@ -0,0 +1,26 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2022, Utkarsh Tiwari <utkarsh02t@gmail.com>
+ *
+ * control_frame.h - qcam - Control frame
+ */
+
+#pragma once
+
+#include <libcamera/controls.h>
+
+#include <QFrame>
+#include <QWidget>
+
+class ControlFrame : public QFrame
+{
+	Q_OBJECT
+
+public:
+	ControlFrame(const libcamera::ControlId *control,
+		     QWidget *parent);
+	~ControlFrame() = default;
+
+private:
+	const libcamera::ControlId *control_;
+};
diff --git a/src/qcam/settings/controls_tab.cpp b/src/qcam/settings/controls_tab.cpp
new file mode 100644
index 00000000..33ed9332
--- /dev/null
+++ b/src/qcam/settings/controls_tab.cpp
@@ -0,0 +1,38 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2022, Utkarsh Tiwari <utkarsh02t@gmail.com>
+ *
+ * controls_tab.cpp - qcam - Controls Tab
+ */
+
+#include "controls_tab.h"
+
+#include <memory>
+
+#include <libcamera/camera.h>
+
+#include <QGridLayout>
+#include <QLabel>
+#include <QWidget>
+
+#include "control_frame.h"
+
+ControlsTab::ControlsTab(std::shared_ptr<libcamera::Camera> camera_,
+			 QWidget *parent)
+	: QWidget(parent)
+{
+	/* Main Layout for the tab */
+	QGridLayout *controlGLayout = new QGridLayout(this);
+
+	int controlCount = 0;
+	for (auto &[control, info] : camera_->controls()) {
+		ControlFrame *controlFrame = new ControlFrame(control, this);
+
+		controlGLayout->addWidget(controlFrame, controlCount / 2,
+					  controlCount % 2);
+		controlCount++;
+	}
+
+	if (controlCount == 0)
+		controlGLayout->addWidget(new QLabel("No controls available"));
+}
diff --git a/src/qcam/settings/controls_tab.h b/src/qcam/settings/controls_tab.h
new file mode 100644
index 00000000..6a63f334
--- /dev/null
+++ b/src/qcam/settings/controls_tab.h
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2022, Utkarsh Tiwari <utkarsh02t@gmail.com>
+ *
+ * controls_tab.h - qcam - Controls Tab
+ */
+
+#pragma once
+
+#include <memory>
+
+#include <libcamera/camera.h>
+
+#include <QVBoxLayout>
+#include <QWidget>
+
+class ControlsTab : public QWidget
+{
+	Q_OBJECT
+
+public:
+	ControlsTab(std::shared_ptr<libcamera::Camera> camera_, QWidget *parent);
+	~ControlsTab() = default;
+};
diff --git a/src/qcam/settings/settings_dialog.h b/src/qcam/settings/settings_dialog.h
new file mode 100644
index 00000000..c2fa61ea
--- /dev/null
+++ b/src/qcam/settings/settings_dialog.h
@@ -0,0 +1,39 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2022, Utkarsh Tiwari <utkarsh02t@gmail.com>
+ *
+ * settings_dialog.h - qcam - Settings Dialog
+ */
+
+#pragma once
+
+#include <memory>
+
+#include <QDialog>
+#include <QTabWidget>
+#include <QVBoxLayout>
+#include <QWidget>
+
+#include "controls_tab.h"
+class SettingsDialog : public QDialog
+{
+	Q_OBJECT
+
+public:
+	SettingsDialog(std::shared_ptr<libcamera::Camera> camera, QWidget *parent)
+		: QDialog(parent)
+	{
+		/*Main layout for dialog */
+		QVBoxLayout *settingVLayout = new QVBoxLayout(this);
+
+		/* Main TabWidget which would hold other tabs */
+		QTabWidget *settingTabWidget = new QTabWidget;
+		settingVLayout->addWidget(settingTabWidget);
+
+		ControlsTab *controlsTab = new ControlsTab(camera, this);
+		settingTabWidget->addTab(controlsTab, "Controls");
+
+		setWindowTitle("Settings");
+	}
+	~SettingsDialog() = default;
+};
