diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index d251496..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//    * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//    * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//    * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 6c6730b..0000000
--- a/Makefile
+++ /dev/null
@@ -1,53 +0,0 @@
-# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-CXX ?= g++
-BASE_VER ?= 125070
-PKG_CONFIG ?= pkg-config
-
-PC_DEPS = alsa dbus-1 dbus-glib-1 gobject-2.0 \
-	libchrome-$(BASE_VER) libchromeos-$(BASE_VER)
-PC_CFLAGS := $(shell $(PKG_CONFIG) --cflags $(PC_DEPS))
-PC_LIBS := $(shell $(PKG_CONFIG) --libs $(PC_DEPS))
-
-CXXFLAGS += -Wall -Werror
-CPPFLAGS += -I. $(PC_CFLAGS)
-LDLIBS = -lpico -lresample
-LDLIBS += $(PC_LIBS)
-
-DBUS_SOURCE=speech_synthesizer.xml
-DBUS_SERVER=bindings/server.h
-BINDINGS_DIR=bindings
-
-CC_SRCS = linux/audio_output_alsa.cc linux/threading.cc \
-pico/pico_tts_engine.cc pico/load_pico_voices_static.cc resampler.cc \
-tts_engine.cc tts_service.cc speech_synthesizer_main.cc \
-speech_synthesizer_service.cc interface.cc
-HEADERS = audio_output.h pico/pico_tts_engine.h resampler.h ringbuffer.h \
-threading.h tts_engine.h tts_receiver.h tts_service.h log.h \
-speech_synthesizer_service.h interface.h
-
-all: speech_synthesizer
-
-clean:
-	rm -rf libttspico.so objs/
-
-dirs:
-	mkdir -p objs/pico objs/linux
-
-CC_OBJS = $(CC_SRCS:%.cc=objs/%.o)
-OBJS = $(CC_OBJS)
-
-$(CC_OBJS): objs/%.o: %.cc $(HEADERS) $(DBUS_SERVER) | dirs
-	$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) $< -o $@
-
-speech_synthesizer: $(OBJS)
-	$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
-
-$(BINDINGS_DIR):
-	mkdir -p $(BINDINGS_DIR)
-
-$(DBUS_SERVER): $(DBUS_SOURCE) | $(BINDINGS_DIR)
-	dbus-binding-tool --mode=glib-server \
-	 --prefix=`basename $(DBUS_SOURCE) .xml` $(DBUS_SOURCE) > $(DBUS_SERVER)
diff --git a/OWNERS b/OWNERS
deleted file mode 100644
index 6143f98..0000000
--- a/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-dmazzoni@chromium.org
-hashimoto@chromium.org
diff --git a/README b/README
deleted file mode 100644
index 6f4e81b..0000000
--- a/README
+++ /dev/null
@@ -1,7 +0,0 @@
-<Summary>
-This directory contains code to implement a text-to-speech (TTS) service on
-client platforms including Android and Chrome.  This includes wrappers for
-various TTS engines and code to manage background processes/threads to
-process incoming text buffers and spool generated audio samples to the
-audio I/O api.  See http://wiki/Main/SpeechLibDesignDoc
-</Summary>
diff --git a/SpeechSynthesizer.conf b/SpeechSynthesizer.conf
deleted file mode 100644
index 645b340..0000000
--- a/SpeechSynthesizer.conf
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
-  "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
-<!--
-  Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style license that can be
-  found in the LICENSE file.
--->
-<busconfig>
-  <policy user="chronos">
-    <!-- introspection is denied -->
-    <deny send_destination="org.chromium.SpeechSynthesizer"
-          send_interface="org.freedesktop.DBus.Introspectable" />
-    <!-- properties denied -->
-    <deny send_destination="org.chromium.SpeechSynthesizer"
-          send_interface="org.freedesktop.DBus.Properties" />
-    <!-- own this dbus service -->
-    <allow own="org.chromium.SpeechSynthesizer" />
-    <allow send_destination="org.chromium.SpeechSynthesizer" />
-    <!-- allow explicit methods -->
-    <allow send_destination="org.chromium.SpeechSynthesizer"
-           send_interface="org.chromium.SpeechSynthesizerInterface"
-           send_member="Speak"/>
-    <allow send_destination="org.chromium.SpeechSynthesizer"
-           send_interface="org.chromium.SpeechSynthesizerInterface"
-           send_member="Stop"/>
-    <allow send_destination="org.chromium.SpeechSynthesizer"
-           send_interface="org.chromium.SpeechSynthesizerInterface"
-           send_member="IsSpeaking"/>
-    <allow send_destination="org.chromium.SpeechSynthesizer"
-           send_interface="org.chromium.SpeechSynthesizerInterface"
-           send_member="Shutdown"/>
-  </policy>
-  <policy context="default">
-    <deny send_destination="org.chromium.SpeechSynthesizer" />
-  </policy>
-</busconfig>
diff --git a/audio_output.h b/audio_output.h
deleted file mode 100644
index e793fae..0000000
--- a/audio_output.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// An interface representing a real-time audio output system on a particular
-// platform.
-
-#ifndef SPEECH_CLIENT_SYNTHESIS_SERVICE_AUDIO_OUTPUT_H_
-#define SPEECH_CLIENT_SYNTHESIS_SERVICE_AUDIO_OUTPUT_H_
-
-#include <stdlib.h>
-
-namespace speech_synthesis {
-
-// This is an interface defining the method that fills an audio buffer
-// for real-time audio output.  Typically the TtsService implements this
-// method for AudioOutput, so that the service has all of the logic for
-// computing the samples to be computed, but AudioOutput has all of the logic
-// for dealing with the platform-specific audio hardware abstraction.
-class AudioProvider {
- public:
-  virtual ~AudioProvider() { }
-
-  // This method must return quickly and not block.  It must always
-  // fill all of the samples, with silence padding as needed.
-  // Returns false if audio should completely stop.
-  virtual bool FillAudioBuffer(int16_t* samples, int size) = 0;
-};
-
-// This is the abstract definition of a class that does real-time audio
-// output.  You must provide an implementation of an AudioProvider that
-// provides the actual samples to output on demand (or silence, if there
-// are not enough samples available immediately).  Subclasses of AudioOutput
-// implement these methods using various platform-specific methods.
-class AudioOutput {
- protected:
-  AudioOutput() { }
-
- public:
-  // Static factory method, creates whatever AudioOutput subclass
-  // has been linked in.
-  static AudioOutput* Create();
-
-  virtual ~AudioOutput() {}
-
-  // Initialize audio output, getting audio samples from the given provider.
-  // Returns true on success.  Safe to call more than once.
-  virtual bool Init(AudioProvider *provider) = 0;
-
-  virtual void StartAudio() = 0;
-
-  virtual void StopAudio() = 0;
-
-  virtual int GetSampleRate() = 0;
-
-  virtual int GetChannelCount() = 0;
-
-  // The typical number of samples that will be requested at once.
-  // The TTS system may want to generate audio in increments of this
-  // many samples, but it's just a hint.
-  virtual int GetChunkSize() = 0;
-
-  // The number of samples needed to completely fill the audio buffers.
-  // The provider must be able to quickly produce at least this many
-  // samples in order to avoid underflow.
-  virtual int GetTotalBufferSize() = 0;
-};
-
-}  // namespace speech_synthesis
-
-#endif  // SPEECH_CLIENT_SYNTHESIS_SERVICE_AUDIO_OUTPUT_H_
diff --git a/inherit-review-settings-ok b/inherit-review-settings-ok
deleted file mode 100644
index e69de29..0000000
--- a/inherit-review-settings-ok
+++ /dev/null
diff --git a/interface.cc b/interface.cc
deleted file mode 100644
index a0b4c81..0000000
--- a/interface.cc
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "interface.h"
-
-namespace speech_synthesis {
-namespace gobject {
-
-// Register with the glib type system.
-// This macro automatically defines a number of functions and variables
-// which are required to make speech_synthesizer functional as a GObject:
-// - speech_synthesizer_parent_class
-// - speech_synthesizer_get_type()
-// - dbus_glib_speech_synthesizer_object_info
-// It also ensures that the structs are setup so that the initialization
-// functions are called in the appropriate way by g_object_new().
-G_DEFINE_TYPE(SpeechSynthesizer, speech_synthesizer, G_TYPE_OBJECT);
-
-GObject* speech_synthesizer_constructor(GType gtype,
-                                        guint n_properties,
-                                        GObjectConstructParam *properties) {
-  GObject* obj;
-  GObjectClass* parent_class;
-  // Instantiate using the parent class, then extend for local properties.
-  parent_class = G_OBJECT_CLASS(speech_synthesizer_parent_class);
-  obj = parent_class->constructor(gtype, n_properties, properties);
-
-  SpeechSynthesizer* speech_synthesizer = reinterpret_cast<SpeechSynthesizer*>(obj);
-  speech_synthesizer->service = NULL;
-
-  // We don't have any thing we care to expose to the glib class system.
-  return obj;
-}
-
-void speech_synthesizer_class_init(SpeechSynthesizerClass *real_class) {
-  // Called once to configure the "class" structure.
-  GObjectClass* gobject_class = G_OBJECT_CLASS(real_class);
-  gobject_class->constructor = speech_synthesizer_constructor;
-}
-
-void speech_synthesizer_init(SpeechSynthesizer *self) { }
-
-// TODO(wad) add error messaging
-#define SPEECH_SYNTHESIZER_WRAP_METHOD(_NAME, s, e, args...) \
-  if (!s->service) { \
-    return FALSE; \
-  } \
-  return s->service->_NAME(args, e);
-
-#define SPEECH_SYNTHESIZER_WRAP_METHOD0(_NAME, s, e) \
-  if (!s->service) { \
-    return FALSE; \
-  } \
-  return s->service->_NAME(e);
-
-gboolean speech_synthesizer_speak(SpeechSynthesizer* self,
-                                  gchar *text,
-                                  gchar *properties,
-                                  GError** error) {
-  SPEECH_SYNTHESIZER_WRAP_METHOD(Speak, self, error, text, properties);
-}
-gboolean speech_synthesizer_stop(SpeechSynthesizer* self,
-                                 GError** error) {
-  SPEECH_SYNTHESIZER_WRAP_METHOD0(Stop, self, error);
-}
-gboolean speech_synthesizer_is_speaking(SpeechSynthesizer* self,
-                                        gboolean* OUT_isSpeaking_requested,
-                                        GError** error) {
-  SPEECH_SYNTHESIZER_WRAP_METHOD(IsSpeaking, self, error,
-      OUT_isSpeaking_requested);
-}
-gboolean speech_synthesizer_shutdown(SpeechSynthesizer* self,
-                                     GError** error) {
-  SPEECH_SYNTHESIZER_WRAP_METHOD0(Shutdown, self, error);
-}
-#undef SPEECH_SYNTHESIZER_WRAP_METHOD
-
-}  // namespace gobject
-}  // namespace speech_synthesis
diff --git a/interface.h b/interface.h
deleted file mode 100644
index acedc91..0000000
--- a/interface.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-#ifndef SPEECH_SYNTHESIS_INTERFACE_H_
-#define SPEECH_SYNTHESIS_INTERFACE_H_
-
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus-glib-bindings.h>
-#include <glib-object.h>
-#include <stdlib.h>
-
-#include <base/logging.h>
-#include <chromeos/dbus/dbus.h>
-#include <chromeos/glib/object.h>
-
-#include "speech_synthesizer_service.h"
-
-// Helpers for using GObjects until we can get a C++ wrapper going.
-namespace speech_synthesis {
-namespace gobject {  // Namespace hiding the GObject type data.
-
-struct SpeechSynthesizer {
-  GObject parent_instance;
-  SpeechSynthesizerService *service;  // pointer to implementing service.
-};
-struct SpeechSynthesizerClass { GObjectClass parent_class; };
-
-// speech_synthesizer_get_type() is defined in interface.cc by the
-// G_DEFINE_TYPE() macro.  This macro defines a number of other GLib
-// class system specific functions and variables discussed in
-// interface.cc.
-GType speech_synthesizer_get_type();  // defined by G_DEFINE_TYPE
-
-// Interface function prototypes which wrap service.
-gboolean speech_synthesizer_speak(SpeechSynthesizer *self,
-                                  gchar *text,
-                                  gchar *properties,
-                                  GError **error);
-gboolean speech_synthesizer_stop(SpeechSynthesizer *self,
-                                 GError **error);
-gboolean speech_synthesizer_is_speaking(SpeechSynthesizer *self,
-                                        gboolean* OUT_isSpeaking_requested,
-                                        GError **error);
-gboolean speech_synthesizer_shutdown(SpeechSynthesizer *self,
-                                     GError **error);
-}  // namespace gobject
-}  // namespace speech_synthesis
-#endif  // SPEECH_SYNTHESIS_INTERFACE_H_
diff --git a/linux/audio_output_alsa.cc b/linux/audio_output_alsa.cc
deleted file mode 100644
index d256361..0000000
--- a/linux/audio_output_alsa.cc
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Implementation of audio output using the Linux ALSA interface.
-
-#include <fcntl.h>
-#include <stdio.h>
-#include <vector>
-
-#include <alsa/asoundlib.h>
-
-#include "base/memory/scoped_ptr.h"
-
-#include "audio_output.h"
-#include "log.h"
-#include "threading.h"
-
-namespace speech_synthesis {
-
-namespace {
-
-const int kSampleRate = 44100;
-const int kChannelCount = 1;
-
-bool isDeviceReady() {
-  snd_ctl_card_info_t *card_info;
-  snd_ctl_card_info_alloca(&card_info);
-
-  snd_pcm_info_t *pcm_info;
-  snd_pcm_info_alloca(&pcm_info);
-
-  int valid_playback_devices = 0;
-  int card_index = -1;
-
-  while(snd_card_next(&card_index) == 0 && card_index >= 0) {
-    char card_name[20];
-    snprintf(card_name, sizeof(card_name), "hw:%d", card_index);
-    LOG(INFO) << "Checking ALSA sound card " << card_name;
-
-    snd_ctl_t *ctl;
-    if(snd_ctl_open(&ctl, card_name, 0) < 0)
-      continue;
-
-    snd_ctl_card_info(ctl, card_info);
-
-    int dev_index = -1;
-    while (snd_ctl_pcm_next_device(ctl, &dev_index) == 0 && dev_index >= 0) {
-      char device_name[30];
-      snprintf(device_name, sizeof(device_name),
-               "hw:%d,%d", card_index, dev_index);
-      LOG(INFO) << "Checking ALSA sound device " << device_name;
-
-      /* Obtain info about this particular device */
-      snd_pcm_info_set_device(pcm_info, dev_index);
-      snd_pcm_info_set_subdevice(pcm_info, 0);
-      snd_pcm_info_set_stream(pcm_info, SND_PCM_STREAM_PLAYBACK);
-      if (snd_ctl_pcm_info(ctl, pcm_info) >= 0) {
-        LOG(INFO) << "    Valid playback device: " << device_name;
-        valid_playback_devices++;
-      }
-    }
-    snd_ctl_close(ctl);
-  }
-
-  LOG(INFO) << "Total valid playback devices: " << valid_playback_devices;
-  if (valid_playback_devices == 0) {
-    return false;
-  }
-  return true;
-}
-
-class LinuxAlsaAudioOutput : public AudioOutput, public Runnable {
- public:
-  LinuxAlsaAudioOutput()
-      : keep_running_(false),
-        provider_(NULL),
-        pcm_out_handle_(NULL),
-        sample_rate_(0),
-        channel_count_(0),
-        chunk_size_(0),
-        total_buffer_size_(0) {
-  }
-
-  virtual ~LinuxAlsaAudioOutput() {
-    StopAudio();
-  }
-
-  // AudioOutput overrides:
-  virtual bool Init(AudioProvider *provider) OVERRIDE {
-    if (!provider) {
-      LOG(ERROR) << "An AudioProvider is required.\n";
-      return false;
-    }
-
-    if (provider_) {
-      return true;
-    }
-
-    if (!isDeviceReady()) {
-      return false;
-    }
-
-    int err = 0;
-    if ((err = snd_pcm_open(&pcm_out_handle_,
-                            "default",
-                            SND_PCM_STREAM_PLAYBACK,
-                            0)) < 0) {
-      LOG(INFO) << "Can't open wave output: " << snd_strerror(err) << "\n";
-      return false;
-    }
-
-    sample_rate_ = kSampleRate;
-    channel_count_ = kChannelCount;
-    int soft_resample = 1;
-    unsigned int latency_us = 50000;
-    if ((err = snd_pcm_set_params(pcm_out_handle_,
-                                  SND_PCM_FORMAT_S16_LE,
-                                  SND_PCM_ACCESS_RW_INTERLEAVED,
-                                  channel_count_,
-                                  sample_rate_,
-                                  soft_resample,
-                                  latency_us)) < 0) {
-      LOG(INFO) << "Can't set pcm parameters " << snd_strerror(err);
-      return false;
-    }
-
-    snd_pcm_uframes_t buffer_size = 0;
-    snd_pcm_uframes_t period_size = 0;
-    if ((err = snd_pcm_get_params(pcm_out_handle_, &buffer_size, &period_size))
-        < 0) {
-      LOG(INFO) << "Can't get pcm parameters: " << snd_strerror(err);
-      return false;
-    }
-
-    chunk_size_ = period_size;
-    total_buffer_size_ = buffer_size;
-
-    if ((err = snd_pcm_prepare(pcm_out_handle_)) < 0) {
-      LOG(INFO) << "Can't prepare: " << snd_strerror(err) << "\n";
-      return false;
-    }
-
-    keep_running_ = true;
-    provider_ = provider;
-    return true;
-  }
-
-  virtual void StartAudio() OVERRIDE {
-    thread_.reset(Thread::StartJoinableThread(this));
-  }
-
-  virtual void StopAudio() OVERRIDE {
-    keep_running_ = false;
-    if (thread_.get()) {
-      thread_->Join();
-      thread_.reset();
-    }
-    if (pcm_out_handle_) {
-      snd_pcm_close(pcm_out_handle_);
-      pcm_out_handle_ = NULL;
-    }
-  }
-
-  virtual int GetSampleRate() OVERRIDE {
-    return kSampleRate;
-  }
-
-  virtual int GetChannelCount() OVERRIDE {
-    return kChannelCount;
-  }
-
-  virtual int GetChunkSize() OVERRIDE {
-    return chunk_size_;
-  }
-
-  virtual int GetTotalBufferSize() OVERRIDE {
-    return total_buffer_size_;
-  }
-
-  // Runnable override.
-  virtual void Run() OVERRIDE {
-    const int chunk_size = GetChunkSize();
-    std::vector<int16_t> chunk(chunk_size);
-
-    if (!provider_) {
-      LOG(ERROR) << "Error: audio output was never initialized.\n";
-      return;
-    }
-
-    LOG(INFO) << "In audio thread\n";
-    while (keep_running_) {
-      if (!provider_->FillAudioBuffer(&chunk[0], chunk_size)) {
-        LOG(INFO) << "Could not fill audio buffer\n";
-        break;
-      }
-
-      int err = snd_pcm_writei(pcm_out_handle_,
-                               &chunk[0],
-                               static_cast<snd_pcm_uframes_t>(chunk_size));
-      if (err < 0) {
-        LOG(INFO) << "Write error: " << err << snd_strerror(err) << "\n";
-        do {
-          sleep(1);
-          LOG(INFO) << "Attempting to recover audio";
-        } while (keep_running_ &&
-                 0 != snd_pcm_recover(pcm_out_handle_, err, 0));
-      }
-    }
-  }
-
- private:
-  volatile bool keep_running_;
-  AudioProvider* provider_;
-  scoped_ptr<Thread> thread_;
-  snd_pcm_t *pcm_out_handle_;
-  int sample_rate_;
-  int channel_count_;
-  int chunk_size_;
-  int total_buffer_size_;
-
-  DISALLOW_COPY_AND_ASSIGN(LinuxAlsaAudioOutput);
-};
-
-}  // namespace
-
-AudioOutput* AudioOutput::Create() {
-  return new LinuxAlsaAudioOutput();
-}
-
-}  // namespace speech_synthesis
diff --git a/linux/threading.cc b/linux/threading.cc
deleted file mode 100644
index c517d23..0000000
--- a/linux/threading.cc
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Implementation of threading classes using Linux pthreads.
-// Also works under Native Client.
-#include "threading.h"
-
-#include <pthread.h>
-#include <sys/time.h>
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-
-#include "log.h"
-
-namespace speech_synthesis {
-
-namespace {
-
-// Implementation of a Mutex using pthreads
-class PthreadMutex : public Mutex {
- public:
-  PthreadMutex() {
-    pthread_mutex_init(&mutex_, NULL);
-  }
-
-  virtual ~PthreadMutex() {
-    pthread_mutex_destroy(&mutex_);
-  }
-
-  // Mutex overrides:
-  virtual void Lock() OVERRIDE {
-    pthread_mutex_lock(&mutex_);
-  }
-
-  virtual void Unlock() OVERRIDE {
-    pthread_mutex_unlock(&mutex_);
-  }
-
- private:
-  pthread_mutex_t mutex_;
-  friend class PthreadCondVar;
-
-  DISALLOW_COPY_AND_ASSIGN(PthreadMutex);
-};
-
-class PthreadCondVar : public CondVar {
- public:
-  PthreadCondVar() {
-    pthread_cond_init(&cond_var_, NULL);
-  }
-
-  virtual ~PthreadCondVar() {
-    pthread_cond_destroy(&cond_var_);
-  }
-
-  // CondVar overrides:
-  virtual void Wait(Mutex* mutex) OVERRIDE {
-    pthread_cond_wait(&cond_var_, &(static_cast<PthreadMutex*>(mutex))->mutex_);
-  }
-
-  virtual void WaitWithTimeout(Mutex* mutex, int timeout_ms) OVERRIDE {
-    struct timeval now;
-    struct timespec timeout;
-    int future_us;
-
-    gettimeofday(&now, NULL);
-    future_us = now.tv_usec + timeout_ms * 1000;
-    timeout.tv_nsec = (future_us % 1000000) * 1000;
-    timeout.tv_sec = now.tv_sec + future_us / 1000000;
-
-    pthread_cond_timedwait(&cond_var_,
-                           &(static_cast<PthreadMutex*>(mutex))->mutex_,
-                           &timeout);
-  }
-
-  virtual void Signal() OVERRIDE {
-    pthread_cond_signal(&cond_var_);
-  }
-
- private:
-  pthread_cond_t cond_var_;
-
-  DISALLOW_COPY_AND_ASSIGN(PthreadCondVar);
-};
-
-// Implementation of a joinable Thread using Pthread's Thread class
-class PthreadThread : public Thread {
- public:
-  explicit PthreadThread(pthread_t *thread)
-      : thread_(thread) { }
-
-  virtual ~PthreadThread() {
-    CHECK(thread_ == NULL);
-  }
-
-  // Thread override.
-  virtual void Join() OVERRIDE {
-    pthread_join(*thread_, NULL);
-    delete thread_;
-    thread_ = NULL;
-  }
-
- private:
-  pthread_t* thread_;
-
-  DISALLOW_COPY_AND_ASSIGN(PthreadThread);
-};
-
-void* ThreadStart(void *userdata) {
-  Runnable *action = static_cast<Runnable *>(userdata);
-  action->Run();
-
-  return NULL;
-}
-
-}  // namespace
-
-// static
-Mutex* Mutex::Create() {
-  return new PthreadMutex();
-}
-
-// static
-CondVar* CondVar::Create() {
-  return new PthreadCondVar();
-}
-
-// static
-Thread* Thread::StartJoinableThread(Runnable *action) {
-  pthread_t* thread = new pthread_t;
-  pthread_create(thread, NULL, ThreadStart, action);
-
-  return new PthreadThread(thread);
-}
-
-}  // namespace speech_synthesis
diff --git a/log.h b/log.h
deleted file mode 100644
index 4b98482..0000000
--- a/log.h
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SPEECH_CLIENT_SYNTHESIS_SERVICE_LOG_H_
-#define SPEECH_CLIENT_SYNTHESIS_SERVICE_LOG_H_
-
-#include <base/logging.h>
-
-#endif  // SPEECH_CLIENT_SYNTHESIS_SERVICE_LOG_H_
-
diff --git a/org.chromium.SpeechSynthesizer.service b/org.chromium.SpeechSynthesizer.service
deleted file mode 100644
index 9c83a3b..0000000
--- a/org.chromium.SpeechSynthesizer.service
+++ /dev/null
@@ -1,4 +0,0 @@
-[D-BUS Service]
-Name=org.chromium.SpeechSynthesizer
-Exec=/usr/sbin/speech_synthesizer
-User=chronos
diff --git a/pico/load_pico_voices_static.cc b/pico/load_pico_voices_static.cc
deleted file mode 100644
index 64a0b51..0000000
--- a/pico/load_pico_voices_static.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Load pico voices and language files using hardcoded paths.
-// TODO(chaitanyag): Change this to load voices from a file.
-
-#include "pico/pico_tts_engine.h"
-
-#include "base/string_number_conversions.h"
-
-namespace speech_synthesis {
-
-// Load the supported languages and properties from hardcoded paths.
-tts_result PicoTtsEngine::LoadVoices(const string& filename) {
-  {
-    voices_.push_back(PicoTtsVoice());
-    PicoTtsVoice* voice = &voices_.back();
-    voice->language = "eng";
-    voice->region = "USA";
-    voice->name = "en-US";
-    voice->sample_rate = 16000;
-    voice->ta_lingware = "en-US_ta.bin";
-    voice->sg_lingware = "en-US_lh0_sg.bin";
-    voice->utpp_lingware = "en-US_utpp.bin";
-    voice->quality = TTS_NORMAL_QUALITY;
-
-    voices_.push_back(PicoTtsVoice());
-    voice = &voices_.back();
-    voice->language = "eng";
-    voice->region = "GBR";
-    voice->name = "en-GB";
-    voice->sample_rate = 16000;
-    voice->ta_lingware = "en-GB_ta.bin";
-    voice->sg_lingware = "en-GB_kh0_sg.bin";
-    voice->utpp_lingware = "en-GB_utpp.bin";
-    voice->quality = TTS_NORMAL_QUALITY;
-
-    voices_.push_back(PicoTtsVoice());
-    voice = &voices_.back();
-    voice->language = "deu";
-    voice->region = "DEU";
-    voice->name = "de-DE";
-    voice->sample_rate = 16000;
-    voice->ta_lingware = "de-DE_ta.bin";
-    voice->sg_lingware = "de-DE_gl0_sg.bin";
-    voice->utpp_lingware = "de-DE_utpp.bin";
-    voice->quality = TTS_NORMAL_QUALITY;
-
-    voices_.push_back(PicoTtsVoice());
-    voice = &voices_.back();
-    voice->language = "spa";
-    voice->region = "ESP";
-    voice->name = "es-ES";
-    voice->sample_rate = 16000;
-    voice->ta_lingware = "es-ES_ta.bin";
-    voice->sg_lingware = "es-ES_zl0_sg.bin";
-    voice->utpp_lingware = "es-ES_utpp.bin";
-    voice->quality = TTS_NORMAL_QUALITY;
-
-    voices_.push_back(PicoTtsVoice());
-    voice = &voices_.back();
-    voice->language = "fra";
-    voice->region = "FRA";
-    voice->name = "fr-FR";
-    voice->sample_rate = 16000;
-    voice->ta_lingware = "fr-FR_ta.bin";
-    voice->sg_lingware = "fr-FR_nk0_sg.bin";
-    voice->utpp_lingware = "fr-FR_utpp.bin";
-    voice->quality = TTS_NORMAL_QUALITY;
-
-    voices_.push_back(PicoTtsVoice());
-    voice = &voices_.back();
-    voice->language = "ita";
-    voice->region = "ITA";
-    voice->name = "it-IT";
-    voice->sample_rate = 16000;
-    voice->ta_lingware = "it-IT_ta.bin";
-    voice->sg_lingware = "it-IT_cm0_sg.bin";
-    voice->utpp_lingware = "it-IT_utpp.bin";
-    voice->quality = TTS_NORMAL_QUALITY;
-
-    // Load properties
-    properties_["rate"] = base::IntToString(PICO_DEF_RATE);
-    properties_["pitch"] = base::IntToString(PICO_DEF_PITCH);
-    properties_["volume"] = base::IntToString(PICO_DEF_VOL);
-  }
-
-  return TTS_SUCCESS;
-}
-
-}  // namespace speech_synthesis
diff --git a/pico/pico_tts_engine.cc b/pico/pico_tts_engine.cc
deleted file mode 100644
index f5b7304..0000000
--- a/pico/pico_tts_engine.cc
+++ /dev/null
@@ -1,389 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Pico specific implementation of the TtsEngine interface defined in
-// tts_engine.h.
-
-#include "pico/pico_tts_engine.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-
-#include "base/string_number_conversions.h"
-
-#include "log.h"
-
-#define FAILERR(X) \
-  if (PICO_OK != (X)) { \
-    LOG(ERROR) << "Fail line " << __LINE__; \
-    return TTS_FAILURE; \
-  } \
-  else
-
-using std::string;
-
-namespace speech_synthesis {
-
-const char* PROP_RATE = "rate";
-const char* PROP_PITCH = "pitch";
-const char* PROP_VOLUME = "volume";
-
-const int PICO_MEM_SIZE = 2500000;
-const pico_Char * PICO_VOICE_NAME =
-    reinterpret_cast<const pico_Char *>("PicoVoice");
-
-PicoTtsEngine::PicoTtsEngine(const std::string& base_path)
-    : base_path_(base_path),
-      mem_area_(NULL),
-      system_(NULL),
-      engine_(NULL),
-      ta_resource_(NULL),
-      sg_resource_(NULL),
-      receiver_(NULL) {
-}
-
-PicoTtsEngine::~PicoTtsEngine() {
-  Shutdown();
-}
-
-// Unloads the Pico engine and any loaded Pico resources, but does not
-// shut down.
-void PicoTtsEngine::CleanResources(void) {
-  if (engine_) {
-    pico_disposeEngine(system_, &engine_);
-    pico_releaseVoiceDefinition(system_, PICO_VOICE_NAME);
-    engine_ = NULL;
-  }
-  if (ta_resource_) {
-    pico_unloadResource(system_, &ta_resource_);
-    ta_resource_ = NULL;
-  }
-  if (sg_resource_) {
-    pico_unloadResource(system_, &sg_resource_);
-    sg_resource_ = NULL;
-  }
-
-  current_voice_index_ = -1;
-}
-
-// Initializes the engine for the specified voice.
-tts_result PicoTtsEngine::InitVoice(int voice_index) {
-  if (voice_index < 0 || voice_index >= GetVoiceCount()) {
-    LOG(INFO) << "Voice index out of range: " << voice_index;
-    return TTS_FAILURE;
-  }
-  const PicoTtsVoice * voice = &voices_[voice_index];
-
-  pico_Char ta_resource_name[PICO_MAX_RESOURCE_NAME_SIZE];
-  pico_Char sg_resource_name[PICO_MAX_RESOURCE_NAME_SIZE];
-
-  string tafile = base_path_ + voice->ta_lingware;
-  string sgfile = base_path_ + voice->sg_lingware;
-  const pico_Char *ta_filename =
-      reinterpret_cast<const pico_Char *>(tafile.c_str());
-  const pico_Char *sg_filename =
-      reinterpret_cast<const pico_Char *>(sgfile.c_str());
-
-  FAILERR(pico_loadResource(system_, ta_filename, &ta_resource_));
-  FAILERR(pico_loadResource(system_, sg_filename, &sg_resource_));
-  FAILERR(pico_getResourceName(system_, ta_resource_,
-      reinterpret_cast<char *>(ta_resource_name)));
-  FAILERR(pico_getResourceName(system_, sg_resource_,
-      reinterpret_cast<char *>(sg_resource_name)));
-  FAILERR(pico_createVoiceDefinition(system_, PICO_VOICE_NAME));
-  FAILERR(pico_addResourceToVoiceDefinition(
-      system_, PICO_VOICE_NAME, ta_resource_name));
-  FAILERR(pico_addResourceToVoiceDefinition(
-      system_, PICO_VOICE_NAME, sg_resource_name));
-  pico_newEngine(system_, PICO_VOICE_NAME, &engine_);
-  current_voice_index_ = voice_index;
-
-  return TTS_SUCCESS;
-}
-
-// Initialize TTS engine.
-tts_result PicoTtsEngine::Init() {
-  LOG(INFO) << "Start.";
-  LoadVoices(base_path_ + "tts_support.xml");
-  mem_area_ = malloc(PICO_MEM_SIZE);
-  if (!mem_area_) {
-    LOG(ERROR) << "Failed to allocate memory for Pico system";
-    return TTS_FAILURE;
-  }
-
-  FAILERR(pico_initialize(mem_area_, PICO_MEM_SIZE, &system_));
-  // Set the first language in the data file as the default.
-  FAILERR(InitVoice(0));
-  LOG(INFO) << "Init done.";
-  return TTS_SUCCESS;
-}
-
-// Shuts down the TTS engine, cleans up resources.
-tts_result PicoTtsEngine::Shutdown() {
-  CleanResources();
-  if (system_) {
-    pico_terminate(&system_);
-    system_ = NULL;
-  }
-  if (mem_area_) {
-    free(mem_area_);
-    mem_area_ = NULL;
-  }
-  return TTS_SUCCESS;
-}
-
-tts_result PicoTtsEngine::Stop() {
-  // TODO(fergus): use PICO_RESET_SOFT here instead?
-  pico_resetEngine(engine_, PICO_RESET_FULL);
-  return TTS_SUCCESS;
-}
-
-int PicoTtsEngine::GetVoiceCount() {
-  return static_cast<int>(voices_.size());
-}
-
-const TtsVoice* PicoTtsEngine::GetVoiceInfo(int voice_index) {
-  if (voice_index >= 0 && voice_index < GetVoiceCount()) {
-    return &voices_[voice_index];
-  } else {
-    return NULL;
-  }
-}
-
-tts_result PicoTtsEngine::SetVoice(int voice_index) {
-  if (current_voice_index_ != voice_index) {
-    CleanResources();
-    return InitVoice(voice_index);
-  } else {
-    return TTS_SUCCESS;
-  }
-}
-
-void PicoTtsEngine::SetReceiver(TtsDataReceiver* receiver) {
-  receiver_ = receiver;
-}
-
-// Sets the property for the engine.
-tts_result PicoTtsEngine::SetProperty(const char *property, const char *value) {
-  if (properties_.count(property) > 0) {
-    properties_[property] = value;
-    return TTS_SUCCESS;
-  } else {
-    return TTS_PROPERTY_UNSUPPORTED;
-  }
-}
-
-tts_result PicoTtsEngine::SetProperty(const char *property, float value) {
-  SetProperty(property, base::IntToString(value).c_str());
-  return TTS_SUCCESS;
-}
-
-tts_result PicoTtsEngine::SetRate(float rate) {
-  if (rate < 0 || rate > 5) {
-    return TTS_VALUE_INVALID;
-  }
-  rate = rate < 0.2 ? 0.2 : rate;
-  return SetProperty(PROP_RATE, rate * 100);
-}
-
-tts_result PicoTtsEngine::SetPitch(float pitch) {
-  if (pitch < 0 || pitch > 2) {
-    return TTS_VALUE_INVALID;
-  }
-  pitch = pitch < 0.5 ? 0.5 : pitch;
-  return SetProperty(PROP_PITCH, pitch * 100);
-}
-
-tts_result PicoTtsEngine::SetVolume(float volume) {
-  if (volume < 0 || volume > 5) {
-    return TTS_VALUE_INVALID;
-  }
-  return SetProperty(PROP_VOLUME, volume * 100);
-}
-
-tts_result PicoTtsEngine::GetProperty(const char *property,
-    const char **value) {
-  std::map<string, string>::const_iterator iter =
-      properties_.find(property);
-  if (iter != properties_.end()) {
-    if (value != NULL) {
-      (*value) = iter->second.c_str();
-    }
-    return TTS_SUCCESS;
-  }
-  return TTS_PROPERTY_UNSUPPORTED;
-}
-
-int PicoTtsEngine::GetSampleRate() {
-  return voices_[current_voice_index_].sample_rate;
-}
-
-tts_result PicoTtsEngine::SynthesizeText(const char* text,
-                                         int16_t* audio_buffer,
-                                         int audio_buffer_size,
-                                         int* out_total_samples) {
-  if (out_total_samples != NULL) {
-    *out_total_samples = 0;
-  }
-
-  string synth_text = "";
-  AppendProperties(text, &synth_text);
-
-  int text_pos = 0;
-  const pico_Char* text_ptr =
-      reinterpret_cast<const pico_Char*>(synth_text.c_str());
-  int text_buffer_len = synth_text.size() + 1;
-  while (text_pos < text_buffer_len) {
-    pico_Int16 text_bytes_consumed = 0;
-    if (PICO_OK != pico_putTextUtf8(
-            engine_, text_ptr, text_buffer_len - text_pos,
-            &text_bytes_consumed)) {
-      return TTS_FAILURE;
-    }
-
-    int out_samples;
-    tts_result result = GetAudioFromTts(
-        audio_buffer, audio_buffer_size, &out_samples);
-    if (out_total_samples != NULL) {
-      *out_total_samples += out_samples;
-    }
-
-    if (result != TTS_SUCCESS) {
-      return result;
-    }
-
-    text_pos += text_bytes_consumed;
-    text_ptr += text_bytes_consumed;
-  }
-  return TTS_SUCCESS;
-}
-
-// This method appends the SSML tags for the supported properties if their
-// values are different from the default values.
-void PicoTtsEngine::AppendProperties(const char *text, string *synth_text) {
-  int rate_level_ = floor(atof(properties_[PROP_RATE].c_str()));
-  int pitch_level_ = floor(atof(properties_[PROP_PITCH].c_str()));
-  int volume_level_ = floor(atof(properties_[PROP_VOLUME].c_str()));
-
-  if (rate_level_ < PICO_MIN_RATE || rate_level_ > PICO_MAX_RATE) {
-    LOG(WARNING) << "Rate is outside the allowed range.";
-  }
-  if (pitch_level_ < PICO_MIN_PITCH || pitch_level_ > PICO_MAX_PITCH) {
-    LOG(WARNING) << "Pitch is outside the allowed range.";
-  }
-  if (volume_level_ < PICO_MIN_VOL || volume_level_ > PICO_MAX_VOL) {
-    LOG(WARNING) << "Volume is outside the allowed range.";
-  }
-
-  *synth_text = "";
-
-  // Append opening tags
-  if (rate_level_ != PICO_DEF_RATE) {
-    *synth_text += "<speed level='" + properties_[PROP_RATE] + "'>";
-  }
-  if (pitch_level_ != PICO_DEF_PITCH) {
-    *synth_text += "<pitch level='" + properties_[PROP_PITCH] + "'>";
-  }
-  if (volume_level_ != PICO_DEF_VOL) {
-    *synth_text += "<volume level='" + properties_[PROP_VOLUME] + "'>";
-  }
-  // Append text
-  *synth_text += text;
-  // Append closing tags in the reverse order
-  if (volume_level_ != PICO_DEF_VOL) {
-    *synth_text += "</volume>";
-  }
-  if (pitch_level_ != PICO_DEF_PITCH) {
-    *synth_text += "</pitch>";
-  }
-  if (rate_level_ != PICO_DEF_RATE) {
-    *synth_text += "</speed>";
-  }
-}
-
-// max_iterations_without_apparent_progress is a hack to prevent infinite loops.
-// This needs to be more than 200 to pass simple tests such as hello world.
-// TODO(fergus): we should fix the underlying bug <http://b/2501315> in the
-// //third_party/pico sources, and then delete all the code relating to
-// max_iterations_without_apparent_progress.
-int PicoTtsEngine::max_iterations_without_apparent_progress = 10000;
-
-tts_result PicoTtsEngine::GetAudioFromTts(int16_t* audio_buffer,
-                                          int audio_buffer_size,
-                                          int* out_total_samples) {
-  int total_samples_output = 0;
-  int status;
-  tts_callback_status callback_status = TTS_CALLBACK_CONTINUE;
-  pico_Int16 data_type = PICO_DATA_PCM_16BIT;
-  uint32_t sample_rate = voices_[current_voice_index_].sample_rate;
-  int iterations_without_apparent_progress = 0;
-  while (1) {
-    pico_Int16 bytes_received = 0;
-    data_type = 0;
-    int8_t* buffer_ptr = reinterpret_cast<int8_t *>(audio_buffer);
-    pico_Int16 buffer_size_bytes = audio_buffer_size * sizeof(pico_Int16);
-
-    status = pico_getData(engine_, buffer_ptr, buffer_size_bytes,
-        &bytes_received, &data_type);
-
-    if (status != PICO_STEP_ERROR && bytes_received > 0) {
-      if (data_type != PICO_DATA_PCM_16BIT) {
-        break;
-      }
-
-      int samples_output = bytes_received / sizeof(const pico_Int16);
-      total_samples_output += samples_output;
-
-      // make the callback here...note that it's important to call this
-      // method even if no data was received.
-      if (receiver_) {
-        callback_status =
-            receiver_->Receive(sample_rate, 1, audio_buffer,
-                               samples_output, TTS_SYNTH_PENDING);
-        if (callback_status != TTS_CALLBACK_CONTINUE) {
-          break;
-        }
-      }
-    }
-    if (status != PICO_STEP_BUSY) {
-      break;
-    }
-    if (bytes_received == 0) {
-      iterations_without_apparent_progress++;
-      if (iterations_without_apparent_progress >
-          max_iterations_without_apparent_progress) {
-        break;
-      }
-    } else {
-      iterations_without_apparent_progress = 0;
-    }
-  };
-
-  if (out_total_samples != NULL) {
-    *out_total_samples = total_samples_output;
-  }
-
-  if (status == PICO_STEP_ERROR ||
-      callback_status == TTS_CALLBACK_ERROR ||
-      data_type != PICO_DATA_PCM_16BIT ||
-      iterations_without_apparent_progress >
-      max_iterations_without_apparent_progress) {
-    return TTS_FAILURE;
-  }
-
-  if (callback_status != TTS_CALLBACK_HALT) {
-    // Send a zero-length packet to tell the destination receiver that
-    // we're done.
-    callback_status = receiver_->Receive(sample_rate, 1, NULL, 0,
-                                         TTS_SYNTH_DONE);
-    if (callback_status == TTS_CALLBACK_ERROR) {
-      return TTS_FAILURE;
-    }
-  }
-
-  return TTS_SUCCESS;
-}
-
-}  // namespace speech_synthesis
diff --git a/pico/pico_tts_engine.h b/pico/pico_tts_engine.h
deleted file mode 100644
index b2eadec..0000000
--- a/pico/pico_tts_engine.h
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Header for SVOX Pico TTS engine implementation.
-
-#ifndef SPEECH_CLIENT_SYNTHESIS_SERVICE_PICO_PICO_TTS_ENGINE_H_
-#define SPEECH_CLIENT_SYNTHESIS_SERVICE_PICO_PICO_TTS_ENGINE_H_
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-
-#include "pico/picoapi.h"
-#include "pico/picodbg.h"
-#include "pico/picodefs.h"
-
-#include "tts_engine.h"
-
-namespace speech_synthesis {
-
-//TODO(chaitanyag): Add a comment about the units of these values once we hear
-// back from the SVox.
-// Speaking speed
-const int PICO_MIN_RATE = 20;
-const int PICO_MAX_RATE = 500;
-const int PICO_DEF_RATE = 100;
-
-// Speaking pitch
-const int PICO_MIN_PITCH = 50;
-const int PICO_MAX_PITCH = 200;
-const int PICO_DEF_PITCH = 100;
-
-// Speaking volume
-const int PICO_MIN_VOL = 0;
-const int PICO_MAX_VOL = 500;
-const int PICO_DEF_VOL = 120;
-
-struct PicoTtsVoice : public TtsVoice {
- public:
-  std::string ta_lingware;
-  std::string sg_lingware;
-  std::string utpp_lingware;
-};
-
-// Thread-safe.  Unfortunately Pico is not 64-bit clean.
-class PicoTtsEngine : public TtsEngine {
- public:
-  // A hack to prevent infinite loops.
-  static int max_iterations_without_apparent_progress;
-
-  explicit PicoTtsEngine(const std::string& base_path);
-  virtual ~PicoTtsEngine();
-
-  // TtsEngine overrides:
-  virtual tts_result Init() OVERRIDE;
-  virtual tts_result Shutdown() OVERRIDE;
-  virtual tts_result Stop() OVERRIDE;
-  virtual int GetVoiceCount() OVERRIDE;
-  virtual const TtsVoice* GetVoiceInfo(int voice_index) OVERRIDE;
-  virtual tts_result SetVoice(int voice_index) OVERRIDE;
-  virtual void SetReceiver(TtsDataReceiver* receiver) OVERRIDE;
-  virtual tts_result SetProperty(const char *property,
-                                 const char *value) OVERRIDE;
-  virtual tts_result SetRate(float rate) OVERRIDE;
-  virtual tts_result SetPitch(float pitch) OVERRIDE;
-  virtual tts_result SetVolume(float volume) OVERRIDE;
-  virtual tts_result GetProperty(const char *property,
-                                 const char **value) OVERRIDE;
-  virtual int GetSampleRate() OVERRIDE;
-  virtual tts_result SynthesizeText(const char *text,
-                                    int16_t* audio_buffer,
-                                    int audio_buffer_size,
-                                    int* out_total_samples) OVERRIDE;
-
- private:
-  tts_result LoadVoices(const std::string& filename);
-  void CleanResources();
-  tts_result InitVoice(int voice_index);
-  tts_result GetAudioFromTts(int16_t* audio_buffer,
-                             int audio_buffer_size,
-                             int* out_total_samples);
-  tts_result SetProperty(const char *property, float value);
-  void AppendProperties(const char *text, std::string *synth_text);
-
-  std::string base_path_;
-
-  std::vector<PicoTtsVoice> voices_;
-  int current_voice_index_;
-
-  std::map<std::string, std::string> properties_;
-
-  void *          mem_area_;
-  pico_System     system_;
-  pico_Engine     engine_;
-  pico_Resource   ta_resource_;
-  pico_Resource   sg_resource_;
-
-  TtsDataReceiver *receiver_;
-
-  DISALLOW_COPY_AND_ASSIGN(PicoTtsEngine);
-};
-
-}  // namespace speech_synthesis
-
-#endif  // SPEECH_CLIENT_SYNTHESIS_SERVICE_PICO_PICO_TTS_ENGINE_H_
diff --git a/resampler.cc b/resampler.cc
deleted file mode 100644
index 521c606..0000000
--- a/resampler.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "log.h"
-#include "resampler.h"
-#include "libresample/libresample.h"
-
-namespace speech_synthesis {
-
-Resampler::Resampler(TtsDataReceiver *destination,
-                     int source_rate,
-                     int dest_rate,
-                     int buffer_size)
-    : destination_(destination),
-      source_rate_(source_rate),
-      dest_rate_(dest_rate),
-      buffer_size_(buffer_size),
-      resample_handle_(NULL),
-      in_floats_(buffer_size),
-      out_floats_(buffer_size),
-      out_int16s_(buffer_size) {
-  const int high_quality = 0;
-  factor_ = dest_rate_ * 1.0 / source_rate_;
-  resample_handle_ = resample_open(high_quality, factor_, factor_);
-}
-
-Resampler::~Resampler() {
-  resample_close(resample_handle_);
-}
-
-tts_callback_status Resampler::Receive(int rate,
-                                       int num_channels,
-                                       const int16_t* data,
-                                       int num_samples,
-                                       tts_synth_status synth_status) {
-  if (num_samples > buffer_size_) {
-    LOG(ERROR) << "Got " << num_samples << " samples, buffer size is " <<
-            buffer_size_ << "\n";
-    exit(-1);
-  }
-
-  if (rate != source_rate_) {
-    LOG(ERROR) << "Got input rate of " << rate << " expected " <<
-        source_rate_ << "\n";
-    exit(-1);
-  }
-
-  for (int i = 0; i < num_samples; i++) {
-    in_floats_[i] = data[i];
-  }
-
-  int last_flag = (synth_status == TTS_SYNTH_DONE? 1 : 0);
-
-  int input_index = 0;
-  while (input_index < num_samples) {
-    int in_buffer_used;
-    int out_samples = resample_process(resample_handle_,
-                                       factor_,
-                                       &in_floats_[input_index],
-                                       num_samples - input_index,
-                                       last_flag,
-                                       &in_buffer_used,
-                                       &out_floats_[0],
-                                       buffer_size_);
-    input_index += in_buffer_used;
-
-    for (int i = 0; i < out_samples; i++) {
-      int value = static_cast<int>(out_floats_[i]);
-      if (value > 32767)
-        value = 32767;
-      if (value < -32768)
-        value = -32768;
-      out_int16s_[i] = static_cast<int16_t>(value);
-    }
-
-    tts_synth_status status;
-    if (synth_status == TTS_SYNTH_DONE && input_index == num_samples) {
-      status = TTS_SYNTH_DONE;
-    } else {
-      status = TTS_SYNTH_PENDING;
-    }
-
-    tts_callback_status callback_status = destination_->Receive(
-        dest_rate_, 1, &out_int16s_[0], out_samples, status);
-    if (callback_status != TTS_CALLBACK_CONTINUE) {
-      return callback_status;
-    }
-  }
-
-  return TTS_CALLBACK_CONTINUE;
-}
-
-}  // namespace speech_synthesis
diff --git a/resampler.h b/resampler.h
deleted file mode 100644
index ef6d17b..0000000
--- a/resampler.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Implementation of TtsDataReceiver that resamples the audio to a
-// different sample rate and then passes the resampled audio through
-// to another callback.
-
-#ifndef SPEECH_CLIENT_SYNTHESIS_SERVICE_RESAMPLER_H_
-#define SPEECH_CLIENT_SYNTHESIS_SERVICE_RESAMPLER_H_
-
-#include <stdint.h>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-
-#include "tts_receiver.h"
-
-namespace speech_synthesis {
-
-class Resampler : public TtsDataReceiver {
- public:
-  // Resamples the audio passed to this object's Receive method and passes
-  // the resampled audio through to the destination.
-  Resampler(TtsDataReceiver *destination,
-            int source_rate,
-            int dest_rate,
-            int buffer_size);
-
-  virtual ~Resampler();
-
-  // TtsDataReceiver override.
-  virtual tts_callback_status Receive(int rate,
-                                      int num_channels,
-                                      const int16_t* data,
-                                      int num_samples,
-                                      tts_synth_status status) OVERRIDE;
-
-  int source_rate() { return source_rate_; }
-
-  int dest_rate() { return dest_rate_; }
-
- private:
-  TtsDataReceiver* destination_;
-  int source_rate_;
-  int dest_rate_;
-  double factor_;
-  int buffer_size_;
-  void* resample_handle_;
-  std::vector<float> in_floats_;
-  std::vector<float> out_floats_;
-  std::vector<int16_t> out_int16s_;
-
-  DISALLOW_COPY_AND_ASSIGN(Resampler);
-};
-}  // namespace speech_synthesis
-
-#endif  // SPEECH_CLIENT_SYNTHESIS_SERVICE_RESAMPLER_H_
diff --git a/ringbuffer.h b/ringbuffer.h
deleted file mode 100644
index 9111060..0000000
--- a/ringbuffer.h
+++ /dev/null
@@ -1,220 +0,0 @@
-// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Templatized, thread-safe RingBuffer.  Acts like a FIFO, but using a
-// fixed-size buffer that wraps around and optimized for operations that
-// read or write many elements at a time.  Commonly used to buffer audio
-// samples that need to be passed from one thread to another.
-//
-// Supports a flag "finished" so the writing thread can notify the reading
-// thread that there's no more data.
-//
-// The implementation is all contained within this .h file because
-// it's templatized.
-
-#ifndef SPEECH_CLIENT_SYNTHESIS_SERVICE_RINGBUFFER_H_
-#define SPEECH_CLIENT_SYNTHESIS_SERVICE_RINGBUFFER_H_
-
-#include "threading.h"
-
-namespace speech_synthesis {
-
-template<typename T> class RingBuffer {
- public:
-  // Construct a RingBuffer using a given Threading object (used for
-  // locking - may not be NULL) of a given capacity (cannot be increased
-  // later).
-  explicit RingBuffer(int capacity);
-
-  // Destructor.
-  ~RingBuffer();
-
-  //
-  // Methods for either thread
-  //
-
-  int GetCapacity() { return buffer_.size(); }
-
-  //
-  // Methods for the writer thread
-  //
-
-  // Reset to the initial state: the ring buffer is empty and marked as
-  // unfinished.
-  void Reset();
-
-  // Get the number of items of type T that are available to be written.
-  // This will be a number between 0 and capacity, inclusive.
-  int WriteAvail();
-
-  // Write *len* elements to the end of the ring buffer.  Returns true on
-  // success.  If all *len* elements cannot be written without blocking,
-  // returns false and writes nothing.
-  bool Write(const T* data, int len);
-
-  // Mark the buffer as finished.  Future write operations will fail.
-  // Read operations will succeed until the buffer is empty, but
-  // IsFinished() will return true immediately.
-  void MarkFinished();
-
-  //
-  // Methods for the reader thread
-  //
-
-  // Get the number of items of type T that are available to be read.
-  // This will be a number between 0 and capacity, inclusive.
-  int ReadAvail();
-
-  // Read *len* elements from the front of the ring buffer.  Returns true on
-  // success.  If all *len* elements cannot be read without blocking,
-  // returns false and reads nothing.
-  bool Read(T* data, int len);
-
-  // Returns true if the buffer has been marked as finished by a call to
-  // MarkFinished, whether the buffer is empty or not.
-  bool IsFinished();
-
- private:
-  scoped_ptr<Mutex> mutex_;
-  std::vector<T> buffer_;
-  bool finished_;
-  volatile int read_pos_;
-  volatile int write_pos_;
-
-  DISALLOW_COPY_AND_ASSIGN(RingBuffer);
-};
-
-//
-// Implementation notes:
-//
-// We use a simple mutex to protect all of the fields.
-//
-// A special value of -1 is used for read_pos_ to indicate that the buffer
-// is empty, otherwise there would be no way to distinguish between an empty
-// buffer and a full buffer when read_pos_ == write_pos_.
-//
-
-template<typename T> RingBuffer<T>::RingBuffer(int capacity)
-    : mutex_(Mutex::Create()),
-      buffer_(capacity),
-      finished_(false),
-      read_pos_(0),
-      write_pos_(0) {
-  Reset();
-}
-
-template<typename T> RingBuffer<T>::~RingBuffer() {
-}
-
-template<typename T> void RingBuffer<T>::Reset() {
-  mutex_->Lock();
-  finished_ = false;
-  read_pos_ = -1;
-  write_pos_ = 0;
-  mutex_->Unlock();
-};
-
-template<typename T> int RingBuffer<T>::WriteAvail() {
-  int avail = GetCapacity();
-  mutex_->Lock();
-  if (read_pos_ != -1) {
-    avail = read_pos_ - write_pos_;
-  }
-  mutex_->Unlock();
-  if (avail < 0) {
-    avail += GetCapacity();
-  }
-  return avail;
-}
-
-template<typename T> bool RingBuffer<T>::Write(const T* data, int len) {
-  mutex_->Lock();
-  if (finished_) {
-    mutex_->Unlock();
-    return false;
-  }
-  int avail = GetCapacity();
-  if (read_pos_ != -1) {
-    avail = read_pos_ - write_pos_;
-  }
-  if (avail < 0) {
-    avail += GetCapacity();
-  }
-  if (len > avail) {
-    mutex_->Unlock();
-    return false;
-  }
-
-  if (read_pos_ == -1) {
-    read_pos_ = write_pos_;
-  }
-  for (int i = 0; i < len; i++) {
-    buffer_[write_pos_] = data[i];
-    write_pos_ = (write_pos_ + 1) % GetCapacity();
-  }
-  mutex_->Unlock();
-
-  return true;
-}
-
-template<typename T> void RingBuffer<T>::MarkFinished() {
-  mutex_->Lock();
-  finished_ = true;
-  mutex_->Unlock();
-}
-
-template<typename T> int RingBuffer<T>::ReadAvail() {
-  mutex_->Lock();
-  if (read_pos_ == -1) {
-    mutex_->Unlock();
-    return 0;
-  }
-  int avail = write_pos_ - read_pos_;
-  mutex_->Unlock();
-  if (avail <= 0) {
-    avail += GetCapacity();
-  }
-  return avail;
-}
-
-template<typename T> bool RingBuffer<T>::Read(T* data, int len) {
-  mutex_->Lock();
-  int avail;
-  if (read_pos_ == -1) {
-    avail = 0;
-  } else {
-    avail = write_pos_ - read_pos_;
-    if (avail <= 0) {
-      avail += GetCapacity();
-    }
-  }
-  if (len > avail) {
-    mutex_->Unlock();
-    return false;
-  }
-
-  for (int i = 0; i < len; i++) {
-    data[i] = buffer_[read_pos_];
-    read_pos_ = (read_pos_ + 1) % GetCapacity();
-  }
-
-  if (read_pos_ == write_pos_) {
-    read_pos_ = -1;
-  }
-
-  mutex_->Unlock();
-
-  return true;
-}
-
-template<typename T> bool RingBuffer<T>::IsFinished() {
-  mutex_->Lock();
-  bool is_finished = finished_;
-  mutex_->Unlock();
-  return is_finished;
-}
-
-}  // namespace speech_synthesis
-
-#endif  // SPEECH_CLIENT_SYNTHESIS_SERVICE
diff --git a/speech_synthesizer.xml b/speech_synthesizer.xml
deleted file mode 100644
index bc355df..0000000
--- a/speech_synthesizer.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!--
-  Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-  Use of this source code is governed by a BSD-style license that can be
-  found in the LICENSE file.
-
-     dbus-binding-tool -mode=glib-server -prefix=speech_synthesis speech_synthesis.xml
-                        &gt; bindings/server.h
--->
-<node name="/org/chromium/">
-  <interface name="org.chromium.SpeechSynthesizerInterface">
-    <annotation name="org.freedesktop.DBus.GLib.CSymbol"
-                value="speech_synthesizer"/>
-    <method name="Speak">
-      <arg type="s" name="text" direction="in" />
-      <arg type="s" name="properties" direction="in" />
-    </method>
-    <method name="Stop">
-    </method>
-    <method name="IsSpeaking">
-      <arg type="b" name="done" direction="out" />
-    </method>
-    <method name="Shutdown">
-    </method>
-  </interface>
-</node>
diff --git a/speech_synthesizer_main.cc b/speech_synthesizer_main.cc
deleted file mode 100644
index a582c2d..0000000
--- a/speech_synthesizer_main.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <iostream>
-#include <errno.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <base/basictypes.h>
-#include <base/command_line.h>
-#include <chromeos/dbus/dbus.h>
-#include <chromeos/glib/object.h>
-#include <chromeos/syslog_logging.h>
-
-#include "base/logging.h"
-#include "speech_synthesizer_service.h"
-
-// Starts the speech synthesis DBus service.
-namespace speech_synthesis {
-
-static const char kLogFile[] = "log-file";
-
-} // namespace speech_synthesis
-
-int main(int argc, char* argv[]) {
-  CommandLine::Init(argc, argv);
-  CommandLine *cl = CommandLine::ForCurrentProcess();
-  const std::string log_file =
-      cl->GetSwitchValueASCII(speech_synthesis::kLogFile);
-  if (log_file.empty()) {
-    // Log goes to syslog unless --log-file option is provided
-    chromeos::InitLog(chromeos::kLogToSyslog | chromeos::kLogToStderr);
-  } else {
-    logging::InitLogging(log_file.c_str(),
-                         logging::LOG_TO_BOTH_FILE_AND_SYSTEM_DEBUG_LOG,
-                         logging::DONT_LOCK_LOG_FILE,
-                         logging::APPEND_TO_OLD_LOG_FILE,
-                         logging::DISABLE_DCHECK_FOR_NON_OFFICIAL_RELEASE_BUILDS
-                         );
-  }
-  LOG(INFO) << "Starting speech_synthesizer service.";
-  ::g_type_init();
-  speech_synthesis::SpeechSynthesizerService service;
-  if (!service.Initialize()) {
-    LOG(ERROR) << "Failed to initialize.";
-    return -1;
-  }
-  if (!service.Register(chromeos::dbus::GetSystemBusConnection())) {
-    LOG(ERROR) << "Failed to register";
-    return -1;
-  }
-  if (!service.Run()) {
-    LOG(ERROR) << "Failed to run";
-    return -1;
-  }
-  LOG(INFO) << "Finished speech_synthesizer service.";
-  return 0;
-}
diff --git a/speech_synthesizer_service.cc b/speech_synthesizer_service.cc
deleted file mode 100644
index e561024..0000000
--- a/speech_synthesizer_service.cc
+++ /dev/null
@@ -1,218 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <iostream>
-#include <base/basictypes.h>
-#include <base/command_line.h>
-#include <chromeos/dbus/dbus.h>
-#include <chromeos/dbus/service_constants.h>
-#include <chromeos/glib/object.h>
-#include <dbus/dbus-glib-lowlevel.h>
-
-#include "base/logging.h"
-#include "interface.h"
-
-// Forcibly namespace the dbus-bindings generated server bindings instead of
-// modifying the files afterward.
-namespace speech_synthesis {  // NOLINT
-namespace gobject {  // NOLINT
-#include "bindings/server.h"
-}  // namespace gobject
-}  // namespace speech_Synthesis
-
-namespace speech_synthesis {
-
-SpeechSynthesizerService::SpeechSynthesizerService()
-    : speech_synthesizer_(NULL),
-      main_loop_(g_main_loop_new(NULL, FALSE)) {
-}
-
-SpeechSynthesizerService::~SpeechSynthesizerService() {
-  if (speech_synthesizer_)
-    g_object_unref(speech_synthesizer_);
-  g_main_loop_unref(main_loop_);
-}
-
-bool SpeechSynthesizerService::Initialize() {
-  // Install the type-info for the service with dbus.
-  dbus_g_object_type_install_info(
-      gobject::speech_synthesizer_get_type(),
-      &gobject::dbus_glib_speech_synthesizer_object_info);
-  return Reset();
-}
-
-bool SpeechSynthesizerService::Reset() {
-  if (speech_synthesizer_)
-    g_object_unref(speech_synthesizer_);
-  speech_synthesizer_ = reinterpret_cast<gobject::SpeechSynthesizer*>(
-      g_object_new(gobject::speech_synthesizer_get_type(), NULL));
-
-  // Allow references to this instance.
-  speech_synthesizer_->service = this;
-
-  if (main_loop_) {
-    ::g_main_loop_unref(main_loop_);
-  }
-  main_loop_ = g_main_loop_new(NULL, false);
-  if (!main_loop_) {
-    LOG(ERROR) << "Failed to create main loop";
-    return false;
-  }
-  return true;
-}
-
-// A utility function to send a signal to the browser.
-void SendSignal(const char* signal_name) {
-  chromeos::dbus::Proxy proxy(chromeos::dbus::GetSystemBusConnection(),
-                              "/",
-                              chromium::kChromiumInterface);
-  DBusMessage* signal = ::dbus_message_new_signal(
-      "/",
-      chromium::kChromiumInterface,
-      signal_name);
-  DCHECK(signal);
-  ::dbus_g_proxy_send(proxy.gproxy(), signal, NULL);
-  ::dbus_message_unref(signal);
-}
-
-bool SpeechSynthesizerService::Run() {
-  if (!main_loop_) {
-    LOG(ERROR) << "You must have a main loop to call Run.";
-    return false;
-  }
-
-  LOG(INFO) << "Running speech_synthesizer main_loop.";
-  scoped_ptr<AudioOutput> audio_output(AudioOutput::Create());
-  scoped_ptr<TtsEngine> engine(new PicoTtsEngine("/usr/share/tts/pico/"));
-  ttsService_.reset(new TtsService(engine.get(), audio_output.get()));
-  utterance_options_.reset(new UtteranceOptions());
-
-  // Polling for idle shutdown.
-  const int kTimeoutInterval = 10000;  // milliseconds
-  UpdateLastCallTime();
-  g_timeout_add(kTimeoutInterval, OnTimeout, this);
-
-  if (ttsService_->StartService()) {
-    SendSignal(chromium::kTTSReadySignal);
-    g_main_loop_run(main_loop_);
-  } else {
-    SendSignal(chromium::kTTSFailedSignal);
-    return false;
-  }
-  ttsService_->StopService();
-  return true;
-}
-
-gboolean SpeechSynthesizerService::AddProperties(gchar *properties) {
-  if (properties == NULL) {
-    return false;
-  }
-  string props(properties);
-  if (props.compare("") == 0) {
-    return true;
-  }
-  string token = "";
-  while(1) {
-    unsigned int sep = props.find(";");
-    if (sep == string::npos) {
-      token = props;
-    } else {
-      token = props.substr(0, sep);
-      props = props.substr(sep + 1);
-    }
-    if (token.empty() || token.compare("") == 0) {
-      break;
-    }
-    int eq = token.find("=");
-    string key = token.substr(0, eq);
-    string value = token.substr(eq + 1);
-
-    if (key.compare("rate") == 0) {
-      utterance_options_->rate = atof(value.c_str());
-    } else if (key.compare("pitch") == 0) {
-      utterance_options_->pitch = atof(value.c_str());
-    } else if (key.compare("volume") == 0) {
-      utterance_options_->volume = atof(value.c_str());
-    } else if (key.compare("name") == 0) {
-      utterance_options_->voice_options.name = value;
-    } else if (key.compare("language") == 0) {
-      utterance_options_->voice_options.language = value;
-    } else if (key.compare("sample_rate") == 0) {
-      utterance_options_->voice_options.sample_rate = atoi(value.c_str());
-    } else if (key.compare("quality") == 0) {
-      utterance_options_->voice_options.quality =
-          (tts_quality) atoi(value.c_str());
-    } else if (key.compare("region") == 0) {
-      utterance_options_->voice_options.region = value;
-    } else if (key.compare("gender") == 0) {
-      utterance_options_->voice_options.gender =
-          (tts_gender) atoi(value.c_str());
-    } else if (key.compare("age") == 0) {
-      utterance_options_->voice_options.age = atoi(value.c_str());
-    } else if (key.compare("enqueue") == 0) {
-      utterance_options_->enqueue = atoi(value.c_str()) == 1;
-    } else if (key.compare("interruptible") == 0) {
-      utterance_options_->interruptible = atoi(value.c_str()) == 1;
-    }
-    if (sep == string::npos) {
-      break;
-    }
-  }
-  return true;
-}
-
-void SpeechSynthesizerService::UpdateLastCallTime() {
-  time_last_call_ = base::Time::Now();
-}
-
-void SpeechSynthesizerService::ShutdownIfIdle() {
-  const int kShutdownTimeout = 60000;
-  const base::Time shutdown_time =
-      time_last_call_ + base::TimeDelta::FromMilliseconds(kShutdownTimeout);
-  if (base::Time::Now() >= shutdown_time &&
-      ttsService_->GetStatus() == TTS_IDLE)
-    g_main_loop_quit(main_loop());
-}
-
-// static
-gboolean SpeechSynthesizerService::OnTimeout(gpointer user_data) {
-  static_cast<SpeechSynthesizerService*>(user_data)->ShutdownIfIdle();
-  // TRUE means this method will be called again, repeatedly.
-  return TRUE;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// SpeechSynthesizerService commands
-
-gboolean SpeechSynthesizerService::Speak(gchar *text,
-                                         gchar *properties,
-                                         GError **error) {
-  UpdateLastCallTime();
-  AddProperties(properties);
-  ttsService_->Speak(text, *utterance_options_);
-  utterance_options_->enqueue = false;
-  utterance_options_->interruptible = true;
-  return true;
-}
-
-gboolean SpeechSynthesizerService::Stop(GError **error) {
-  UpdateLastCallTime();
-  ttsService_->Stop();
-  return true;
-}
-
-gboolean SpeechSynthesizerService::IsSpeaking(
-    gboolean* OUT_isSpeaking_requested,
-    GError **error) {
-  UpdateLastCallTime();
-  *OUT_isSpeaking_requested = (ttsService_->GetStatus() == TTS_BUSY);
-  return true;
-}
-
-gboolean SpeechSynthesizerService::Shutdown(GError **error) {
-  g_main_loop_quit(main_loop());
-  return true;
-}
-
-} // namespace speech_synthesis
diff --git a/speech_synthesizer_service.h b/speech_synthesizer_service.h
deleted file mode 100644
index bec9f39..0000000
--- a/speech_synthesizer_service.h
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SPEECH_SYNTHESIS_SPEECH_SYNTHESIZER_SERVICE_H_
-#define SPEECH_SYNTHESIS_SPEECH_SYNTHESIZER_SERVICE_H_
-
-#include "base/memory/scoped_ptr.h"
-#include "base/time.h"
-
-#include <chromeos/dbus/abstract_dbus_service.h>
-#include <chromeos/dbus/dbus.h>
-#include <chromeos/dbus/service_constants.h>
-
-#include "pico/pico_tts_engine.h"
-#include "threading.h"
-#include "tts_engine.h"
-#include "tts_service.h"
-
-namespace speech_synthesis {
-namespace gobject {
-struct SpeechSynthesizer;
-} // namespace gobject
-
-// Provides a wrapper for exporting SpeechSynthesizerInterface to
-// D-Bus and entering the glib run loop.
-//
-// ::g_type_init() must be called before this class is used.
-class SpeechSynthesizerService : public chromeos::dbus::AbstractDbusService {
- public:
-  SpeechSynthesizerService();
-  virtual ~SpeechSynthesizerService();
-
-  ////////////////////////////////////////////////////////////////////////////
-  // Implementing chromeos::dbus::AbstractDbusService
-  virtual bool Initialize() OVERRIDE;
-  virtual bool Reset() OVERRIDE;
-
-  virtual bool Run()OVERRIDE;
-
-  virtual const char* service_name() const OVERRIDE {
-    return kSpeechSynthesizerServiceName;
-  }
-  virtual const char* service_path() const OVERRIDE {
-    return kSpeechSynthesizerServicePath;
-  }
-  virtual const char* service_interface() const OVERRIDE {
-    return kSpeechSynthesizerInterface;
-  }
-  virtual GObject* service_object() const OVERRIDE{
-    return G_OBJECT(speech_synthesizer_);
-  }
-
-  // Interface function prototypes which wrap service.
-  gboolean Speak(gchar *text,
-                 gchar *properties,
-                 GError **error);
-  gboolean Stop(GError **error);
-  gboolean IsSpeaking(gboolean *OUT_isSpeaking_requested,
-                GError **error);
-  gboolean Shutdown(GError **error);
-
- protected:
-  // AbstractDbusService override.
-  virtual GMainLoop* main_loop() OVERRIDE { return main_loop_; }
-
- private:
-  scoped_ptr<TtsService> ttsService_;
-  scoped_ptr<AudioOutput> audio_output_;
-  scoped_ptr<UtteranceOptions> utterance_options_;
-
-  gobject::SpeechSynthesizer* speech_synthesizer_;
-  GMainLoop* main_loop_;
-
-  // The time when the last dbus method call was made.
-  base::Time time_last_call_;
-
-  gboolean AddProperties(gchar *properties);
-
-  // Update |time_last_call_| to delay idle shutdown.
-  void UpdateLastCallTime();
-  // Shutdown the service if dbus method call has not been made for long time.
-  void ShutdownIfIdle();
-  // Handler method to be used by g_timeout_add.
-  static gboolean OnTimeout(gpointer user_data);
-
-  DISALLOW_COPY_AND_ASSIGN(SpeechSynthesizerService);
-};
-
-} // namespace speech_synthesis
-#endif // SPEECH_SYNTHESIS_SPEECH_SYNTHESIZER_SERVICE_H_
diff --git a/threading.h b/threading.h
deleted file mode 100644
index 67b6c3e..0000000
--- a/threading.h
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Abstract interfaces for threading classes that need to be implemented
-// for each platform.
-
-#ifndef SPEECH_CLIENT_SYNTHESIS_SERVICE_THREADING_H_
-#define SPEECH_CLIENT_SYNTHESIS_SERVICE_THREADING_H_
-
-namespace speech_synthesis {
-
-// An interface for a runnable class.
-// TODO(chaitanyag): Implement this using chromeos's threading library from
-// third_party/chrome/base
-class Runnable {
- public:
-  virtual ~Runnable() { }
-
-  virtual void Run() = 0;
-};
-
-// A simple mutex.  Only one thread can hold the lock at a time.
-class Mutex {
- public:
-  virtual ~Mutex() { }
-
-  virtual void Lock() = 0;
-  virtual void Unlock() = 0;
-
-  // Creates an instance of Mutex.
-  static Mutex* Create();
-};
-
-// A condition variable, used so that Thread B can wait until Thread A has
-// signalled it to continue.  Thread B locks a mutex and then checks to see
-// if the variable it's looking for is ready.  If not, it calls Wait,
-// passing it the mutex.  Meanwhile, when Thread A finishes the work it's
-// doing, it locks the mutex, updates the variable, and then calls
-// Signal, which instantly wakes up Thread B as soon as Thread A has
-// released its lock.
-class CondVar {
- public:
-  virtual ~CondVar() { }
-
-  // The mutex MUST be locked before calling this method, and unlocked after.
-  virtual void Wait(Mutex* mutex) = 0;
-
-  // The mutex MUST be locked before calling this method, and unlocked after.
-  // Will exit after the specified number of milliseconds have passed,
-  // regardless of the status of the condition variable.
-  virtual void WaitWithTimeout(Mutex* mutex, int timeout_ms) = 0;
-
-  // The mutex MUST be locked before calling this method, and unlocked after.
-  virtual void Signal() = 0;
-
-  // Creates an instance of CondVar.
-  static CondVar* Create();
-};
-
-// A joinable thread.
-class Thread {
- public:
-  virtual ~Thread() { }
-
-  // Block until this thread has finished.  Deletes this object upon return.
-  virtual void Join() = 0;
-
-  // Starts a thread and runs action->Run() on it.
-  // Returns the started thread.
-  static Thread* StartJoinableThread(Runnable *action);
-};
-
-}  // namespace speech_synthesis
-
-#endif  // SPEECH_CLIENT_SYNTHESIS_SERVICE_THREADING_H_
diff --git a/tts_engine.cc b/tts_engine.cc
deleted file mode 100644
index b0a8115..0000000
--- a/tts_engine.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Implementation of cross-engine TtsEngine code.
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <map>
-#include <vector>
-
-#include "tts_engine.h"
-
-using std::map;
-using std::vector;
-
-namespace speech_synthesis {
-
-int TtsEngine::GetVoiceIndex(const TtsVoice& voice_options) {
-  int count = GetVoiceCount();
-  for (int i = 0; i < count; i++) {
-    const TtsVoice* voice = GetVoiceInfo(i);
-    if (TtsEngine::VoiceMatches(*voice, voice_options)) {
-      return i;
-    }
-  }
-  return -1;
-}
-
-bool TtsEngine::VoiceMatches(const TtsVoice& voice, const TtsVoice& pattern) {
-  return (pattern.name.empty()
-          || strcasecmp(voice.name.c_str(), pattern.name.c_str()) == 0)
-      && (pattern.language.empty()
-          || strcasecmp(voice.language.c_str(),
-                        pattern.language.c_str()) == 0)
-      && (pattern.sample_rate == 0
-          || voice.sample_rate == pattern.sample_rate)
-      && (pattern.quality == TTS_UNSPECIFIED_QUALITY
-          || voice.quality == pattern.quality)
-      && (pattern.region.empty()
-          || strcasecmp(voice.region.c_str(), pattern.region.c_str()) == 0)
-      && (pattern.gender == TTS_UNSPECIFIED_GENDER
-          || voice.gender == pattern.gender)
-      && (pattern.age == 0
-          || voice.age == pattern.age);
-}
-
-tts_result TtsEngine::SetVoiceByLanguage(const string& language_code) {
-  int count = GetVoiceCount();
-  for (int i = 0; i < count; i++) {
-    if (0 == strcasecmp(GetVoiceInfo(i)->language.c_str(),
-                        language_code.c_str())) {
-      return SetVoice(i);
-    }
-  }
-  return TTS_FAILURE;
-}
-
-}  // namespace speech_synthesis
diff --git a/tts_engine.h b/tts_engine.h
deleted file mode 100644
index 9eda415..0000000
--- a/tts_engine.h
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// This header defines the interface to access Text-To-Speech functionality
-// in shared libraries that implement speech synthesis and the management
-// of resources associated with the synthesis.
-// An example of the implementation of this interface can be found in
-// pico/tts_engine.cc
-
-#ifndef SPEECH_CLIENT_SYNTHESIS_SERVICE_TTS_ENGINE_H_
-#define SPEECH_CLIENT_SYNTHESIS_SERVICE_TTS_ENGINE_H_
-
-#include <string>
-
-#include "tts_receiver.h"
-
-using std::string;
-
-namespace speech_synthesis {
-
-enum tts_result {
-  TTS_SUCCESS = 0,
-  TTS_FAILURE = -1,
-  TTS_FEATURE_UNSUPPORTED = -2,
-  TTS_VALUE_INVALID = -3,
-  TTS_PROPERTY_UNSUPPORTED = -4,
-  TTS_MISSING_RESOURCES = -5
-};
-
-enum tts_gender {
-  TTS_UNSPECIFIED_GENDER = 0,
-  TTS_MALE = 1,
-  TTS_FEMALE = 2
-};
-
-enum tts_quality {
-  TTS_UNSPECIFIED_QUALITY = 0,
-  TTS_EXPERIMENTAL_QUALITY = 1,
-  TTS_LOW_QUALITY = 2,
-  TTS_NORMAL_QUALITY = 3,
-  TTS_HIGH_QUALITY = 4
-};
-
-struct TtsVoice {
- public:
-  // Required
-  string name;
-  string language;
-  int sample_rate;
-  tts_quality quality;
-
-  // Optional
-  string region;
-  tts_gender gender;
-  int age;
-
-  TtsVoice()
-      : name(),
-        language(),
-        sample_rate(0),
-        quality(TTS_UNSPECIFIED_QUALITY),
-        region(),
-        gender(TTS_UNSPECIFIED_GENDER),
-        age(0) {
-  }
-};
-
-class TtsEngine {
- public:
-  virtual ~TtsEngine() {}
-
-  // Initialize the TTS engine and returns whether initialization succeeded.
-  // @return TTS_SUCCESS, or TTS_FAILURE
-  virtual tts_result Init() = 0;
-
-  // Shut down the TTS engine and releases all associated resources.
-  // @return TTS_SUCCESS, or TTS_FAILURE
-  virtual tts_result Shutdown() = 0;
-
-  // Interrupt synthesis and flushes any synthesized data that hasn't been
-  // output yet. This will block until callbacks underway are completed.
-  // @return TTS_SUCCESS, or TTS_FAILURE
-  virtual tts_result Stop() = 0;
-
-  // Return the number of loaded voices
-  virtual int GetVoiceCount() = 0;
-
-  // Return information about the ith voice
-  virtual const TtsVoice* GetVoiceInfo(int voice_index) = 0;
-
-  // Returns true iff the specified voice matches the pattern given in
-  // voice_options.  Default values in voice_options are treated as wildcards.
-  static bool VoiceMatches(const TtsVoice& voice,
-                           const TtsVoice& voice_options);
-
-  // Return the voice index for the first voice matching the specified
-  // voice options, or -1 if there are no matching voices.
-  int GetVoiceIndex(const TtsVoice& voice_options);
-
-  // Switch to the voice with the given index.
-  // @return TTS_SUCCESS or TTS_FAILURE
-  virtual tts_result SetVoice(int voice_index) = 0;
-
-  // Switch to the first voice in the given language code.
-  // @return TTS_SUCCESS or TTS_FAILURE
-  tts_result SetVoiceByLanguage(const string& language_code);
-
-  // Switch to the first voice with matching properties.
-  // @return TTS_SUCCESS or TTS_FAILURE
-  tts_result SetVoiceByProperties(const TtsVoice& voice_options) {
-    return SetVoice(GetVoiceIndex(voice_options));
-  }
-
-  // Set the object that will receive completed audio samples
-  virtual void SetReceiver(TtsDataReceiver* receiver) = 0;
-
-  // Set a property for the the TTS engine
-  // @param property pointer to the property name
-  // @param value    pointer to the new property value, null-terminated utf-8
-  // @return         TTS_PROPERTY_UNSUPPORTED, or TTS_SUCCESS, or
-  //                   TTS_FAILURE, or TTS_VALUE_INVALID
-  virtual tts_result SetProperty(const char *property, const char *value) = 0;
-
-  // Set the speaking rate/speed.
-  // @param rate the speaking rate in the range of 0 to 1. Default is 0.2
-  // @return     TTS_SUCCESS, or TTS_FAILURE, or TTS_VALUE_INVALID
-  virtual tts_result SetRate(float rate) = 0;
-
-  // Set the speaking pitch.
-  // @param pitch the speaking pitch in the range of 0 to 1. Default is 0.5
-  // @return      TTS_SUCCESS, or TTS_FAILURE, or TTS_VALUE_INVALID
-  virtual tts_result SetPitch(float pitch) = 0;
-
-  // Set the speaking volume.
-  // @param volume the speaking volume in the range of 0 to 1. Default is 0.2
-  // @return       TTS_SUCCESS, or TTS_FAILURE, or TTS_VALUE_INVALID
-  virtual tts_result SetVolume(float volume) = 0;
-
-  // Retrieve a property from the TTS engine
-  // @param        property   pointer to the property name
-  // @param[out]   out_value  will return a const pointer to the
-  //                            retrieved value, or null if it doesn't exist
-  // @return TTS_PROPERTY_UNSUPPORTED, or TTS_SUCCESS
-  virtual tts_result GetProperty(const char *property, const char **value) = 0;
-
-  // Get the sample rate of the currently selected voice
-  // @return the sample rate in Hz
-  virtual int GetSampleRate() = 0;
-
-  // Synthesize the text.
-  // As the synthesis is performed, the engine invokes the callback to notify
-  // the TTS framework that it has filled the given buffer, and indicates how
-  // many bytes it wrote. The callback is called repeatedly until the engine
-  // has generated all the audio data corresponding to the text.
-  // Text is coded in UTF-8 and supports SSML.
-  //
-  // @param text                 null-terminated UTF-8 text to synthesize
-  // @param audio_buffer         buffer to write output audio samples
-  // @param audio_sample_count   number of samples in the audio buffer
-  // @param out_total_samples    receives total number of samples output
-  // @return                     TTS_SUCCESS or TTS_FAILURE
-  virtual tts_result SynthesizeText(const char *text,
-                                    int16_t* audio_buffer,
-                                    int audio_sample_count,
-                                    int* out_total_samples) = 0;
-};
-
-}  // namespace speech_synthesis
-
-#endif  // SPEECH_CLIENT_SYNTHESIS_SERVICE_TTS_ENGINE_H_
diff --git a/tts_receiver.h b/tts_receiver.h
deleted file mode 100644
index 208dd64..0000000
--- a/tts_receiver.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Defined an interface to be implemented for passing as a callback
-// to receive synthesized audio data from the TTS engine.
-
-#include <stdint.h>
-#include <cstring>
-
-#ifndef SPEECH_CLIENT_SYNTHESIS_SERVICE_TTS_RECEIVER_H_
-#define SPEECH_CLIENT_SYNTHESIS_SERVICE_TTS_RECEIVER_H_
-
-namespace speech_synthesis {
-
-enum tts_synth_status {
-  TTS_SYNTH_DONE = 0,         // Only the LAST call to Receive() for a given
-                              // synthesis should have status = TTS_SYNTH_DONE.
-  TTS_SYNTH_PENDING = 1
-};
-
-enum tts_callback_status {
-  TTS_CALLBACK_CONTINUE = 1,  // The normal case: continue if there's more data.
-  TTS_CALLBACK_HALT = 0,      // Stop synthesis.  The engine should
-                              // return TTS_SUCCESS from SynthesizeText().
-  TTS_CALLBACK_ERROR = 2      // Stop synthesis due to error.  The engine should
-                              // return TTS_FAILURE from SynthesizeText().
-};
-
-template <class DataElement>
-class TtsGenericDataReceiver {
- public:
-  virtual ~TtsGenericDataReceiver() {}
-  // Note that 'data' may be null if num_data_elements is zero;
-  // this is often used with status = TTS_SYNTH_DONE to signal
-  // the end of data.
-  // TODO(fergus): refactor this to remove the status parameter
-  // and instead use a separate Done() method.
-  virtual tts_callback_status Receive(int rate, int num_channels,
-      const DataElement* data, int num_data_elements,
-      tts_synth_status status) = 0;
-};
-
-// For raw audio (linear 16 bit encoding).
-typedef TtsGenericDataReceiver<int16_t> TtsDataReceiver;
-
-// For compressed audio (arbitrary encoding).
-typedef TtsGenericDataReceiver<char> TtsEncodedDataReceiver;
-}
-
-#endif  // SPEECH_CLIENT_SYNTHESIS_SERVICE_TTS_RECEIVER_H_
-
diff --git a/tts_service.cc b/tts_service.cc
deleted file mode 100644
index 7010afd..0000000
--- a/tts_service.cc
+++ /dev/null
@@ -1,308 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "tts_service.h"
-
-#include "log.h"
-#include "resampler.h"
-#include "ringbuffer.h"
-#include "tts_engine.h"
-
-namespace speech_synthesis {
-
-UtteranceOptions::UtteranceOptions()
-    : rate(1),
-      pitch(1),
-      volume(1),
-      enqueue(false),
-      interruptible(true) {
-}
-
-TtsService::TtsService(TtsEngine *engine, AudioOutput *audio_output)
-    : engine_(engine),
-      audio_output_(audio_output),
-      current_utterance_(NULL),
-      mutex_(Mutex::Create()),
-      cond_var_(CondVar::Create()),
-      service_running_(false),
-      utterance_running_(false),
-      current_utterance_interruptible_(true) {
-}
-
-TtsService::~TtsService() {
-}
-
-bool TtsService::StartService() {
-  if (!audio_output_->Init(this)) {
-    LOG(ERROR) << "TTS Service unable to open audio output.";
-    return false;
-  }
-  ring_buffer_.reset(
-      new RingBuffer<int16_t>(audio_output_->GetTotalBufferSize()));
-  audio_buffer_.resize(audio_output_->GetChunkSize());
-  if (engine_->Init() != TTS_SUCCESS) {
-    return false;
-  }
-  LOG(INFO) << "StartService";
-  audio_output_->StartAudio();
-  service_running_ = true;
-  thread_.reset(Thread::StartJoinableThread(this));
-  return true;
-}
-
-void TtsService::StopService() {
-  Stop();
-  if (!service_running_) {
-    return;
-  }
-  LOG(INFO) << "Stopping audio.";
-  audio_output_->StopAudio();
-
-  LOG(INFO) << "Stopping main service.";
-  mutex_->Lock();
-  service_running_ = false;
-  cond_var_->Signal();
-  mutex_->Unlock();
-
-  LOG(INFO) << "Joining main thread.";
-  thread_->Join();
-  LOG(INFO) << "Joined";
-}
-
-void TtsService::Speak(const std::string& text,
-                       const UtteranceOptions& options) {
-  if (!service_running_) {
-    return;
-  }
-  Utterance *utterance = new Utterance;
-  utterance->text = text;
-  if ((utterance->voice_index =
-       engine_->GetVoiceIndex(options.voice_options)) == -1) {
-    utterance->voice_index = 0;
-  }
-  utterance->options = options;
-
-  mutex_->Lock();
-  if (!utterance->options.enqueue) {
-    // Remove from the back until a non-interruptible utterance is found.
-    // This means that the an utterance being non-interruptible gives a
-    // cascading effect on the utterances that are queued before the
-    // non-interruptible utterance. It can be enforced at a higher level
-    // that if interruptiple == false, then enqueue = false.
-    while (!utterances_.empty() &&
-           utterances_.back()->options.interruptible) {
-      delete utterances_.back();
-      utterances_.pop_back();
-    }
-    if (utterances_.empty() && current_utterance_interruptible_) {
-      ring_buffer_->Reset();
-      utterance_running_ = false;
-    }
-  }
-  utterances_.push_back(utterance);
-  cond_var_->Signal();
-  mutex_->Unlock();
-}
-
-void TtsService::Stop() {
-  if (!service_running_) {
-    return;
-  }
-  mutex_->Lock();
-  ring_buffer_->Reset();
-  while (!utterances_.empty()) {
-    delete utterances_.front();
-    utterances_.pop_front();
-  }
-  utterance_running_ = false;
-  cond_var_->Signal();
-  mutex_->Unlock();
-}
-
-tts_status TtsService::GetStatus() {
-  if (!service_running_) {
-    return TTS_ERROR;
-  }
-  tts_status status;
-  mutex_->Lock();
-  if (utterances_.empty() && !utterance_running_)
-    status = TTS_IDLE;
-  else
-    status = TTS_BUSY;
-  mutex_->Unlock();
-  return status;
-}
-
-void TtsService::WaitUntilFinished() {
-  if (!service_running_) {
-    return;
-  }
-  mutex_->Lock();
-  while (!utterances_.empty() || utterance_running_) {
-    cond_var_->Wait(mutex_.get());
-  }
-  mutex_->Unlock();
-}
-
-void TtsService::Run() {
-  if (!service_running_) {
-    return;
-  }
-  LOG(INFO) << "Running background thread";
-  for (;;) {
-    mutex_->Lock();
-    // If there are no utterances and there's no signal to stop,
-    // wait on our condition variable, which will allow this thread to
-    // sleep with no CPU usage and wake up immediately when there's
-    // work for us to do.
-    if (utterances_.empty() && service_running_ == true) {
-      cond_var_->Wait(mutex_.get());
-    }
-
-    if (service_running_ == false) {
-      LOG(INFO) << "Exiting background thread";
-      while (!utterances_.empty()) {
-        delete utterances_.front();
-        utterances_.pop_front();
-      }
-      mutex_->Unlock();
-      return;
-    }
-
-    if (current_utterance_ == NULL && !utterances_.empty()) {
-      current_utterance_ = utterances_.front();
-      current_utterance_interruptible_ =
-          current_utterance_->options.interruptible;
-      utterances_.pop_front();
-    }
-
-    utterance_running_ = true;
-
-    mutex_->Unlock();
-
-    if (!current_utterance_) {
-      continue;
-    }
-
-    engine_->SetRate(current_utterance_->options.rate);
-    engine_->SetPitch(current_utterance_->options.pitch);
-    engine_->SetVolume(current_utterance_->options.volume);
-
-    // Synthesize the current utterance.  The TTS engine will call our
-    // callback method, Receive, repeatedly while it performs synthesis.
-    // During that callback, we check if Stop was called and can cause
-    // this method to exit prematurely.  Otherwise this method won't exit
-    // until this utterance is done synthesizing, and then current_utterance_
-    // will be set to NULL.
-    int samples_output = 0;
-    engine_->SetVoice(current_utterance_->voice_index);
-
-    scoped_ptr<Resampler> resampler;
-    if (audio_output_->GetSampleRate() != engine_->GetSampleRate()) {
-      resampler.reset(new Resampler(this,
-                                     engine_->GetSampleRate(),
-                                     audio_output_->GetSampleRate(),
-                                     audio_buffer_.size()));
-      engine_->SetReceiver(resampler.get());
-    } else {
-      engine_->SetReceiver(this);
-    }
-
-    // Save the utterance text because current_utterance_ is deleted
-    // by the Done() callback before the call to SynthesizeText exits.
-    string utterance_text = current_utterance_->text;
-
-    engine_->SynthesizeText(
-        utterance_text.c_str(),
-        &audio_buffer_[0],
-        audio_buffer_.size(),
-        &samples_output);
-
-    // TODO(chaitanyag): Make the completion callback here.
-    VLOG(3) << "Done: " << utterance_text.c_str();
-
-    mutex_->Lock();
-    if (utterance_running_ == false) {
-      // The utterance was interrupted
-      engine_->Stop();
-    }
-    utterance_running_ = false;
-    cond_var_->Signal();
-    mutex_->Unlock();
-
-    delete current_utterance_;
-    current_utterance_ = NULL;
-  }
-}
-
-tts_callback_status TtsService::Receive(int rate,
-                                        int num_channels,
-                                        const int16_t* data,
-                                        int num_samples,
-                                        tts_synth_status status) {
-  if (status == TTS_SYNTH_DONE) {
-    current_utterance_ = NULL;
-  }
-
-  // Check if we need to exit prematurely
-  mutex_->Lock();
-  if (service_running_ == false || utterance_running_ == false) {
-    mutex_->Unlock();
-    return TTS_CALLBACK_HALT;
-  }
-  mutex_->Unlock();
-
-  // If there's no audio data, just return success
-  if (num_samples == 0) {
-    return TTS_CALLBACK_CONTINUE;
-  }
-
-  // If the ring buffer is full, compute the amount of time we expect
-  // it to take for that many audio samples to be output, and sleep for
-  // that long.
-  while (ring_buffer_->WriteAvail() < num_samples) {
-    int ms_to_sleep = num_samples * 1000 / rate;
-    mutex_->Lock();
-    cond_var_->WaitWithTimeout(mutex_.get(), ms_to_sleep);
-    if (service_running_ == false || utterance_running_ == false) {
-      mutex_->Unlock();
-      return TTS_CALLBACK_HALT;
-    }
-    mutex_->Unlock();
-  }
-
-  bool success = ring_buffer_->Write(data, num_samples);
-  if (!success) {
-    LOG(INFO) << "Unable to write to ring buffer";
-    exit(0);
-  }
-
-  if (status == TTS_SYNTH_DONE) {
-    ring_buffer_->MarkFinished();
-  }
-
-  return TTS_CALLBACK_CONTINUE;
-}
-
-bool TtsService::FillAudioBuffer(int16_t* samples, int size) {
-  int avail = ring_buffer_->ReadAvail();
-
-  // If the ring buffer is finished, play until the end.  Otherwise,
-  // only play if we have a full buffer.
-  int copy_len;
-  if (ring_buffer_->IsFinished()) {
-    copy_len = avail < size? avail : size;
-  } else {
-    copy_len = avail >= size? size : 0;
-  }
-
-  ring_buffer_->Read(samples, copy_len);
-  for (int i = copy_len; i < size; i++) {
-    samples[i] = 0;
-  }
-
-  return !ring_buffer_->IsFinished();
-}
-
-}  // namespace speech_synthesis
diff --git a/tts_service.h b/tts_service.h
deleted file mode 100644
index af8604f..0000000
--- a/tts_service.h
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// This header defines the interface to access a Text-To-Speech service
-// that manages background threads and presents a real-time, nonblocking
-// interface.
-
-#ifndef SPEECH_CLIENT_SYNTHESIS_SERVICE_TTS_SERVICE_H_
-#define SPEECH_CLIENT_SYNTHESIS_SERVICE_TTS_SERVICE_H_
-
-#include <stdint.h>
-
-#include <list>
-#include <string>
-#include <vector>
-
-#include "base/basictypes.h"
-#include "base/memory/scoped_ptr.h"
-
-#include "audio_output.h"
-#include "threading.h"
-#include "tts_engine.h"
-#include "tts_receiver.h"
-
-namespace speech_synthesis {
-
-enum tts_status {
-  TTS_IDLE = 0,
-  TTS_BUSY = 1,
-  TTS_ERROR = 2,
-};
-
-template<typename T> class RingBuffer;
-class TtsEngine;
-
-// Add more such as rate, pitch etc. in the future.
-struct UtteranceOptions {
- public:
-  TtsVoice voice_options;
-  // Default is 1. Use higher or lower values to increase or decrease the
-  // speaking rate. Map default to ~100 words/min if possible. Speech
-  // engines may or may not support this mapping.
-  float rate;
-  // Default is 1. Use higher or lower values to increase or decrease the
-  // speaking pitch. Map default to 200 Hz if possible. Speech
-  // engines may or may not support this exact mapping.
-  float pitch;
-  // Default is 1. Use higher or lower values to increase or decrease the
-  // speaking volume.
-  float volume;
-  // Whether to enqueue this utterance or flush the existing queue.
-  bool enqueue;
-  // Whether this utterance is interruptible.
-  bool interruptible;
-
-  UtteranceOptions();
-};
-
-struct Utterance {
- public:
-  std::string text;
-  int voice_index;
-  UtteranceOptions options;
-};
-
-class TtsService
-    : public AudioProvider,
-      public Runnable,
-      public TtsDataReceiver {
- public:
-  TtsService(TtsEngine *engine, AudioOutput *audio_output);
-
-  virtual ~TtsService();
-
-  //
-  // External interface
-  //
-
-  // Start the background service
-  bool StartService();
-
-  // Stop the background service.
-  void StopService();
-
-  // Queue up this text to be spoken and return immediately. The
-  // UtteranceOptions contains other settings such as language name, voice,
-  // pitch, rate etc. Currently language name specified as:
-  // <language>-<locale> is supported. Example: en-US, fr-FR, etc.
-  void Speak(const std::string& text, const UtteranceOptions& options);
-
-  // Interrupts the current utterance and discards other utterances
-  // in the queue.
-  void Stop();
-
-  // Determine if the service is busy or speaking.
-  tts_status GetStatus();
-
-  // Block until all queued utterances are done speaking.
-  void WaitUntilFinished();
-
-  //
-  // Internal implementation
-  //
-
-  // Implementation of AudioProvider, called by the audio output thread.
-  bool FillAudioBuffer(int16_t* samples, int size);
-
-  // Implementation of Runnable, for our background thread.
-  virtual void Run() OVERRIDE;
-
-  // Implementation of TtsDataReceiver, where the TtsEngine calls us
-  // with the generated audio data.
-  tts_callback_status Receive(int rate,
-                              int num_channels,
-                              const int16_t* data,
-                              int num_samples,
-                              tts_synth_status status);
-
- private:
-  TtsEngine *engine_;
-  AudioOutput *audio_output_;
-  scoped_ptr<RingBuffer<int16_t> > ring_buffer_;
-  scoped_ptr<Thread> thread_;
-  Utterance *current_utterance_;
-  std::vector<int16_t> audio_buffer_;
-
-  // A mutex and condition variable
-  scoped_ptr<Mutex> mutex_;
-  scoped_ptr<CondVar> cond_var_;
-
-  // Variables that are protected by the mutex and signaled by the
-  // condition variable.
-  std::list<Utterance*> utterances_;
-  bool service_running_;
-  bool utterance_running_;
-  bool current_utterance_interruptible_;
-
-  DISALLOW_COPY_AND_ASSIGN(TtsService);
-};
-}  // namespace speech_synthesis
-
-#endif  // SPEECH_CLIENT_SYNTHESIS_SERVICE_TTS_SERVICE_H_
