diff --git a/Src/Gtk2/DasherSpi.cpp b/Src/Gtk2/DasherSpi.cpp
index 8517038..5cd460e 100644
--- a/Src/Gtk2/DasherSpi.cpp
+++ b/Src/Gtk2/DasherSpi.cpp
@@ -2,7 +2,9 @@
 
 #ifdef GNOME_A11Y
 
-#include <cspi/spi.h>
+extern "C" {
+	#include <atspi/atspi.h>
+}
 #include <string.h>
 
 enum {
@@ -13,7 +15,7 @@ enum {
 
 bool initSPI() {
   if (status == NOT_INIT) {
-    status = (SPI_init()==2) ? INIT_FAIL : INIT_SUCCESS;
+    status = (atspi_init()==2) ? INIT_FAIL : INIT_SUCCESS;
   }
   return (status==INIT_SUCCESS);
 }
@@ -33,8 +35,9 @@ void sendText(const char *szText) {
   char *szNewText;
   szNewText = new char[strlen(szText) + 1];
   strcpy(szNewText, szText);
-  
-  SPI_generateKeyboardEvent(0, szNewText, SPI_KEY_STRING);
+
+  // The GError argument is currently ignored 
+  atspi_generate_keyboard_event(0, szNewText, ATSPI_KEY_STRING, NULL);
   
   delete[] szNewText;
 #else
diff --git a/Src/Gtk2/Speech.h b/Src/Gtk2/Speech.h
index effbbd0..c8ab714 100644
--- a/Src/Gtk2/Speech.h
+++ b/Src/Gtk2/Speech.h
@@ -11,7 +11,7 @@
 #include <libbonobo.h>
 #endif
 #ifdef HAVE_SPEECHD
-#include <speech-dispatcher/libspeechd.h>
+#include <libspeechd.h>
 #endif
 
 class CSpeech {
diff --git a/Src/Gtk2/dasher_editor_external.cpp b/Src/Gtk2/dasher_editor_external.cpp
index 9e8f5e5..93831d2 100644
--- a/Src/Gtk2/dasher_editor_external.cpp
+++ b/Src/Gtk2/dasher_editor_external.cpp
@@ -6,7 +6,9 @@
 #include <gtk/gtk.h>
 
 #ifdef GNOME_A11Y
-#include <cspi/spi.h>
+extern "C" {
+	#include <atspi/atspi.h>
+}
 #else
 #include <X11/X.h>
 #include <X11/Xlib.h>
@@ -24,11 +26,11 @@
 #include "DasherSpi.h"
 
 #ifdef GNOME_A11Y
-void dasher_editor_external_handle_focus(DasherEditorInternal *pSelf, const AccessibleEvent *pEvent);
-void dasher_editor_external_handle_caret(DasherEditorInternal *pSelf, const AccessibleEvent *pEvent);
+void dasher_editor_external_handle_focus(DasherEditorInternal *pSelf, const AtspiEvent *pEvent);
+void dasher_editor_external_handle_caret(DasherEditorInternal *pSelf, const AtspiEvent *pEvent);
 
-void focus_listener(const AccessibleEvent *pEvent, void *pUserData);
-void caret_listener(const AccessibleEvent *pEvent, void *pUserData);
+void focus_listener(const AtspiEvent *pEvent, void *pUserData);
+void caret_listener(const AtspiEvent *pEvent, void *pUserData);
 #endif
 
 void
@@ -40,14 +42,14 @@ dasher_editor_external_create_buffer(DasherEditor *pSelf) {
   if(!initSPI()) {
     g_message("Could not initialise SPI - accessibility options disabled");
   } else {
-    pPrivate->pFocusListener = SPI_createAccessibleEventListener(focus_listener, pSelf);
-    pPrivate->pCaretListener = SPI_createAccessibleEventListener(caret_listener, pSelf);
+    pPrivate->pFocusListener = atspi_event_listener_new(focus_listener, pSelf, NULL);
+    pPrivate->pCaretListener = atspi_event_listener_new(caret_listener, pSelf, NULL);
     
     // TODO: Need to deregister these on destruction
     
     if(pPrivate->pFocusListener && pPrivate->pCaretListener) {
-      SPI_registerGlobalEventListener(pPrivate->pFocusListener, "focus:");
-      SPI_registerGlobalEventListener(pPrivate->pCaretListener, "object:text-caret-moved");
+      atspi_event_listener_register(pPrivate->pFocusListener, "focus:", NULL);
+      atspi_event_listener_register(pPrivate->pCaretListener, "object:text-caret-moved", NULL);
     } else {
       g_message("Could not obtain an SPI listener");
     }
@@ -67,7 +69,7 @@ dasher_editor_external_delete(DasherEditor *pSelf, int iLength, int iOffset) {
 #ifdef GNOME_A11Y
   if(!initSPI()) return;
 
-  SPI_generateKeyboardEvent(XK_BackSpace, NULL, SPI_KEY_SYM);
+  atspi_generate_keyboard_event(XK_BackSpace, NULL, ATSPI_KEY_SYM, NULL);
 #else
   Display *dpy;
   dpy = gdk_x11_get_default_xdisplay();
@@ -86,7 +88,7 @@ dasher_editor_external_get_context(DasherEditor *pSelf, int iOffset, int iLength
 #ifdef GNOME_A11Y
   DasherEditorInternalPrivate *pPrivate = DASHER_EDITOR_INTERNAL_GET_PRIVATE(pSelf);
   if(pPrivate->pAccessibleText)
-    return AccessibleText_getText(pPrivate->pAccessibleText, iOffset, iOffset + iLength);
+    return atspi_text_get_text(pPrivate->pAccessibleText, iOffset, iOffset + iLength, NULL);
   else
     return "";
 #else
@@ -98,40 +100,45 @@ gint
 dasher_editor_external_get_offset(DasherEditor *pSelf) {
 #ifdef GNOME_A11Y
   DasherEditorInternalPrivate *pPrivate = DASHER_EDITOR_INTERNAL_GET_PRIVATE(pSelf);
+  AtspiRange *range;
+  int ret;
   
   if(!pPrivate->pAccessibleText)
     return 0;
-  if (AccessibleText_getNSelections(pPrivate->pAccessibleText)==0)
-    return AccessibleText_getCaretOffset(pPrivate->pAccessibleText);
-  long int start,end;
-  AccessibleText_getSelection(pPrivate->pAccessibleText, 0, &start, &end);
-  return std::min(start,end);
+  if (atspi_text_get_n_selections(pPrivate->pAccessibleText, NULL)==0)
+    return atspi_text_get_caret_offset(pPrivate->pAccessibleText, NULL);
+
+  range = atspi_text_get_selection(pPrivate->pAccessibleText, 0, NULL);
+  ret = std::min(range->start_offset,range->end_offset);
+  g_free(range);
+
+  return ret;
 #else
   return 0;
 #endif
 }
 
 #ifdef GNOME_A11Y
-void dasher_editor_external_handle_focus(DasherEditorInternal *pSelf, const AccessibleEvent *pEvent) {
+void dasher_editor_external_handle_focus(DasherEditorInternal *pSelf, const AtspiEvent *pEvent) {
   DasherEditorInternalPrivate *pPrivate = DASHER_EDITOR_INTERNAL_GET_PRIVATE(pSelf);
 
   //  g_message("Focus");
   
   if(pPrivate->pAccessibleText) {
-    AccessibleText_unref(pPrivate->pAccessibleText);
+    g_object_unref(pPrivate->pAccessibleText);
     pPrivate->pAccessibleText = 0;
   }
   
-  Accessible *accessible = pEvent->source;
-  Accessible_ref(accessible);
+  AtspiAccessible *accessible = pEvent->source;
+  g_object_ref(accessible);
   
   //  g_message("%s", Accessible_getName(accessible));
   // g_message("%s", Accessible_getRoleName(accessible));
   //g_message("%s", Accessible_getDescription(accessible));
 
-  if(Accessible_isText(accessible) || Accessible_isEditableText(accessible)) {
-    pPrivate->pAccessibleText = Accessible_getText(accessible);
-    AccessibleText_ref(pPrivate->pAccessibleText);
+  if(ATSPI_IS_TEXT(accessible) || ATSPI_IS_EDITABLE_TEXT(accessible)) {
+    pPrivate->pAccessibleText = atspi_accessible_get_text(accessible);
+    g_object_ref(pPrivate->pAccessibleText);
 
 //     g_iExpectedPosition = AccessibleText_getCaretOffset(pPrivate->pAccessibleText);
 //     g_iOldPosition = g_iExpectedPosition;
@@ -147,30 +154,30 @@ void dasher_editor_external_handle_focus(DasherEditorInternal *pSelf, const Acce
 
   }
 
-  Accessible_unref(accessible);
+  g_object_unref(accessible);
 }
 
-void dasher_editor_external_handle_caret(DasherEditorInternal *pSelf, const AccessibleEvent *pEvent) {
+void dasher_editor_external_handle_caret(DasherEditorInternal *pSelf, const AtspiEvent *pEvent) {
   //  g_message("Caret");
  DasherEditorInternalPrivate *pPrivate = DASHER_EDITOR_INTERNAL_GET_PRIVATE(pSelf);
 
  //  g_message("Focus");
   
   if(pPrivate->pAccessibleText) {
-    AccessibleText_unref(pPrivate->pAccessibleText);
+    g_object_unref(pPrivate->pAccessibleText);
     pPrivate->pAccessibleText = 0;
   }
   
-  Accessible *accessible = pEvent->source;
-  Accessible_ref(accessible);
+  AtspiAccessible *accessible = pEvent->source;
+  g_object_ref(accessible);
   
   // g_message("%s", Accessible_getName(accessible));
   //g_message("%s", Accessible_getRoleName(accessible));
   //g_message("%s", Accessible_getDescription(accessible));
 
-  if(Accessible_isText(accessible) || Accessible_isEditableText(accessible)) {
-    pPrivate->pAccessibleText = Accessible_getText(accessible);
-    AccessibleText_ref(pPrivate->pAccessibleText);
+  if(ATSPI_IS_TEXT(accessible) || ATSPI_IS_EDITABLE_TEXT(accessible)) {
+    pPrivate->pAccessibleText = atspi_accessible_get_text(accessible);
+    g_object_ref(pPrivate->pAccessibleText);
 
 //     g_iExpectedPosition = AccessibleText_getCaretOffset(pPrivate->pAccessibleText);
 //     g_iOldPosition = g_iExpectedPosition;
@@ -182,7 +189,7 @@ void dasher_editor_external_handle_caret(DasherEditorInternal *pSelf, const Acce
     g_signal_emit_by_name(G_OBJECT(pSelf), "context_changed", G_OBJECT(pSelf), NULL, NULL);
   }
 
-  Accessible_unref(accessible);
+  g_object_unref(accessible);
 //   Accessible_ref(event->source);
 
 //   AccessibleStateSet *pAStateSet = Accessible_getStateSet(event->source);
@@ -209,11 +216,11 @@ void dasher_editor_external_handle_caret(DasherEditorInternal *pSelf, const Acce
 //   }
 }
 
-void focus_listener(const AccessibleEvent *pEvent, void *pUserData) {
+void focus_listener(const AtspiEvent *pEvent, void *pUserData) {
   dasher_editor_external_handle_focus((DasherEditorInternal *)pUserData, pEvent);
 }
 
-void caret_listener(const AccessibleEvent *pEvent, void *pUserData) {
+void caret_listener(const AtspiEvent *pEvent, void *pUserData) {
   dasher_editor_external_handle_caret((DasherEditorInternal *)pUserData, pEvent);
 }
 
diff --git a/Src/Gtk2/dasher_editor_internal.cpp b/Src/Gtk2/dasher_editor_internal.cpp
index 8d81c6c..d1ebaca 100644
--- a/Src/Gtk2/dasher_editor_internal.cpp
+++ b/Src/Gtk2/dasher_editor_internal.cpp
@@ -10,7 +10,9 @@
 #include <gtk/gtk.h>
 
 #ifdef GNOME_A11Y
-#include <cspi/spi.h>
+extern "C" {
+	#include <atspi/atspi.h>
+}
 #endif
 
 #include "dasher_editor_internal.h"
@@ -42,9 +44,9 @@ struct _DasherEditorInternalPrivate {
 
   // for direct mode:
 #ifdef GNOME_A11Y
-  AccessibleEventListener *pFocusListener;
-  AccessibleEventListener *pCaretListener;
-  AccessibleText *pAccessibleText;
+  AtspiEventListener *pFocusListener;
+  AtspiEventListener *pCaretListener;
+  AtspiText *pAccessibleText;
 #endif
 
   //Paralleling the previous approach in dasher_main, we _don't_ send context_changed
@@ -210,8 +212,8 @@ dasher_editor_internal_finalize(GObject *pObject) {
   DasherEditorInternalPrivate *pPrivate = DASHER_EDITOR_INTERNAL_GET_PRIVATE(pObject);
 
 #ifdef GNOME_A11Y
-  SPI_deregisterGlobalEventListener(pPrivate->pFocusListener, "focus:");
-  SPI_deregisterGlobalEventListener(pPrivate->pCaretListener, "object:text-caret-moved");
+  atspi_event_listener_deregister(pPrivate->pFocusListener, "focus:", NULL);
+  atspi_event_listener_deregister(pPrivate->pCaretListener, "object:text-caret-moved", NULL);
 #endif
 
   if(pPrivate->szFilename)
diff --git a/Src/main.cc b/Src/main.cc
index 1f81354..a8f6114 100644
--- a/Src/main.cc
+++ b/Src/main.cc
@@ -18,7 +18,7 @@
 #endif
 
 // TODO: This shouldn't need to be here
-#if (defined GNOME_SPEECH || defined GNOME_A11Y)
+#if (defined GNOME_SPEECH)
 #include <libbonobo.h>
 #endif
 
@@ -201,7 +201,7 @@ int main(int argc, char *argv[]) {
   osso_context = osso_initialize("dasher", PACKAGE_VERSION, TRUE, NULL);
 #endif
 
-#if (defined GNOME_SPEECH || defined GNOME_A11Y)
+#if (defined GNOME_SPEECH)
   if(!bonobo_is_initialized()) {
     if(!bonobo_init(&argc, argv)) {
       g_error("Can't initialize Bonobo...\n");
diff --git a/configure.ac b/configure.ac
index e7ce44a..a9261a4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -94,7 +94,7 @@ AC_ARG_WITH([gpe],
 
 AC_ARG_ENABLE([a11y],
 	[AS_HELP_STRING([--enable-a11y],
-		[use cspi rather than Xtst for direct entry mode if found])])
+		[use atspi rather than Xtst for direct entry mode if found])])
 
 AC_ARG_ENABLE([japanese],
 	 AS_HELP_STRING([--enable-japanese],[build with support for Japanese Kanji entry (experimental -- default is NO)]),
@@ -269,7 +269,7 @@ AS_IF(
 	[enable_speech=yes; only_warn_if_speech_not_found=yes])
 AS_IF(
 	[test "x$enable_speech" = xspeechdispatcher -o "x$enable_speech" = xyes],
-	[AC_CHECK_HEADER([speech-dispatcher/libspeechd.h],
+	[AC_CHECK_HEADER([libspeechd.h],
 		[AC_CHECK_LIB([speechd], [spd_open],
 			[AC_DEFINE([HAVE_SPEECHD], 1,
 				[speechdispatcher libraries are present])
@@ -308,11 +308,11 @@ AC_SUBST(SPEECH_LIBS)
 
 AS_IF(	[test x"$enable_a11y" != xno],
 	[PKG_CHECK_MODULES([gnome_a11y],
-		[bonobo-activation-2.0 libbonobo-2.0 ORBit-2.0 cspi-1.0 atk],
-		[AC_DEFINE([GNOME_A11Y], 1, [cspi library is present])
+		[atspi-2 atk],
+		[AC_DEFINE([GNOME_A11Y], 1, [atspi library is present])
 		 enable_a11y=yes],
 		[AS_IF([test x"$enable_a11y" = xyes],
-			[AC_MSG_ERROR([cspi requested but not found])])
+			[AC_MSG_ERROR([atspi requested but not found])])
 		 enable_a11y=no])])
 
 AC_PATH_XTRA
