diff --git a/src/executor.cc b/src/executor.cc
new file mode 100644
index 0000000..15d54d1
--- /dev/null
+++ b/src/executor.cc
@@ -0,0 +1,92 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ *	   Zhenkai Zhu <zhenkai@cs.ucla.edu>
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "executor.h"
+
+using namespace std;
+using namespace boost;
+
+Executor::Executor(int poolSize)
+{
+  for (int i = 0; i < poolSize; i++)
+  {
+    m_group.create_thread(bind(&Executor::run, this));
+  }
+}
+
+Executor::~Executor()
+{
+  m_group.interrupt_all();
+}
+
+void
+Executor::execute(const Job &job)
+{
+  Lock lock(m_mutex);
+  bool queueWasEmpty = m_queue.empty();
+  m_queue.push_back(job);
+
+  // notify working threads if the queue was empty
+  if (queueWasEmpty)
+  {
+    m_cond.notify_one();
+  }
+}
+
+int
+Executor::poolSize()
+{
+  return m_group.size();
+}
+
+int
+Executor::jobQueueSize()
+{
+  Lock lock(m_mutex);
+  return m_queue.size();
+}
+
+void
+Executor::run()
+{
+  while(true)
+  {
+    Job job = waitForJob();
+
+    job();
+  }
+}
+
+Executor::Job
+Executor::waitForJob()
+{
+  Lock lock(m_mutex);
+
+  // wait until job queue is not empty
+  while (m_queue.empty())
+  {
+    m_cond.wait(lock);
+  }
+
+  Job job = m_queue.front();
+  m_queue.pop_front();
+  return job;
+}
diff --git a/src/executor.h b/src/executor.h
new file mode 100644
index 0000000..bda46b4
--- /dev/null
+++ b/src/executor.h
@@ -0,0 +1,77 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ *	   Zhenkai Zhu <zhenkai@cs.ucla.edu>
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#ifndef EXECUTOR_H
+#define EXECUTOR_H
+
+#include <boost/function.hpp>
+#include <boost/thread/condition_variable.hpp>
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/locks.hpp>
+#include <boost/thread/thread.hpp>
+#include <deque>
+
+/* A very simple executor to execute submitted tasks immediately or 
+ * in the future (depending on whether there is idle thread)
+ * A fixed number of threads are created for executing tasks;
+ * The policy is FIFO
+ * No cancellation of submitted tasks
+ */
+
+class Executor
+{
+public:
+  typedef boost::function<void ()> Job;
+
+  Executor(int poolSize);
+  ~Executor();
+
+  // execute the job immediately or sometime in the future
+  void
+  execute(const Job &job);
+
+  int
+  poolSize();
+
+// only for test
+  int
+  jobQueueSize();
+
+private:
+  void
+  run();
+
+  Job
+  waitForJob();
+
+private:
+  typedef std::deque<Job> JobQueue;
+  typedef boost::mutex Mutex;
+  typedef boost::unique_lock<Mutex> Lock;
+  typedef boost::condition_variable Cond;
+  typedef boost::thread Thread;
+  typedef boost::thread_group ThreadGroup;
+  JobQueue m_queue;
+  Mutex m_mutex;
+  Cond m_cond;
+  ThreadGroup m_group;
+};
+#endif // EXECUTOR_H
