diff --git a/clutter/clutter-behaviour.c b/clutter/clutter-behaviour.c
index b1541acc7..63327cd3c 100644
--- a/clutter/clutter-behaviour.c
+++ b/clutter/clutter-behaviour.c
@@ -71,12 +71,14 @@
 #include "config.h"
 #endif
 
-#include "clutter-main.h"
 #include "clutter-actor.h"
 #include "clutter-behaviour.h"
 #include "clutter-debug.h"
-#include "clutter-private.h"
+#include "clutter-main.h"
 #include "clutter-marshal.h"
+#include "clutter-private.h"
+#include "clutter-scriptable.h"
+#include "clutter-script-private.h"
 
 /**
  * clutter_knot_copy:
@@ -157,9 +159,13 @@ clutter_knot_get_type (void)
   return our_type;
 }
 
-G_DEFINE_ABSTRACT_TYPE (ClutterBehaviour,
-                        clutter_behaviour,
-                        G_TYPE_OBJECT);
+static void clutter_scriptable_iface_init (ClutterScriptableIface *iface);
+
+G_DEFINE_ABSTRACT_TYPE_WITH_CODE (ClutterBehaviour,
+                                  clutter_behaviour,
+                                  G_TYPE_OBJECT,
+                                  G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_SCRIPTABLE,
+                                                         clutter_scriptable_iface_init));
 
 struct _ClutterBehaviourPrivate
 {
@@ -188,6 +194,36 @@ static guint behave_signals[LAST_SIGNAL] = { 0 };
                CLUTTER_TYPE_BEHAVIOUR,             \
                ClutterBehaviourPrivate))
 
+static gboolean
+clutter_behaviour_parse_custom_node (ClutterScriptable *scriptable,
+                                     ClutterScript     *script,
+                                     GValue            *value,
+                                     const gchar       *name,
+                                     JsonNode          *node)
+{
+  if (strncmp (name, "alpha", 5) == 0)
+    {
+      GObject *alpha;
+
+      alpha = _clutter_script_parse_alpha (script, node);
+      if (alpha != NULL)
+        {
+          g_value_init (value, CLUTTER_TYPE_ALPHA);
+          g_value_set_object (value, alpha);
+
+          return TRUE;
+        }
+    }
+
+  return FALSE;
+}
+
+static void
+clutter_scriptable_iface_init (ClutterScriptableIface *iface)
+{
+  iface->parse_custom_node = clutter_behaviour_parse_custom_node;
+}
+
 static void
 clutter_behaviour_dispose (GObject *gobject)
 {
diff --git a/clutter/clutter-script-parser.c b/clutter/clutter-script-parser.c
index 868ad620a..f318208d4 100644
--- a/clutter/clutter-script-parser.c
+++ b/clutter/clutter-script-parser.c
@@ -816,8 +816,8 @@ resolve_alpha_func (const gchar *name)
 }
 
 GObject *
-clutter_script_parse_alpha (ClutterScript *script,
-                            JsonNode      *node)
+_clutter_script_parse_alpha (ClutterScript *script,
+                             JsonNode      *node)
 {
   GObject *retval = NULL;
   JsonObject *object;
@@ -1068,21 +1068,6 @@ clutter_script_parse_node (ClutterScript *script,
 
           if (g_type_is_a (p_type, G_TYPE_OBJECT))
             {
-              /* ClutterAlpha are handled a little bit
-               * differently, since they can be implicit
-               */
-              if (g_type_is_a (p_type, CLUTTER_TYPE_ALPHA))
-                {
-                  GObject *alpha;
-
-                  alpha = clutter_script_parse_alpha (script, node);
-                  if (alpha)
-                    {
-                      g_value_set_object (value, alpha);
-                      return TRUE;
-                    }
-                }
-
               /* default GObject handling: we get the id and
                * retrieve the ObjectInfo for it; since the object
                * definitions are parsed leaf-first we are guaranteed
diff --git a/clutter/clutter-script-private.h b/clutter/clutter-script-private.h
index b60bec713..601a93b73 100644
--- a/clutter/clutter-script-private.h
+++ b/clutter/clutter-script-private.h
@@ -121,8 +121,8 @@ gboolean clutter_script_parse_geometry    (ClutterScript   *script,
 gboolean clutter_script_parse_color       (ClutterScript   *script,
                                            JsonNode        *node,
                                            ClutterColor    *color);
-GObject *clutter_script_parse_alpha       (ClutterScript   *script,
-                                           JsonNode        *node);
+GObject *_clutter_script_parse_alpha       (ClutterScript   *script,
+                                            JsonNode        *node);
 
 void _clutter_script_construct_object (ClutterScript *script,
                                        ObjectInfo    *oinfo);