diff --git a/include/libcamera/ipa/ipa_interface.h b/include/libcamera/ipa/ipa_interface.h
new file mode 100644
index 0000000..2c5eb1f
--- /dev/null
+++ b/include/libcamera/ipa/ipa_interface.h
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * ipa_interface.h - Image Processing Algorithm interface
+ */
+#ifndef __LIBCAMERA_IPA_INTERFACE_H__
+#define __LIBCAMERA_IPA_INTERFACE_H__
+
+namespace libcamera {
+
+class IPAInterface
+{
+public:
+	virtual ~IPAInterface() {}
+
+	virtual int init() = 0;
+};
+
+} /* namespace libcamera */
+
+#endif /* __LIBCAMERA_IPA_INTERFACE_H__ */
diff --git a/include/libcamera/meson.build b/include/libcamera/meson.build
index 1fcf6b5..1b86fdc 100644
--- a/include/libcamera/meson.build
+++ b/include/libcamera/meson.build
@@ -5,6 +5,7 @@ libcamera_api = files([
     'event_dispatcher.h',
     'event_notifier.h',
     'geometry.h',
+    'ipa/ipa_interface.h',
     'ipa/ipa_module_info.h',
     'object.h',
     'request.h',
diff --git a/src/libcamera/ipa_interface.cpp b/src/libcamera/ipa_interface.cpp
new file mode 100644
index 0000000..9d30da2
--- /dev/null
+++ b/src/libcamera/ipa_interface.cpp
@@ -0,0 +1,27 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * ipa_interface.cpp - Image Processing Algorithm interface
+ */
+
+#include <libcamera/ipa/ipa_interface.h>
+
+/**
+ * \file ipa_interface.h
+ * \brief Image Processing Algorithm interface
+ */
+
+namespace libcamera {
+
+/**
+ * \class IPAInterface
+ * \brief Interface for IPA implementation
+ */
+
+/**
+ * \fn IPAInterface::init()
+ * \brief Initialise the IPAInterface
+ */
+
+} /* namespace libcamera */
diff --git a/src/libcamera/meson.build b/src/libcamera/meson.build
index 6a73580..07335e5 100644
--- a/src/libcamera/meson.build
+++ b/src/libcamera/meson.build
@@ -10,6 +10,7 @@ libcamera_sources = files([
     'event_notifier.cpp',
     'formats.cpp',
     'geometry.cpp',
+    'ipa_interface.cpp',
     'ipa_module.cpp',
     'log.cpp',
     'media_device.cpp',
diff --git a/test/ipa/ipa_test.cpp b/test/ipa/ipa_test.cpp
index 9861ee2..2dbc702 100644
--- a/test/ipa/ipa_test.cpp
+++ b/test/ipa/ipa_test.cpp
@@ -60,8 +60,6 @@ protected:
 			9001,
 		};
 
-		count += runTest("test/ipa/ipa-dummy-c.so", testInfo);
-
 		count += runTest("test/ipa/ipa-dummy-cpp.so", testInfo);
 
 		if (count < 0)
diff --git a/test/ipa/meson.build b/test/ipa/meson.build
index ecde313..08ee95c 100644
--- a/test/ipa/meson.build
+++ b/test/ipa/meson.build
@@ -1,5 +1,4 @@
 ipa_modules_sources = [
-    ['ipa-dummy-c',   'shared_test.c'],
     ['ipa-dummy-cpp', 'shared_test.cpp'],
 ]
 
diff --git a/test/ipa/shared_test.c b/test/ipa/shared_test.c
deleted file mode 100644
index 87d182b..0000000
--- a/test/ipa/shared_test.c
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <libcamera/ipa/ipa_module_info.h>
-
-const struct IPAModuleInfo ipaModuleInfo = {
-	.name = "It's over nine thousand!",
-	.version = 9001,
-};
