diff --git a/src/Makefile.am b/src/Makefile.am
index 9bc9157..f7e9831 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -72,6 +72,8 @@ mutter_SOURCES= 				\
 	core/keybindings.c			\
 	core/keybindings-private.h		\
 	core/main.c				\
+	core/a11y.c				\
+	core/a11y.h				\
 	core/mutter-Xatomtype.h		\
 	core/place.c				\
 	core/place.h				\
diff --git a/src/core/a11y.c b/src/core/a11y.c
new file mode 100644
index 0000000..1c78598
--- /dev/null
+++ b/src/core/a11y.c
@@ -0,0 +1,99 @@
+#include <config.h>
+#include <glib-object.h>
+#include <gmodule.h>
+
+#include "a11y.h"
+
+/* FIXME: WARNING: harcoded values */
+#define ATK_BRIDGE_MODULE_DIRECTORY "/opt/gnome2/lib/gtk-2.0/modules"
+#define CALLY_MODULE_DIRECTORY "/opt/gnome2/lib/gtk-2.0/modules"
+
+static gboolean
+_a11y_invoke_module                    (const gchar  *libname,
+                                        const gchar  *dirname,
+                                        gboolean      init);
+static char *
+_a11y_create_accessibility_module_name (const gchar *libname,
+                                        const gchar *dirname);
+
+
+static gboolean
+_a11y_invoke_module (const gchar  *libname,
+                     const gchar  *dirname,
+                     gboolean      init)
+{
+  GModule    *handle;
+  void      (*invoke_fn) (void);
+  const char *method;
+  gboolean    retval = FALSE;
+  gchar      *module_name;
+
+  if (init)
+    method = "gnome_accessibility_module_init";
+  else
+    method = "gnome_accessibility_module_shutdown";
+
+  module_name = _a11y_create_accessibility_module_name (libname, dirname);
+
+  if (!module_name) {
+    g_warning ("Accessibility: failed to find module '%s' which "
+               "is needed to make this application accessible",
+               libname);
+
+  } else if (!(handle = g_module_open (module_name, G_MODULE_BIND_LAZY))) {
+    g_warning ("Accessibility: failed to load module '%s': '%s'",
+               libname, g_module_error ());
+
+  } else if (!g_module_symbol (handle, method, (gpointer *)&invoke_fn)) {
+    g_warning ("Accessibility: error library '%s' does not include "
+               "method '%s' required for accessibility support",
+               libname, method);
+    g_module_close (handle);
+
+  } else {
+    g_debug ("Module %s loaded successfully", libname);
+    retval = TRUE;
+    invoke_fn ();
+  }
+
+  g_free (module_name);
+
+  return retval;
+}
+
+static gchar *
+_a11y_create_accessibility_module_name (const gchar *libname,
+                                        const gchar *dirname)
+{
+  gchar *fname;
+  gchar *retval;
+
+  fname = g_strconcat (libname, "." G_MODULE_SUFFIX, NULL);
+
+  retval = g_strconcat (dirname, G_DIR_SEPARATOR_S, fname, NULL);
+
+  g_free (fname);
+
+  g_debug ("retval = %s", retval);
+
+  return retval;
+}
+
+void
+meta_cally_init (GOptionContext *ctx, int *argc, char ***argv)
+{
+  /* loading the different accessibility modules  */
+  _a11y_invoke_module ("libcally-1.0",
+                       CALLY_MODULE_DIRECTORY,
+                       TRUE);
+
+  /* gail */
+/*   _a11y_invoke_module ("libgail", */
+/*                        ATK_BRIDGE_MODULE_DIRECTORY, */
+/*                        TRUE); */
+
+  /* atk-bridge */
+  _a11y_invoke_module ("libatk-bridge",
+                       ATK_BRIDGE_MODULE_DIRECTORY,
+                       TRUE);
+}
diff --git a/src/core/a11y.h b/src/core/a11y.h
new file mode 100644
index 0000000..94edf7f
--- /dev/null
+++ b/src/core/a11y.h
@@ -0,0 +1,2 @@
+void
+meta_cally_init (GOptionContext *ctx, int *argc, char ***argv);
diff --git a/src/core/main.c b/src/core/main.c
index c074b74..44af8e4 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -77,6 +77,11 @@
 #include "compositor/mutter-plugin-manager.h"
 #endif
 
+#define WITH_CALLY_SUPPORT
+#ifdef WITH_CALLY_SUPPORT
+#include "a11y.h"
+#endif
+
 /**
  * The exit code we'll return to our parent process when we eventually die.
  */
@@ -623,6 +628,10 @@ main (int argc, char **argv)
    */
   meta_clutter_init (ctx, &argc, &argv);
 
+#ifdef WITH_CALLY_SUPPORT
+  meta_cally_init (ctx, &argc, &argv);
+#endif
+
   g_option_context_free (ctx);
 
   /* must be after UI init so we can override GDK handlers */
