From 4bcb6ee549d95592f93f26cc1d2faa4a4b269f51 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Corentin=20No=C3=ABl?= <corentin.noel@collabora.com>
Date: Tue, 10 Jun 2025 10:18:16 +0200
Subject: [PATCH] Start the port to Mutter 48

---
 compositor/PointerLocator.vala |   4 +
 compositor/WindowManager.vala  |  18 +
 compositor/Zoom.vala           |   7 +-
 compositor/meson.build         |  11 +
 vapi/Clutter-14-custom.vala    |  29 --
 vapi/Clutter-15-custom.vala    |  25 --
 vapi/Clutter-16.metadata       | 145 +++++++
 vapi/Cogl-16-custom.vala       |  66 +++
 vapi/Cogl-16.metadata          |  42 ++
 vapi/Meta-16.metadata          | 180 ++++++++
 vapi/Mtk-16.metadata           |   6 +
 vapi/libmutter-16.deps         |   1 +
 vapi/libmutter-16.vapi         |   1 +
 vapi/libmutter.vapi            | 150 ++++++-
 vapi/meson.build               |  72 +++-
 vapi/mutter-clutter-16.deps    |   6 +
 vapi/mutter-clutter-16.vapi    |   1 +
 vapi/mutter-clutter.vapi       | 765 ++++++++++++++++++++++++++++++++-
 vapi/mutter-cogl-14.vapi       | 176 +++++++-
 vapi/mutter-cogl-16.deps       |   5 +
 vapi/mutter-cogl-16.vapi       |   1 +
 vapi/mutter-mtk-13.vapi        |  17 +
 vapi/mutter-mtk-16.vapi        |   1 +
 23 files changed, 1638 insertions(+), 91 deletions(-)
 create mode 100644 vapi/Clutter-16.metadata
 create mode 100644 vapi/Cogl-16-custom.vala
 create mode 100644 vapi/Cogl-16.metadata
 create mode 100644 vapi/Meta-16.metadata
 create mode 100644 vapi/Mtk-16.metadata
 create mode 120000 vapi/libmutter-16.deps
 create mode 120000 vapi/libmutter-16.vapi
 create mode 100644 vapi/mutter-clutter-16.deps
 create mode 120000 vapi/mutter-clutter-16.vapi
 create mode 100644 vapi/mutter-cogl-16.deps
 create mode 120000 vapi/mutter-cogl-16.vapi
 create mode 120000 vapi/mutter-mtk-16.vapi

diff --git a/compositor/PointerLocator.vala b/compositor/PointerLocator.vala
index 37bde2a9a..9516315d3 100644
--- a/compositor/PointerLocator.vala
+++ b/compositor/PointerLocator.vala
@@ -132,7 +132,11 @@ public class GreeterCompositor.PointerLocator : Clutter.Actor, Clutter.Animatabl
         fill_color = new Cairo.Pattern.rgba (rgba.red, rgba.green, rgba.blue, BACKGROUND_OPACITY);
 
         unowned var display = wm.get_display ();
+#if HAS_MUTTER48
+        unowned var tracker = display.get_compositor ().get_backend ().get_cursor_tracker ();
+#else
         unowned var tracker = display.get_cursor_tracker ();
+#endif
         Graphene.Point coords = {};
         tracker.get_pointer (out coords, null);
 
diff --git a/compositor/WindowManager.vala b/compositor/WindowManager.vala
index d4aa2c2a3..52c61f034 100644
--- a/compositor/WindowManager.vala
+++ b/compositor/WindowManager.vala
@@ -37,7 +37,9 @@ namespace GreeterCompositor {
 
         private Clutter.Actor fade_in_screen;
 
+#if !HAS_MUTTER48
         private Meta.PluginInfo info;
+#endif
 
         // Used to toggle screenreader
         private GLib.Settings application_settings;
@@ -46,8 +48,10 @@ namespace GreeterCompositor {
         private Zoom zoom;
 
         construct {
+#if !HAS_MUTTER48
             info = Meta.PluginInfo () {name = "GreeterCompositor", version = Constants.VERSION, author = "elementary LLC.",
                 license = "GPLv3", description = "The greeter compositor"};
+#endif
         }
 
         public override void start () {
@@ -95,7 +99,11 @@ namespace GreeterCompositor {
             DBusWingpanelManager.init (this);
             KeyboardManager.init (display);
 
+#if HAS_MUTTER48
+            stage = display.get_compositor ().get_stage () as Clutter.Stage;
+#else
             stage = display.get_stage () as Clutter.Stage;
+#endif
 #if HAS_MUTTER47
             stage.background_color = Cogl.Color.from_string ("black");
 #else
@@ -125,11 +133,19 @@ namespace GreeterCompositor {
             };
             stage.add_child (fade_in_screen);
 
+#if HAS_MUTTER48
+            window_group = display.get_compositor ().get_window_group ();
+#else
             window_group = display.get_window_group ();
+#endif
             stage.remove_child (window_group);
             ui_group.add_child (window_group);
 
+#if HAS_MUTTER48
+            top_window_group = display.get_compositor ().get_top_window_group ();
+#else
             top_window_group = display.get_top_window_group ();
+#endif
             stage.remove_child (top_window_group);
             ui_group.add_child (top_window_group);
 
@@ -353,8 +369,10 @@ namespace GreeterCompositor {
             dialog.show ();
         }
 
+#if !HAS_MUTTER48
         public override unowned Meta.PluginInfo? plugin_info () {
             return info;
         }
+#endif
     }
 }
diff --git a/compositor/Zoom.vala b/compositor/Zoom.vala
index f6288e806..44d6df558 100644
--- a/compositor/Zoom.vala
+++ b/compositor/Zoom.vala
@@ -58,7 +58,12 @@ public class GreeterCompositor.Zoom : Object {
     private inline Graphene.Point compute_new_pivot_point () {
         unowned var wins = wm.ui_group;
         Graphene.Point coords;
-        wm.get_display ().get_cursor_tracker ().get_pointer (out coords, null);
+#if HAS_MUTTER48
+        unowned var tracker = wm.get_display ().get_compositor ().get_backend ().get_cursor_tracker ();
+#else
+        unowned var tracker = wm.get_display ().get_cursor_tracker ();
+#endif
+        tracker.get_pointer (out coords, null);
         var new_pivot = Graphene.Point () {
             x = coords.x / wins.width,
             y = coords.y / wins.height
diff --git a/compositor/meson.build b/compositor/meson.build
index 6a171f9ba..469cecfe2 100644
--- a/compositor/meson.build
+++ b/compositor/meson.build
@@ -46,6 +46,17 @@ if mutter47_dep.found()
 	vala_flags = ['--define', 'HAS_MUTTER46', '--define', 'HAS_MUTTER47']
 endif
 
+mutter48_dep = dependency('libmutter-16', version: ['>= 48', '< 49'], required: false)
+if mutter48_dep.found()
+	libmutter_dep = dependency('libmutter-16', version: '>= 48')
+	mutter_dep = [
+		libmutter_dep,
+		dependency('mutter-mtk-16'), dependency('mutter-cogl-16'),
+		dependency('mutter-clutter-16')
+	]
+	vala_flags = ['--define', 'HAS_MUTTER46', '--define', 'HAS_MUTTER47', '--define', 'HAS_MUTTER48']
+endif
+
 if mutter_dep.length() == 0
 	error ('No supported mutter library found!')
 endif
diff --git a/vapi/Clutter-14-custom.vala b/vapi/Clutter-14-custom.vala
index e5c71c2d8..94010f0cd 100644
--- a/vapi/Clutter-14-custom.vala
+++ b/vapi/Clutter-14-custom.vala
@@ -21,33 +21,4 @@ namespace Clutter {
 		[CCode (cname = "clutter_color_from_string")]
 		public bool parse_string (string str);
 	}
-
-	public interface Container : GLib.Object {
-		public void add (params Clutter.Actor[] actors);
-		[CCode (cname = "clutter_container_class_find_child_property")]
-		public class unowned GLib.ParamSpec find_child_property (string property_name);
-		[CCode (cname = "clutter_container_class_list_child_properties")]
-		public class unowned GLib.ParamSpec[] list_child_properties ();
-	}
-
-	public struct Units {
-		[CCode (cname = "clutter_units_from_cm")]
-		public Units.from_cm (float cm);
-		[CCode (cname = "clutter_units_from_em")]
-		public Units.from_em (float em);
-		[CCode (cname = "clutter_units_from_em_for_font")]
-		public Units.from_em_for_font (string font_name, float em);
-		[CCode (cname = "clutter_units_from_mm")]
-		public Units.from_mm (float mm);
-		[CCode (cname = "clutter_units_from_pixels")]
-		public Units.from_pixels (int px);
-		[CCode (cname = "clutter_units_from_pt")]
-		public Units.from_pt (float pt);
-		[CCode (cname = "clutter_units_from_string")]
-		public Units.from_string (string str);
-	}
-
-	[CCode (cheader_filename = "clutter/clutter.h", has_copy_function = false, has_destroy_function = false, has_type_id = false)]
-	public struct Capture {
-	}
 }
diff --git a/vapi/Clutter-15-custom.vala b/vapi/Clutter-15-custom.vala
index abc9b22d7..fd012031f 100644
--- a/vapi/Clutter-15-custom.vala
+++ b/vapi/Clutter-15-custom.vala
@@ -1,29 +1,4 @@
 namespace Clutter {
-	public interface Container : GLib.Object {
-		public void add (params Clutter.Actor[] actors);
-		[CCode (cname = "clutter_container_class_find_child_property")]
-		public class unowned GLib.ParamSpec find_child_property (string property_name);
-		[CCode (cname = "clutter_container_class_list_child_properties")]
-		public class unowned GLib.ParamSpec[] list_child_properties ();
-	}
-
-	public struct Units {
-		[CCode (cname = "clutter_units_from_cm")]
-		public Units.from_cm (float cm);
-		[CCode (cname = "clutter_units_from_em")]
-		public Units.from_em (float em);
-		[CCode (cname = "clutter_units_from_em_for_font")]
-		public Units.from_em_for_font (string font_name, float em);
-		[CCode (cname = "clutter_units_from_mm")]
-		public Units.from_mm (float mm);
-		[CCode (cname = "clutter_units_from_pixels")]
-		public Units.from_pixels (int px);
-		[CCode (cname = "clutter_units_from_pt")]
-		public Units.from_pt (float pt);
-		[CCode (cname = "clutter_units_from_string")]
-		public Units.from_string (string str);
-	}
-
 	[CCode (cheader_filename = "clutter/clutter.h", has_copy_function = false, has_destroy_function = false, has_type_id = false)]
 	public struct Capture {
 	}
diff --git a/vapi/Clutter-16.metadata b/vapi/Clutter-16.metadata
new file mode 100644
index 000000000..f7f420511
--- /dev/null
+++ b/vapi/Clutter-16.metadata
@@ -0,0 +1,145 @@
+// Non mini-object
+ActorBox struct
+Margin struct
+PaintVolume struct
+Perspective struct
+
+*.ref unowned
+* cheader_filename="clutter/clutter.h"
+
+// Fix the few clutter-pango headers
+Text cheader_filename="clutter/clutter-pango.h"
+TextBuffer cheader_filename="clutter/clutter-pango.h"
+TextNode cheader_filename="clutter/clutter-pango.h"
+Actor
+	.get_pango_context cheader_filename="clutter/clutter-pango.h"
+	.create_pango_context cheader_filename="clutter/clutter-pango.h"
+	.create_pango_layout cheader_filename="clutter/clutter-pango.h"
+
+
+Actor
+	.apply_transform.matrix ref
+	.get_abs_allocation_vertices.verts out=false
+Event.type#method name="get_type"
+
+// ???
+Actor.has_pointer#method name="get_has_pointer"
+
+// Not all backing symbols are deprecated
+Actor.pick deprecated=false
+
+// Nullable return values
+Actor
+	.get_parent nullable
+
+// The original CType has been overridden by the annotations
+Actor
+	.allocate.box ctype="const ClutterActorBox *"
+	.get_stage ctype="ClutterActor *"
+Action.handle_event.event ctype="const ClutterEvent *"
+
+// method/virtual-method/signal don't match
+Actor
+	.event#method name="emit_event"
+	.get_paint_volume#virtual_method name="get_paint_volume_vfunc"
+	.get_paint_volume#virtual_method.volume out
+Text
+	.activate#method name="try_activate"
+	.insert_text#signal skip
+TextBuffer.get_text#virtual_method name="get_text_with_length"
+
+// Default values
+Stage.read_pixels
+	.width default=-1
+	.height default=-1
+Stage.paint_to_buffer
+    .data type="uint8[]"
+Text
+	.position_to_coords.line_height default=null
+
+// Skipped by g-i for unknown reasons
+LayoutManager
+	.create_child_meta skip=false
+
+// We can use static strings
+PaintNode
+	.set_static_name skip=false
+
+// Variadic arguments
+Backend
+	.get_cogl_context skip=false
+Interval
+	.new skip=false
+	.get_interval skip=false
+	.set_final skip=false
+	.set_initial skip=false
+	.set_interval skip=false
+LayoutManager
+	.child_get skip=false
+	.child_set skip=false
+
+// Skipped upstream for unknown reasons
+Interval.register_progress_func skip=false
+
+// struct/class confusion
+ActorBox
+	.new skip
+	.from_vertices skip
+Margin
+	.new skip
+
+// Upstream
+Event
+	.get_position.position out
+
+FrameListenerIface skip
+FrameClock.new skip
+
+// Remove for clutter-2.0
+/////////////////////////
+
+StageView.layout skip
+
+Stage
+	.paint_view.redraw_clip type="Cairo.Region"
+
+// *Event should be compact classes derived from Clutter.Event
+Event.type skip=false
+AnyEvent struct=false base_type="Clutter.Event"
+ButtonEvent struct=false base_type="Clutter.Event"
+CrossingEvent struct=false base_type="Clutter.Event"
+DeviceEvent struct=false base_type="Clutter.Event"
+IMEvent struct=false base_type="Clutter.Event"
+KeyEvent struct=false base_type="Clutter.Event"
+MotionEvent struct=false base_type="Clutter.Event"
+PadButtonEvent struct=false base_type="Clutter.Event"
+PadRingEvent struct=false base_type="Clutter.Event"
+PadStripEvent struct=false base_type="Clutter.Event"
+ProximityEvent struct=false base_type="Clutter.Event"
+ScrollEvent struct=false base_type="Clutter.Event"
+TouchEvent struct=false base_type="Clutter.Event"
+TouchpadHoldEvent struct=false base_type="Clutter.Event"
+TouchpadPinchEvent struct=false base_type="Clutter.Event"
+TouchpadSwipeEvent struct=false base_type="Clutter.Event"
+
+// Keysyms used to be CLUTTER_X instead of CLUTTER_KEY_X
+*#constant skip
+CURRENT_TIME skip=false
+PRIORITY_REDRAW skip=false
+
+// Clutter devs don't like us creating nested namespaces
+value_* name="value_(.+)" parent="Clutter.Value"
+threads_* name="threads_(.+)" parent="Clutter.Threads"
+
+// There is no way to know sealed classes before GLib 2.70
+ColorState sealed
+FrameClock sealed
+TextureContent sealed
+
+TextureContent.new_from_texture symbol_type="constructor"
+
+// Possibly keep
+KEY_* skip=false name="KEY_(.+)" type="uint" parent="Clutter.Key"
+BUTTON_* skip=false name="BUTTON_(.+)" type="uint32" parent="Clutter.Button"
+EVENT_STOP skip=false type="bool"
+EVENT_PROPAGATE skip=false type="bool"
diff --git a/vapi/Cogl-16-custom.vala b/vapi/Cogl-16-custom.vala
new file mode 100644
index 000000000..90d46b330
--- /dev/null
+++ b/vapi/Cogl-16-custom.vala
@@ -0,0 +1,66 @@
+namespace Cogl {
+	public struct Color {
+		[CCode (cname="cogl_color_init_from_4f")]
+		public Color.from_4f (float red, float green, float blue, float alpha);
+		[CCode (cname="cogl_color_init_from_hsl")]
+		public Color.from_hsl (float hue, float saturation, float luminance);
+		[CCode (cname = "_vala_cogl_color_from_string")]
+		public static Cogl.Color? from_string (string str) {
+			Cogl.Color color = {};
+			if (color.init_from_string (str))
+				return color;
+
+			return null;
+		}
+	}
+	[CCode (cheader_filename = "cogl/cogl.h", has_type_id = false)]
+	public struct VertexP2 {
+		public float x;
+		public float y;
+	}
+	[CCode (cheader_filename = "cogl/cogl.h", has_type_id = false)]
+	public struct VertexP2C4 {
+		public float x;
+		public float y;
+		public uint8 r;
+		public uint8 g;
+		public uint8 b;
+		public uint8 a;
+	}
+	[CCode (cheader_filename = "cogl/cogl.h", has_type_id = false)]
+	public struct VertexP2T2 {
+		public float x;
+		public float y;
+		public float s;
+		public float t;
+	}
+	[CCode (cheader_filename = "cogl/cogl.h", has_type_id = false)]
+	public struct VertexP2T2C4 {
+		public float x;
+		public float y;
+		public float s;
+		public float t;
+		public uint8 r;
+		public uint8 g;
+		public uint8 b;
+		public uint8 a;
+	}
+	[CCode (cheader_filename = "cogl/cogl.h", has_type_id = false)]
+	public struct VertexP3 {
+		public float x;
+		public float y;
+		public float z;
+	}
+	[CCode (cheader_filename = "cogl/cogl.h", has_type_id = false)]
+	public struct VertexP3T2 {
+		public float x;
+		public float y;
+		public float z;
+		public float s;
+		public float t;
+	}
+	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_PIXEL_FORMAT_", type_id = "cogl_pixel_format_get_type ()")]
+	public enum PixelFormat {
+		CAIRO_ARGB32_COMPAT;
+	}
+}
diff --git a/vapi/Cogl-16.metadata b/vapi/Cogl-16.metadata
new file mode 100644
index 000000000..ac4447133
--- /dev/null
+++ b/vapi/Cogl-16.metadata
@@ -0,0 +1,42 @@
+* cheader_filename="cogl/cogl.h"
+
+Color struct
+
+Color.equal.v1 type="Cogl.Color"
+Color.equal.v2 type="Cogl.Color"
+Color.from_string name="init_from_string"
+
+Context.free_timestamp_query.query owned
+
+Bitmap.* skip=false
+Bitmap.new_for_data.data type="owned uint8[]"
+Bitmap.get_buffer type="unowned Cogl.Buffer?"
+
+Primitive.new skip=false
+
+Texture
+  .get_data.data type="uint8[]"
+  .set_data.data type="uint8[]"
+  .set_region.data type="uint8[]"
+
+Texture2D
+  .new_from_data skip=false
+
+Texture.error_quark parent="Cogl.TextureError" name="quark"
+
+RendererError errordomain
+SystemError errordomain
+TextureError errordomain
+FramebufferError errordomain
+ScanoutError errordomain
+
+Onscreen
+  .add_frame_callback unowned
+
+A_BIT parent="Cogl.Bits" name="A"
+BGR_BIT parent="Cogl.Bits" name="BGR"
+AFIRST_BIT parent="Cogl.Bits" name="AFIRST"
+PREMULT_BIT parent="Cogl.Bits" name="PREMULT"
+DEPTH_BIT parent="Cogl.Bits" name="DEPTH"
+STENCIL_BIT parent="Cogl.Bits" name="STENCIL"
+PIXEL_FORMAT_MAX_PLANES parent = "Cogl.PixelFormat" name="MAX_PLANES"
diff --git a/vapi/Meta-16.metadata b/vapi/Meta-16.metadata
new file mode 100644
index 000000000..d4611f11e
--- /dev/null
+++ b/vapi/Meta-16.metadata
@@ -0,0 +1,180 @@
+* skip=false
+*.* skip=false
+* cheader_filename="meta/main.h"
+
+Backend cheader_filename="meta/meta-backend.h"
+Backend.gpu_added skip
+Background cheader_filename="meta/meta-background.h"
+Background.set_file.file nullable
+BackgroundContent.new symbol_type="constructor"
+BackgroundActor cheader_filename="meta/meta-background-actor.h"
+BackgroundContent cheader_filename="meta/meta-background-content.h"
+BackgroundGroup cheader_filename="meta/meta-background-group.h"
+BackgroundImage cheader_filename="meta/meta-background-image.h"
+BackgroundImageCache cheader_filename="meta/meta-background-image.h"
+Barrier cheader_filename="meta/barrier.h"
+BarrierDirection cheader_filename="meta/barrier.h"
+BarrierEvent cheader_filename="meta/barrier.h"
+BarrierFlags cheader_filename="meta/barrier.h"
+ButtonFunction cheader_filename="meta/common.h"
+ButtonLayout cheader_filename="meta/common.h"
+Compositor cheader_filename="meta/compositor.h"
+CompEffect cheader_filename="meta/compositor.h"
+CloseDialog cheader_filename="meta/meta-close-dialog.h"
+CloseDialogResponse cheader_filename="meta/meta-close-dialog.h"
+Context cheader_filename="meta/meta-context.h"
+CompositorType cheader_filename="meta/meta-enums.h"
+Cursor cheader_filename="meta/common.h"
+CursorTracker cheader_filename="meta/meta-cursor-tracker.h"
+CursorTracker.get_pointer.mods out
+DebugControl cheader_filename="meta/meta-debug-control.h"
+DebugTopic cheader_filename="meta/util.h"
+DebugPaintFlag cheader_filename="meta/util.h"
+Direction cheader_filename="meta/common.h"
+Display cheader_filename="meta/display.h"
+Display.focus_window#signal name="do_focus_window"
+DisplayCorner cheader_filename="meta/display.h"
+DisplayDirection cheader_filename="meta/display.h"
+Dnd cheader_filename="meta/meta-dnd.h"
+EdgeType cheader_filename="meta/boxes.h"
+Edge cheader_filename="meta/boxes.h"
+FrameBorders cheader_filename="meta/common.h"
+FrameType cheader_filename="meta/common.h"
+GrabOp cheader_filename="meta/common.h"
+Gravity cheader_filename="meta/common.h"
+Group cheader_filename="meta/meta-x11-types.h"
+IdleMonitor cheader_filename="meta/meta-idle-monitor.h"
+IdleMonitorWatchFunc cheader_filename="meta/meta-idle-monitor.h"
+InhibitShortcutsDialog cheader_filename="meta/meta-inhibit-shortcuts-dialog.h"
+InhibitShortcutsDialogResponse cheader_filename="meta/meta-inhibit-shortcuts-dialog.h"
+KeyboardA11yFlags cheader_filename="meta/meta-enums.h"
+KeyBinding cheader_filename="meta/keybindings.h"
+keybindings_set_custom_handler parent="Meta.KeyBinding" name="set_custom_handler" cheader_filename="meta/keybindings.h"
+KeyBindingAction cheader_filename="meta/prefs.h"
+KeyBindingFlags cheader_filename="meta/prefs.h"
+KeyHandlerFunc cheader_filename="meta/prefs.h"
+KeyHandlerFunc.event type="Clutter.KeyEvent?"
+KeyHandlerFunc.window nullable
+LaunchContext cheader_filename="meta/meta-launch-context.h"
+Laters cheader_filename="meta/types.h"
+LaterType cheader_filename="meta/util.h"
+MaximizeFlags cheader_filename="meta/window.h"
+MultiTexture cheader_filename="meta/meta-multi-texture.h"
+MultiTextureFormat cheader_filename="meta/meta-multi-texture-format.h"
+MonitorManager cheader_filename="meta/meta-monitor-manager.h"
+MonitorSwitchConfigType cheader_filename="meta/meta-monitor-manager.h"
+MotionDirection cheader_filename="meta/common.h"
+Orientation cheader_filename="meta/meta-orientation-manager.h"
+OrientationManager cheader_filename="meta/meta-orientation-manager.h"
+PadDirection cheader_filename="meta/display.h"
+PadFeatureType cheader_filename="meta/display.h"
+Plugin cheader_filename="meta/meta-plugin.h"
+PowerSaveChangeReason cheader_filename="meta/meta-monitor-manager.h"
+Preference cheader_filename="meta/prefs.h"
+PrefsChangedFunc cheader_filename="meta/prefs.h"
+RemoteAccessController cheader_filename="meta/meta-remote-access-controller.h"
+RemoteAccessHandle cheader_filename="meta/meta-remote-access-controller.h"
+Selection cheader_filename="meta/meta-selection.h"
+SelectionSource cheader_filename="meta/meta-selection-source.h"
+SelectionSourceMemory cheader_filename="meta/meta-selection-source-memory.h"
+SelectionType cheader_filename="meta/meta-selection-source.h"
+Settings cheader_filename="meta/meta-settings.h"
+ShapedTexture cheader_filename="meta/meta-shaped-texture.h"
+Side cheader_filename="meta/common.h"
+SizeChange cheader_filename="meta/compositor.h"
+SoundPlayer cheader_filename="meta/meta-sound-player.h"
+StartupNotification cheader_filename="meta/meta-startup-notification.h"
+StartupNotification.changed.object type="Meta.StartupSequence"
+StartupNotification.get_sequences type_arguments="Meta.StartupSequence"
+StartupSequence cheader_filename="meta/meta-startup-notification.h"
+StackLayer cheader_filename="meta/common.h"
+Stage cheader_filename="meta/meta-stage.h"
+Strut cheader_filename="meta/boxes.h"
+TabList cheader_filename="meta/display.h"
+TabShowType cheader_filename="meta/display.h"
+WaylandClient cheader_filename="meta/meta-wayland-client.h"
+WaylandCompositor cheader_filename="meta/meta-wayland-compositor.h"
+Workspace cheader_filename="meta/workspace.h"
+WorkspaceManager cheader_filename="meta/meta-workspace-manager.h"
+Window cheader_filename="meta/window.h"
+Window.focus#signal name="focused"
+Window.suspend_state skip
+Window.main_monitor skip
+WindowActor cheader_filename="meta/meta-window-actor.h"
+WindowClientType cheader_filename="meta/window.h"
+WindowForeachFunc cheader_filename="meta/window.h"
+WindowGroup cheader_filename="meta/meta-window-group.h"
+WindowMenuType cheader_filename="meta/compositor.h"
+WindowType cheader_filename="meta/window.h"
+X11Display cheader_filename="meta/meta-x11-display.h"
+X11Display.add_event_func skip
+X11DisplayEventFunc skip
+X11Display.set_stage_input_region.rects type="X.Xrectangle[]" array_length_idx=1
+
+WaylandSurface.scanout_candidate skip
+WaylandSurface.main_monitor skip
+
+// As per https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2287
+MonitorManager.monitor_privacy_screen_changed skip
+
+prefs_* parent="Meta.Prefs" name="prefs_(.+)" cheader_filename="meta/prefs.h"
+
+g_utf8_strndup skip
+
+preference_to_string cheader_filename="meta/prefs.h"
+frame_type_to_string cheader_filename="meta/util.h"
+topic_to_string parent="Meta.DebugTopic" name="to_string" cheader_filename="meta/util.h"
+
+CURRENT_TIME cheader_filename="meta/common.h"
+PRIORITY_RESIZE cheader_filename="meta/common.h"
+PRIORITY_BEFORE_REDRAW cheader_filename="meta/common.h"
+PRIORITY_REDRAW cheader_filename="meta/common.h"
+PRIORITY_PREFS_NOTIFY cheader_filename="meta/common.h"
+VIRTUAL_CORE_POINTER_ID cheader_filename="meta/common.h"
+VIRTUAL_CORE_KEYBOARD_ID cheader_filename="meta/common.h"
+
+Display.window_visibility_updated
+	.object name="unplaced" type="GLib.List<unowned Meta.Window>"
+	.p0 name="should_show" type="GLib.List<unowned Meta.Window>"
+	.p1 name="should_hide" type="GLib.List<unowned Meta.Window>"
+
+Compositor.get_window_actors type_arguments="Meta.WindowActor"
+
+add_verbose_topic parent="Meta.Util" cheader_filename="meta/util.h"
+bug parent="Meta.Util" cheader_filename="meta/util.h"
+external_binding_name_for_action parent="Meta.Util" cheader_filename="meta/util.h"
+fatal parent="Meta.Util" cheader_filename="meta/util.h"
+is_verbose parent="Meta.Util" cheader_filename="meta/util.h"
+is_wayland_compositor parent="Meta.Util" cheader_filename="meta/util.h"
+pop_no_msg_prefix parent="Meta.Util" cheader_filename="meta/util.h"
+push_no_msg_prefix parent="Meta.Util" cheader_filename="meta/util.h"
+remove_verbose_topic parent="Meta.Util" cheader_filename="meta/util.h"
+unsigned_long_equal parent="Meta.Util" name="ulong_equal" cheader_filename="meta/util.h"
+unsigned_long_equal.v1 type="ulong?"
+unsigned_long_equal.v2 type="ulong?"
+unsigned_long_hash parent="Meta.Util" name="ulong_hash" cheader_filename="meta/util.h"
+unsigned_long_hash.v type="ulong?"
+create_context parent="Meta.Context" name="new" symbol_type="constructor" cheader_filename="meta/meta-context.h"
+
+Plugin.create_close_dialog unowned=false nullable
+Plugin.create_inhibit_shortcuts_dialog unowned=false
+
+BackgroundActor sealed
+BackgroundContent sealed
+BackgroundImage sealed
+BackgroundImageCache sealed
+Background sealed
+Dnd sealed
+IdleMonitor sealed
+LaunchContext sealed
+RemoteAccessController sealed
+SelectionSourceMemory sealed
+Selection sealed
+ShapedTexture sealed
+SoundPlayer sealed
+Stage sealed
+StartupNotification sealed
+WaylandClient sealed
+WindowGroup sealed
+WorkspaceManager sealed
+X11Display sealed
diff --git a/vapi/Mtk-16.metadata b/vapi/Mtk-16.metadata
new file mode 100644
index 000000000..f804d1bc0
--- /dev/null
+++ b/vapi/Mtk-16.metadata
@@ -0,0 +1,6 @@
+Rectangle struct
+RECTANGLE_MAX_STACK_RECTS parent="Mtk.Rectangle" name="MAX_STACK_RECTS"
+REGION_BUILDER_MAX_LEVELS parent="Mtk.RegionBuilder" name="MAX_LEVELS"
+
+MONITOR_ALL_TRANSFORMS parent="Mtk.MonitorTransform" name="ALL"
+MONITOR_N_TRANSFORMS skip
diff --git a/vapi/libmutter-16.deps b/vapi/libmutter-16.deps
new file mode 120000
index 000000000..9616fe3fa
--- /dev/null
+++ b/vapi/libmutter-16.deps
@@ -0,0 +1 @@
+libmutter-15.deps
\ No newline at end of file
diff --git a/vapi/libmutter-16.vapi b/vapi/libmutter-16.vapi
new file mode 120000
index 000000000..18103632d
--- /dev/null
+++ b/vapi/libmutter-16.vapi
@@ -0,0 +1 @@
+libmutter-15.vapi
\ No newline at end of file
diff --git a/vapi/libmutter.vapi b/vapi/libmutter.vapi
index 308c71e91..ddbd35684 100644
--- a/vapi/libmutter.vapi
+++ b/vapi/libmutter.vapi
@@ -113,14 +113,14 @@ namespace Meta {
 		public static void push_no_msg_prefix ();
 		[CCode (cheader_filename = "meta/util.h", cname = "meta_remove_verbose_topic")]
 		public static void remove_verbose_topic (Meta.DebugTopic topic);
-		[CCode (cheader_filename = "meta/util.h", cname = "meta_show_dialog")]
-		public static GLib.Pid show_dialog (string type, string message, string? timeout = null, string? display = null, string? ok_text = null, string? cancel_text = null, string? icon_name = null, int transient_for = 0, GLib.SList<string>? columns = null, GLib.SList<string>? entries = null);
 		[CCode (cheader_filename = "meta/util.h", cname = "meta_unsigned_long_equal")]
 		public static int ulong_equal ([CCode (type = "gconstpointer")] ulong? v1, [CCode (type = "gconstpointer")] ulong? v2);
 		[CCode (cheader_filename = "meta/util.h", cname = "meta_unsigned_long_hash")]
 		public static uint ulong_hash ([CCode (type = "gconstpointer")] ulong? v);
+#if !HAS_MUTTER46
 		[CCode (cheader_filename = "meta/util.h", cname = "meta_warning")]
 		public static void warning (string format, ...);
+#endif
 	}
 	[CCode (cheader_filename = "meta/meta-backend.h", type_id = "meta_backend_get_type ()")]
 	public abstract class Backend : GLib.Object, GLib.Initable {
@@ -132,6 +132,9 @@ namespace Meta {
 		public Meta.BackendCapabilities get_capabilities ();
 		public unowned Meta.Context get_context ();
 		public unowned Meta.IdleMonitor get_core_idle_monitor ();
+#if HAS_MUTTER48
+		public unowned Meta.CursorTracker get_cursor_tracker ();
+#endif
 		public unowned Meta.Dnd get_dnd ();
 		public unowned Meta.MonitorManager get_monitor_manager ();
 #if HAS_MUTTER47
@@ -143,6 +146,9 @@ namespace Meta {
 		public bool is_headless ();
 		public bool is_rendering_hardware_accelerated ();
 		public void lock_layout_group (uint idx);
+#if HAS_MUTTER48
+		public void renderdoc_capture ();
+#endif
 #if HAS_MUTTER46
 		public void set_keymap (string layouts, string variants, string options, string model);
 		public void unfreeze_keyboard (uint32 timestamp);
@@ -156,7 +162,13 @@ namespace Meta {
 		public signal void keymap_layout_group_changed (uint object);
 		public signal void last_device_changed (Clutter.InputDevice object);
 		public signal void lid_is_closed_changed (bool object);
+#if HAS_MUTTER48
+		public signal void pause ();
+#endif
 		public signal void prepare_shutdown ();
+#if HAS_MUTTER48
+		public signal void resume ();
+#endif
 	}
 	[CCode (cheader_filename = "meta/meta-background.h", type_id = "meta_background_get_type ()")]
 	public sealed class Background : GLib.Object {
@@ -294,10 +306,23 @@ namespace Meta {
 	public abstract class Compositor : GLib.Object {
 		[CCode (has_construct_function = false)]
 		protected Compositor ();
+#if HAS_MUTTER48
+		public void disable_unredirect ();
+		public void enable_unredirect ();
+		public unowned Meta.Backend get_backend ();
+#endif
 		public unowned Clutter.Actor get_feedback_group ();
 		public unowned Meta.Laters get_laters ();
+#if HAS_MUTTER48
+		public unowned Clutter.Stage get_stage ();
+		public unowned Clutter.Actor get_top_window_group ();
+		public unowned GLib.List<Meta.WindowActor> get_window_actors ();
+		public unowned Clutter.Actor get_window_group ();
+		public Meta.Backend backend { get; construct; }
+#else
 		[NoAccessorMethod]
 		public Meta.Backend backend { owned get; construct; }
+#endif
 		[NoAccessorMethod]
 		public Meta.Display display { owned get; construct; }
 	}
@@ -352,6 +377,9 @@ namespace Meta {
 		[NoAccessorMethod]
 		public Meta.Backend backend { owned get; construct; }
 		public signal void cursor_changed ();
+#if HAS_MUTTER48
+		public signal void cursor_prefs_changed ();
+#endif
 		public signal void position_invalidated ();
 		public signal void visibility_changed ();
 	}
@@ -374,10 +402,12 @@ namespace Meta {
 		public uint add_keybinding (string name, GLib.Settings settings, Meta.KeyBindingFlags flags, owned Meta.KeyHandlerFunc handler);
 		public void clear_mouse_mode ();
 		public void close (uint32 timestamp);
+#if !HAS_MUTTER48
 		[CCode (cheader_filename = "meta/compositor-mutter.h", cname = "meta_disable_unredirect_for_display")]
 		public void disable_unredirect ();
 		[CCode (cheader_filename = "meta/compositor-mutter.h", cname = "meta_enable_unredirect_for_display")]
 		public void enable_unredirect ();
+#endif
 		public void focus_default_window (uint32 timestamp);
 #if !HAS_MUTTER46
 		[CCode (cheader_filename = "meta/compositor-mutter.h", cname = "meta_focus_stage_window")]
@@ -390,8 +420,10 @@ namespace Meta {
 		public int get_current_monitor ();
 		public uint32 get_current_time ();
 		public uint32 get_current_time_roundtrip ();
+#if !HAS_MUTTER48
 		[CCode (cname = "meta_cursor_tracker_get_for_display")]
 		public unowned Meta.CursorTracker get_cursor_tracker ();
+#endif
 #if !HAS_MUTTER46
 		[CCode (cheader_filename = "meta/compositor-mutter.h", cname = "meta_get_feedback_group_for_display")]
 		public unowned Clutter.Actor get_feedback_group ();
@@ -411,18 +443,22 @@ namespace Meta {
 		public unowned Meta.Selection get_selection ();
 		public void get_size (out int width, out int height);
 		public unowned Meta.SoundPlayer get_sound_player ();
+#if !HAS_MUTTER48
 		[CCode (cheader_filename = "meta/compositor-mutter.h", cname = "meta_get_stage_for_display")]
 		public unowned Clutter.Actor get_stage ();
+#endif
 		public unowned Meta.StartupNotification get_startup_notification ();
 		public unowned Meta.Window get_tab_current (Meta.TabList type, Meta.Workspace workspace);
 		public GLib.List<weak Meta.Window> get_tab_list (Meta.TabList type, Meta.Workspace? workspace);
 		public unowned Meta.Window get_tab_next (Meta.TabList type, Meta.Workspace workspace, Meta.Window? window, bool backward);
+#if !HAS_MUTTER48
 		[CCode (cheader_filename = "meta/compositor-mutter.h", cname = "meta_get_top_window_group_for_display")]
 		public unowned Clutter.Actor get_top_window_group ();
 		[CCode (cheader_filename = "meta/compositor-mutter.h", cname = "meta_get_window_actors")]
 		public unowned GLib.List<Meta.WindowActor> get_window_actors ();
 		[CCode (cheader_filename = "meta/compositor-mutter.h", cname = "meta_get_window_group_for_display")]
 		public unowned Clutter.Actor get_window_group ();
+#endif
 		public unowned Meta.WorkspaceManager get_workspace_manager ();
 		public unowned Meta.X11Display get_x11_display ();
 		public uint grab_accelerator (string accelerator, Meta.KeyBindingFlags flags);
@@ -575,8 +611,10 @@ namespace Meta {
 		public void switch_config (Meta.MonitorSwitchConfigType config_type);
 		[NoAccessorMethod]
 		public Meta.Backend backend { owned get; construct; }
+#if !HAS_MUTTER48
 		[NoAccessorMethod]
 		public string experimental_hdr { owned get; set; }
+#endif
 		[NoAccessorMethod]
 		public bool has_builtin_panel { get; }
 		[NoAccessorMethod]
@@ -627,7 +665,9 @@ namespace Meta {
 		public virtual void destroy (Meta.WindowActor actor);
 		public void destroy_completed (Meta.WindowActor actor);
 		public unowned Meta.Display get_display ();
+#if !HAS_MUTTER48
 		public unowned Meta.PluginInfo? get_info ();
+#endif
 		[NoWrapper]
 		public virtual void hide_tile_preview ();
 		[NoWrapper]
@@ -645,8 +685,10 @@ namespace Meta {
 		[NoWrapper]
 		public virtual void minimize (Meta.WindowActor actor);
 		public void minimize_completed (Meta.WindowActor actor);
+#if !HAS_MUTTER48
 		[NoWrapper]
 		public virtual unowned Meta.PluginInfo? plugin_info ();
+#endif
 		[NoWrapper]
 		public virtual void show_tile_preview (Meta.Window window, Mtk.Rectangle tile_rect, int tile_monitor_number);
 		[NoWrapper]
@@ -669,6 +711,10 @@ namespace Meta {
 #if !HAS_MUTTER46
 		[NoWrapper]
 		public virtual bool xevent_filter ([CCode (type = "XEvent*")] ref X.Event event);
+#endif
+#if HAS_MUTTER48
+		[NoWrapper]
+		public virtual bool xevent_filter (X.Event event);
 #endif
 	}
 	[CCode (cheader_filename = "meta/meta-remote-access-controller.h", type_id = "meta_remote_access_controller_get_type ()")]
@@ -884,6 +930,9 @@ namespace Meta {
 		public void foreach_transient (Meta.WindowForeachFunc func);
 		public Mtk.Rectangle frame_rect_to_client_rect (Mtk.Rectangle frame_rect);
 		public Mtk.Rectangle get_buffer_rect ();
+#if HAS_MUTTER48
+		public Mtk.Rectangle get_client_content_rect ();
+#endif
 #if !HAS_MUTTER46
 		public unowned string? get_client_machine ();
 #endif
@@ -894,10 +943,12 @@ namespace Meta {
 #if !HAS_MUTTER46
 		public unowned Meta.Frame get_frame ();
 #endif
+#if !HAS_MUTTER48
 #if HAS_MUTTER46
 		public unowned Mtk.Region? get_frame_bounds ();
 #else
 		public unowned Cairo.Region? get_frame_bounds ();
+#endif
 #endif
 		public Mtk.Rectangle get_frame_rect ();
 		public Meta.FrameType get_frame_type ();
@@ -990,7 +1041,9 @@ namespace Meta {
 		public Mtk.Rectangle stage_to_protocol_rect (Mtk.Rectangle stage_rect);
 #endif
 		public void stick ();
+#if !HAS_MUTTER48
 		public bool titlebar_is_onscreen ();
+#endif
 		public void unmake_above ();
 		public void unmake_fullscreen ();
 		public void unmaximize (Meta.MaximizeFlags directions);
@@ -1055,7 +1108,10 @@ namespace Meta {
 		public uint user_time { get; }
 		public Meta.WindowType window_type { get; }
 		public string wm_class { get; }
-#if HAS_MUTTER46 && !HAS_MUTTER47
+#if HAS_MUTTER48
+		public signal void configure (Meta.WindowConfig window_config);
+#endif
+#if !HAS_MUTTER48
 		public ulong xwindow { get; construct; }
 #endif
 		[CCode (cname = "focus")]
@@ -1091,6 +1147,24 @@ namespace Meta {
 		public signal void first_frame ();
 		public signal void thawed ();
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "meta/main.h", type_id = "meta_window_config_get_type ()")]
+	public sealed class WindowConfig : GLib.Object {
+		[CCode (has_construct_function = false)]
+		public WindowConfig ();
+		public bool get_is_fullscreen ();
+		public bool get_is_initial ();
+		public void get_position (int x, int y);
+		public Mtk.Rectangle? get_rect ();
+		public void get_size (int width, int height);
+		public void set_is_fullscreen (bool is_fullscreen);
+		public void set_position (int x, int y);
+		public void set_rect (Mtk.Rectangle rect);
+		public void set_size (int width, int height);
+		public bool is_fullscreen { get; set; }
+		public Mtk.Rectangle rect { owned get; set; }
+	}
+#endif
 	[CCode (cheader_filename = "meta/meta-window-group.h", type_id = "meta_window_group_get_type ()")]
 #if HAS_MUTTER46
 	public sealed class WindowGroup : Clutter.Actor, Atk.Implementor, Clutter.Animatable {
@@ -1191,7 +1265,9 @@ namespace Meta {
 #endif
 		public unowned X.Display get_xdisplay ();
 		public X.Window get_xroot ();
+#if !HAS_MUTTER48
 		public unowned Meta.Group lookup_group (X.Window group_leader);
+#endif
 #if HAS_MUTTER46
 		public X.Window lookup_xwindow (Meta.Window window);
 #endif
@@ -1254,6 +1330,7 @@ namespace Meta {
 		public Meta.FrameBorder total;
 		public void clear ();
 	}
+#if !HAS_MUTTER48
 	[CCode (cheader_filename = "meta/meta-plugin.h", has_type_id = false)]
 	public struct PluginInfo {
 		public weak string name;
@@ -1262,6 +1339,7 @@ namespace Meta {
 		public weak string license;
 		public weak string description;
 	}
+#endif
 #if !HAS_MUTTER47
 	[CCode (cheader_filename = "meta/meta-shadow-factory.h", has_type_id = false)]
 	public struct ShadowParams {
@@ -1325,16 +1403,57 @@ namespace Meta {
 	}
 	[CCode (cheader_filename = "meta/common.h", cprefix = "META_CURSOR_", type_id = "meta_cursor_get_type ()")]
 	public enum Cursor {
+#if HAS_MUTTER48
+		INVALID,
+#endif
 		NONE,
 		DEFAULT,
+#if HAS_MUTTER48
+		CONTEXT_MENU,
+		HELP,
+		POINTER,
+		PROGRESS,
+		WAIT,
+		CELL,
+		CROSSHAIR,
+		TEXT,
+		VERTICAL_TEXT,
+		ALIAS,
+		COPY,
+		MOVE,
+		NO_DROP,
+		NOT_ALLOWED,
+		GRAB,
+		GRABBING,
+		E_RESIZE,
+		N_RESIZE,
+#else
 		NORTH_RESIZE,
 		SOUTH_RESIZE,
 		WEST_RESIZE,
 		EAST_RESIZE,
 		SE_RESIZE,
 		SW_RESIZE,
+#endif
 		NE_RESIZE,
 		NW_RESIZE,
+#if HAS_MUTTER48
+		S_RESIZE,
+		SE_RESIZE,
+		SW_RESIZE,
+		W_RESIZE,
+		EW_RESIZE,
+		NS_RESIZE,
+		NESW_RESIZE,
+		NWSE_RESIZE,
+		COL_RESIZE,
+		ROW_RESIZE,
+		ALL_SCROLL,
+		ZOOM_IN,
+		ZOOM_OUT,
+		DND_ASK,
+		ALL_RESIZE
+#else
 		MOVE_OR_RESIZE_WINDOW,
 		BUSY,
 		DND_IN_DRAG,
@@ -1346,6 +1465,7 @@ namespace Meta {
 		IBEAM,
 		BLANK,
 		LAST
+#endif
 	}
 	[CCode (cheader_filename = "meta/util.h", cprefix = "META_DEBUG_PAINT_", type_id = "meta_debug_paint_flag_get_type ()")]
 	[Flags]
@@ -1370,14 +1490,20 @@ namespace Meta {
 		WINDOW_OPS,
 		GEOMETRY,
 		PLACEMENT,
+#if HAS_MUTTER48
+		DISPLAY,
+#else
 		PING,
+#endif
 		KEYBINDINGS,
 		SYNC,
 		STARTUP,
 		PREFS,
+#if !HAS_MUTTER48
 		GROUPS,
 		RESIZING,
 		SHAPES,
+#endif
 		EDGE_RESISTANCE,
 		DBUS,
 		INPUT,
@@ -1392,6 +1518,10 @@ namespace Meta {
 #if HAS_MUTTER47
 		KMS_DEADLINE,
 		SESSION_MANAGEMENT,
+#endif
+#if HAS_MUTTER48
+		X11,
+		WORKSPACES,
 #endif
 		RENDER;
 		[CCode (cheader_filename = "meta/util.h", cname = "meta_topic_to_string")]
@@ -1841,13 +1971,21 @@ namespace Meta {
 	[CCode (cheader_filename = "meta/meta-idle-monitor.h", instance_pos = 2.9)]
 	public delegate void IdleMonitorWatchFunc (Meta.IdleMonitor monitor, uint watch_id);
 	[CCode (cheader_filename = "meta/prefs.h", instance_pos = 4.9)]
+#if HAS_MUTTER48
+	public delegate void KeyHandlerFunc (Meta.Display display, Meta.Window? window, [CCode (type = "const ClutterEvent*")] Clutter.KeyEvent? event, Meta.KeyBinding binding);
+#else
 	public delegate void KeyHandlerFunc (Meta.Display display, Meta.Window? window, [CCode (type = "const ClutterKeyEvent*")] Clutter.KeyEvent? event, Meta.KeyBinding binding);
+#endif
 	[CCode (cheader_filename = "meta/prefs.h", instance_pos = 1.9)]
 	public delegate void PrefsChangedFunc (Meta.Preference pref);
 	[CCode (cheader_filename = "meta/window.h", instance_pos = 1.9)]
 	public delegate bool WindowForeachFunc (Meta.Window window);
 	[CCode (cheader_filename = "meta/common.h", cname = "META_CURRENT_TIME")]
 	public const int CURRENT_TIME;
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "meta/main.h", cname = "META_N_ORIENTATIONS")]
+	public const int N_ORIENTATIONS;
+#endif
 	[CCode (cheader_filename = "meta/common.h", cname = "META_PRIORITY_BEFORE_REDRAW")]
 	public const int PRIORITY_BEFORE_REDRAW;
 	[CCode (cheader_filename = "meta/common.h", cname = "META_PRIORITY_PREFS_NOTIFY")]
@@ -1862,8 +2000,10 @@ namespace Meta {
 	public const int VIRTUAL_CORE_POINTER_ID;
 	[CCode (cheader_filename = "meta/main.h")]
 	public static string accelerator_name (Clutter.ModifierType accelerator_mods, uint accelerator_key);
+#if !HAS_MUTTER48
 	[CCode (cheader_filename = "meta/main.h")]
 	public static void add_clutter_debug_flags (Clutter.DebugFlag debug_flags, Clutter.DrawDebugFlag draw_flags, Clutter.PickDebugFlag pick_flags);
+#endif
 	[CCode (cheader_filename = "meta/main.h")]
 	public static void add_debug_paint_flag (Meta.DebugPaintFlag flag);
 #if !HAS_MUTTER46
@@ -1872,8 +2012,10 @@ namespace Meta {
 #endif
 	[CCode (cheader_filename = "meta/main.h")]
 	public static void exit (Meta.ExitCode code);
+#if !HAS_MUTTER48
 	[CCode (cheader_filename = "meta/main.h")]
 	public static void get_clutter_debug_flags (out Clutter.DebugFlag debug_flags, out Clutter.DrawDebugFlag draw_flags, out Clutter.PickDebugFlag pick_flags);
+#endif
 	[CCode (cheader_filename = "meta/main.h")]
 	public static Meta.DebugPaintFlag get_debug_paint_flags ();
 	[CCode (cheader_filename = "meta/main.h")]
@@ -1882,8 +2024,10 @@ namespace Meta {
 	public static bool is_topic_enabled (Meta.DebugTopic topic);
 	[CCode (cheader_filename = "meta/main.h")]
 	public static void log (string format, ...);
+#if !HAS_MUTTER48
 	[CCode (cheader_filename = "meta/main.h")]
 	public static void remove_clutter_debug_flags (Clutter.DebugFlag debug_flags, Clutter.DrawDebugFlag draw_flags, Clutter.PickDebugFlag pick_flags);
+#endif
 	[CCode (cheader_filename = "meta/main.h")]
 	public static void remove_debug_paint_flag (Meta.DebugPaintFlag flag);
 	[CCode (cheader_filename = "meta/main.h")]
diff --git a/vapi/meson.build b/vapi/meson.build
index c2cd463e1..dd3df5a79 100644
--- a/vapi/meson.build
+++ b/vapi/meson.build
@@ -246,7 +246,6 @@ if mutter47_dep.found()
 			'--pkg=pangocairo',
 			'--pkg=x11',
 			vapigen_args,
-			files('Clutter-15-custom.vala')
 		],
 		depends: [ cogl_target, cogl_pango_target, mtk_target ],
 		output: 'mutter-clutter-15.vapi'
@@ -273,3 +272,74 @@ if mutter47_dep.found()
 		output: 'libmutter-15.vapi'
 	)
 endif
+if mutter48_dep.found()
+	mtk_target = custom_target('mutter-mtk-16',
+		command: [
+			vapigen,
+			mutter_typelib_dir / 'Mtk-16.gir',
+			'--library=mutter-mtk-16',
+			'--pkg=gobject-2.0',
+			'--pkg=gio-2.0',
+			'--pkg=cairo',
+			'--pkg=graphene-gobject-1.0',
+			vapigen_args
+		],
+		output: 'mutter-mtk-16.vapi'
+	)
+	cogl_target = custom_target('mutter-cogl-16',
+		command: [
+			vapigen,
+			mutter_typelib_dir / 'Cogl-16.gir',
+			'--library=mutter-cogl-16',
+			'--pkg=mutter-mtk-16',
+			'--pkg=gobject-2.0',
+			'--pkg=gio-2.0',
+			'--pkg=cairo',
+			'--pkg=graphene-gobject-1.0',
+			'--pkg=x11',
+			vapigen_args,
+			files('Cogl-16-custom.vala')
+		],
+		depends: mtk_target,
+		output: 'mutter-cogl-16.vapi'
+	)
+
+	clutter_target = custom_target('mutter-clutter-16',
+		command: [
+			vapigen,
+			mutter_typelib_dir / 'Clutter-16.gir',
+			'--library=mutter-clutter-16',
+			'--pkg=graphene-gobject-1.0',
+			'--pkg=mutter-mtk-16',
+			'--pkg=mutter-cogl-16',
+			'--pkg=atk',
+			'--pkg=gio-2.0',
+			'--pkg=json-glib-1.0',
+			'--pkg=pango',
+			'--pkg=x11',
+			vapigen_args,
+		],
+		depends: [ cogl_target, mtk_target ],
+		output: 'mutter-clutter-16.vapi'
+	)
+
+	libmutter_target = custom_target('libmutter-16',
+		command: [
+			vapigen,
+			mutter_typelib_dir / 'Meta-16.gir',
+			'--library=libmutter-16',
+			'--pkg=graphene-gobject-1.0',
+			'--pkg=mutter-cogl-16',
+			'--pkg=mutter-clutter-16',
+			'--pkg=atk',
+			'--pkg=gio-2.0',
+			'--pkg=json-glib-1.0',
+			'--pkg=pango',
+			'--pkg=x11',
+			'--pkg=xfixes-4.0',
+			vapigen_args
+		],
+		depends: [ cogl_target, clutter_target ],
+		output: 'libmutter-16.vapi'
+	)
+endif
diff --git a/vapi/mutter-clutter-16.deps b/vapi/mutter-clutter-16.deps
new file mode 100644
index 000000000..1393e092d
--- /dev/null
+++ b/vapi/mutter-clutter-16.deps
@@ -0,0 +1,6 @@
+atk
+cairo
+pango
+json-glib-1.0
+mutter-cogl-16
+graphene-gobject-1.0
diff --git a/vapi/mutter-clutter-16.vapi b/vapi/mutter-clutter-16.vapi
new file mode 120000
index 000000000..a15687d85
--- /dev/null
+++ b/vapi/mutter-clutter-16.vapi
@@ -0,0 +1 @@
+mutter-clutter-15.vapi
\ No newline at end of file
diff --git a/vapi/mutter-clutter.vapi b/vapi/mutter-clutter.vapi
index 96c23c520..1bf906631 100644
--- a/vapi/mutter-clutter.vapi
+++ b/vapi/mutter-clutter.vapi
@@ -15,6 +15,12 @@ namespace Clutter {
 		public const uint @0;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_1")]
 		public const uint @1;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_10ChannelsDown")]
+		public const uint @10ChannelsDown;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_10ChannelsUp")]
+		public const uint @10ChannelsUp;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_2")]
 		public const uint @2;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_3")]
@@ -79,6 +85,10 @@ namespace Clutter {
 		public const uint @3270_Setup;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_3270_Test")]
 		public const uint @3270_Test;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_3DMode")]
+		public const uint @3DMode;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_4")]
 		public const uint @4;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_5")]
@@ -95,6 +105,10 @@ namespace Clutter {
 		public const uint A;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AE")]
 		public const uint AE;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_ALSToggle")]
+		public const uint ALSToggle;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Aacute")]
 		public const uint Aacute;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Abelowdot")]
@@ -115,6 +129,10 @@ namespace Clutter {
 		public const uint AccessX_Enable;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AccessX_Feedback_Enable")]
 		public const uint AccessX_Feedback_Enable;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Accessibility")]
+		public const uint Accessibility;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Acircumflex")]
 		public const uint Acircumflex;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Acircumflexacute")]
@@ -129,6 +147,10 @@ namespace Clutter {
 		public const uint Acircumflextilde;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AddFavorite")]
 		public const uint AddFavorite;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Addressbook")]
+		public const uint Addressbook;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Adiaeresis")]
 		public const uint Adiaeresis;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Agrave")]
@@ -143,6 +165,10 @@ namespace Clutter {
 		public const uint Amacron;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Aogonek")]
 		public const uint Aogonek;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AppSelect")]
+		public const uint AppSelect;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_ApplicationLeft")]
 		public const uint ApplicationLeft;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_ApplicationRight")]
@@ -489,12 +515,34 @@ namespace Clutter {
 		public const uint Armenian_za;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Armenian_zhe")]
 		public const uint Armenian_zhe;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AspectRatio")]
+		public const uint AspectRatio;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Assistant")]
+		public const uint Assistant;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Atilde")]
 		public const uint Atilde;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AttendantOff")]
+		public const uint AttendantOff;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AttendantOn")]
+		public const uint AttendantOn;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AttendantToggle")]
+		public const uint AttendantToggle;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AudibleBell_Enable")]
 		public const uint AudibleBell_Enable;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Audio")]
+		public const uint Audio;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AudioCycleTrack")]
 		public const uint AudioCycleTrack;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AudioDesc")]
+		public const uint AudioDesc;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AudioForward")]
 		public const uint AudioForward;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AudioLowerVolume")]
@@ -511,6 +559,10 @@ namespace Clutter {
 		public const uint AudioPause;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AudioPlay")]
 		public const uint AudioPlay;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AudioPreset")]
+		public const uint AudioPreset;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AudioPrev")]
 		public const uint AudioPrev;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AudioRaiseVolume")]
@@ -525,6 +577,10 @@ namespace Clutter {
 		public const uint AudioRewind;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AudioStop")]
 		public const uint AudioStop;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_AutopilotEngageToggle")]
+		public const uint AutopilotEngageToggle;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Away")]
 		public const uint Away;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_B")]
@@ -553,6 +609,16 @@ namespace Clutter {
 		public const uint Break;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_BrightnessAdjust")]
 		public const uint BrightnessAdjust;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_BrightnessAuto")]
+		public const uint BrightnessAuto;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_BrightnessMax")]
+		public const uint BrightnessMax;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_BrightnessMin")]
+		public const uint BrightnessMin;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Buttonconfig")]
+		public const uint Buttonconfig;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Byelorussian_SHORTU")]
 		public const uint Byelorussian_SHORTU;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Byelorussian_shortu")]
@@ -575,6 +641,28 @@ namespace Clutter {
 		public const uint Calculator;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Calendar")]
 		public const uint Calendar;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_CameraAccessDisable")]
+		public const uint CameraAccessDisable;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_CameraAccessEnable")]
+		public const uint CameraAccessEnable;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_CameraAccessToggle")]
+		public const uint CameraAccessToggle;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_CameraDown")]
+		public const uint CameraDown;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_CameraFocus")]
+		public const uint CameraFocus;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_CameraLeft")]
+		public const uint CameraLeft;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_CameraRight")]
+		public const uint CameraRight;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_CameraUp")]
+		public const uint CameraUp;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_CameraZoomIn")]
+		public const uint CameraZoomIn;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_CameraZoomOut")]
+		public const uint CameraZoomOut;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Cancel")]
 		public const uint Cancel;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Caps_Lock")]
@@ -587,10 +675,20 @@ namespace Clutter {
 		public const uint Ccircumflex;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Ch")]
 		public const uint Ch;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_ChannelDown")]
+		public const uint ChannelDown;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_ChannelUp")]
+		public const uint ChannelUp;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Clear")]
 		public const uint Clear;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_ClearGrab")]
 		public const uint ClearGrab;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_ClearvuSonar")]
+		public const uint ClearvuSonar;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Close")]
 		public const uint Close;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Codeinput")]
@@ -599,8 +697,16 @@ namespace Clutter {
 		public const uint ColonSign;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Community")]
 		public const uint Community;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_ContextMenu")]
+		public const uint ContextMenu;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_ContrastAdjust")]
 		public const uint ContrastAdjust;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_ControlPanel")]
+		public const uint ControlPanel;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Control_L")]
 		public const uint Control_L;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Control_R")]
@@ -825,14 +931,36 @@ namespace Clutter {
 		public const uint D;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_DOS")]
 		public const uint DOS;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_DVD")]
+		public const uint DVD;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Dabovedot")]
 		public const uint Dabovedot;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Data")]
+		public const uint Data;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Database")]
+		public const uint Database;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Dcaron")]
 		public const uint Dcaron;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Delete")]
 		public const uint Delete;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Dictate")]
+		public const uint Dictate;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Display")]
 		public const uint Display;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_DisplayOff")]
+		public const uint DisplayOff;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_DisplayToggle")]
+		public const uint DisplayToggle;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_DoNotDisturb")]
+		public const uint DoNotDisturb;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Documents")]
 		public const uint Documents;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_DongSign")]
@@ -841,6 +969,10 @@ namespace Clutter {
 		public const uint Down;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Dstroke")]
 		public const uint Dstroke;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_DualRangeRadar")]
+		public const uint DualRangeRadar;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_E")]
 		public const uint E;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_ENG")]
@@ -873,6 +1005,10 @@ namespace Clutter {
 		public const uint EcuSign;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Ediaeresis")]
 		public const uint Ediaeresis;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Editor")]
+		public const uint Editor;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Egrave")]
 		public const uint Egrave;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Ehook")]
@@ -885,6 +1021,10 @@ namespace Clutter {
 		public const uint Eject;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Emacron")]
 		public const uint Emacron;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_EmojiPicker")]
+		public const uint EmojiPicker;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_End")]
 		public const uint End;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Eogonek")]
@@ -1001,6 +1141,10 @@ namespace Clutter {
 		public const uint Farsi_9;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Farsi_yeh")]
 		public const uint Farsi_yeh;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_FastReverse")]
+		public const uint FastReverse;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Favorites")]
 		public const uint Favorites;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Finance")]
@@ -1009,12 +1153,26 @@ namespace Clutter {
 		public const uint Find;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_First_Virtual_Screen")]
 		public const uint First_Virtual_Screen;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_FishingChart")]
+		public const uint FishingChart;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Fn")]
+		public const uint Fn;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_FnRightShift")]
+		public const uint FnRightShift;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Fn_Esc")]
+		public const uint Fn_Esc;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Forward")]
 		public const uint Forward;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_FrameBack")]
 		public const uint FrameBack;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_FrameForward")]
 		public const uint FrameForward;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_FullScreen")]
+		public const uint FullScreen;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_G")]
 		public const uint G;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Gabovedot")]
@@ -1109,6 +1267,10 @@ namespace Clutter {
 		public const uint Georgian_zhar;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Go")]
 		public const uint Go;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_GraphicsEditor")]
+		public const uint GraphicsEditor;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Greek_ALPHA")]
 		public const uint Greek_ALPHA;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Greek_ALPHAaccent")]
@@ -1475,6 +1637,10 @@ namespace Clutter {
 		public const uint Hangul_YeorinHieuh;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Hangul_switch")]
 		public const uint Hangul_switch;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_HangupPhone")]
+		public const uint HangupPhone;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Hankaku")]
 		public const uint Hankaku;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Hcircumflex")]
@@ -1607,6 +1773,12 @@ namespace Clutter {
 		public const uint Ihook;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Imacron")]
 		public const uint Imacron;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Images")]
+		public const uint Images;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Info")]
+		public const uint Info;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Insert")]
 		public const uint Insert;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Iogonek")]
@@ -1617,6 +1789,10 @@ namespace Clutter {
 		public const uint J;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Jcircumflex")]
 		public const uint Jcircumflex;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Journal")]
+		public const uint Journal;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_K")]
 		public const uint K;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_KP_0")]
@@ -1707,10 +1883,38 @@ namespace Clutter {
 		public const uint KbdBrightnessDown;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_KbdBrightnessUp")]
 		public const uint KbdBrightnessUp;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_KbdInputAssistAccept")]
+		public const uint KbdInputAssistAccept;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_KbdInputAssistCancel")]
+		public const uint KbdInputAssistCancel;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_KbdInputAssistNext")]
+		public const uint KbdInputAssistNext;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_KbdInputAssistNextgroup")]
+		public const uint KbdInputAssistNextgroup;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_KbdInputAssistPrev")]
+		public const uint KbdInputAssistPrev;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_KbdInputAssistPrevgroup")]
+		public const uint KbdInputAssistPrevgroup;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_KbdLcdMenu1")]
+		public const uint KbdLcdMenu1;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_KbdLcdMenu2")]
+		public const uint KbdLcdMenu2;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_KbdLcdMenu3")]
+		public const uint KbdLcdMenu3;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_KbdLcdMenu4")]
+		public const uint KbdLcdMenu4;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_KbdLcdMenu5")]
+		public const uint KbdLcdMenu5;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_KbdLightOnOff")]
 		public const uint KbdLightOnOff;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Kcedilla")]
 		public const uint Kcedilla;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Keyboard")]
+		public const uint Keyboard;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Korean_Won")]
 		public const uint Korean_Won;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_L")]
@@ -1779,8 +1983,18 @@ namespace Clutter {
 		public const uint Lcedilla;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Left")]
 		public const uint Left;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_LeftDown")]
+		public const uint LeftDown;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_LeftUp")]
+		public const uint LeftUp;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_LightBulb")]
 		public const uint LightBulb;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_LightsToggle")]
+		public const uint LightsToggle;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Linefeed")]
 		public const uint Linefeed;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_LiraSign")]
@@ -1809,16 +2023,100 @@ namespace Clutter {
 		public const uint Macedonia_gje;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macedonia_kje")]
 		public const uint Macedonia_kje;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro1")]
+		public const uint Macro1;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro10")]
+		public const uint Macro10;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro11")]
+		public const uint Macro11;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro12")]
+		public const uint Macro12;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro13")]
+		public const uint Macro13;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro14")]
+		public const uint Macro14;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro15")]
+		public const uint Macro15;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro16")]
+		public const uint Macro16;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro17")]
+		public const uint Macro17;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro18")]
+		public const uint Macro18;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro19")]
+		public const uint Macro19;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro2")]
+		public const uint Macro2;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro20")]
+		public const uint Macro20;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro21")]
+		public const uint Macro21;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro22")]
+		public const uint Macro22;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro23")]
+		public const uint Macro23;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro24")]
+		public const uint Macro24;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro25")]
+		public const uint Macro25;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro26")]
+		public const uint Macro26;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro27")]
+		public const uint Macro27;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro28")]
+		public const uint Macro28;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro29")]
+		public const uint Macro29;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro3")]
+		public const uint Macro3;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro30")]
+		public const uint Macro30;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro4")]
+		public const uint Macro4;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro5")]
+		public const uint Macro5;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro6")]
+		public const uint Macro6;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro7")]
+		public const uint Macro7;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro8")]
+		public const uint Macro8;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Macro9")]
+		public const uint Macro9;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_MacroPreset1")]
+		public const uint MacroPreset1;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_MacroPreset2")]
+		public const uint MacroPreset2;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_MacroPreset3")]
+		public const uint MacroPreset3;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_MacroPresetCycle")]
+		public const uint MacroPresetCycle;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_MacroRecordStart")]
+		public const uint MacroRecordStart;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_MacroRecordStop")]
+		public const uint MacroRecordStop;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Mae_Koho")]
 		public const uint Mae_Koho;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Mail")]
 		public const uint Mail;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_MailForward")]
 		public const uint MailForward;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_MarkWaypoint")]
+		public const uint MarkWaypoint;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Market")]
 		public const uint Market;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Massyo")]
 		public const uint Massyo;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_MediaRepeat")]
+		public const uint MediaRepeat;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_MediaTopMenu")]
+		public const uint MediaTopMenu;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Meeting")]
 		public const uint Meeting;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Memo")]
@@ -1841,6 +2139,10 @@ namespace Clutter {
 		public const uint ModeLock;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Mode_switch")]
 		public const uint Mode_switch;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_MonBrightnessCycle")]
+		public const uint MonBrightnessCycle;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_MonBrightnessDown")]
 		public const uint MonBrightnessDown;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_MonBrightnessUp")]
@@ -1867,6 +2169,12 @@ namespace Clutter {
 		public const uint Nacute;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_NairaSign")]
 		public const uint NairaSign;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_NavChart")]
+		public const uint NavChart;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_NavInfo")]
+		public const uint NavInfo;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Ncaron")]
 		public const uint Ncaron;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Ncedilla")]
@@ -1879,14 +2187,62 @@ namespace Clutter {
 		public const uint News;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Next")]
 		public const uint Next;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_NextElement")]
+		public const uint NextElement;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_NextFavorite")]
+		public const uint NextFavorite;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Next_VMode")]
 		public const uint Next_VMode;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Next_Virtual_Screen")]
 		public const uint Next_Virtual_Screen;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_NotificationCenter")]
+		public const uint NotificationCenter;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Ntilde")]
 		public const uint Ntilde;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Num_Lock")]
 		public const uint Num_Lock;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Numeric0")]
+		public const uint Numeric0;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Numeric1")]
+		public const uint Numeric1;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Numeric11")]
+		public const uint Numeric11;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Numeric12")]
+		public const uint Numeric12;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Numeric2")]
+		public const uint Numeric2;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Numeric3")]
+		public const uint Numeric3;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Numeric4")]
+		public const uint Numeric4;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Numeric5")]
+		public const uint Numeric5;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Numeric6")]
+		public const uint Numeric6;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Numeric7")]
+		public const uint Numeric7;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Numeric8")]
+		public const uint Numeric8;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Numeric9")]
+		public const uint Numeric9;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_NumericA")]
+		public const uint NumericA;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_NumericB")]
+		public const uint NumericB;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_NumericC")]
+		public const uint NumericC;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_NumericD")]
+		public const uint NumericD;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_NumericPound")]
+		public const uint NumericPound;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_NumericStar")]
+		public const uint NumericStar;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_O")]
 		public const uint O;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_OE")]
@@ -1935,6 +2291,10 @@ namespace Clutter {
 		public const uint Ohorntilde;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Omacron")]
 		public const uint Omacron;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_OnScreenKeyboard")]
+		public const uint OnScreenKeyboard;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Ooblique")]
 		public const uint Ooblique;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Open")]
@@ -1963,10 +2323,18 @@ namespace Clutter {
 		public const uint Paste;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Pause")]
 		public const uint Pause;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_PauseRecord")]
+		public const uint PauseRecord;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_PesetaSign")]
 		public const uint PesetaSign;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Phone")]
 		public const uint Phone;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_PickupPhone")]
+		public const uint PickupPhone;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Pictures")]
 		public const uint Pictures;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Pointer_Accelerate")]
@@ -2033,16 +2401,28 @@ namespace Clutter {
 		public const uint PowerDown;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_PowerOff")]
 		public const uint PowerOff;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Presentation")]
+		public const uint Presentation;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Prev_VMode")]
 		public const uint Prev_VMode;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Prev_Virtual_Screen")]
 		public const uint Prev_Virtual_Screen;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_PreviousCandidate")]
 		public const uint PreviousCandidate;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_PreviousElement")]
+		public const uint PreviousElement;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Print")]
 		public const uint Print;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Prior")]
 		public const uint Prior;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_PrivacyScreenToggle")]
+		public const uint PrivacyScreenToggle;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Q")]
 		public const uint Q;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_R")]
@@ -2077,8 +2457,16 @@ namespace Clutter {
 		public const uint R8;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_R9")]
 		public const uint R9;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_RFKill")]
+		public const uint RFKill;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Racute")]
 		public const uint Racute;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_RadarOverlay")]
+		public const uint RadarOverlay;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Rcaron")]
 		public const uint Rcaron;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Rcedilla")]
@@ -2089,6 +2477,10 @@ namespace Clutter {
 		public const uint Redo;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Refresh")]
 		public const uint Refresh;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_RefreshRateToggle")]
+		public const uint RefreshRateToggle;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Reload")]
 		public const uint Reload;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_RepeatKeys_Enable")]
@@ -2099,6 +2491,12 @@ namespace Clutter {
 		public const uint Return;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Right")]
 		public const uint Right;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_RightDown")]
+		public const uint RightDown;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_RightUp")]
+		public const uint RightUp;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_RockerDown")]
 		public const uint RockerDown;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_RockerEnter")]
@@ -2107,10 +2505,18 @@ namespace Clutter {
 		public const uint RockerUp;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Romaji")]
 		public const uint Romaji;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_RootMenu")]
+		public const uint RootMenu;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_RotateWindows")]
 		public const uint RotateWindows;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_RotationKB")]
 		public const uint RotationKB;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_RotationLockToggle")]
+		public const uint RotationLockToggle;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_RotationPB")]
 		public const uint RotationPB;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_RupeeSign")]
@@ -2133,6 +2539,10 @@ namespace Clutter {
 		public const uint Scircumflex;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_ScreenSaver")]
 		public const uint ScreenSaver;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Screensaver")]
+		public const uint Screensaver;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_ScrollClick")]
 		public const uint ScrollClick;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_ScrollDown")]
@@ -2147,6 +2557,10 @@ namespace Clutter {
 		public const uint Select;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_SelectButton")]
 		public const uint SelectButton;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_SelectiveScreenshot")]
+		public const uint SelectiveScreenshot;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Send")]
 		public const uint Send;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Serbian_DJE")]
@@ -2181,8 +2595,16 @@ namespace Clutter {
 		public const uint Shift_R;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Shop")]
 		public const uint Shop;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_SidevuSonar")]
+		public const uint SidevuSonar;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_SingleCandidate")]
 		public const uint SingleCandidate;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_SingleRangeRadar")]
+		public const uint SingleRangeRadar;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Sinh_a")]
 		public const uint Sinh_a;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Sinh_aa")]
@@ -2347,8 +2769,18 @@ namespace Clutter {
 		public const uint Sleep;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_SlowKeys_Enable")]
 		public const uint SlowKeys_Enable;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_SlowReverse")]
+		public const uint SlowReverse;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Sos")]
+		public const uint Sos;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Spell")]
 		public const uint Spell;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_SpellCheck")]
+		public const uint SpellCheck;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_SplitScreen")]
 		public const uint SplitScreen;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Standby")]
@@ -2359,6 +2791,10 @@ namespace Clutter {
 		public const uint StickyKeys_Enable;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Stop")]
 		public const uint Stop;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_StopRecord")]
+		public const uint StopRecord;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Subtitle")]
 		public const uint Subtitle;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Super_L")]
@@ -2405,6 +2841,10 @@ namespace Clutter {
 		public const uint Tabovedot;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_TaskPane")]
 		public const uint TaskPane;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Taskmanager")]
+		public const uint Taskmanager;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Tcaron")]
 		public const uint Tcaron;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Tcedilla")]
@@ -2599,6 +3039,10 @@ namespace Clutter {
 		public const uint TouchpadToggle;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Touroku")]
 		public const uint Touroku;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_TraditionalSonar")]
+		public const uint TraditionalSonar;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Travel")]
 		public const uint Travel;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Tslash")]
@@ -2669,6 +3113,10 @@ namespace Clutter {
 		public const uint Undo;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Ungrab")]
 		public const uint Ungrab;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Unmute")]
+		public const uint Unmute;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Uogonek")]
 		public const uint Uogonek;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Up")]
@@ -2685,18 +3133,38 @@ namespace Clutter {
 		public const uint Utilde;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_V")]
 		public const uint V;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_VOD")]
+		public const uint VOD;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_VendorHome")]
 		public const uint VendorHome;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Video")]
 		public const uint Video;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_VideoPhone")]
+		public const uint VideoPhone;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_View")]
 		public const uint View;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_VoiceCommand")]
+		public const uint VoiceCommand;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Voicemail")]
+		public const uint Voicemail;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_VoidSymbol")]
 		public const uint VoidSymbol;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_W")]
 		public const uint W;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_WLAN")]
 		public const uint WLAN;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_WPSButton")]
+		public const uint WPSButton;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_WWAN")]
+		public const uint WWAN;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_WWW")]
 		public const uint WWW;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Wacute")]
@@ -2761,6 +3229,10 @@ namespace Clutter {
 		public const uint ZoomIn;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_ZoomOut")]
 		public const uint ZoomOut;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_ZoomReset")]
+		public const uint ZoomReset;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_Zstroke")]
 		public const uint Zstroke;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_a")]
@@ -3441,6 +3913,18 @@ namespace Clutter {
 		public const uint club;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_colon")]
 		public const uint colon;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_combining_acute")]
+		public const uint combining_acute;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_combining_belowdot")]
+		public const uint combining_belowdot;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_combining_grave")]
+		public const uint combining_grave;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_combining_hook")]
+		public const uint combining_hook;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_combining_tilde")]
+		public const uint combining_tilde;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_comma")]
 		public const uint comma;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_containsas")]
@@ -3473,6 +3957,10 @@ namespace Clutter {
 		public const uint dead_I;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_dead_O")]
 		public const uint dead_O;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_dead_SCHWA")]
+		public const uint dead_SCHWA;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_dead_U")]
 		public const uint dead_U;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_dead_a")]
@@ -3533,6 +4021,10 @@ namespace Clutter {
 		public const uint dead_grave;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_dead_greek")]
 		public const uint dead_greek;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_dead_hamza")]
+		public const uint dead_hamza;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_dead_hook")]
 		public const uint dead_hook;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_dead_horn")]
@@ -3557,6 +4049,10 @@ namespace Clutter {
 		public const uint dead_perispomeni;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_dead_psili")]
 		public const uint dead_psili;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_dead_schwa")]
+		public const uint dead_schwa;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_dead_semivoiced_sound")]
 		public const uint dead_semivoiced_sound;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_dead_small_schwa")]
@@ -3745,6 +4241,12 @@ namespace Clutter {
 		public const uint greater;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_greaterthanequal")]
 		public const uint greaterthanequal;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_guillemetleft")]
+		public const uint guillemetleft;
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_guillemetright")]
+		public const uint guillemetright;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_guillemotleft")]
 		public const uint guillemotleft;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_guillemotright")]
@@ -4231,6 +4733,10 @@ namespace Clutter {
 		public const uint opentribulletup;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_ordfeminine")]
 		public const uint ordfeminine;
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_ordmasculine")]
+		public const uint ordmasculine;
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_oslash")]
 		public const uint oslash;
 		[CCode (cheader_filename = "clutter/clutter.h", cname = "CLUTTER_KEY_otilde")]
@@ -4561,6 +5067,7 @@ namespace Clutter {
 		public const uint zstroke;
 	}
 	namespace Threads {
+#if !HAS_MUTTER48
 		namespace Idle {
 			[CCode (cheader_filename = "clutter/clutter.h", cname = "clutter_threads_add_idle")]
 			public static uint add (GLib.SourceFunc func);
@@ -4573,10 +5080,15 @@ namespace Clutter {
 			[CCode (cheader_filename = "clutter/clutter.h", cname = "clutter_threads_add_timeout_full")]
 			public static uint add_full (int priority, uint interval, owned GLib.SourceFunc func);
 		}
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h")]
+#if HAS_MUTTER48
+		public static uint add_repaint_func (Clutter.RepaintFlags flags, owned GLib.SourceFunc func);
+#else
 		public static uint add_repaint_func (owned GLib.SourceFunc func);
 		[CCode (cheader_filename = "clutter/clutter.h")]
 		public static uint add_repaint_func_full (Clutter.RepaintFlags flags, owned GLib.SourceFunc func);
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h")]
 		public static void remove_repaint_func (uint handle_id);
 	}
@@ -4611,8 +5123,10 @@ namespace Clutter {
 		public static void set_shader_int (GLib.Value value, [CCode (array_length_cname = "size", array_length_pos = 1.5)] int[] ints);
 		[CCode (cheader_filename = "clutter/clutter.h")]
 		public static void set_shader_matrix (GLib.Value value, [CCode (array_length_cname = "size", array_length_pos = 1.5)] float[] matrix);
+#if !HAS_MUTTER48
 		[CCode (cheader_filename = "clutter/clutter.h")]
 		public static void set_units (GLib.Value value, Clutter.Units units);
+#endif
 		[CCode (cheader_filename = "clutter/clutter.h")]
 		public static void take_paint_node (GLib.Value value, Clutter.PaintNode? node);
 	}
@@ -4622,7 +5136,7 @@ namespace Clutter {
 		protected Action ();
 		public Clutter.EventPhase get_phase ();
 		[NoWrapper]
-		public virtual bool handle_event (Clutter.Event event);
+		public virtual bool handle_event ([CCode (type = "const ClutterEvent *")] Clutter.Event event);
 #if HAS_MUTTER47
 		[NoWrapper]
 		public virtual bool register_sequence (Clutter.Event event);
@@ -4652,7 +5166,7 @@ namespace Clutter {
 		public void add_effect (Clutter.Effect effect);
 		public void add_effect_with_name (string name, Clutter.Effect effect);
 		public void add_transition (string name, Clutter.Transition transition);
-		public virtual void allocate (Clutter.ActorBox box);
+		public virtual void allocate ([CCode (type = "const ClutterActorBox *")] Clutter.ActorBox box);
 		public void allocate_align_fill (Clutter.ActorBox box, double x_align, double y_align, bool x_fill, bool y_fill);
 		public void allocate_available_size (float x, float y, float available_width, float available_height);
 		public void allocate_preferred_size (float x, float y);
@@ -4669,7 +5183,13 @@ namespace Clutter {
 		public bool contains (Clutter.Actor descendant);
 		public void continue_paint (Clutter.PaintContext paint_context);
 		public void continue_pick (Clutter.PickContext pick_context);
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter-pango.h")]
+#endif
 		public Pango.Context create_pango_context ();
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter-pango.h")]
+#endif
 		public Pango.Layout create_pango_layout (string? text);
 #if HAS_MUTTER46
 		public Clutter.PaintNode create_texture_paint_node (Cogl.Texture texture);
@@ -4745,6 +5265,9 @@ namespace Clutter {
 		[CCode (vfunc_name = "get_paint_volume")]
 		[NoWrapper]
 		public virtual bool get_paint_volume_vfunc (out Clutter.PaintVolume volume);
+#if HAS_MUTTER48
+		[CCode (cheader_filename = "clutter/clutter-pango.h")]
+#endif
 		public unowned Pango.Context get_pango_context ();
 		public unowned Clutter.Actor? get_parent ();
 		public void get_pivot_point (out float pivot_x, out float pivot_y);
@@ -4755,13 +5278,16 @@ namespace Clutter {
 		public virtual void get_preferred_width (float for_height, out float min_width_p, out float natural_width_p);
 		public unowned Clutter.Actor? get_previous_sibling ();
 		public bool get_reactive ();
+#if !HAS_MUTTER48
 		public Graphene.Matrix get_relative_transformation_matrix (Clutter.Actor? ancestor);
+#endif
 		public Clutter.RequestMode get_request_mode ();
 		public float get_resource_scale ();
 		public double get_rotation_angle (Clutter.RotateAxis axis);
 		public void get_scale (out double scale_x, out double scale_y);
 		public double get_scale_z ();
 		public void get_size (out float width, out float height);
+		[CCode (type = "ClutterActor *")]
 		public unowned Clutter.Stage get_stage ();
 		public Clutter.TextDirection get_text_direction ();
 		public Graphene.Matrix get_transform ();
@@ -4786,7 +5312,9 @@ namespace Clutter {
 		public bool has_actions ();
 		public bool has_allocation ();
 		public bool has_constraints ();
+#if !HAS_MUTTER48
 		public bool has_damage ();
+#endif
 		public bool has_effects ();
 		public bool has_key_focus ();
 		public bool has_mapped_clones ();
@@ -4799,7 +5327,9 @@ namespace Clutter {
 		public void insert_child_below (Clutter.Actor child, Clutter.Actor? sibling);
 		public void invalidate_paint_volume ();
 		public void invalidate_transform ();
+#if !HAS_MUTTER48
 		public bool is_effectively_on_stage_view (Clutter.StageView view);
+#endif
 		public bool is_in_clone_paint ();
 		public bool is_mapped ();
 #if HAS_MUTTER47
@@ -4812,7 +5342,9 @@ namespace Clutter {
 		public virtual void map ();
 		public void move_by (float dx, float dy);
 		public bool needs_expand (Clutter.Orientation orientation);
+#if !HAS_MUTTER48
 		public void notify_transform_invalid ();
+#endif
 		public virtual void paint (Clutter.PaintContext paint_context);
 		[NoWrapper]
 #if HAS_MUTTER47
@@ -4824,6 +5356,9 @@ namespace Clutter {
 		public void pick_box (Clutter.PickContext pick_context, Clutter.ActorBox box);
 		public void queue_redraw ();
 		public void queue_redraw_with_clip (Mtk.Rectangle? clip);
+#if HAS_MUTTER48
+		public void remove_accessible_state (Atk.StateType state);
+#endif
 		public void remove_action (Clutter.Action action);
 		public void remove_action_by_name (string name);
 		public void remove_all_children ();
@@ -4855,7 +5390,7 @@ namespace Clutter {
 		public void set_child_transform (Graphene.Matrix? transform);
 		public void set_clip (float xoff, float yoff, float width, float height);
 		public void set_clip_to_allocation (bool clip_set);
-		public void set_color_state (Clutter.ColorState? color_state);
+		public void set_color_state (Clutter.ColorState color_state);
 		public void set_content (Clutter.Content? content);
 		public void set_content_gravity (Clutter.ContentGravity gravity);
 		public void set_content_repeat (Clutter.ContentRepeat repeat);
@@ -4879,6 +5414,9 @@ namespace Clutter {
 		public void set_margin_right (float margin);
 		public void set_margin_top (float margin);
 		public void set_name (string? name);
+#if HAS_MUTTER48
+		public void set_no_layout (bool no_layout);
+#endif
 		public void set_offscreen_redirect (Clutter.OffscreenRedirect redirect);
 		public void set_opacity (uint8 opacity);
 		public void set_opacity_override (int opacity);
@@ -5123,18 +5661,22 @@ namespace Clutter {
 		protected Backend ();
 		public unowned Cogl.Context get_cogl_context ();
 		public unowned Clutter.Seat get_default_seat ();
+#if !HAS_MUTTER48
 		public unowned Cairo.FontOptions get_font_options ();
+#endif
 		public unowned Clutter.InputMethod get_input_method ();
 		public double get_resolution ();
+#if !HAS_MUTTER48
 		public void set_font_options (Cairo.FontOptions options);
+#endif
 		public void set_input_method (Clutter.InputMethod? method);
-		public signal void font_changed ();
-		public signal void resolution_changed ();
-		public signal void settings_changed ();
 #if HAS_MUTTER47
 		[NoAccessorMethod]
 		public Clutter.Context context { owned get; construct; }
 #endif
+		public signal void font_changed ();
+		public signal void resolution_changed ();
+		public signal void settings_changed ();
 	}
 	[CCode (cheader_filename = "clutter/clutter.h", type_id = "clutter_bin_layout_get_type ()")]
 	public class BinLayout : Clutter.LayoutManager {
@@ -5327,28 +5869,51 @@ namespace Clutter {
 	public sealed class ColorState : GLib.Object {
 		[CCode (has_construct_function = false)]
 #if HAS_MUTTER47
+#if HAS_MUTTER48
+		protected ColorState ();
+#else
 		public ColorState (Clutter.Context context, Clutter.Colorspace colorspace, Clutter.TransferFunction transfer_function);
+#endif
 		public void add_pipeline_transform (Clutter.ColorState target_color_state, Cogl.Pipeline pipeline);
+#if HAS_MUTTER48
+		public virtual void do_transform (Clutter.ColorState target_color_state, float input, float output, int n_samples);
+		public virtual bool equals (Clutter.ColorState other_color_state);
+		public virtual Clutter.ColorState get_blending (bool force);
+#else
 		public bool equals (Clutter.ColorState other_color_state);
 		[CCode (has_construct_function = false)]
 		public ColorState.full (Clutter.Context context, Clutter.Colorspace colorspace, Clutter.TransferFunction transfer_function, float min_lum, float max_lum, float ref_lum);
 		public Clutter.ColorState get_blending (bool force);
+#endif
 #else
 		public ColorState (Clutter.Colorspace colorspace);
 #endif
+#if !HAS_MUTTER48
 		public Clutter.Colorspace get_colorspace ();
+#endif
 #if HAS_MUTTER47
 		public uint get_id ();
+#if HAS_MUTTER48
+		[NoWrapper]
+		public virtual void init_color_transform_key (Clutter.ColorState target_color_state, Clutter.ColorTransformKey key);
+		public virtual Clutter.EncodingRequiredFormat required_format ();
+		public virtual string to_string ();
+		public virtual void update_uniforms (Clutter.ColorState target_color_state, Cogl.Pipeline pipeline);
+#else
 		public void get_luminances (float min_lum_out, float max_lum_out, float ref_lum_out);
 		public Clutter.TransferFunction get_transfer_function ();
 		public Clutter.EncodingRequiredFormat required_format ();
 		public string to_string ();
 		public void update_uniforms (Clutter.ColorState target_color_state, Cogl.Pipeline pipeline);
 #endif
+#endif
+#if !HAS_MUTTER48
 		public Clutter.Colorspace colorspace { get; construct; }
+#endif
 #if HAS_MUTTER47
 		[NoAccessorMethod]
 		public Clutter.Context context { owned get; construct; }
+#if !HAS_MUTTER48
 		[NoAccessorMethod]
 		public float max_luminance { get; construct; }
 		[NoAccessorMethod]
@@ -5357,7 +5922,26 @@ namespace Clutter {
 		public float ref_luminance { get; construct; }
 		public Clutter.TransferFunction transfer_function { get; construct; }
 #endif
+#endif
+	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "clutter/clutter.h", type_id = "clutter_color_state_params_get_type ()")]
+	public class ColorStateParams : Clutter.ColorState {
+		[CCode (has_construct_function = false, type = "ClutterColorState*")]
+		public ColorStateParams (Clutter.Context context, Clutter.Colorspace colorspace, Clutter.TransferFunction transfer_function);
+		[CCode (has_construct_function = false, type = "ClutterColorState*")]
+		public ColorStateParams.from_primitives (Clutter.Context context, Clutter.Colorimetry colorimetry, Clutter.EOTF eotf, Clutter.Luminance luminance);
+		[CCode (has_construct_function = false, type = "ClutterColorState*")]
+		public ColorStateParams.full (Clutter.Context context, Clutter.Colorspace colorspace, Clutter.TransferFunction transfer_function, Clutter.Primaries primaries, float gamma_exp, float min_lum, float max_lum, float ref_lum);
+		public unowned Clutter.Colorimetry? get_colorimetry ();
+		public unowned Clutter.EOTF? get_eotf ();
+		public unowned Clutter.Luminance? get_luminance ();
 	}
+	[CCode (cheader_filename = "clutter/clutter.h", has_type_id = false)]
+	[Compact]
+	public class ColorTransformKey {
+	}
+#endif
 	[CCode (cheader_filename = "clutter/clutter.h", type_id = "clutter_colorize_effect_get_type ()")]
 	public class ColorizeEffect : Clutter.OffscreenEffect {
 		[CCode (has_construct_function = false, type = "ClutterEffect*")]
@@ -5610,6 +6194,9 @@ namespace Clutter {
 	public sealed class FrameClock : GLib.Object {
 		[CCode (has_construct_function = false)]
 		protected FrameClock ();
+#if HAS_MUTTER48
+		public void add_future_time (int64 when_us);
+#endif
 		public void add_timeline (Clutter.Timeline timeline);
 		public GLib.StringBuilder get_max_render_time_debug_info ();
 		public float get_refresh_rate ();
@@ -5741,6 +6328,7 @@ namespace Clutter {
 	[Compact]
 	public class IMEvent : Clutter.Event {
 	}
+#if !HAS_MUTTER48
 	[CCode (cheader_filename = "clutter/clutter.h", type_id = "clutter_image_get_type ()")]
 	public class Image : GLib.Object, Clutter.Content {
 		[CCode (has_construct_function = false, type = "ClutterContent*")]
@@ -5750,6 +6338,7 @@ namespace Clutter {
 		public bool set_bytes (GLib.Bytes data, Cogl.PixelFormat pixel_format, uint width, uint height, uint row_stride) throws GLib.Error;
 		public bool set_data ([CCode (array_length = false)] uint8[] data, Cogl.PixelFormat pixel_format, uint width, uint height, uint row_stride) throws GLib.Error;
 	}
+#endif
 	[CCode (cheader_filename = "clutter/clutter.h", type_id = "clutter_input_device_get_type ()")]
 	public class InputDevice : GLib.Object {
 		[CCode (has_construct_function = false)]
@@ -6029,7 +6618,6 @@ namespace Clutter {
 		public virtual Cogl.Handle create_texture (float width, float height);
 #endif
 		public unowned Cogl.Pipeline? get_pipeline ();
-		[Version (deprecated = true, deprecated_since = "1.14")]
 		public bool get_target_size (out float width, out float height);
 #if HAS_MUTTER46
 		public unowned Cogl.Texture get_texture ();
@@ -6078,10 +6666,10 @@ namespace Clutter {
 		public void pop_color_state ();
 #endif
 		public void pop_framebuffer ();
-		public void push_framebuffer (Cogl.Framebuffer framebuffer);
 #if HAS_MUTTER47
 		public void push_color_state (Clutter.ColorState color_state);
 #endif
+		public void push_framebuffer (Cogl.Framebuffer framebuffer);
 		public unowned Clutter.PaintContext @ref ();
 		public void unref ();
 	}
@@ -6099,6 +6687,9 @@ namespace Clutter {
 		public void paint (Clutter.PaintContext paint_context);
 		public unowned Clutter.PaintNode @ref ();
 		public void set_name (string name);
+#if HAS_MUTTER48
+		public void set_static_name (string name);
+#endif
 		public void unref ();
 	}
 	[CCode (cheader_filename = "clutter/clutter.h", type_id = "clutter_pan_action_get_type ()")]
@@ -6223,7 +6814,9 @@ namespace Clutter {
 	[CCode (cheader_filename = "clutter/clutter.h", type_id = "clutter_root_node_get_type ()")]
 	public class RootNode : Clutter.PaintNode {
 		[CCode (has_construct_function = false, type = "ClutterPaintNode*")]
-#if HAS_MUTTER47
+#if HAS_MUTTER48
+		public RootNode (Cogl.Framebuffer framebuffer, Clutter.ColorState color_state, Cogl.Color clear_color, Cogl.BufferBit clear_flags);
+#elif HAS_MUTTER47
 		public RootNode (Cogl.Framebuffer framebuffer, Cogl.Color clear_color, Cogl.BufferBit clear_flags);
 #else
 		public RootNode (Cogl.Framebuffer framebuffer, Clutter.Color clear_color, Cogl.BufferBit clear_flags);
@@ -6262,6 +6855,12 @@ namespace Clutter {
 		public string translation_domain { get; set; }
 	}
 #endif
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "clutter/clutter.h", has_type_id = false)]
+	[Compact]
+	public class ScrollActor {
+	}
+#endif
 #if !HAS_MUTTER47
 	[CCode (cheader_filename = "clutter/clutter.h", type_id = "clutter_scroll_actor_get_type ()")]
 #if HAS_MUTTER46
@@ -6300,6 +6899,9 @@ namespace Clutter {
 		public bool get_touch_mode ();
 		[NoWrapper]
 		public virtual Clutter.GrabState grab (uint32 time);
+#if HAS_MUTTER48
+		[NoWrapper]
+#endif
 		public virtual bool handle_event_post (Clutter.Event event);
 		public void inhibit_unfocus ();
 		[NoWrapper]
@@ -6338,18 +6940,24 @@ namespace Clutter {
 		public int double_click_distance { get; set; }
 		[NoAccessorMethod]
 		public int double_click_time { get; set; }
+#if !HAS_MUTTER48
 		[NoAccessorMethod]
 		public int font_antialias { get; set; }
+#endif
 		[NoAccessorMethod]
 		public int font_dpi { get; set; }
+#if !HAS_MUTTER48
 		[NoAccessorMethod]
 		public string font_hint_style { owned get; set; }
 		[NoAccessorMethod]
 		public int font_hinting { get; set; }
+#endif
 		[NoAccessorMethod]
 		public string font_name { owned get; set; }
+#if !HAS_MUTTER48
 		[NoAccessorMethod]
 		public string font_subpixel_order { owned get; set; }
+#endif
 #if !HAS_MUTTER47
 		[NoAccessorMethod]
 		public uint fontconfig_timestamp { set; }
@@ -6358,8 +6966,10 @@ namespace Clutter {
 		public int long_press_duration { get; set; }
 		[NoAccessorMethod]
 		public uint password_hint_time { get; set; }
+#if !HAS_MUTTER48
 		[NoAccessorMethod]
 		public int unscaled_font_dpi { set; }
+#endif
 	}
 #if !HAS_MUTTER46
 	[CCode (cheader_filename = "clutter/clutter.h", has_type_id = false)]
@@ -6370,7 +6980,11 @@ namespace Clutter {
 	[CCode (cheader_filename = "clutter/clutter.h", type_id = "clutter_shader_effect_get_type ()")]
 	public class ShaderEffect : Clutter.OffscreenEffect {
 		[CCode (has_construct_function = false, type = "ClutterEffect*")]
+#if HAS_MUTTER48
+		public ShaderEffect (Cogl.ShaderType shader_type);
+#else
 		public ShaderEffect (Clutter.ShaderType shader_type);
+#endif
 #if HAS_MUTTER46
 		public unowned Cogl.Program get_program ();
 		public unowned Cogl.Shader get_shader ();
@@ -6383,7 +6997,11 @@ namespace Clutter {
 		public bool set_shader_source (string source);
 		public void set_uniform_value (string name, GLib.Value value);
 		[NoAccessorMethod]
+#if HAS_MUTTER48
+		public Cogl.ShaderType shader_type { construct; }
+#else
 		public Clutter.ShaderType shader_type { construct; }
+#endif
 	}
 	[CCode (cheader_filename = "clutter/clutter.h", type_id = "clutter_shader_float_get_type ()")]
 	public class ShaderFloat {
@@ -6425,18 +7043,24 @@ namespace Clutter {
 #endif
 		[CCode (has_construct_function = false)]
 		protected Stage ();
+#if !HAS_MUTTER48
 		public void capture_view_into (Clutter.StageView view, Mtk.Rectangle rect, uint8 data, int stride);
 		public void clear_stage_views ();
+#endif
 		public void ensure_viewport ();
 		public unowned Clutter.Actor get_actor_at_pos (Clutter.PickMode pick_mode, float x, float y);
 		public bool get_capture_final_size (Mtk.Rectangle rect, out int out_width, out int out_height, out float out_scale);
 		public unowned Clutter.Actor? get_device_actor (Clutter.InputDevice device, Clutter.EventSequence? sequence);
 		public unowned Clutter.Actor? get_event_actor (Clutter.Event event);
+#if !HAS_MUTTER48
 		public int64 get_frame_counter ();
+#endif
 		public unowned Clutter.Actor? get_grab_actor ();
-		public unowned Clutter.Actor get_key_focus ();
+		public unowned Clutter.Actor? get_key_focus ();
 		public Clutter.Perspective get_perspective ();
+#if !HAS_MUTTER48
 		public unowned string get_title ();
+#endif
 		public Clutter.Grab grab (Clutter.Actor actor);
 #if HAS_MUTTER47
 		public Clutter.Grab grab_inactive (Clutter.Actor actor);
@@ -6451,34 +7075,41 @@ namespace Clutter {
 		public bool pointing_input_foreach (Clutter.StageInputForeachFunc func);
 		[CCode (array_length = false)]
 		public uint8[] read_pixels (int x, int y, int width = -1, int height = -1);
+#if !HAS_MUTTER48
 		public void repick_device (Clutter.InputDevice device);
+#endif
 		public void schedule_update ();
 #if HAS_MUTTER47
 		public void set_active (bool is_active);
 #endif
 		public void set_key_focus (Clutter.Actor? actor);
 		public void set_minimum_size (uint width, uint height);
+#if !HAS_MUTTER48
 		public void set_title (string title);
 #if HAS_MUTTER46
 		public void update_device (Clutter.InputDevice device, Clutter.EventSequence sequence, Clutter.InputDevice source_device, Graphene.Point point, uint32 time, Clutter.Actor new_actor, Mtk.Region region, bool emit_crossing);
 #else
 		public void update_device (Clutter.InputDevice device, Clutter.EventSequence sequence, Clutter.InputDevice source_device, Graphene.Point point, uint32 time, Clutter.Actor new_actor, Cairo.Region region, bool emit_crossing);
+#endif
 #endif
 		[NoAccessorMethod]
 		public bool is_grabbed { get; }
 		public Clutter.Actor key_focus { get; set; }
 		public Clutter.Perspective perspective { get; }
+#if !HAS_MUTTER48
 		public string title { get; set; }
 		public virtual signal void activate ();
+#endif
 		public signal void after_paint (Clutter.StageView view, Clutter.Frame frame);
 		public signal void after_update (Clutter.StageView view, Clutter.Frame frame);
 		public virtual signal void before_paint (Clutter.StageView view, Clutter.Frame frame);
 		public signal void before_update (Clutter.StageView view, Clutter.Frame frame);
-#if !HAS_MUTTER47
 		public virtual signal void deactivate ();
-#endif
 		public virtual signal void paint_view (Clutter.StageView view, Cairo.Region redraw_clip, Clutter.Frame frame);
 		public signal void prepare_frame (Clutter.StageView view, Clutter.Frame frame);
+#if HAS_MUTTER48
+		public virtual signal void skipped_paint (Clutter.StageView view, Clutter.Frame frame);
+#endif
 	}
 #if !HAS_MUTTER47
 	[CCode (cheader_filename = "clutter/clutter.h", type_id = "clutter_stage_manager_get_type ()")]
@@ -6498,7 +7129,9 @@ namespace Clutter {
 	public class StageView : GLib.Object {
 		[CCode (has_construct_function = false)]
 		protected StageView ();
+#if !HAS_MUTTER48
 		public void assign_next_scanout (Cogl.Scanout scanout);
+#endif
 		public virtual Clutter.PaintFlag get_default_paint_flags ();
 		public unowned Cogl.Framebuffer get_framebuffer ();
 		public void get_layout (Mtk.Rectangle rect);
@@ -6514,7 +7147,9 @@ namespace Clutter {
 		public Mtk.MonitorTransform get_transform ();
 #endif
 		public bool has_shadowfb ();
+#if !HAS_MUTTER48
 		public void invalidate_offscreen_blit_pipeline ();
+#endif
 		[NoWrapper]
 		public virtual Clutter.Frame new_frame ();
 #if HAS_MUTTER47
@@ -6583,7 +7218,11 @@ namespace Clutter {
 		public TapAction ();
 		public virtual signal void tap (Clutter.Actor actor);
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "clutter/clutter-pango.h", type_id = "clutter_text_get_type ()")]
+#else
 	[CCode (cheader_filename = "clutter/clutter.h", type_id = "clutter_text_get_type ()")]
+#endif
 #if HAS_MUTTER46
 	public class Text : Clutter.Actor, Atk.Implementor, Clutter.Animatable {
 #else
@@ -6759,7 +7398,11 @@ namespace Clutter {
 		public signal void delete_text (int start_pos, int end_pos);
 		public virtual signal void text_changed ();
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "clutter/clutter-pango.h", type_id = "clutter_text_buffer_get_type ()")]
+#else
 	[CCode (cheader_filename = "clutter/clutter.h", type_id = "clutter_text_buffer_get_type ()")]
+#endif
 	public class TextBuffer : GLib.Object {
 		[CCode (has_construct_function = false)]
 		public TextBuffer ();
@@ -6784,7 +7427,11 @@ namespace Clutter {
 		public virtual signal void deleted_text (uint position, uint n_chars);
 		public virtual signal void inserted_text (uint position, string chars, uint n_chars);
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "clutter/clutter-pango.h", type_id = "clutter_text_node_get_type ()")]
+#else
 	[CCode (cheader_filename = "clutter/clutter.h", type_id = "clutter_text_node_get_type ()")]
+#endif
 	public class TextNode : Clutter.PaintNode {
 		[CCode (has_construct_function = false, type = "ClutterPaintNode*")]
 #if HAS_MUTTER47
@@ -6975,6 +7622,7 @@ namespace Clutter {
 		public abstract bool interpolate_value (string property_name, Clutter.Interval interval, double progress, out GLib.Value value);
 		public abstract void set_final_state (string property_name, GLib.Value value);
 	}
+#if !HAS_MUTTER48
 #if HAS_MUTTER46
 	[CCode (cheader_filename = "clutter/clutter.h")]
 #else
@@ -7013,6 +7661,7 @@ namespace Clutter {
 		public virtual signal void child_notify (Clutter.Actor child, GLib.ParamSpec pspec);
 #endif
 	}
+#endif
 	[CCode (cheader_filename = "clutter/clutter.h", type_cname = "ClutterContentInterface", type_id = "clutter_content_get_type ()")]
 	public interface Content : GLib.Object {
 		public abstract bool get_preferred_size (out float width, out float height);
@@ -7069,6 +7718,7 @@ namespace Clutter {
 		public bool prev (out unowned Clutter.Actor? child);
 		public void remove ();
 	}
+#if !HAS_MUTTER48
 	[CCode (cheader_filename = "clutter/clutter.h", has_copy_function = false, has_destroy_function = false, has_type_id = false)]
 	public struct Capture {
 #if !HAS_MUTTER46
@@ -7076,6 +7726,29 @@ namespace Clutter {
 		public Mtk.Rectangle rect;
 #endif
 	}
+#endif
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "clutter/clutter.h", has_type_id = false)]
+	public struct Colorimetry {
+		public Clutter.ColorimetryType type;
+		public Clutter.Colorspace colorspace;
+		public Clutter.Primaries primaries;
+	}
+	[CCode (cheader_filename = "clutter/clutter.h", has_type_id = false)]
+	public struct EOTF {
+		public Clutter.EOTFType type;
+		public Clutter.TransferFunction tf_name;
+		public float gamma_exp;
+		public unowned Clutter.Luminance? get_default_luminance ();
+	}
+	[CCode (cheader_filename = "clutter/clutter.h", has_type_id = false)]
+	public struct Luminance {
+		public Clutter.LuminanceType type;
+		public float min;
+		public float max;
+		public float @ref;
+	}
+#endif
 #if !HAS_MUTTER47
 	[CCode (cheader_filename = "clutter/clutter.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "clutter_color_get_type ()")]
 	public struct Color {
@@ -7211,6 +7884,20 @@ namespace Clutter {
 		public int dwell_delay;
 		public int dwell_threshold;
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "clutter/clutter.h", has_type_id = false)]
+	public struct Primaries {
+		public float r_x;
+		public float r_y;
+		public float g_x;
+		public float g_y;
+		public float b_x;
+		public float b_y;
+		public float w_x;
+		public float w_y;
+		public void ensure_normalized_range ();
+	}
+#endif
 #if HAS_MUTTER47
 	[CCode (cheader_filename = "clutter/clutter.h", has_type_id = false)]
 	public struct TextureVertex {
@@ -7222,6 +7909,7 @@ namespace Clutter {
 		public Cogl.Color color;
 	}
 #endif
+#if !HAS_MUTTER48
 #if HAS_MUTTER46
 	[CCode (cheader_filename = "clutter/clutter.h")]
 #else
@@ -7253,6 +7941,7 @@ namespace Clutter {
 		public string to_string ();
 #endif
 	}
+#endif
 	[CCode (cheader_filename = "clutter/clutter.h", cprefix = "CLUTTER_ACTOR_ALIGN_", type_id = "clutter_actor_align_get_type ()")]
 	public enum ActorAlign {
 		FILL,
@@ -7358,6 +8047,13 @@ namespace Clutter {
 		RELEASED,
 		PRESSED
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "clutter/clutter.h", cprefix = "CLUTTER_COLORIMETRY_TYPE_", type_id = "clutter_colorimetry_type_get_type ()")]
+	public enum ColorimetryType {
+		COLORSPACE,
+		PRIMARIES
+	}
+#endif
 	[CCode (cheader_filename = "clutter/clutter.h", cprefix = "CLUTTER_COLORSPACE_", type_id = "clutter_colorspace_get_type ()")]
 	public enum Colorspace {
 #if HAS_MUTTER47
@@ -7366,7 +8062,13 @@ namespace Clutter {
 		UNKNOWN,
 #endif
 		SRGB,
+#if HAS_MUTTER48
+		BT2020,
+		NTSC;
+		public unowned Clutter.Primaries? to_primaries ();
+#else
 		BT2020
+#endif
 	}
 	[CCode (cheader_filename = "clutter/clutter.h", cprefix = "CLUTTER_CONTENT_GRAVITY_", type_id = "clutter_content_gravity_get_type ()")]
 	public enum ContentGravity {
@@ -7390,6 +8092,7 @@ namespace Clutter {
 		Y_AXIS,
 		BOTH
 	}
+#if !HAS_MUTTER48
 #if HAS_MUTTER46
 	[CCode (cheader_filename = "clutter/clutter.h", cprefix = "CLUTTER_CONTEXT_FLAG_", type_id = "clutter_context_flags_get_type ()")]
 	[Flags]
@@ -7397,6 +8100,7 @@ namespace Clutter {
 		NONE,
 		NO_A11Y
 	}
+#endif
 #endif
 	[CCode (cheader_filename = "clutter/clutter.h", cprefix = "CLUTTER_DEBUG_", type_id = "clutter_debug_flag_get_type ()")]
 	[Flags]
@@ -7447,8 +8151,18 @@ namespace Clutter {
 		PAINT_DEFORM_TILES,
 		PAINT_DAMAGE_REGION,
 		DISABLE_DYNAMIC_MAX_RENDER_TIME,
+#if HAS_MUTTER48
+		DISABLE_TRIPLE_BUFFERING,
+#endif
 		PAINT_MAX_RENDER_TIME
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "clutter/clutter.h", cprefix = "CLUTTER_EOTF_TYPE_", type_id = "clutter_eotf_type_get_type ()")]
+	public enum EOTFType {
+		NAMED,
+		GAMMA
+	}
+#endif
 	[CCode (cheader_filename = "clutter/clutter.h", cprefix = "CLUTTER_EFFECT_PAINT_", type_id = "clutter_effect_paint_flags_get_type ()")]
 	[Flags]
 	public enum EffectPaintFlags {
@@ -7472,6 +8186,9 @@ namespace Clutter {
 		FLAG_REPEATED,
 		FLAG_RELATIVE_MOTION,
 		FLAG_POINTER_EMULATED,
+#if HAS_MUTTER48
+		FLAG_A11Y_MODIFIER_FIRST_CLICK,
+#endif
 		FLAG_GRAB_NOTIFY
 	}
 	[CCode (cheader_filename = "clutter/clutter.h", cprefix = "CLUTTER_PHASE_", type_id = "clutter_event_phase_get_type ()")]
@@ -7706,6 +8423,13 @@ namespace Clutter {
 		ACTIVATE,
 		CANCEL
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "clutter/clutter.h", cprefix = "CLUTTER_LUMINANCE_TYPE_", type_id = "clutter_luminance_type_get_type ()")]
+	public enum LuminanceType {
+		DERIVED,
+		EXPLICIT
+	}
+#endif
 	[CCode (cheader_filename = "clutter/clutter.h", cprefix = "CLUTTER_", type_id = "clutter_modifier_type_get_type ()")]
 	[Flags]
 	public enum ModifierType {
@@ -7894,11 +8618,13 @@ namespace Clutter {
 		FINGER,
 		CONTINUOUS
 	}
+#if !HAS_MUTTER48
 	[CCode (cheader_filename = "clutter/clutter.h", cprefix = "CLUTTER_", type_id = "clutter_shader_type_get_type ()")]
 	public enum ShaderType {
 		VERTEX_SHADER,
 		FRAGMENT_SHADER
 	}
+#endif
 	[CCode (cheader_filename = "clutter/clutter.h", cprefix = "CLUTTER_SNAP_EDGE_", type_id = "clutter_snap_edge_get_type ()")]
 	public enum SnapEdge {
 		TOP,
@@ -7993,8 +8719,13 @@ namespace Clutter {
 		DEFAULT,
 		SRGB,
 		PQ,
+#if HAS_MUTTER48
+		BT709,
+		LINEAR
+#else
 		LINEAR;
 		public void get_default_luminances (out float min_lum_out, out float max_lum_out, out float ref_lum_out);
+#endif
 	}
 #endif
 #if !HAS_MUTTER46
@@ -8065,6 +8796,10 @@ namespace Clutter {
 	public static void cairo_clear (Cairo.Context cr);
 	[CCode (cheader_filename = "clutter/clutter.h")]
 	public static void cairo_set_source_color (Cairo.Context cr, Clutter.Color color);
+#endif
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "clutter/clutter.h")]
+	public static void add_debug_flags (Clutter.DebugFlag debug_flags, Clutter.DrawDebugFlag draw_flags, Clutter.PickDebugFlag pick_flags);
 #endif
 	[CCode (cheader_filename = "clutter/clutter.h")]
 	public static void debug_set_max_render_time_constant (int max_render_time_constant_us);
@@ -8081,7 +8816,7 @@ namespace Clutter {
 	[CCode (cheader_filename = "clutter/clutter.h")]
 	public static uint32 get_current_event_time ();
 	[CCode (cheader_filename = "clutter/clutter.h")]
-	public static void get_debug_flags (Clutter.DebugFlag debug_flags, Clutter.DrawDebugFlag draw_flags, Clutter.PickDebugFlag pick_flags);
+	public static void get_debug_flags (out Clutter.DebugFlag debug_flags, out Clutter.DrawDebugFlag draw_flags, out Clutter.PickDebugFlag pick_flags);
 	[CCode (cheader_filename = "clutter/clutter.h")]
 	public static unowned Clutter.Backend get_default_backend ();
 	[CCode (cheader_filename = "clutter/clutter.h")]
@@ -8102,6 +8837,10 @@ namespace Clutter {
 	public static void keyval_convert_case (uint symbol, out uint lower, out uint upper);
 	[CCode (cheader_filename = "clutter/clutter.h")]
 	public static unowned string? keyval_name (uint keyval);
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "clutter/clutter.h")]
+	public static void remove_debug_flags (Clutter.DebugFlag debug_flags, Clutter.DrawDebugFlag draw_flags, Clutter.PickDebugFlag pick_flags);
+#endif
 	[CCode (cheader_filename = "clutter/clutter.h")]
 	public static uint unicode_to_keysym (uint32 wc);
 }
diff --git a/vapi/mutter-cogl-14.vapi b/vapi/mutter-cogl-14.vapi
index f8087bc21..b3b82b5b5 100644
--- a/vapi/mutter-cogl-14.vapi
+++ b/vapi/mutter-cogl-14.vapi
@@ -18,7 +18,7 @@ namespace Cogl {
 		public const int STENCIL;
 	}
 	[CCode (cheader_filename = "cogl/cogl.h", type_id = "cogl_atlas_get_type ()")]
-	public class Atlas : GLib.Object {
+	public sealed class Atlas : GLib.Object {
 		[CCode (has_construct_function = false)]
 		protected Atlas ();
 		public bool reserve_space (uint width, uint height, void* user_data);
@@ -38,7 +38,7 @@ namespace Cogl {
 		public AtlasTexture.with_size (Cogl.Context ctx, int width, int height);
 	}
 	[CCode (cheader_filename = "cogl/cogl.h", type_id = "cogl_attribute_get_type ()")]
-	public class Attribute : GLib.Object {
+	public sealed class Attribute : GLib.Object {
 		[CCode (has_construct_function = false)]
 		public Attribute (Cogl.AttributeBuffer attribute_buffer, string name, size_t stride, size_t offset, int components, Cogl.AttributeType type);
 #if !HAS_MUTTER47
@@ -78,7 +78,7 @@ namespace Cogl {
 		public AttributeBuffer.with_size (Cogl.Context context, size_t bytes);
 	}
 	[CCode (cheader_filename = "cogl/cogl.h", type_id = "cogl_bitmap_get_type ()")]
-	public class Bitmap : GLib.Object {
+	public sealed class Bitmap : GLib.Object {
 		[CCode (has_construct_function = false)]
 		protected Bitmap ();
 		[CCode (has_construct_function = false)]
@@ -113,7 +113,7 @@ namespace Cogl {
 		public Cogl.BufferUpdateHint update_hint { set construct; }
 	}
 	[CCode (cheader_filename = "cogl/cogl.h", type_id = "cogl_context_get_type ()")]
-	public class Context : GLib.Object {
+	public sealed class Context : GLib.Object {
 		[CCode (has_construct_function = false)]
 		public Context (Cogl.Display? display) throws GLib.Error;
 #if HAS_MUTTER47
@@ -129,7 +129,13 @@ namespace Cogl {
 		[CCode (cheader_filename = "cogl/cogl.h", cname = "cogl_get_graphics_reset_status")]
 #endif
 		public Cogl.GraphicsResetStatus get_graphics_reset_status ();
+#if HAS_MUTTER48
+		public int get_latest_sync_fd ();
+#endif
 		public unowned Cogl.Pipeline get_named_pipeline (Cogl.PipelineKey key);
+#if HAS_MUTTER48
+		public unowned Cogl.Indices get_rectangle_indices (int n_rectangles);
+#endif
 		public unowned Cogl.Renderer get_renderer ();
 #if !HAS_MUTTER47
 		[CCode (cheader_filename = "cogl/cogl.h", cname = "cogl_has_feature")]
@@ -143,7 +149,7 @@ namespace Cogl {
 		public int64 timestamp_query_get_time_ns (Cogl.TimestampQuery query);
 	}
 	[CCode (cheader_filename = "cogl/cogl.h", type_id = "cogl_display_get_type ()")]
-	public class Display : GLib.Object {
+	public sealed class Display : GLib.Object {
 		[CCode (has_construct_function = false)]
 #if HAS_MUTTER47
 		public Display (Cogl.Renderer renderer);
@@ -162,11 +168,22 @@ namespace Cogl {
 		[DestroysInstance]
 		public void free ();
 		public int get_bpp ();
+#if HAS_MUTTER48
+		public int get_fd (int plane);
+#else
 		public int get_fd ();
+#endif
 		public unowned Cogl.Framebuffer get_framebuffer ();
 		public int get_height ();
+#if HAS_MUTTER48
+		public uint64 get_modifier ();
+		public int get_n_planes ();
+		public int get_offset (int plane);
+		public int get_stride (int plane);
+#else
 		public int get_offset ();
 		public int get_stride ();
+#endif
 		public int get_width ();
 		public void* mmap () throws GLib.Error;
 		public bool munmap (void* data) throws GLib.Error;
@@ -189,7 +206,7 @@ namespace Cogl {
 	public class FrameClosure {
 	}
 	[CCode (cheader_filename = "cogl/cogl.h", type_id = "cogl_frame_info_get_type ()")]
-	public class FrameInfo : GLib.Object {
+	public sealed class FrameInfo : GLib.Object {
 		[CCode (has_construct_function = false)]
 		protected FrameInfo ();
 		public int64 get_frame_counter ();
@@ -215,7 +232,9 @@ namespace Cogl {
 		public unowned Cogl.FenceClosure? add_fence_callback ([CCode (scope = "async")] Cogl.FenceCallback callback);
 #endif
 		public virtual bool allocate () throws GLib.Error;
+#if !HAS_MUTTER48
 		[CCode (cheader_filename = "cogl/cogl.h", cname = "cogl_blit_framebuffer")]
+#endif
 		public bool blit (Cogl.Framebuffer dst, int src_x, int src_y, int dst_x, int dst_y, int width, int height) throws GLib.Error;
 #if !HAS_MUTTER47
 		public void cancel_fence_callback (Cogl.FenceClosure closure);
@@ -319,12 +338,16 @@ namespace Cogl {
 	public class Indices : GLib.Object {
 		[CCode (has_construct_function = false)]
 		public Indices (Cogl.Context context, Cogl.IndicesType type, void* indices_data, int n_indices);
+#if !HAS_MUTTER48
 		[CCode (has_construct_function = false)]
 		public Indices.for_buffer (Cogl.IndicesType type, Cogl.IndexBuffer buffer, size_t offset);
+#endif
 		public unowned Cogl.IndexBuffer get_buffer ();
 		public Cogl.IndicesType get_indices_type ();
+#if !HAS_MUTTER48
 		public size_t get_offset ();
 		public void set_offset (size_t offset);
+#endif
 	}
 	[CCode (cheader_filename = "cogl/cogl.h", ref_function = "cogl_matrix_entry_ref", type_id = "cogl_matrix_entry_get_type ()", unref_function = "cogl_matrix_entry_unref")]
 	[Compact]
@@ -339,7 +362,7 @@ namespace Cogl {
 		public void unref ();
 	}
 	[CCode (cheader_filename = "cogl/cogl.h", type_id = "cogl_matrix_stack_get_type ()")]
-	public class MatrixStack : GLib.Object {
+	public sealed class MatrixStack : GLib.Object {
 		[CCode (has_construct_function = false)]
 		public MatrixStack (Cogl.Context ctx);
 		public void frustum (float left, float right, float bottom, float top, float z_near, float z_far);
@@ -363,7 +386,7 @@ namespace Cogl {
 		public void translate (float x, float y, float z);
 	}
 	[CCode (cheader_filename = "cogl/cogl.h", type_id = "cogl_offscreen_get_type ()")]
-	public class Offscreen : Cogl.Framebuffer {
+	public sealed class Offscreen : Cogl.Framebuffer {
 		[CCode (has_construct_function = false)]
 		protected Offscreen ();
 		public unowned Cogl.Texture get_texture ();
@@ -387,7 +410,12 @@ namespace Cogl {
 #if !HAS_MUTTER47
 		public void hide ();
 #endif
+#if HAS_MUTTER48
+		public virtual bool get_window_handles (out void* device_out, out void* window_out);
+		public virtual void queue_damage_region (Mtk.Region region);
+#else
 		public virtual void queue_damage_region ([CCode (array_length_cname = "n_rectangles", array_length_pos = 1.1)] int[] rectangles);
+#endif
 #if !HAS_MUTTER47
 		public void remove_dirty_callback (Cogl.OnscreenDirtyClosure closure);
 #endif
@@ -396,8 +424,13 @@ namespace Cogl {
 		public void show ();
 #endif
 		public void swap_buffers (Cogl.FrameInfo frame_info, void* user_data);
+#if HAS_MUTTER48
+		public virtual void swap_buffers_with_damage (Mtk.Region region, Cogl.FrameInfo info);
+		public virtual void swap_region (Mtk.Region region, Cogl.FrameInfo info);
+#else
 		public virtual void swap_buffers_with_damage ([CCode (array_length_cname = "n_rectangles", array_length_pos = 1.5)] int[] rectangles, Cogl.FrameInfo info);
 		public virtual void swap_region ([CCode (array_length_cname = "n_rectangles", array_length_pos = 1.5)] int[] rectangles, Cogl.FrameInfo info);
+#endif
 	}
 #if !HAS_MUTTER47
 	[CCode (cheader_filename = "cogl/cogl.h", copy_function = "g_boxed_copy", free_function = "g_boxed_free", type_id = "cogl_onscreen_dirty_closure_get_type ()")]
@@ -445,10 +478,16 @@ namespace Cogl {
 		public Cogl.PipelineWrapMode get_layer_wrap_mode_s (int layer_index);
 		public Cogl.PipelineWrapMode get_layer_wrap_mode_t (int layer_index);
 		public int get_n_layers ();
+#if HAS_MUTTER48
+		public unowned string get_name ();
+#endif
 		public bool get_per_vertex_point_size ();
 		public float get_point_size ();
 		public int get_uniform_location (string uniform_name);
 		public unowned Cogl.Program get_user_program ();
+#if HAS_MUTTER48
+		public bool has_capability (GLib.Quark domain, uint capability);
+#endif
 		public void remove_layer (int layer_index);
 		public void set_alpha_test_function (Cogl.PipelineAlphaFunc alpha_func, float alpha_reference);
 		public bool set_blend (string blend_string) throws GLib.Error;
@@ -486,7 +525,7 @@ namespace Cogl {
 		public PixelBuffer (Cogl.Context context, [CCode (array_length_cname = "size", array_length_pos = 1.5, array_length_type = "gsize")] uint8[] data);
 	}
 	[CCode (cheader_filename = "cogl/cogl.h", type_id = "cogl_primitive_get_type ()")]
-	public class Primitive : GLib.Object {
+	public sealed class Primitive : GLib.Object {
 		[CCode (has_construct_function = false)]
 		public Primitive (Cogl.VerticesMode mode, int n_vertices, ...);
 #if !HAS_MUTTER47
@@ -536,9 +575,10 @@ namespace Cogl {
 		public Primitive.with_attributes (Cogl.VerticesMode mode, int n_vertices, [CCode (array_length_cname = "n_attributes", array_length_pos = 3.1)] Cogl.Attribute[] attributes);
 	}
 	[CCode (cheader_filename = "cogl/cogl.h", type_id = "cogl_program_get_type ()")]
-	public class Program : GLib.Object {
+	public sealed class Program : GLib.Object {
 		[CCode (has_construct_function = false)]
-		protected Program ();
+		[Version (deprecated = true, deprecated_since = "1.16")]
+		public Program ();
 		[Version (deprecated = true, deprecated_since = "1.16")]
 		public void attach_shader (Cogl.Shader shader);
 #if !HAS_MUTTER47
@@ -562,7 +602,7 @@ namespace Cogl {
 		public void set_uniform_matrix (int uniform_location, int dimensions, bool transpose, [CCode (array_length_cname = "count", array_length_pos = 2.5)] float[] value);
 	}
 	[CCode (cheader_filename = "cogl/cogl.h", type_id = "cogl_renderer_get_type ()")]
-	public class Renderer : GLib.Object {
+	public sealed class Renderer : GLib.Object {
 		[CCode (has_construct_function = false)]
 		public Renderer ();
 #if !HAS_MUTTER47
@@ -573,20 +613,29 @@ namespace Cogl {
 		public bool check_onscreen_template (Cogl.OnscreenTemplate onscreen_template) throws GLib.Error;
 #endif
 		public bool connect () throws GLib.Error;
-		public static uint32 error_quark ();
 #if !HAS_MUTTER47
 		public void foreach_output (Cogl.OutputCallback callback);
 #endif
+#if HAS_MUTTER48
+		public Cogl.DriverId get_driver_id ();
+		public uint64 get_implicit_drm_modifier ();
+#else
 		public Cogl.Driver get_driver ();
+#endif
 #if HAS_MUTTER47
 		public void* get_proc_address (string name);
 #endif
 		public Cogl.WinsysID get_winsys_id ();
 		public bool is_dma_buf_supported ();
+#if HAS_MUTTER48
+		public bool is_implicit_drm_modifier (uint64 modifier);
+#endif
 #if !HAS_MUTTER47
 		public void remove_constraint (Cogl.RendererConstraint constraint);
 #endif
+#if !HAS_MUTTER48
 		public void set_driver (Cogl.Driver driver);
+#endif
 #if !HAS_MUTTER47
 		public void set_winsys_id (Cogl.WinsysID winsys_id);
 #endif
@@ -594,18 +643,24 @@ namespace Cogl {
 	[CCode (cheader_filename = "cogl/cogl.h", type_id = "cogl_scanout_get_type ()")]
 	public sealed class Scanout : GLib.Object {
 		[CCode (has_construct_function = false)]
+#if HAS_MUTTER48
+		public Scanout (Cogl.ScanoutBuffer scanout_buffer, Mtk.Rectangle dst_rect);
+#else
 		public Scanout (Cogl.ScanoutBuffer scanout_buffer);
+#endif
 		public bool blit_to_framebuffer (Cogl.Framebuffer framebuffer, int x, int y) throws GLib.Error;
 		public unowned Cogl.ScanoutBuffer get_buffer ();
-		public void get_dst_rect (Mtk.Rectangle rect);
+		public void get_dst_rect (Mtk.Rectangle dst_rect);
 		public void get_src_rect (Graphene.Rect rect);
 		public void notify_failed (Cogl.Onscreen onscreen);
+#if !HAS_MUTTER48
 		public void set_dst_rect (Mtk.Rectangle rect);
+#endif
 		public void set_src_rect (Graphene.Rect rect);
 		public signal void scanout_failed (Cogl.Onscreen object);
 	}
 	[CCode (cheader_filename = "cogl/cogl.h", type_id = "cogl_shader_get_type ()")]
-	public class Shader : GLib.Object {
+	public sealed class Shader : GLib.Object {
 		[CCode (has_construct_function = false)]
 #if HAS_MUTTER47
 		[Version (deprecated = true, deprecated_since = "1.16")]
@@ -622,7 +677,7 @@ namespace Cogl {
 		public void source (string source);
 	}
 	[CCode (cheader_filename = "cogl/cogl.h", type_id = "cogl_snippet_get_type ()")]
-	public class Snippet : GLib.Object {
+	public sealed class Snippet : GLib.Object {
 		[CCode (has_construct_function = false)]
 		public Snippet (Cogl.SnippetHook hook, string? declarations, string? post);
 		public unowned string get_declarations ();
@@ -658,8 +713,12 @@ namespace Cogl {
 		[CCode (has_construct_function = false)]
 		protected Texture ();
 		public bool allocate () throws GLib.Error;
+#if HAS_MUTTER48
+		public void foreach_in_region (float tx_1, float ty_1, float tx_2, float ty_2, Cogl.PipelineWrapMode wrap_s, Cogl.PipelineWrapMode wrap_t, Cogl.TextureForeachCallback callback);
+#else
 		[CCode (cheader_filename = "cogl/cogl.h", cname = "cogl_meta_texture_foreach_in_region")]
 		public void foreach_in_region (float tx_1, float ty_1, float tx_2, float ty_2, Cogl.PipelineWrapMode wrap_s, Cogl.PipelineWrapMode wrap_t, Cogl.MetaTextureCallback callback);
+#endif
 		public Cogl.TextureComponents get_components ();
 #if HAS_MUTTER47
 		public unowned Cogl.Context get_context ();
@@ -670,7 +729,9 @@ namespace Cogl {
 #endif
 		public bool get_gl_texture (out uint out_gl_handle, out uint out_gl_target);
 		public uint get_height ();
+#if !HAS_MUTTER48
 		public int get_max_waste ();
+#endif
 		public bool get_premultiplied ();
 		public uint get_width ();
 		public bool is_get_data_supported ();
@@ -901,7 +962,11 @@ namespace Cogl {
 		DISABLE_MIGRATION
 	}
 #endif
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_ATTRIBUTE_TYPE_", type_id = "cogl_attribute_type_get_type ()")]
+#else
 	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_ATTRIBUTE_TYPE_", has_type_id = false)]
+#endif
 	public enum AttributeType {
 		BYTE,
 		UNSIGNED_BYTE,
@@ -924,7 +989,11 @@ namespace Cogl {
 		INDEX_BUFFER,
 		COUNT
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_BUFFER_BIT_", type_id = "cogl_buffer_bit_get_type ()")]
+#else
 	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_BUFFER_BIT_", has_type_id = false)]
+#endif
 	[Flags]
 	public enum BufferBit {
 		COLOR,
@@ -957,7 +1026,11 @@ namespace Cogl {
 		DYNAMIC,
 		STREAM
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_DEPTH_TEST_FUNCTION_", type_id = "cogl_depth_test_function_get_type ()")]
+#else
 	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_DEPTH_TEST_FUNCTION_", has_type_id = false)]
+#endif
 	public enum DepthTestFunction {
 		NEVER,
 		LESS,
@@ -968,13 +1041,27 @@ namespace Cogl {
 		GEQUAL,
 		ALWAYS
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_DRIVER_ID_", has_type_id = false)]
+	public enum DriverId {
+#else
 	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_DRIVER_", has_type_id = false)]
 	public enum Driver {
+#endif
 		ANY,
 		NOP,
 		GL3,
 		GLES2
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_DRM_MODIFIER_FILTER_", has_type_id = false)]
+	[Flags]
+	public enum DrmModifierFilter {
+		NONE,
+		SINGLE_PLANE,
+		NOT_EXTERNAL_ONLY
+	}
+#endif
 	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_EGL_IMAGE_FLAG_", has_type_id = false)]
 	[Flags]
 	public enum EglImageFlags {
@@ -1012,7 +1099,11 @@ namespace Cogl {
 		[CCode (cname = "COGL_FEATURE_ID_TIMESTAMP_QUERY")]
 		OGL_FEATURE_ID_TIMESTAMP_QUERY
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_FILTER_", type_id = "cogl_filter_return_get_type ()")]
+#else
 	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_FILTER_", has_type_id = false)]
+#endif
 	public enum FilterReturn {
 		CONTINUE,
 		REMOVE
@@ -1030,7 +1121,11 @@ namespace Cogl {
 		UNKNOWN_CONTEXT_RESET,
 		PURGED_CONTEXT_RESET
 	}
+#if HAS_MUTTER48
+    [CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_INDICES_TYPE_UNSIGNED_", type_id = "cogl_indices_type_get_type ()")]
+#else
 	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_INDICES_TYPE_UNSIGNED_", has_type_id = false)]
+#endif
 	public enum IndicesType {
 		BYTE,
 		SHORT,
@@ -1144,11 +1239,15 @@ namespace Cogl {
 		NVAL
 	}
 #endif
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_READ_PIXELS_COLOR_", type_id = "cogl_read_pixels_flags_get_type ()")]
+#else
 	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_READ_PIXELS_COLOR_", has_type_id = false)]
+#endif
 	[Flags]
 	public enum ReadPixelsFlags {
 		[CCode (cname = "COGL_READ_PIXELS_COLOR_BUFFER")]
-		READ_PIXELS_COLOR_BUFFER
+		COLOR_BUFFER
 	}
 #if !HAS_MUTTER47
 	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_RENDERER_CONSTRAINT_USES_", has_type_id = false)]
@@ -1159,7 +1258,11 @@ namespace Cogl {
 		EGL
 	}
 #endif
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_SHADER_TYPE_", type_id = "cogl_shader_type_get_type ()")]
+#else
 	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_SHADER_TYPE_", has_type_id = false)]
+#endif
 	public enum ShaderType {
 		VERTEX,
 		FRAGMENT
@@ -1201,7 +1304,11 @@ namespace Cogl {
 		RGBA,
 		DEPTH
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_VERTICES_MODE_", type_id = "cogl_vertices_mode_get_type ()")]
+#else
 	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_VERTICES_MODE_", has_type_id = false)]
+#endif
 	public enum VerticesMode {
 		POINTS,
 		LINES,
@@ -1211,12 +1318,20 @@ namespace Cogl {
 		TRIANGLE_STRIP,
 		TRIANGLE_FAN
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_WINDING_", type_id = "cogl_winding_get_type ()")]
+#else
 	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_WINDING_", has_type_id = false)]
+#endif
 	public enum Winding {
 		CLOCKWISE,
 		COUNTER_CLOCKWISE
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_WINSYS_FEATURE_", type_id = "cogl_winsys_feature_get_type ()")]
+#else
 	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_WINSYS_FEATURE_", has_type_id = false)]
+#endif
 	public enum WinsysFeature {
 		VBLANK_COUNTER,
 		VBLANK_WAIT,
@@ -1260,18 +1375,29 @@ namespace Cogl {
 		[CCode (cname = "COGL_FRAMEBUFFER_ERROR_ALLOCATE")]
 		FRAMEBUFFER_ERROR_ALLOCATE
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_RENDERER_ERROR_", type_id = "cogl_renderer_error_get_type ()")]
+#else
 	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_RENDERER_ERROR_", has_type_id = false)]
+#endif
 	public errordomain RendererError {
 		XLIB_DISPLAY_OPEN,
 		BAD_CONSTRAINT
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_SCANOUT_ERROR_", type_id = "cogl_scanout_error_get_type ()")]
+#else
 	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_SCANOUT_ERROR_", has_type_id = false)]
+#endif
 	public errordomain ScanoutError {
-		[CCode (cname = "COGL_SCANOUT_ERROR_INHIBITED")]
-		SCANOUT_ERROR_INHIBITED;
+		INHIBITED;
 		public static GLib.Quark quark ();
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_SYSTEM_ERROR_", type_id = "cogl_system_error_get_type ()")]
+#else
 	[CCode (cheader_filename = "cogl/cogl.h", cprefix = "COGL_SYSTEM_ERROR_", has_type_id = false)]
+#endif
 	public errordomain SystemError {
 		UNSUPPORTED,
 		NO_MEMORY
@@ -1296,8 +1422,10 @@ namespace Cogl {
 #endif
 	[CCode (cheader_filename = "cogl/cogl.h", instance_pos = 3.9)]
 	public delegate void FrameCallback (Cogl.Onscreen onscreen, Cogl.FrameEvent event, Cogl.FrameInfo info);
+#if !HAS_MUTTER48
 	[CCode (cheader_filename = "cogl/cogl.h", instance_pos = 3.9)]
 	public delegate void MetaTextureCallback (Cogl.Texture sub_texture, float sub_texture_coords, float meta_coords);
+#endif
 #if !HAS_MUTTER47
 	[CCode (cheader_filename = "cogl/cogl.h", instance_pos = 2.9)]
 	public delegate void OnscreenDirtyCallback (Cogl.Onscreen onscreen, Cogl.OnscreenDirtyInfo info);
@@ -1309,6 +1437,10 @@ namespace Cogl {
 #if !HAS_MUTTER47
 	[CCode (cheader_filename = "cogl/cogl.h", instance_pos = 2.9)]
 	public delegate bool PrimitiveAttributeCallback (Cogl.Primitive primitive, Cogl.Attribute attribute);
+#endif
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "cogl/cogl.h", instance_pos = 3.9)]
+	public delegate void TextureForeachCallback (Cogl.Texture sub_texture, float sub_texture_coords, float meta_coords);
 #endif
 	[CCode (cheader_filename = "cogl/cogl.h", cname = "COGL_TEXTURE_MAX_WASTE")]
 	public const int TEXTURE_MAX_WASTE;
@@ -1319,12 +1451,14 @@ namespace Cogl {
 	[CCode (cheader_filename = "cogl/cogl.h")]
 	[Version (replacement = "Color.init_from_hsl")]
 	public static void color_init_from_hsl (out Cogl.Color color, float hue, float saturation, float luminance);
+#if !HAS_MUTTER48
 	[CCode (cheader_filename = "cogl/cogl.h")]
 	public static void debug_matrix_entry_print (Cogl.MatrixEntry entry);
 	[CCode (cheader_filename = "cogl/cogl.h")]
 	public static void flush ();
 	[CCode (cheader_filename = "cogl/cogl.h")]
 	public static unowned Cogl.Indices get_rectangle_indices (Cogl.Context context, int n_rectangles);
+#endif
 #if HAS_MUTTER47
 	[CCode (cheader_filename = "cogl/cogl.h")]
 	public static GLib.Source glib_source_new (Cogl.Renderer renderer, int priority);
@@ -1335,7 +1469,11 @@ namespace Cogl {
 	public static GLib.Source glib_source_new (Cogl.Context context, int priority);
 #endif
 	[CCode (cheader_filename = "cogl/cogl.h")]
+#if HAS_MUTTER48
+	public static void graphene_matrix_project_points_f3 (Graphene.Matrix matrix, size_t stride_in, void* points_in, size_t stride_out, void* points_out, int n_points);
+#else
 	public static void graphene_matrix_project_point (Graphene.Matrix matrix, ref float x, ref float y, ref float z, ref float w);
+#endif
 	[CCode (cheader_filename = "cogl/cogl.h")]
 	public static void graphene_matrix_project_points (Graphene.Matrix matrix, int n_components, size_t stride_in, void* points_in, size_t stride_out, void* points_out, int n_points);
 	[CCode (cheader_filename = "cogl/cogl.h")]
diff --git a/vapi/mutter-cogl-16.deps b/vapi/mutter-cogl-16.deps
new file mode 100644
index 000000000..fd4bf15b6
--- /dev/null
+++ b/vapi/mutter-cogl-16.deps
@@ -0,0 +1,5 @@
+pango
+glib-2.0
+gio-2.0
+mutter-mtk-16
+x11
diff --git a/vapi/mutter-cogl-16.vapi b/vapi/mutter-cogl-16.vapi
new file mode 120000
index 000000000..f409fd824
--- /dev/null
+++ b/vapi/mutter-cogl-16.vapi
@@ -0,0 +1 @@
+mutter-cogl-15.vapi
\ No newline at end of file
diff --git a/vapi/mutter-mtk-13.vapi b/vapi/mutter-mtk-13.vapi
index 7d51487f7..528605b52 100644
--- a/vapi/mutter-mtk-13.vapi
+++ b/vapi/mutter-mtk-13.vapi
@@ -15,6 +15,9 @@ namespace Mtk {
 		public static Mtk.Region create_rectangles (Mtk.Rectangle rects, int n_rects);
 		public Mtk.Region crop_and_scale (Graphene.Rect src_rect, int dst_width, int dst_height);
 		public bool equal (Mtk.Region other);
+#if HAS_MUTTER48
+		public void get_box (int nth, int x1, int y1, int x2, int y2);
+#endif
 		public Mtk.Rectangle? get_extents ();
 		public Mtk.Rectangle? get_rectangle (int nth);
 		public void intersect (Mtk.Region other);
@@ -44,6 +47,10 @@ namespace Mtk {
 		[CCode (has_construct_function = false, type = "MtkRectangle*")]
 		public Rectangle (int x, int y, int width, int height);
 		public int area ();
+#if HAS_MUTTER48
+		public bool contains_point (int x, int y);
+		public bool contains_pointf (float x, float y);
+#endif
 		public bool contains_rect (Mtk.Rectangle inner_rect);
 		public Mtk.Rectangle? copy ();
 		public bool could_fit_rect (Mtk.Rectangle inner_rect);
@@ -107,7 +114,13 @@ namespace Mtk {
 		FLIPPED_90,
 		FLIPPED_180,
 		FLIPPED_270;
+#if HAS_MUTTER48
+		public static Mtk.MonitorTransform from_string (string name);
+#endif
 		public Mtk.MonitorTransform invert ();
+#if HAS_MUTTER48
+		public unowned string to_string ();
+#endif
 		public Mtk.MonitorTransform transform (Mtk.MonitorTransform other);
 		public void transform_matrix (Graphene.Matrix matrix);
 		public void transform_point (int area_width, int area_height, int point_x, int point_y);
@@ -128,6 +141,10 @@ namespace Mtk {
 		GROW,
 		ROUND
 	}
+#if HAS_MUTTER48
+	[CCode (cheader_filename = "mtk/mtk.h")]
+	public static void compute_viewport_matrix (Graphene.Matrix matrix, int width, int height, float scale, Mtk.MonitorTransform transform, Graphene.Rect src_rect);
+#endif
 	[CCode (cheader_filename = "mtk/mtk.h")]
 	[Version (replacement = "Rectangle.from_graphene_rect")]
 	public static Mtk.Rectangle rectangle_from_graphene_rect (Graphene.Rect rect, Mtk.RoundingStrategy rounding_strategy);
diff --git a/vapi/mutter-mtk-16.vapi b/vapi/mutter-mtk-16.vapi
new file mode 120000
index 000000000..7df39ac72
--- /dev/null
+++ b/vapi/mutter-mtk-16.vapi
@@ -0,0 +1 @@
+mutter-mtk-15.vapi
\ No newline at end of file
