diff --git a/Common/src/com/googlecode/android_scripting/facade/EventFacade.java b/Common/src/com/googlecode/android_scripting/facade/EventFacade.java
index 00b0866..17ba17e 100644
--- a/Common/src/com/googlecode/android_scripting/facade/EventFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/EventFacade.java
@@ -1,422 +1,454 @@
-/*
- * Copyright (C) 2010 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.googlecode.android_scripting.facade;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Multimaps;
-import com.googlecode.android_scripting.Log;
-import com.googlecode.android_scripting.event.Event;
-import com.googlecode.android_scripting.future.FutureResult;
-import com.googlecode.android_scripting.jsonrpc.JsonBuilder;
-import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
-import com.googlecode.android_scripting.rpc.Rpc;
-import com.googlecode.android_scripting.rpc.RpcDefault;
-import com.googlecode.android_scripting.rpc.RpcDeprecated;
-import com.googlecode.android_scripting.rpc.RpcName;
-import com.googlecode.android_scripting.rpc.RpcOptional;
-import com.googlecode.android_scripting.rpc.RpcParameter;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Queue;
-import java.util.Set;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.TimeUnit;
-
-import org.json.JSONException;
-
-/**
- * Manage the event queue. <br>
- * <br>
- * <b>Usage Notes:</b><br>
- * EventFacade APIs interact with the Event Queue (a data buffer containing up to 1024 event
- * entries).<br>
- * Events are automatically entered into the Event Queue following API calls such as startSensing()
- * and startLocating().<br>
- * The Event Facade provides control over how events are entered into (and removed from) the Event
- * Queue.<br>
- * The Event Queue provides a useful means of recording background events (such as sensor data) when
- * the phone is busy with foreground activities.
- * 
- * @author Felix Arends (felix.arends@gmail.com)
- * 
- */
-public class EventFacade extends RpcReceiver {
-  /**
-   * The maximum length of the event queue. Old events will be discarded when this limit is
-   * exceeded.
-   */
-  private static final int MAX_QUEUE_SIZE = 1024;
-  private final Queue<Event> mEventQueue = new ConcurrentLinkedQueue<Event>();
-  private final CopyOnWriteArrayList<EventObserver> mGlobalEventObservers =
-      new CopyOnWriteArrayList<EventObserver>();
-  private final Multimap<String, EventObserver> mNamedEventObservers = Multimaps
-      .synchronizedListMultimap(ArrayListMultimap.<String, EventObserver> create());
-  private EventServer mEventServer = null;
-  private final HashMap<String, BroadcastListener> mBroadcastListeners =
-      new HashMap<String, BroadcastListener>();
-  private final Context mContext;
-  private boolean bEventServerRunning;
-
-  public EventFacade(FacadeManager manager) {
-    super(manager);
-    mContext = manager.getService().getApplicationContext();
-    Log.v("Creating new EventFacade Instance()");
-    bEventServerRunning = false;
-  }
-
-  /**
-   * Example (python): droid.eventClearBuffer()
-   */
-  @Rpc(description = "Clears all events from the event buffer.")
-  public void eventClearBuffer() {
-    mEventQueue.clear();
-  }
-
-  /**
-   * Registers a listener for a new broadcast signal
-   */
-  @Rpc(description = "Registers a listener for a new broadcast signal")
-  public boolean eventRegisterForBroadcast(
-      @RpcParameter(name = "category") String category,
-      @RpcParameter(name = "enqueue", description = "Should this events be added to the event queue or only dispatched") @RpcDefault(value = "true") Boolean enqueue) {
-    if (mBroadcastListeners.containsKey(category)) {
-      return false;
-    }
-
-    BroadcastListener b = new BroadcastListener(this, enqueue.booleanValue());
-    IntentFilter c = new IntentFilter(category);
-    mContext.registerReceiver(b, c);
-    mBroadcastListeners.put(category, b);
-
-    return true;
-  }
-
-  @Rpc(description = "Stop listening for a broadcast signal")
-  public void eventUnregisterForBroadcast(@RpcParameter(name = "category") String category) {
-    if (!mBroadcastListeners.containsKey(category)) {
-      return;
-    }
-
-    mContext.unregisterReceiver(mBroadcastListeners.get(category));
-    mBroadcastListeners.remove(category);
-  }
-
-  @Rpc(description = "Lists all the broadcast signals we are listening for")
-  public Set<String> eventGetBrodcastCategories() {
-    return mBroadcastListeners.keySet();
-  }
-
-  /**
-   * Actual data returned in the map will depend on the type of event.
-   * 
-   * <pre>
-   * Example (python):
-   *     import android, time
-   *     droid = android.Android()
-   *     droid.startSensing()
-   *     time.sleep(1)
-   *     droid.eventClearBuffer()
-   *     time.sleep(1)
-   *     e = eventPoll(1).result
-   *     event_entry_number = 0
-   *     x = e[event_entry_ number]['data']['xforce']
-   * </pre>
-   * 
-   * e has the format:<br>
-   * [{u'data': {u'accuracy': 0, u'pitch': -0.48766891956329345, u'xmag': -5.6875, u'azimuth':
-   * 0.3312483489513397, u'zforce': 8.3492730000000002, u'yforce': 4.5628165999999997, u'time':
-   * 1297072704.813, u'ymag': -11.125, u'zmag': -42.375, u'roll': -0.059393649548292161, u'xforce':
-   * 0.42223078000000003}, u'name': u'sensors', u'time': 1297072704813000L}]<br>
-   * x has the string value of the x force data (0.42223078000000003) at the time of the event
-   * entry. </pre>
-   */
-
-  @Rpc(description = "Returns and removes the oldest n events (i.e. location or sensor update, etc.) from the event buffer.", returns = "A List of Maps of event properties.")
-  public List<Event> eventPoll(
-      @RpcParameter(name = "number_of_events") @RpcDefault("1") Integer number_of_events) {
-    List<Event> events = Lists.newArrayList();
-    for (int i = 0; i < number_of_events; i++) {
-      Event event = mEventQueue.poll();
-      if (event == null) {
-        break;
-      }
-      events.add(event);
-    }
-    return events;
-  }
-
-  @Rpc(description = "Blocks until an event with the supplied name occurs. Event is removed from the buffer if removeEvent is True.",
-      returns = "Map of event properties.")
-  public Event eventWaitFor(
-      @RpcParameter(name = "eventName") final String eventName,
-      @RpcParameter(name = "removeEvent") final Boolean removeEvent,
-      @RpcParameter(name = "timeout", description = "the maximum time to wait (in ms)") @RpcOptional Integer timeout)
-      throws InterruptedException {
-    Event result = null;
-    final FutureResult<Event> futureEvent;
-    synchronized (mEventQueue) { // First check to make sure it isn't already there
-      for (Event event : mEventQueue) {
-        if (event.getName().equals(eventName)) {
-          result = event;
-          if(removeEvent)
-            mEventQueue.remove(event);
-          return result;
-        }
-      }
-      futureEvent = new FutureResult<Event>();
-      addNamedEventObserver(eventName, new EventObserver() {
-        @Override
-        public void onEventReceived(Event event) {
-          if (event.getName().equals(eventName)) {
-            synchronized (futureEvent) {
-              if (!futureEvent.isDone()) {
-                futureEvent.set(event);
-                //TODO(navtej) Remove log.
-                Log.v(String.format("Removeing observer (%s) got event  (%s)",this, event));
-                removeEventObserver(this);
-              }
-              if(removeEvent)
-                mEventQueue.remove(event);
-            }
-          }
-        }
-      });
-    }
-    if (futureEvent != null) {
-      if (timeout != null) {
-        result = futureEvent.get(timeout, TimeUnit.MILLISECONDS);
-      } else {
-        result = futureEvent.get();
-      }
-    }
-    return result;
-  }
-
-  @Rpc(description = "Blocks until an event occurs. The returned event is removed from the buffer.", returns = "Map of event properties.")
-  public Event eventWait(
-      @RpcParameter(name = "timeout", description = "the maximum time to wait") @RpcOptional Integer timeout)
-      throws InterruptedException {
-    Event result = null;
-    final FutureResult<Event> futureEvent = new FutureResult<Event>();
-    EventObserver observer;
-    synchronized (mEventQueue) { // Anything in queue?
-      if (mEventQueue.size() > 0) {
-         return mEventQueue.poll(); // return it.
-      }
-      observer = new EventObserver() {
-        @Override
-        public void onEventReceived(Event event) { // set up observer for any events.
-          synchronized (futureEvent) {
-            if (!futureEvent.isDone()) {
-              futureEvent.set(event);
-              //TODO(navtej) Remove log.
-              Log.v(String.format("onEventReceived for event (%s)", event));
-            }
-            mEventQueue.remove(event);
-          }
-        }
-      };
-      addGlobalEventObserver(observer);
-    }
-    if (timeout != null) {
-        result = futureEvent.get(timeout, TimeUnit.MILLISECONDS);
-        if(result == null){
-          result = new Event( "eventTimeout", null);
-        }
-    } else {
-        result = futureEvent.get();
-    }
-    //TODO(navtej) Remove log.
-    Log.v(String.format("Removing observer (%s) got event  (%s)", observer, result ));
-    if (observer != null) {
-      removeEventObserver(observer); // Make quite sure this goes away.
-    }
-    return result;
-  }
-
-  /**
-   * <pre>
-   * Example:
-   *   import android
-   *   from datetime import datetime
-   *   droid = android.Android()
-   *   t = datetime.now()
-   *   droid.eventPost('Some Event', t)
-   * </pre>
-   */
-  @Rpc(description = "Post an event to the event queue.")
-  public void eventPost(
-      @RpcParameter(name = "name", description = "Name of event") String name,
-      @RpcParameter(name = "data", description = "Data contained in event.") String data,
-      @RpcParameter(name = "enqueue", description = "Set to False if you don't want your events to be added to the event queue, just dispatched.") @RpcOptional @RpcDefault("false") Boolean enqueue) {
-    postEvent(name, data, enqueue.booleanValue());
-  }
-
-  /**
-   * Post an event and queue it
-   */
-  public void postEvent(String name, Object data) {
-    postEvent(name, data, true);
-  }
-
-  /**
-   * Posts an event with to the event queue.
-   */
-  public void postEvent(String name, Object data, boolean enqueue) {
-    Event event = new Event(name, data);
-    if (enqueue != false) {
-      synchronized (mEventQueue) {
-        while (mEventQueue.size() >= MAX_QUEUE_SIZE) {
-          mEventQueue.remove();
-        }
-        mEventQueue.add(event);
-      }
-      Log.v(String.format("postEvent(%s)", name));
-    }
-    synchronized (mNamedEventObservers) {
-      for (EventObserver observer : mNamedEventObservers.get(name)) {
-        observer.onEventReceived(event);
-      }
-    }
-    synchronized (mGlobalEventObservers) {
-      //TODO(navtej) Remove log.
-      Log.v(String.format("mGlobalEventObservers size (%s)", mGlobalEventObservers.size()));
-      for (EventObserver observer : mGlobalEventObservers) {
-        observer.onEventReceived(event);
-      }
-    }
-  }
-
-  @RpcDeprecated(value = "eventPost", release = "r4")
-  @Rpc(description = "Post an event to the event queue.")
-  @RpcName(name = "postEvent")
-  public void rpcPostEvent(@RpcParameter(name = "name") String name,
-      @RpcParameter(name = "data") String data) {
-    postEvent(name, data);
-  }
-
-  @RpcDeprecated(value = "eventPoll", release = "r4")
-  @Rpc(description = "Returns and removes the oldest event (i.e. location or sensor update, etc.) from the event buffer.", returns = "Map of event properties.")
-  public Event receiveEvent() {
-    return mEventQueue.poll();
-  }
-
-  @RpcDeprecated(value = "eventWaitFor", release = "r4")
-  @Rpc(description = "Blocks until an event with the supplied name occurs. Event is removed from the buffer if removeEvent is True.",
-   returns = "Map of event properties.")
-  public Event waitForEvent(
-      @RpcParameter(name = "eventName") final String eventName,
-      @RpcOptional final Boolean removeEvent,
-      @RpcParameter(name = "timeout", description = "the maximum time to wait") @RpcOptional Integer timeout)
-      throws InterruptedException {
-    return eventWaitFor(eventName, removeEvent, timeout);
-  }
-
-  @Rpc(description = "Opens up a socket where you can read for events posted")
-  public int startEventDispatcher(
-      @RpcParameter(name = "port", description = "Port to use") @RpcDefault("0") @RpcOptional() Integer port) {
-    if (mEventServer == null) {
-      if (port == null) {
-        port = 0;
-      }
-      mEventServer = new EventServer(port);
-      addGlobalEventObserver(mEventServer);
-      bEventServerRunning = true;
-    }
-    return mEventServer.getAddress().getPort();
-  }
-
-  @Rpc(description = "Stops the event server, you can't read in the port anymore")
-  public void stopEventDispatcher() throws RuntimeException {
-    if (bEventServerRunning == true) {
-      if (mEventServer == null) {
-        throw new RuntimeException("Not running");
-      }
-      bEventServerRunning = false;
-      mEventServer.shutdown();
-      Log.v(String.format("stopEventDispatcher   (%s)", mEventServer ));
-      removeEventObserver(mEventServer);
-      mEventServer = null;
-    }
-    return;
-  }
-
-  @Override
-  public void shutdown() {
-
-    try {
-      stopEventDispatcher();
-    } catch (Exception e) {
-      Log.e("Exception tearing down event dispatcher", e);
-    }
-    mGlobalEventObservers.clear();
-    mEventQueue.clear();
-  }
-
-  public void addNamedEventObserver(String eventName, EventObserver observer) {
-    mNamedEventObservers.put(eventName, observer);
-  }
-
-  public void addGlobalEventObserver(EventObserver observer) {
-    mGlobalEventObservers.add(observer);
-  }
-
-  public void removeEventObserver(EventObserver observer) {
-    mNamedEventObservers.removeAll(observer);
-    mGlobalEventObservers.remove(observer);
-  }
-
-  public interface EventObserver {
-    public void onEventReceived(Event event);
-  }
-
-  public class BroadcastListener extends android.content.BroadcastReceiver {
-    private EventFacade mParent;
-    private boolean mEnQueue;
-
-    public BroadcastListener(EventFacade parent, boolean enqueue) {
-      mParent = parent;
-      mEnQueue = enqueue;
-    }
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-      Bundle data;
-      if (intent.getExtras() != null) {
-        data = (Bundle) intent.getExtras().clone();
-      } else {
-        data = new Bundle();
-      }
-      data.putString("action", intent.getAction());
-      try {
-        mParent.eventPost("sl4a", JsonBuilder.build(data).toString(), mEnQueue);
-      } catch (JSONException e) {
-        e.printStackTrace();
-      }
-    }
-
-  }
-}
+/*
+ * Copyright (C) 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.googlecode.android_scripting.facade;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Multimaps;
+import com.googlecode.android_scripting.Log;
+import com.googlecode.android_scripting.event.Event;
+import com.googlecode.android_scripting.future.FutureResult;
+import com.googlecode.android_scripting.jsonrpc.JsonBuilder;
+import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
+import com.googlecode.android_scripting.rpc.Rpc;
+import com.googlecode.android_scripting.rpc.RpcDefault;
+import com.googlecode.android_scripting.rpc.RpcDeprecated;
+import com.googlecode.android_scripting.rpc.RpcName;
+import com.googlecode.android_scripting.rpc.RpcOptional;
+import com.googlecode.android_scripting.rpc.RpcParameter;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Queue;
+import java.util.Set;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.TimeUnit;
+
+import org.json.JSONException;
+
+/**
+ * Manage the event queue. <br>
+ * <br>
+ * <b>Usage Notes:</b><br>
+ * EventFacade APIs interact with the Event Queue (a data buffer containing up to 1024 event
+ * entries).<br>
+ * Events are automatically entered into the Event Queue following API calls such as startSensing()
+ * and startLocating().<br>
+ * The Event Facade provides control over how events are entered into (and removed from) the Event
+ * Queue.<br>
+ * The Event Queue provides a useful means of recording background events (such as sensor data) when
+ * the phone is busy with foreground activities.
+ *
+ * @author Felix Arends (felix.arends@gmail.com)
+ */
+public class EventFacade extends RpcReceiver {
+    /**
+     * The maximum length of the event queue. Old events will be discarded when this limit is
+     * exceeded.
+     */
+    private static final int MAX_QUEUE_SIZE = 1024;
+    private final Queue<Event> mEventQueue = new ConcurrentLinkedQueue<Event>();
+    private final CopyOnWriteArrayList<EventObserver> mGlobalEventObservers =
+            new CopyOnWriteArrayList<EventObserver>();
+    private final Multimap<String, EventObserver> mNamedEventObservers = Multimaps
+            .synchronizedListMultimap(ArrayListMultimap.<String, EventObserver> create());
+    private EventServer mEventServer = null;
+    private final HashMap<String, BroadcastListener> mBroadcastListeners =
+            new HashMap<String, BroadcastListener>();
+    private final Context mContext;
+    private boolean bEventServerRunning;
+
+    public EventFacade(FacadeManager manager) {
+        super(manager);
+        mContext = manager.getService().getApplicationContext();
+        Log.v("Creating new EventFacade Instance()");
+        bEventServerRunning = false;
+    }
+
+    /**
+     * Example (python): droid.eventClearBuffer()
+     */
+    @Rpc(description = "Clears all events from the event buffer.")
+    public void eventClearBuffer() {
+        mEventQueue.clear();
+    }
+
+    /**
+     * Registers a listener for a new broadcast signal
+     */
+    @Rpc(description = "Registers a listener for a new broadcast signal")
+    public boolean eventRegisterForBroadcast(
+                        @RpcParameter(name = "category")
+            String category,
+            @RpcParameter(name = "enqueue",
+                    description = "Should this events be added to the event queue or only dispatched")
+            @RpcDefault(value = "true")
+            Boolean enqueue) {
+        if (mBroadcastListeners.containsKey(category)) {
+            return false;
+        }
+
+        BroadcastListener b = new BroadcastListener(this, enqueue.booleanValue());
+        IntentFilter c = new IntentFilter(category);
+        mContext.registerReceiver(b, c);
+        mBroadcastListeners.put(category, b);
+
+        return true;
+    }
+
+    @Rpc(description = "Stop listening for a broadcast signal")
+    public void eventUnregisterForBroadcast(
+            @RpcParameter(name = "category")
+    String category) {
+        if (!mBroadcastListeners.containsKey(category)) {
+            return;
+        }
+
+        mContext.unregisterReceiver(mBroadcastListeners.get(category));
+        mBroadcastListeners.remove(category);
+    }
+
+    @Rpc(description = "Lists all the broadcast signals we are listening for")
+    public Set<String> eventGetBrodcastCategories() {
+        return mBroadcastListeners.keySet();
+    }
+
+    /**
+     * Actual data returned in the map will depend on the type of event.
+     *
+     * <pre>
+     * Example (python):
+     *     import android, time
+     *     droid = android.Android()
+     *     droid.startSensing()
+     *     time.sleep(1)
+     *     droid.eventClearBuffer()
+     *     time.sleep(1)
+     *     e = eventPoll(1).result
+     *     event_entry_number = 0
+     *     x = e[event_entry_ number]['data']['xforce']
+     * </pre>
+     *
+     * e has the format:<br>
+     * [{u'data': {u'accuracy': 0, u'pitch': -0.48766891956329345, u'xmag': -5.6875, u'azimuth':
+     * 0.3312483489513397, u'zforce': 8.3492730000000002, u'yforce': 4.5628165999999997, u'time':
+     * 1297072704.813, u'ymag': -11.125, u'zmag': -42.375, u'roll': -0.059393649548292161,
+     * u'xforce': 0.42223078000000003}, u'name': u'sensors', u'time': 1297072704813000L}]<br>
+     * x has the string value of the x force data (0.42223078000000003) at the time of the event
+     * entry. </pre>
+     */
+
+    @Rpc(description = "Returns and removes the oldest n events (i.e. location or sensor update, etc.) from the event buffer.",
+            returns = "A List of Maps of event properties.")
+    public List<Event> eventPoll(
+            @RpcParameter(name = "number_of_events")
+            @RpcDefault("1")
+            Integer number_of_events) {
+        List<Event> events = Lists.newArrayList();
+        for (int i = 0; i < number_of_events; i++) {
+            Event event = mEventQueue.poll();
+            if (event == null) {
+                break;
+            }
+            events.add(event);
+        }
+        return events;
+    }
+
+    @Rpc(description = "Blocks until an event with the supplied name occurs. Event is removed from the buffer if removeEvent is True.",
+            returns = "Map of event properties.")
+    public Event eventWaitFor(
+                        @RpcParameter(name = "eventName")
+            final String eventName,
+                        @RpcParameter(name = "removeEvent")
+            final Boolean removeEvent,
+            @RpcParameter(name = "timeout", description = "the maximum time to wait (in ms)")
+            @RpcOptional
+            Integer timeout)
+            throws InterruptedException {
+        Event result = null;
+        final FutureResult<Event> futureEvent;
+        synchronized (mEventQueue) { // First check to make sure it isn't already there
+            for (Event event : mEventQueue) {
+                if (event.getName().equals(eventName)) {
+                    result = event;
+                    if (removeEvent)
+                        mEventQueue.remove(event);
+                    return result;
+                }
+            }
+            futureEvent = new FutureResult<Event>();
+            addNamedEventObserver(eventName, new EventObserver() {
+                    @Override
+                public void onEventReceived(Event event) {
+                    if (event.getName().equals(eventName)) {
+                        synchronized (futureEvent) {
+                            if (!futureEvent.isDone()) {
+                                futureEvent.set(event);
+                                // TODO(navtej) Remove log.
+                                Log.v(String.format("Removeing observer (%s) got event  (%s)", this,
+                                        event));
+                                removeEventObserver(this);
+                            }
+                            if (removeEvent)
+                                mEventQueue.remove(event);
+                        }
+                    }
+                }
+            });
+        }
+        if (futureEvent != null) {
+            if (timeout != null) {
+                result = futureEvent.get(timeout, TimeUnit.MILLISECONDS);
+            } else {
+                result = futureEvent.get();
+            }
+        }
+        return result;
+    }
+
+    @Rpc(description = "Blocks until an event occurs. The returned event is removed from the buffer.",
+            returns = "Map of event properties.")
+    public Event eventWait(
+            @RpcParameter(name = "timeout", description = "the maximum time to wait")
+            @RpcOptional
+            Integer timeout)
+            throws InterruptedException {
+        Event result = null;
+        final FutureResult<Event> futureEvent = new FutureResult<Event>();
+        EventObserver observer;
+        synchronized (mEventQueue) { // Anything in queue?
+            if (mEventQueue.size() > 0) {
+                return mEventQueue.poll(); // return it.
+            }
+            observer = new EventObserver() {
+                    @Override
+                public void onEventReceived(Event event) { // set up observer for any events.
+                    synchronized (futureEvent) {
+                        if (!futureEvent.isDone()) {
+                            futureEvent.set(event);
+                            // TODO(navtej) Remove log.
+                            Log.v(String.format("onEventReceived for event (%s)", event));
+                        }
+                    }
+                }
+            };
+            addGlobalEventObserver(observer);
+        }
+        if (timeout != null) {
+            result = futureEvent.get(timeout, TimeUnit.MILLISECONDS);
+        } else {
+            result = futureEvent.get();
+        }
+        if (result != null) {
+            mEventQueue.remove(result);
+        }
+        // TODO(navtej) Remove log.
+        Log.v(String.format("Removeing observer (%s) got event  (%s)", observer, result));
+        if (observer != null) {
+            removeEventObserver(observer); // Make quite sure this goes away.
+        }
+        return result;
+    }
+
+    /**
+     * <pre>
+     * Example:
+     *   import android
+     *   from datetime import datetime
+     *   droid = android.Android()
+     *   t = datetime.now()
+     *   droid.eventPost('Some Event', t)
+     * </pre>
+     */
+    @Rpc(description = "Post an event to the event queue.")
+    public void eventPost(
+                        @RpcParameter(name = "name", description = "Name of event")
+            String name,
+                        @RpcParameter(name = "data", description = "Data contained in event.")
+            String data,
+            @RpcParameter(name = "enqueue",
+                    description = "Set to False if you don't want your events to be added to the event queue, just dispatched.")
+            @RpcOptional
+            @RpcDefault("false")
+            Boolean enqueue) {
+        postEvent(name, data, enqueue.booleanValue());
+    }
+
+    /**
+     * Post an event and queue it
+     */
+    public void postEvent(String name, Object data) {
+        postEvent(name, data, true);
+    }
+
+    /**
+     * Posts an event with to the event queue.
+     */
+    public void postEvent(String name, Object data, boolean enqueue) {
+        Event event = new Event(name, data);
+        if (enqueue != false) {
+            synchronized (mEventQueue) {
+                while (mEventQueue.size() >= MAX_QUEUE_SIZE) {
+                    mEventQueue.remove();
+                }
+                mEventQueue.add(event);
+            }
+            Log.v(String.format("postEvent(%s)", name));
+        }
+        synchronized (mNamedEventObservers) {
+            for (EventObserver observer : mNamedEventObservers.get(name)) {
+                observer.onEventReceived(event);
+            }
+        }
+        synchronized (mGlobalEventObservers) {
+            // TODO(navtej) Remove log.
+            Log.v(String.format("mGlobalEventObservers size (%s)", mGlobalEventObservers.size()));
+            for (EventObserver observer : mGlobalEventObservers) {
+                observer.onEventReceived(event);
+            }
+        }
+    }
+
+    @RpcDeprecated(value = "eventPost", release = "r4")
+    @Rpc(description = "Post an event to the event queue.")
+    @RpcName(name = "postEvent")
+    public void rpcPostEvent(
+            @RpcParameter(name = "name")
+    String name,
+                        @RpcParameter(name = "data")
+            String data) {
+        postEvent(name, data);
+    }
+
+    @RpcDeprecated(value = "eventPoll", release = "r4")
+    @Rpc(description = "Returns and removes the oldest event (i.e. location or sensor update, etc.) from the event buffer.",
+            returns = "Map of event properties.")
+    public Event receiveEvent() {
+        return mEventQueue.poll();
+    }
+
+    @RpcDeprecated(value = "eventWaitFor", release = "r4")
+    @Rpc(description = "Blocks until an event with the supplied name occurs. Event is removed from the buffer if removeEvent is True.",
+            returns = "Map of event properties.")
+    public Event waitForEvent(
+                        @RpcParameter(name = "eventName")
+            final String eventName,
+                        @RpcOptional
+            final Boolean removeEvent,
+            @RpcParameter(name = "timeout", description = "the maximum time to wait")
+            @RpcOptional
+            Integer timeout)
+            throws InterruptedException {
+        return eventWaitFor(eventName, removeEvent, timeout);
+    }
+
+    @Rpc(description = "Opens up a socket where you can read for events posted")
+    public int startEventDispatcher(
+            @RpcParameter(name = "port", description = "Port to use")
+            @RpcDefault("0")
+            @RpcOptional()
+            Integer port) {
+        if (mEventServer == null) {
+            if (port == null) {
+                port = 0;
+            }
+            mEventServer = new EventServer(port);
+            addGlobalEventObserver(mEventServer);
+            bEventServerRunning = true;
+        }
+        return mEventServer.getAddress().getPort();
+    }
+
+    @Rpc(description = "Stops the event server, you can't read in the port anymore")
+    public void stopEventDispatcher() throws RuntimeException {
+        if (bEventServerRunning == true) {
+            if (mEventServer == null) {
+                throw new RuntimeException("Not running");
+            }
+            bEventServerRunning = false;
+            mEventServer.shutdown();
+            Log.v(String.format("stopEventDispatcher   (%s)", mEventServer));
+            removeEventObserver(mEventServer);
+            mEventServer = null;
+        }
+        return;
+    }
+
+    @Override
+    public void shutdown() {
+
+        try {
+            stopEventDispatcher();
+        } catch (Exception e) {
+            Log.e("Exception tearing down event dispatcher", e);
+        }
+        mGlobalEventObservers.clear();
+        mEventQueue.clear();
+    }
+
+    public void addNamedEventObserver(String eventName, EventObserver observer) {
+        mNamedEventObservers.put(eventName, observer);
+    }
+
+    public void addGlobalEventObserver(EventObserver observer) {
+        mGlobalEventObservers.add(observer);
+    }
+
+    public void removeEventObserver(EventObserver observer) {
+        mNamedEventObservers.removeAll(observer);
+        mGlobalEventObservers.remove(observer);
+    }
+
+    public interface EventObserver {
+        public void onEventReceived(Event event);
+    }
+
+    public class BroadcastListener extends android.content.BroadcastReceiver {
+        private EventFacade mParent;
+        private boolean mEnQueue;
+
+        public BroadcastListener(EventFacade parent, boolean enqueue) {
+            mParent = parent;
+            mEnQueue = enqueue;
+        }
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            Bundle data;
+            if (intent.getExtras() != null) {
+                data = (Bundle) intent.getExtras().clone();
+            } else {
+                data = new Bundle();
+            }
+            data.putString("action", intent.getAction());
+            try {
+                mParent.eventPost("sl4a", JsonBuilder.build(data).toString(), mEnQueue);
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+        }
+
+    }
+}
diff --git a/Common/src/com/googlecode/android_scripting/facade/SettingsFacade.java b/Common/src/com/googlecode/android_scripting/facade/SettingsFacade.java
index 477c04e..73d0e79 100644
--- a/Common/src/com/googlecode/android_scripting/facade/SettingsFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/SettingsFacade.java
@@ -29,15 +29,12 @@
 import com.android.internal.widget.LockPatternUtils;
 import com.googlecode.android_scripting.BaseApplication;
 import com.googlecode.android_scripting.FutureActivityTaskExecutor;
-import com.googlecode.android_scripting.Log;
 import com.googlecode.android_scripting.future.FutureActivityTask;
 import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
 import com.googlecode.android_scripting.rpc.Rpc;
 import com.googlecode.android_scripting.rpc.RpcOptional;
 import com.googlecode.android_scripting.rpc.RpcParameter;
 
-import java.lang.reflect.Method;
-
 /**
  * Exposes phone settings functionality.
  *
@@ -197,31 +194,24 @@
         return oldValue;
     }
 
-    @Rpc(description = "Checks if the screen is on or off (requires API level 7).",
-            returns = "True if the screen is currently on.")
-    public Boolean checkScreenOn() throws Exception {
-        Class<?> powerManagerClass = mPower.getClass();
-        Boolean result = null;
-        try {
-            Method isScreenOn = powerManagerClass.getMethod("isScreenOn");
-            result = (Boolean) isScreenOn.invoke(mPower);
-        } catch (Exception e) {
-            Log.e(e);
-            throw new UnsupportedOperationException("This feature is only available after Eclair.");
-        }
-        return result;
+    @Rpc(description = "Returns true if the device is in an interactive state.")
+    public Boolean isDeviceInteractive() throws Exception {
+        return mPower.isInteractive();
     }
 
-    @Rpc(description = "Wakeup screen(requires API level 19).")
-    public void wakeupScreen() throws Exception {
-        Class<?> powerManagerClass = mPower.getClass();
-        try {
-            Method wakeUp = powerManagerClass.getMethod("wakeUp", long.class);
-            wakeUp.invoke(mPower, SystemClock.uptimeMillis());
-        } catch (Exception e) {
-            Log.e(e);
-            throw new UnsupportedOperationException("This feature is only available after Kitkat.");
-        }
+    @Rpc(description = "Issues a request to put the device to sleep after a delay.")
+    public void goToSleep(Integer delay) {
+        mPower.goToSleep(SystemClock.uptimeMillis() + delay);
+    }
+
+    @Rpc(description = "Issues a request to put the device to sleep right away.")
+    public void goToSleepNow() {
+        mPower.goToSleep(SystemClock.uptimeMillis());
+    }
+
+    @Rpc(description = "Issues a request to wake the device up right away.")
+    public void wakeUpNow() {
+        mPower.wakeUp(SystemClock.uptimeMillis());
     }
 
     @Rpc(description = "Get Up time of device.",
diff --git a/Common/src/com/googlecode/android_scripting/facade/WakeLockFacade.java b/Common/src/com/googlecode/android_scripting/facade/WakeLockFacade.java
index 9c095a0..85eac84 100644
--- a/Common/src/com/googlecode/android_scripting/facade/WakeLockFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/WakeLockFacade.java
@@ -18,7 +18,6 @@
 
 import android.content.Context;
 import android.os.PowerManager;
-import android.os.SystemClock;
 import android.os.PowerManager.WakeLock;
 
 import com.googlecode.android_scripting.jsonrpc.RpcReceiver;
@@ -88,16 +87,6 @@
         mManager = new WakeLockManager(mmPowerManager);
     }
 
-    @Rpc(description = "Issue a request to put the device to sleep right away.")
-    public void goToSleepNow() {
-        mmPowerManager.goToSleep(SystemClock.uptimeMillis());
-    }
-
-    @Rpc(description = "Issue a request to wake the device up right away.")
-    public void wakeUpNow() {
-        mmPowerManager.wakeUp(SystemClock.uptimeMillis());
-    }
-
     @Rpc(description = "Acquires a full wake lock (CPU on, screen bright, keyboard bright).")
     public void wakeLockAcquireFull() {
         mManager.acquire(WakeLockType.FULL);
diff --git a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothFacade.java b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothFacade.java
index f56e4ae..605414c 100644
--- a/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/bluetooth/BluetoothFacade.java
@@ -325,6 +325,11 @@
         return energyInfo.toString();
     }
 
+    @Rpc(description = "Enables BLE after BT has been toggled off.")
+    public boolean bluetoothEnableBLE() {
+        return mBluetoothAdapter.enableBLE();
+    }
+
     @Override
     public void shutdown() {
         for (Map.Entry<String, BluetoothConnection> entry : connections.entrySet()) {
diff --git a/Common/src/com/googlecode/android_scripting/facade/tele/PhoneFacade.java b/Common/src/com/googlecode/android_scripting/facade/tele/PhoneFacade.java
index ff234af..bbc3d30 100644
--- a/Common/src/com/googlecode/android_scripting/facade/tele/PhoneFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/tele/PhoneFacade.java
@@ -27,6 +27,7 @@
 import android.provider.ContactsContract;
 import android.telephony.CellLocation;
 import android.telephony.NeighboringCellInfo;
+import android.telephony.CellInfo;
 import android.telephony.PhoneStateListener;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
@@ -931,6 +932,12 @@
         return mTelephonyManager.getNeighboringCellInfo();
     }
 
+    @Rpc(description = "Returns all observed cell information from all radios"+
+                       "on the device including the primary and neighboring cells")
+    public List<CellInfo> getAllCellInfo() {
+        return mTelephonyManager.getAllCellInfo();
+    }
+
     @Rpc(description = "Returns True if cellular data is enabled for" +
                        "default data subscription ID.")
     public Boolean isDataEnabled() {
diff --git a/Common/src/com/googlecode/android_scripting/facade/tele/TelephonyStateListeners.java b/Common/src/com/googlecode/android_scripting/facade/tele/TelephonyStateListeners.java
index c080787..88888ba 100644
--- a/Common/src/com/googlecode/android_scripting/facade/tele/TelephonyStateListeners.java
+++ b/Common/src/com/googlecode/android_scripting/facade/tele/TelephonyStateListeners.java
@@ -15,57 +15,6 @@
  */
 public class TelephonyStateListeners {
 
-    private static String getNetworkTypeString(int type) {
-        switch(type) {
-            case TelephonyManager.NETWORK_TYPE_GPRS:
-                return "GPRS";
-            case TelephonyManager.NETWORK_TYPE_EDGE:
-                return "EDGE";
-            case TelephonyManager.NETWORK_TYPE_UMTS:
-                return "UMTS";
-            case TelephonyManager.NETWORK_TYPE_HSDPA:
-                return "HSDPA";
-            case TelephonyManager.NETWORK_TYPE_HSUPA:
-                return "HSUPA";
-            case TelephonyManager.NETWORK_TYPE_HSPA:
-                return "HSPA";
-            case TelephonyManager.NETWORK_TYPE_CDMA:
-                return "CDMA";
-            case TelephonyManager.NETWORK_TYPE_1xRTT:
-                return "1xRTT";
-            case TelephonyManager.NETWORK_TYPE_EVDO_0:
-                return "EVDO_0";
-            case TelephonyManager.NETWORK_TYPE_EVDO_A:
-                return "EVDO_A";
-            case TelephonyManager.NETWORK_TYPE_EVDO_B:
-                return "EVDO_B";
-            case TelephonyManager.NETWORK_TYPE_EHRPD:
-                return "EHRPD";
-            case TelephonyManager.NETWORK_TYPE_LTE:
-                return "LTE";
-            case TelephonyManager.NETWORK_TYPE_HSPAP:
-                return "HSPAP";
-            case TelephonyManager.NETWORK_TYPE_GSM:
-                return "GSM";
-        }
-        return "UNKNOWN";
-    }
-
-    private static String getNetworkStateString(int state) {
-        switch(state) {
-            case ServiceState.STATE_EMERGENCY_ONLY:
-                return "EMERGENCY_ONLY";
-            case ServiceState.STATE_IN_SERVICE:
-                return "IN_SERVICE";
-            case ServiceState.STATE_OUT_OF_SERVICE:
-                return "OUT_OF_SERVICE";
-            case ServiceState.STATE_POWER_OFF:
-                return "POWER_OFF";
-            default:
-                return "UNKNOWN";
-        }
-   }
-
     public static class CallStateChangeListener extends PhoneStateListener {
 
         private final EventFacade mEventFacade;
@@ -244,7 +193,7 @@
                 subEvent = "Connecting";
             } else if (state == TelephonyManager.DATA_CONNECTED) {
                 subEvent = "Connected";
-                event.putString("DataNetworkType", getNetworkTypeString(
+                event.putString("DataNetworkType", TelephonyUtils.getNetworkTypeString(
                                  mTelephonyManager.getDataNetworkType()));
             } else if (state == TelephonyManager.DATA_SUSPENDED) {
                 subEvent = "Suspended";
@@ -295,13 +244,13 @@
                     subEvent = "PowerOff";
                 break;
             }
-            event.putString("VoiceRegState", getNetworkStateString(
+            event.putString("VoiceRegState", TelephonyUtils.getNetworkStateString(
                              serviceState.getVoiceRegState()));
-            event.putString("VoiceNetworkType", getNetworkTypeString(
+            event.putString("VoiceNetworkType", TelephonyUtils.getNetworkTypeString(
                              serviceState.getVoiceNetworkType()));
-            event.putString("DataRegState", getNetworkStateString(
+            event.putString("DataRegState", TelephonyUtils.getNetworkStateString(
                              serviceState.getDataRegState()));
-            event.putString("DataNetworkType", getNetworkTypeString(
+            event.putString("DataNetworkType", TelephonyUtils.getNetworkTypeString(
                              serviceState.getDataNetworkType()));
             event.putString("OperatorName", serviceState.getOperatorAlphaLong());
             event.putString("OperatorId", serviceState.getOperatorNumeric());
@@ -347,29 +296,12 @@
             mEventFacade = ef;
         }
 
-        private static String getSrvccStateString(int srvccState) {
-            switch (srvccState) {
-                case VoLteServiceState.HANDOVER_STARTED:
-                    return "HANDOVER_STARTED";
-                case VoLteServiceState.HANDOVER_COMPLETED:
-                    return "HANDOVER_COMPLETED";
-                case VoLteServiceState.HANDOVER_FAILED:
-                    return "HANDOVER_FAILED";
-                case VoLteServiceState.HANDOVER_CANCELED:
-                    return "HANDOVER_CANCELED";
-                default:
-                    Log.e(String.format("getSrvccStateString():"
-                            + "unknown state %d", srvccState));
-                    return "UNKNOWN";
-            }
-        }
-
         @Override
         public void onVoLteServiceStateChanged(VoLteServiceState volteInfo) {
             Bundle event = new Bundle();
 
             event.putString("srvccState",
-                    getSrvccStateString(volteInfo.getSrvccState()));
+                    TelephonyUtils.getSrvccStateString(volteInfo.getSrvccState()));
 
             mEventFacade.postEvent(
                     "onVolteServiceStateChanged", event);
diff --git a/Common/src/com/googlecode/android_scripting/facade/tele/TelephonyUtils.java b/Common/src/com/googlecode/android_scripting/facade/tele/TelephonyUtils.java
new file mode 100644
index 0000000..cf174ec
--- /dev/null
+++ b/Common/src/com/googlecode/android_scripting/facade/tele/TelephonyUtils.java
@@ -0,0 +1,84 @@
+package com.googlecode.android_scripting.facade.tele;
+
+import com.googlecode.android_scripting.Log;
+import android.telephony.ServiceState;
+import android.telephony.TelephonyManager;
+import android.telephony.VoLteServiceState;
+
+/**
+ * Telephony utility functions
+ */
+public class TelephonyUtils {
+
+    public static String getNetworkTypeString(int type) {
+        switch(type) {
+            case TelephonyManager.NETWORK_TYPE_GPRS:
+                return "GPRS";
+            case TelephonyManager.NETWORK_TYPE_EDGE:
+                return "EDGE";
+            case TelephonyManager.NETWORK_TYPE_UMTS:
+                return "UMTS";
+            case TelephonyManager.NETWORK_TYPE_HSDPA:
+                return "HSDPA";
+            case TelephonyManager.NETWORK_TYPE_HSUPA:
+                return "HSUPA";
+            case TelephonyManager.NETWORK_TYPE_HSPA:
+                return "HSPA";
+            case TelephonyManager.NETWORK_TYPE_CDMA:
+                return "CDMA";
+            case TelephonyManager.NETWORK_TYPE_1xRTT:
+                return "1xRTT";
+            case TelephonyManager.NETWORK_TYPE_EVDO_0:
+                return "EVDO_0";
+            case TelephonyManager.NETWORK_TYPE_EVDO_A:
+                return "EVDO_A";
+            case TelephonyManager.NETWORK_TYPE_EVDO_B:
+                return "EVDO_B";
+            case TelephonyManager.NETWORK_TYPE_EHRPD:
+                return "EHRPD";
+            case TelephonyManager.NETWORK_TYPE_LTE:
+                return "LTE";
+            case TelephonyManager.NETWORK_TYPE_HSPAP:
+                return "HSPAP";
+            case TelephonyManager.NETWORK_TYPE_GSM:
+                return "GSM";
+            case TelephonyManager. NETWORK_TYPE_TD_SCDMA:
+                return "TD-SCDMA";
+            case TelephonyManager.NETWORK_TYPE_IWLAN:
+                return "WLAN";
+        }
+        return "UNKNOWN";
+    }
+
+    public static String getNetworkStateString(int state) {
+        switch(state) {
+            case ServiceState.STATE_EMERGENCY_ONLY:
+                return "EMERGENCY_ONLY";
+            case ServiceState.STATE_IN_SERVICE:
+                return "IN_SERVICE";
+            case ServiceState.STATE_OUT_OF_SERVICE:
+                return "OUT_OF_SERVICE";
+            case ServiceState.STATE_POWER_OFF:
+                return "POWER_OFF";
+            default:
+                return "UNKNOWN";
+        }
+   }
+
+    public static String getSrvccStateString(int srvccState) {
+        switch (srvccState) {
+            case VoLteServiceState.HANDOVER_STARTED:
+                return "HANDOVER_STARTED";
+            case VoLteServiceState.HANDOVER_COMPLETED:
+                return "HANDOVER_COMPLETED";
+            case VoLteServiceState.HANDOVER_FAILED:
+                return "HANDOVER_FAILED";
+            case VoLteServiceState.HANDOVER_CANCELED:
+                return "HANDOVER_CANCELED";
+            default:
+                Log.e(String.format("getSrvccStateString():"
+                        + "unknown state %d", srvccState));
+                return "UNKNOWN";
+        }
+    };
+}
diff --git a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiManagerFacade.java b/Common/src/com/googlecode/android_scripting/facade/wifi/WifiManagerFacade.java
index c6089ee..91f34ae 100755
--- a/Common/src/com/googlecode/android_scripting/facade/wifi/WifiManagerFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/wifi/WifiManagerFacade.java
@@ -274,7 +274,7 @@
     }
 
     private WifiConfiguration genEnterpriseConfig(String configStr) throws JSONException,
-            GeneralSecurityException {
+    GeneralSecurityException {
         if (configStr == null) {
             return null;
         }
@@ -326,6 +326,11 @@
             Log.v("Setting Alt Subject to " + altSub);
             eConfig.setAltSubjectMatch(altSub);
         }
+        if (j.has(WifiEnterpriseConfig.DOM_SUFFIX_MATCH_KEY)) {
+            String domSuffix = j.getString(WifiEnterpriseConfig.DOM_SUFFIX_MATCH_KEY);
+            Log.v("Setting Domain Suffix Match to " + domSuffix);
+            eConfig.setDomainSuffixMatch(domSuffix);
+        }
         config.enterpriseConfig = eConfig;
         return config;
     }
@@ -400,7 +405,7 @@
     }
 
     private PrivateKey strToPrivateKey(String key) throws NoSuchAlgorithmException,
-            InvalidKeySpecException {
+    InvalidKeySpecException {
         byte[] keyBytes = base64StrToBytes(key);
         PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
         KeyFactory fact = KeyFactory.getInstance("RSA");
@@ -409,7 +414,7 @@
     }
 
     private PublicKey strToPublicKey(String key) throws NoSuchAlgorithmException,
-            InvalidKeySpecException {
+    InvalidKeySpecException {
         byte[] keyBytes = base64StrToBytes(key);
         X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
         KeyFactory fact = KeyFactory.getInstance("RSA");
@@ -468,7 +473,7 @@
     public Boolean wifiConnect(
             @RpcParameter(name = "SSID") String SSID,
             @RpcParameter(name = "Password") @RpcOptional String Password)
-            throws ConnectException {
+                    throws ConnectException {
         WifiConfiguration wifiConfig = genWifiConfig(SSID, Password);
         mWifi.addNetwork(wifiConfig);
         Boolean status = false;
@@ -532,7 +537,7 @@
     }
 
     @Rpc(description = "Returns wifi activity and energy usage info.")
-    public WifiActivityEnergyInfo getControllerActivityEnergyInfo() {
+    public WifiActivityEnergyInfo wifiGetControllerActivityEnergyInfo() {
         return mWifi.getControllerActivityEnergyInfo(0);
     }
 
@@ -662,8 +667,8 @@
     @Rpc(description = "Start Wi-fi Protected Setup.")
     public void wifiStartWps(
             @RpcParameter(name = "config",
-                    description = "A json string with fields \"setup\", \"BSSID\", and \"pin\"") String config)
-            throws JSONException {
+            description = "A json string with fields \"setup\", \"BSSID\", and \"pin\"") String config)
+                    throws JSONException {
         WpsInfo info = parseWpsInfo(config);
         WifiWpsCallback listener = new WifiWpsCallback();
         Log.d("Starting wps with: " + info);
@@ -699,7 +704,7 @@
             returns = "True if Wifi scan is always available.")
     public Boolean wifiToggleScanAlwaysAvailable(
             @RpcParameter(name = "enabled") @RpcOptional Boolean enabled)
-            throws SettingNotFoundException {
+                    throws SettingNotFoundException {
         ContentResolver cr = mService.getContentResolver();
         int isSet = 0;
         if (enabled == null) {
diff --git a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java b/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java
index b30aa76..04b5aa1 100644
--- a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java
+++ b/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java
@@ -55,7 +55,19 @@
 import android.telecom.AudioState;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
+import android.telephony.CellIdentityCdma;
+import android.telephony.CellIdentityGsm;
+import android.telephony.CellIdentityLte;
+import android.telephony.CellIdentityWcdma;
+import android.telephony.CellInfoCdma;
+import android.telephony.CellInfoGsm;
+import android.telephony.CellInfoLte;
+import android.telephony.CellInfoWcdma;
 import android.telephony.CellLocation;
+import android.telephony.CellSignalStrengthCdma;
+import android.telephony.CellSignalStrengthGsm;
+import android.telephony.CellSignalStrengthLte;
+import android.telephony.CellSignalStrengthWcdma;
 import android.telephony.NeighboringCellInfo;
 import android.telephony.SmsMessage;
 import android.telephony.SubscriptionInfo;
@@ -66,6 +78,7 @@
 import com.googlecode.android_scripting.ConvertUtils;
 import com.googlecode.android_scripting.Log;
 import com.googlecode.android_scripting.event.Event;
+import com.googlecode.android_scripting.facade.tele.TelephonyUtils;
 
 public class JsonBuilder {
 
@@ -180,7 +193,6 @@
         if (data instanceof Point) {
             return buildPoint((Point) data);
         }
-
         if (data instanceof SmsMessage) {
             return buildSmsMessage((SmsMessage) data);
         }
@@ -220,6 +232,18 @@
         if (data instanceof Object[]) {
             return buildJSONArray((Object[]) data);
         }
+        if (data instanceof CellInfoLte) {
+            return buildCellInfoLte((CellInfoLte) data);
+        }
+        if (data instanceof CellInfoWcdma) {
+            return buildCellInfoWcdma((CellInfoWcdma) data);
+        }
+        if (data instanceof CellInfoGsm) {
+            return buildCellInfoGsm((CellInfoGsm) data);
+        }
+        if (data instanceof CellInfoCdma) {
+            return buildCellInfoCdma((CellInfoCdma) data);
+        }
 
         return data.toString();
         // throw new JSONException("Failed to build JSON result. " +
@@ -525,7 +549,7 @@
     private static JSONObject buildWifiActivityEnergyInfo(
             WifiActivityEnergyInfo data) throws JSONException {
         JSONObject result = new JSONObject();
-        result.put("ControllerEnergyUserd", data.getControllerEnergyUsed());
+        result.put("ControllerEnergyUsed", data.getControllerEnergyUsed());
         result.put("ControllerIdleTimeMillis",
                 data.getControllerIdleTimeMillis());
         result.put("ControllerRxTimeMillis", data.getControllerRxTimeMillis());
@@ -590,10 +614,92 @@
 
     private static JSONObject buildNeighboringCellInfo(NeighboringCellInfo data)
             throws JSONException {
-        // TODO(damonkohler): Additional information available at API level 5.
         JSONObject result = new JSONObject();
         result.put("cid", data.getCid());
         result.put("rssi", data.getRssi());
+        result.put("lac", data.getLac());
+        result.put("psc", data.getPsc());
+        String networkType =
+                TelephonyUtils.getNetworkTypeString(data.getNetworkType());
+        result.put("network_type", build(networkType));
+        return result;
+    }
+
+    private static JSONObject buildCellInfoLte(CellInfoLte data)
+            throws JSONException {
+        JSONObject result = new JSONObject();
+        result.put("rat", "lte");
+        result.put("registered", data.isRegistered());
+        CellIdentityLte cellidentity =
+                        ((CellInfoLte) data).getCellIdentity();
+        CellSignalStrengthLte signalstrength =
+                        ((CellInfoLte) data).getCellSignalStrength();
+        result.put("mcc", cellidentity.getMcc());
+        result.put("mnc", cellidentity.getMnc());
+        result.put("cid", cellidentity.getCi());
+        result.put("pcid", cellidentity.getPci());
+        result.put("tac", cellidentity.getTac());
+        result.put("rsrp", signalstrength.getDbm());
+        result.put("asulevel", signalstrength.getAsuLevel());
+        result.put("timing_advance", signalstrength.getTimingAdvance());
+        return result;
+    }
+
+    private static JSONObject buildCellInfoGsm(CellInfoGsm data)
+            throws JSONException {
+        JSONObject result = new JSONObject();
+        result.put("rat", "gsm");
+        result.put("registered", data.isRegistered());
+        CellIdentityGsm cellidentity =
+                      ((CellInfoGsm) data).getCellIdentity();
+        CellSignalStrengthGsm signalstrength =
+                      ((CellInfoGsm) data).getCellSignalStrength();
+        result.put("mcc", cellidentity.getMcc());
+        result.put("mnc", cellidentity.getMnc());
+        result.put("cid", cellidentity.getCid());
+        result.put("lac", cellidentity.getLac());
+        result.put("signal_strength", signalstrength.getDbm());
+        result.put("asulevel", signalstrength.getAsuLevel());
+        return result;
+    }
+
+    private static JSONObject buildCellInfoWcdma(CellInfoWcdma data)
+            throws JSONException {
+        JSONObject result = new JSONObject();
+        result.put("rat", "wcdma");
+        result.put("registered", data.isRegistered());
+        CellIdentityWcdma cellidentity =
+                          ((CellInfoWcdma) data).getCellIdentity();
+        CellSignalStrengthWcdma signalstrength =
+                          ((CellInfoWcdma) data).getCellSignalStrength();
+        result.put("mcc", cellidentity.getMcc());
+        result.put("mnc", cellidentity.getMnc());
+        result.put("cid", cellidentity.getCid());
+        result.put("lac", cellidentity.getLac());
+        result.put("signal_strength", signalstrength.getDbm());
+        result.put("asulevel", signalstrength.getAsuLevel());
+        return result;
+    }
+
+    private static JSONObject buildCellInfoCdma(CellInfoCdma data)
+            throws JSONException {
+        JSONObject result = new JSONObject();
+        result.put("rat", "cdma");
+        result.put("registered", data.isRegistered());
+        CellIdentityCdma cellidentity =
+                       ((CellInfoCdma) data).getCellIdentity();
+        CellSignalStrengthCdma signalstrength =
+                       ((CellInfoCdma) data).getCellSignalStrength();
+        result.put("network_id", cellidentity.getNetworkId());
+        result.put("system_id", cellidentity.getSystemId());
+        result.put("basestation_id", cellidentity.getBasestationId());
+        result.put("longitude", cellidentity.getLongitude());
+        result.put("latitude", cellidentity.getLatitude());
+        result.put("cdma_dbm", signalstrength.getCdmaDbm());
+        result.put("cdma_ecio", signalstrength.getCdmaEcio());
+        result.put("evdo_dbm", signalstrength.getEvdoDbm());
+        result.put("evdo_ecio", signalstrength.getEvdoEcio());
+        result.put("evdo_snr", signalstrength.getEvdoSnr());
         return result;
     }
 
diff --git a/Utils/src/com/googlecode/android_scripting/future/FutureResult.java b/Utils/src/com/googlecode/android_scripting/future/FutureResult.java
index 78a63b0..bdf9cb8 100644
--- a/Utils/src/com/googlecode/android_scripting/future/FutureResult.java
+++ b/Utils/src/com/googlecode/android_scripting/future/FutureResult.java
@@ -27,39 +27,39 @@
  */
 public class FutureResult<T> implements Future<T> {
 
-  private final CountDownLatch mLatch = new CountDownLatch(1);
-  private volatile T mResult = null;
+    private final CountDownLatch mLatch = new CountDownLatch(1);
+    private volatile T mResult = null;
 
-  public void set(T result) {
-    mResult = result;
-    mLatch.countDown();
-  }
+    public void set(T result) {
+        mResult = result;
+        mLatch.countDown();
+    }
 
-  @Override
-  public boolean cancel(boolean mayInterruptIfRunning) {
-    return false;
-  }
+    @Override
+    public boolean cancel(boolean mayInterruptIfRunning) {
+        return false;
+    }
 
-  @Override
-  public T get() throws InterruptedException {
-    mLatch.await();
-    return mResult;
-  }
+    @Override
+    public T get() throws InterruptedException {
+        mLatch.await();
+        return mResult;
+    }
 
-  @Override
-  public T get(long timeout, TimeUnit unit) throws InterruptedException {
-    mLatch.await(timeout, unit);
-    return mResult;
-  }
+    @Override
+    public T get(long timeout, TimeUnit unit) throws InterruptedException {
+        mLatch.await(timeout, unit);
+        return mResult;
+    }
 
-  @Override
-  public boolean isCancelled() {
-    return false;
-  }
+    @Override
+    public boolean isCancelled() {
+        return false;
+    }
 
-  @Override
-  public boolean isDone() {
-    return mResult != null;
-  }
+    @Override
+    public boolean isDone() {
+        return mResult != null;
+    }
 
 }
