diff --git a/Common/src/com/googlecode/android_scripting/facade/EventServer.java b/Common/src/com/googlecode/android_scripting/facade/EventServer.java
index 432980a..3b67fa4 100644
--- a/Common/src/com/googlecode/android_scripting/facade/EventServer.java
+++ b/Common/src/com/googlecode/android_scripting/facade/EventServer.java
@@ -20,6 +20,7 @@
 import com.googlecode.android_scripting.event.Event;
 import com.googlecode.android_scripting.jsonrpc.JsonBuilder;
 
+import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.net.InetSocketAddress;
@@ -64,6 +65,7 @@
 
   @Override
   protected void handleConnection(Socket socket) throws IOException {
+    Log.d("handle event connection.");
     Listener l = new Listener(socket);
     Log.v("Adding EventServer listener " + socket.getPort());
     mListeners.add(l);
@@ -116,4 +118,9 @@
       out = new PrintWriter(l.getOutputStream(), true);
     }
   }
+
+  @Override
+  protected void handleRPCConnection(Socket sock, Integer UID, BufferedReader reader, PrintWriter writer)
+      throws Exception {
+  }
 }
diff --git a/Common/src/com/googlecode/android_scripting/facade/FacadeManagerFactory.java b/Common/src/com/googlecode/android_scripting/facade/FacadeManagerFactory.java
index 4bde600..2557cd8 100644
--- a/Common/src/com/googlecode/android_scripting/facade/FacadeManagerFactory.java
+++ b/Common/src/com/googlecode/android_scripting/facade/FacadeManagerFactory.java
@@ -7,9 +7,9 @@
 import com.googlecode.android_scripting.jsonrpc.RpcReceiverManager;
 import com.googlecode.android_scripting.jsonrpc.RpcReceiverManagerFactory;
 
-import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Collection;
-import java.util.List;
+import java.util.Map;
 
 public class FacadeManagerFactory implements RpcReceiverManagerFactory {
 
@@ -17,7 +17,7 @@
   private final Service mService;
   private final Intent mIntent;
   private final Collection<Class<? extends RpcReceiver>> mClassList;
-  private final List<RpcReceiverManager> mFacadeManagers;
+  private final Map<Integer, RpcReceiverManager> mFacadeManagers;
 
   public FacadeManagerFactory(int sdkLevel, Service service, Intent intent,
       Collection<Class<? extends RpcReceiver>> classList) {
@@ -25,17 +25,18 @@
     mService = service;
     mIntent = intent;
     mClassList = classList;
-    mFacadeManagers = new ArrayList<RpcReceiverManager>();
+    mFacadeManagers = new HashMap<Integer, RpcReceiverManager>();
   }
 
-  public FacadeManager create() {
+  @Override
+  public FacadeManager create(Integer UID) {
     FacadeManager facadeManager = new FacadeManager(mSdkLevel, mService, mIntent, mClassList);
-    mFacadeManagers.add(facadeManager);
+    mFacadeManagers.put(UID, facadeManager);
     return facadeManager;
   }
 
   @Override
-  public List<RpcReceiverManager> getRpcReceiverManagers() {
+  public Map<Integer, RpcReceiverManager> getRpcReceiverManagers() {
     return mFacadeManagers;
   }
 }
diff --git a/Common/src/com/googlecode/android_scripting/facade/ScanFacade.java b/Common/src/com/googlecode/android_scripting/facade/ScanFacade.java
index 82975d1..84a4848 100644
--- a/Common/src/com/googlecode/android_scripting/facade/ScanFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/ScanFacade.java
@@ -11,6 +11,7 @@
 import com.googlecode.android_scripting.MainThread;
 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 com.googlecode.android_scripting.rpc.RpcStartEvent;
 import com.googlecode.android_scripting.rpc.RpcStopEvent;
@@ -20,14 +21,13 @@
 
 /**
  * ScanManager functions.
- *
  */
 public class ScanFacade extends RpcReceiver {
   private final Service mService;
   private final EventFacade mEventFacade;
   private final WifiScanner mScan;
-  // These counters are just for indexing;
-  // they do not represent the total number of listeners
+  //These counters are just for indexing;
+  //they do not represent the total number of listeners
   private static int WifiScanListenerCnt;
   private static int WifiChangeListenerCnt;
   private static int WifiHotspotListenerCnt;
@@ -52,10 +52,10 @@
     protected String listenerType;
 
     public WifiActionListener(String type, int idx, Bundle statusBundle, Bundle resultBundle) {
-      index = idx;
-      listenerType = type;
-      mStatus = statusBundle;
-      mResults = resultBundle;
+      this.index = idx;
+      this.listenerType = type;
+      this.mStatus = statusBundle;
+      this.mResults = resultBundle;
     }
 
     @Override
@@ -81,28 +81,25 @@
     public void reportResult(ScanResult[] results, String eventType) {
       Log.d("android_scripting " + eventType + " " + listenerType + index);
       mResults.putString("ID", listenerType + index);
+      mResults.putLong("Timestamp", System.currentTimeMillis()/1000);
       mResults.putString("Type", eventType);
       mResults.putParcelableArray("Results", results);
-      mResults.putLong("Time", System.currentTimeMillis());
       mEventFacade.postEvent("ScanResults", mResults.clone());
       mResults.clear();
     }
-
   }
 
   /**
    * Constructs a wifiScanListener obj and returns it
-   *
    * @return WifiScanListener
    */
   private WifiScanListener genWifiScanListener() {
-    WifiScanListener mWifiScannerListener =
-        MainThread.run(mService, new Callable<WifiScanListener>() {
-          @Override
-          public WifiScanListener call() throws Exception {
-            return new WifiScanListener();
-          }
-        });
+    WifiScanListener mWifiScannerListener = MainThread.run(mService, new Callable<WifiScanListener>() {
+      @Override
+      public WifiScanListener call() throws Exception {
+        return new WifiScanListener();
+      }
+    });
     wifiScannerListenerList.put(mWifiScannerListener.index, mWifiScannerListener);
     return mWifiScannerListener;
   }
@@ -161,7 +158,6 @@
 
   /**
    * Constructs a ChangeListener obj and returns it
-   *
    * @return ChangeListener
    */
   public ChangeListener genWifiChangeListener() {
@@ -198,38 +194,29 @@
     public void onFailure(int reason, Object exception) {
       mWAL.onFailure(reason, exception);
     }
-
-    /**
-     * indicates that changes were detected in wifi environment
-     *
-     * @param results
-     *          indicate the access points that exhibited change
+    /** indicates that changes were detected in wifi environment
+     * @param results indicate the access points that exhibited change
      */
     @Override
-    public void onChanging(ScanResult[] results) { /* changes are found */
+    public void onChanging(ScanResult[] results) {           /* changes are found */
       mWAL.reportResult(results, "onChanging");
     }
-
-    /**
-     * indicates that no wifi changes are being detected for a while
-     *
-     * @param results
-     *          indicate the access points that are bing monitored for change
+    /** indicates that no wifi changes are being detected for a while
+     * @param results indicate the access points that are bing monitored for change
      */
     @Override
-    public void onQuiescence(ScanResult[] results) { /* changes settled down */
+    public void onQuiescence(ScanResult[] results) {         /* changes settled down */
       mWAL.reportResult(results, "onQuiescence");
     }
   }
 
   public WifiHotspotListener genWifiHotspotListener() {
-    WifiHotspotListener mWifiHotspotListener =
-        MainThread.run(mService, new Callable<WifiHotspotListener>() {
-          @Override
-          public WifiHotspotListener call() throws Exception {
-            return new WifiHotspotListener();
-          }
-        });
+    WifiHotspotListener mWifiHotspotListener = MainThread.run(mService, new Callable<WifiHotspotListener>() {
+      @Override
+      public WifiHotspotListener call() throws Exception {
+        return new WifiHotspotListener();
+      }
+    });
     wifiHotspotListenerList.put(mWifiHotspotListener.index, mWifiHotspotListener);
     return mWifiHotspotListener;
   }
@@ -268,26 +255,23 @@
 
   /**
    * Starts periodic wifi background scan
-   *
    * @param periodInMs
-   * @param channel_freqs
-   *          frequencies of channels to scan
+   * @param channel_freqs frequencies of channels to scan
    * @return the id of the scan listener associated with this scan
    */
   @Rpc(description = "Starts a periodic Wifi scan in background.")
   @RpcStartEvent("WifiScan")
   public Integer startWifiBackgroundScan(@RpcParameter(name = "periodInMs") Integer periodInMs,
-      @RpcParameter(name = "channel_freqs") Integer[] channel_freqs) {
+                                  @RpcParameter(name = "channel_freqs") Integer[] channel_freqs) {
     WifiScanner.ScanSettings ss = new WifiScanner.ScanSettings();
     ss.channels = new WifiScanner.ChannelSpec[channel_freqs.length];
-    for (int i = 0; i < channel_freqs.length; i++) {
+    for(int i=0; i<channel_freqs.length; i++) {
       ss.channels[i] = new WifiScanner.ChannelSpec(channel_freqs[i]);
     }
     ss.periodInMs = periodInMs;
     Log.d("android_scripting periodInMs " + ss.periodInMs);
-    for (int i = 0; i < ss.channels.length; i++) {
-      Log.d("android_scripting " + ss.channels[i].frequency + " " + ss.channels[i].passive + " "
-          + ss.channels[i].dwellTimeMS);
+    for(int i=0; i<ss.channels.length; i++) {
+      Log.d("android_scripting " + ss.channels[i].frequency + " " + ss.channels[i].passive + " " + ss.channels[i].dwellTimeMS);
     }
     WifiScanListener mListener = genWifiScanListener();
     mScan.startBackgroundScan(ss, mListener);
@@ -296,9 +280,7 @@
 
   /**
    * Stops a wifi background scan
-   *
-   * @param listener_index
-   *          the id of the scan listener whose scan to stop
+   * @param listener_index the id of the scan listener whose scan to stop
    */
   @Rpc(description = "Stops an ongoing periodic Wifi scan in background")
   @RpcStopEvent("WifiScan")
@@ -314,7 +296,7 @@
   public Integer[] showWifiScanListeners() {
     Integer[] result = new Integer[wifiScannerListenerList.size()];
     int j = 0;
-    for (int i : wifiScannerListenerList.keySet()) {
+    for(int i : wifiScannerListenerList.keySet()) {
       result[j] = wifiScannerListenerList.get(i).index;
       j += 1;
     }
@@ -323,7 +305,6 @@
 
   /**
    * Starts tracking wifi changes
-   *
    * @return the id of the change listener associated with this track
    */
   @Rpc(description = "Starts tracking wifi changes")
@@ -336,9 +317,7 @@
 
   /**
    * Stops tracking wifi changes
-   *
-   * @param listener_index
-   *          the id of the change listener whose track to stop
+   * @param listener_index the id of the change listener whose track to stop
    */
   @Rpc(description = "Stops tracking wifi changes")
   public void stopTrackingChange(@RpcParameter(name = "listener") Integer listener_index) {
@@ -349,31 +328,27 @@
 
   /**
    * Starts tracking changes of the wifi networks specified in a hotlist
-   *
-   * @param hotspotInfos
-   *          a 'hotlist' specifying which wifi networks to track
-   * @param apLostThreshold
-   *          signal strength below which an AP is considered lost
+   * @param hotspotInfos a 'hotlist' specifying which wifi networks to track
+   * @param apLostThreshold signal strength below which an AP is considered lost
    * @return the id of the hotlist listener associated with this track
    * @throws Exception
    */
   @Rpc(description = "Starts tracking changes of the APs on hotlist")
   public Integer setHotlist(String[] hotspotInfos, Integer apLostThreshold) throws Exception {
-    // Instantiates HotspotInfo objs
+    //Instantiates HotspotInfo objs
     HotspotInfo[] mHotspotInfos = new HotspotInfo[hotspotInfos.length];
-    for (int i = 0; i < hotspotInfos.length; i++) {
+    for(int i=0; i<hotspotInfos.length; i++) {
       Log.d("android_scripting " + hotspotInfos[i]);
       String[] tokens = hotspotInfos[i].split(" ");
-      if (tokens.length != 3) {
-        throw new Exception("Invalid hotspot info: " + hotspotInfos[i]);
-
+      if(tokens.length!=3) {
+        throw new Exception("Invalid hotspot info: "+hotspotInfos[i]);
       }
       int a = Integer.parseInt(tokens[1]);
       int b = Integer.parseInt(tokens[2]);
       HotspotInfo mHI = new HotspotInfo();
       mHI.bssid = tokens[0];
-      mHI.low = a < b ? a : b;
-      mHI.high = a < b ? b : a;
+      mHI.low = a<b? a:b;
+      mHI.high = a<b? b:a;
       mHotspotInfos[i] = mHI;
     }
     WifiHotspotListener mWHL = genWifiHotspotListener();
@@ -383,9 +358,7 @@
 
   /**
    * Stops tracking the hotlist associated with the input listener
-   *
-   * @param listener_index
-   *          the id of the hotspot listener whose track to stop
+   * @param listener_index the id of the hotspot listener whose track to stop
    */
   @Rpc(description = "Stops tracking changes of the APs on hotlist")
   public void resetHotlist(@RpcParameter(name = "listener") Integer listener_index) {
@@ -399,7 +372,7 @@
    */
   @Rpc(description = "Shuts down all WifiScanner activities")
   public void wifiScannerShutdown() {
-    shutdown();
+    this.shutdown();
   }
 
   /**
@@ -407,19 +380,19 @@
    */
   @Override
   public void shutdown() {
-    if (!wifiScannerListenerList.isEmpty()) {
-      for (int i : wifiScannerListenerList.keySet()) {
-        stopWifiBackgroundScan(i);
+    if(!wifiScannerListenerList.isEmpty()) {
+      for(int i : wifiScannerListenerList.keySet()) {
+        this.stopWifiBackgroundScan(i);
       }
     }
-    if (!wifiChangeListenerList.isEmpty()) {
-      for (int i : wifiChangeListenerList.keySet()) {
-        stopTrackingChange(i);
+    if(!wifiChangeListenerList.isEmpty()) {
+      for(int i : wifiChangeListenerList.keySet()) {
+        this.stopTrackingChange(i);
       }
     }
-    if (!wifiHotspotListenerList.isEmpty()) {
-      for (int i : wifiHotspotListenerList.keySet()) {
-        resetHotlist(i);
+    if(!wifiHotspotListenerList.isEmpty()) {
+      for(int i : wifiHotspotListenerList.keySet()) {
+        this.resetHotlist(i);
       }
     }
   }
diff --git a/Common/src/com/googlecode/android_scripting/facade/SettingsFacade.java b/Common/src/com/googlecode/android_scripting/facade/SettingsFacade.java
index 7fb1988..1635ffc 100644
--- a/Common/src/com/googlecode/android_scripting/facade/SettingsFacade.java
+++ b/Common/src/com/googlecode/android_scripting/facade/SettingsFacade.java
@@ -84,7 +84,7 @@
   public Boolean checkAirplaneMode() {
     try {
       return android.provider.Settings.System.getInt(mService.getContentResolver(),
-          android.provider.Settings.System.AIRPLANE_MODE_ON) == AIRPLANE_MODE_ON;
+          android.provider.Settings.Global.AIRPLANE_MODE_ON) == AIRPLANE_MODE_ON;
     } catch (SettingNotFoundException e) {
       return false;
     }
@@ -96,7 +96,7 @@
       enabled = !checkAirplaneMode();
     }
     android.provider.Settings.System.putInt(mService.getContentResolver(),
-        android.provider.Settings.System.AIRPLANE_MODE_ON, enabled ? AIRPLANE_MODE_ON
+        android.provider.Settings.Global.AIRPLANE_MODE_ON, enabled ? AIRPLANE_MODE_ON
             : AIRPLANE_MODE_OFF);
     Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
     intent.putExtra("state", enabled);
diff --git a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java b/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java
index bb74fa1..522610d 100644
--- a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java
+++ b/Common/src/com/googlecode/android_scripting/jsonrpc/JsonBuilder.java
@@ -295,8 +295,7 @@
     return result;
   }
 
-  private static JSONObject buildNeighboringCellInfo(NeighboringCellInfo data)
-      throws JSONException {
+  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());
diff --git a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonRpcServer.java b/Common/src/com/googlecode/android_scripting/jsonrpc/JsonRpcServer.java
index 94324d8..73171dc 100644
--- a/Common/src/com/googlecode/android_scripting/jsonrpc/JsonRpcServer.java
+++ b/Common/src/com/googlecode/android_scripting/jsonrpc/JsonRpcServer.java
@@ -57,18 +57,33 @@
   public void shutdown() {
     super.shutdown();
     // Notify all RPC receiving objects. They may have to clean up some of their state.
-    for (RpcReceiverManager manager : mRpcReceiverManagerFactory.getRpcReceiverManagers()) {
+    for (RpcReceiverManager manager : mRpcReceiverManagerFactory.getRpcReceiverManagers().values()) {
       manager.shutdown();
     }
   }
 
+
   @Override
-  protected void handleConnection(Socket socket) throws Exception {
-    RpcReceiverManager receiverManager = mRpcReceiverManagerFactory.create();
+  protected void handleRPCConnection(Socket sock, Integer UID, BufferedReader reader, PrintWriter writer) throws Exception {
+    RpcReceiverManager receiverManager = null;
+    //Log.d("Sock state 3: "+sock.isClosed());
+    Log.d("UID "+UID);
+    Log.d("manager map size: "+mRpcReceiverManagerFactory.getRpcReceiverManagers().size());
+    Log.d("manager map keys: "+mRpcReceiverManagerFactory.getRpcReceiverManagers().keySet());
+    if(mRpcReceiverManagerFactory.getRpcReceiverManagers().containsKey(UID)) {
+      Log.d("Look up existing session");
+      receiverManager = mRpcReceiverManagerFactory.getRpcReceiverManagers().get(UID);
+    }else{
+      Log.d("Create a new session");
+      receiverManager = mRpcReceiverManagerFactory.create(UID);
+    }
+    //Log.d("Sock state 4: "+sock.isClosed());
+
+    /*RpcReceiverManager receiverManager = mRpcReceiverManagerFactory.create();
     BufferedReader reader =
         new BufferedReader(new InputStreamReader(socket.getInputStream()), 8192);
-    PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
-    boolean passedAuthentication = false;
+    PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);*/
+    //boolean passedAuthentication = false;
     String data;
     while ((data = reader.readLine()) != null) {
       Log.v("Received: " + data);
@@ -78,17 +93,17 @@
       JSONArray params = request.getJSONArray("params");
 
       // First RPC must be _authenticate if a handshake was specified.
-      if (!passedAuthentication && mHandshake != null) {
-        if (!checkHandshake(method, params)) {
-          SecurityException exception = new SecurityException("Authentication failed!");
-          send(writer, JsonRpcResult.error(id, exception));
-          shutdown();
-          throw exception;
-        }
-        passedAuthentication = true;
-        send(writer, JsonRpcResult.result(id, true));
-        continue;
-      }
+//      if (!passedAuthentication && mHandshake != null) {
+//        if (!checkHandshake(method, params)) {
+//          SecurityException exception = new SecurityException("Authentication failed!");
+//          send(writer, JsonRpcResult.error(id, exception));
+//          shutdown();
+//          throw exception;
+//        }
+//        passedAuthentication = true;
+//        send(writer, JsonRpcResult.result(id, true));
+//        continue;
+//      }
 
       MethodDescriptor rpc = receiverManager.getMethodDescriptor(method);
       if (rpc == null) {
@@ -116,4 +131,8 @@
     writer.flush();
     Log.v("Sent: " + result);
   }
+
+  @Override
+  protected void handleConnection(Socket socket) throws Exception {
+  }
 }
diff --git a/Common/src/com/googlecode/android_scripting/jsonrpc/RpcReceiverManagerFactory.java b/Common/src/com/googlecode/android_scripting/jsonrpc/RpcReceiverManagerFactory.java
index 8ac810c..6e03078 100644
--- a/Common/src/com/googlecode/android_scripting/jsonrpc/RpcReceiverManagerFactory.java
+++ b/Common/src/com/googlecode/android_scripting/jsonrpc/RpcReceiverManagerFactory.java
@@ -16,10 +16,10 @@
 
 package com.googlecode.android_scripting.jsonrpc;
 
-import java.util.List;
+import java.util.Map;
 
 public interface RpcReceiverManagerFactory {
-  public RpcReceiverManager create();
+  public RpcReceiverManager create(Integer UID);
 
-  public List<RpcReceiverManager> getRpcReceiverManagers();
+  public Map<Integer, RpcReceiverManager> getRpcReceiverManagers();
 }
diff --git a/QuickAction/src/net/londatiga/android/QuickAction.java b/QuickAction/src/net/londatiga/android/QuickAction.java
index 532e6cf..2c1cfb4 100644
--- a/QuickAction/src/net/londatiga/android/QuickAction.java
+++ b/QuickAction/src/net/londatiga/android/QuickAction.java
@@ -19,7 +19,6 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import net.londatiga.android.R;
 
 /**
  * Popup window, shows action list as icon and text (QuickContact / Twitter app).
diff --git a/README b/README
index ffbb891..41f9585 100644
--- a/README
+++ b/README
@@ -1,3 +1,9 @@
-This directory contains Eclipse projects related to the Scripting Layer For Android.
-
+This directory contains projects related to the Scripting Layer For Android.
 ScriptingLayerForAndroid/ contains the main SL4A project.
+
+To build, modify the BRANCH_ROOT and other paths if necessary in build_all.sh
+Plug in your device and run build_all.sh
+
+To run, add android.py to your $PYTHONPATH
+
+Note: the sl4a build is dependent on prebuilt libraries in your repo branch. So your local repo needs to be able to build first.
diff --git a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/ActivityFlinger.java b/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/ActivityFlinger.java
index 17cca3c..389b55e 100644
--- a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/ActivityFlinger.java
+++ b/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/ActivityFlinger.java
@@ -20,9 +20,9 @@
 import android.content.Context;
 import android.content.Intent;
 import android.view.GestureDetector;
-import android.view.GestureDetector.SimpleOnGestureListener;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.GestureDetector.SimpleOnGestureListener;
 import android.view.View.OnTouchListener;
 
 import com.googlecode.android_scripting.activity.InterpreterManager;
@@ -70,8 +70,8 @@
     Class<? extends Activity> current = null;
     Class<? extends Activity> right = null;
 
-    for (Iterator<Class<? extends Activity>> it = entries.iterator();
-        it.hasNext() || current != null;) {
+    for (Iterator<Class<? extends Activity>> it = entries.iterator(); it.hasNext()
+        || current != null;) {
       if (current == null) {
         current = it.next();
       }
@@ -126,8 +126,7 @@
     Runnable mRightRunnable;
 
     @Override
-    public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX,
-        float velocityY) {
+    public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) {
       if (Math.abs(event1.getY() - event2.getY()) > SWIPE_MAX_OFF_PATH) {
         return false;
       }
diff --git a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptingLayerService.java b/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptingLayerService.java
index b3e74b6..ce95ec5 100644
--- a/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptingLayerService.java
+++ b/ScriptingLayerForAndroid/src/com/googlecode/android_scripting/activity/ScriptingLayerService.java
@@ -213,7 +213,7 @@
     AndroidProxy androidProxy = new AndroidProxy(this, intent, requiresHandshake);
     boolean usePublicIp = intent.getBooleanExtra(Constants.EXTRA_USE_EXTERNAL_IP, false);
     int usePort = intent.getIntExtra(Constants.EXTRA_USE_SERVICE_PORT, 0);
-    // If port is in use, fall back to defaut behaviour
+    // If port is in use, fall back to default behaviour
     if (!tryPort(androidProxy, usePublicIp, usePort)) {
       if (usePort != 0) {
         tryPort(androidProxy, usePublicIp, 0);
diff --git a/ScriptingLayerForAndroid/src/org/connectbot/TerminalView.java b/ScriptingLayerForAndroid/src/org/connectbot/TerminalView.java
index 507a553..dfe231b 100644
--- a/ScriptingLayerForAndroid/src/org/connectbot/TerminalView.java
+++ b/ScriptingLayerForAndroid/src/org/connectbot/TerminalView.java
@@ -41,7 +41,6 @@
 /**
  * User interface {@link View} for showing a TerminalBridge in an {@link Activity}. Handles drawing
  * bitmap updates and passing keystrokes down to terminal.
- *
  * @author jsharkey
  */
 public class TerminalView extends View implements FontSizeChangedListener {
@@ -208,8 +207,9 @@
       if (bridge.isSelectingForCopy()) {
         SelectionArea area = bridge.getSelectionArea();
         canvas.save(Canvas.CLIP_SAVE_FLAG);
-        canvas.clipRect(area.getLeft() * bridge.charWidth, area.getTop() * bridge.charHeight,
-            (area.getRight() + 1) * bridge.charWidth, (area.getBottom() + 1) * bridge.charHeight);
+        canvas.clipRect(area.getLeft() * bridge.charWidth, area.getTop() * bridge.charHeight, (area
+            .getRight() + 1)
+            * bridge.charWidth, (area.getBottom() + 1) * bridge.charHeight);
         canvas.drawPaint(cursorPaint);
         canvas.restore();
       }
@@ -239,7 +239,6 @@
 
   /**
    * Ask the {@link TerminalBridge} we're connected to to resize to a specific size.
-   *
    * @param width
    * @param height
    */
@@ -249,7 +248,6 @@
 
   /**
    * Sets the ability for the TerminalView to display Toast notifications to the user.
-   *
    * @param value
    *          whether to enable notifications or not
    */
@@ -264,8 +262,9 @@
 
   @Override
   public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
-    outAttrs.imeOptions |= EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_FLAG_NO_ENTER_ACTION
-        | EditorInfo.IME_ACTION_NONE;
+    outAttrs.imeOptions |=
+        EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_FLAG_NO_ENTER_ACTION
+            | EditorInfo.IME_ACTION_NONE;
     outAttrs.inputType = EditorInfo.TYPE_NULL;
     return new BaseInputConnection(this, false);
   }
diff --git a/ScriptingLayerForAndroid/src/org/connectbot/service/TerminalBridge.java b/ScriptingLayerForAndroid/src/org/connectbot/service/TerminalBridge.java
index 75c0974..9f988fd 100644
--- a/ScriptingLayerForAndroid/src/org/connectbot/service/TerminalBridge.java
+++ b/ScriptingLayerForAndroid/src/org/connectbot/service/TerminalBridge.java
@@ -825,7 +825,7 @@
   public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
     if (mProcess.isAlive()) {
       RpcReceiverManagerFactory rpcReceiverManagerFactory = mProcess.getRpcReceiverManagerFactory();
-      for (RpcReceiverManager manager : rpcReceiverManagerFactory.getRpcReceiverManagers()) {
+      for (RpcReceiverManager manager : rpcReceiverManagerFactory.getRpcReceiverManagers().values()) {
         UiFacade facade = manager.getReceiver(UiFacade.class);
         facade.onCreateContextMenu(menu, v, menuInfo);
       }
@@ -836,7 +836,7 @@
     boolean returnValue = false;
     if (mProcess.isAlive()) {
       RpcReceiverManagerFactory rpcReceiverManagerFactory = mProcess.getRpcReceiverManagerFactory();
-      for (RpcReceiverManager manager : rpcReceiverManagerFactory.getRpcReceiverManagers()) {
+      for (RpcReceiverManager manager : rpcReceiverManagerFactory.getRpcReceiverManagers().values()) {
         UiFacade facade = manager.getReceiver(UiFacade.class);
         returnValue = returnValue || facade.onPrepareOptionsMenu(menu);
       }
diff --git a/Utils/src/com/googlecode/android_scripting/ForegroundService.java b/Utils/src/com/googlecode/android_scripting/ForegroundService.java
index 175681c..9e289bb 100644
--- a/Utils/src/com/googlecode/android_scripting/ForegroundService.java
+++ b/Utils/src/com/googlecode/android_scripting/ForegroundService.java
@@ -4,7 +4,6 @@
 import android.app.NotificationManager;
 import android.app.Service;
 
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
 public abstract class ForegroundService extends Service {
@@ -72,18 +71,6 @@
     setForeground(false);
   }
 
-  void invokeMethod(Method method, Object[] args) {
-    try {
-      method.invoke(this, args);
-    } catch (InvocationTargetException e) {
-      // Should not happen.
-      Log.e(e);
-    } catch (IllegalAccessException e) {
-      // Should not happen.
-      Log.e(e);
-    }
-  }
-
   @Override
   public void onCreate() {
     mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
diff --git a/Utils/src/com/googlecode/android_scripting/SimpleServer.java b/Utils/src/com/googlecode/android_scripting/SimpleServer.java
index 2c62beb..ed7ac89 100644
--- a/Utils/src/com/googlecode/android_scripting/SimpleServer.java
+++ b/Utils/src/com/googlecode/android_scripting/SimpleServer.java
@@ -18,7 +18,16 @@
 
 import com.google.common.collect.Lists;
 
+//import com.googlecode.android_scripting.jsonrpc.RpcReceiverManager;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.BufferedReader;
 import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
 import java.net.Inet4Address;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
@@ -30,17 +39,16 @@
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * A simple server.
- * 
  * @author Damon Kohler (damonkohler@gmail.com)
  */
 public abstract class SimpleServer {
-
-  private final CopyOnWriteArrayList<ConnectionThread> mConnectionThreads =
-      new CopyOnWriteArrayList<ConnectionThread>();
+  private static int threadIndex = 0;
+  private final ConcurrentHashMap<Integer, ConnectionThread> mConnectionThreads =
+      new ConcurrentHashMap<Integer, ConnectionThread>();
   private final List<SimpleServerObserver> mObservers = Lists.newArrayList();
   private volatile boolean mStopServer = false;
   private ServerSocket mServer;
@@ -53,6 +61,10 @@
   }
 
   protected abstract void handleConnection(Socket socket) throws Exception;
+  protected abstract void handleRPCConnection(Socket socket,
+                                              Integer UID,
+                                              BufferedReader reader,
+                                              PrintWriter writer) throws Exception;
 
   /** Adds an observer. */
   public void addObserver(SimpleServerObserver observer) {
@@ -78,17 +90,32 @@
 
   private final class ConnectionThread extends Thread {
     private final Socket mmSocket;
+    private final BufferedReader reader;
+    private final PrintWriter writer;
+    private final Integer UID;
+    private final boolean isRpc;
 
-    private ConnectionThread(Socket socket) {
+    private ConnectionThread(Socket socket, boolean rpc, Integer uid, BufferedReader reader, PrintWriter writer) {
       setName("SimpleServer ConnectionThread " + getId());
       mmSocket = socket;
+      this.UID = uid;
+      this.reader = reader;
+      this.writer = writer;
+      this.isRpc = rpc;
     }
 
     @Override
     public void run() {
       Log.v("Server thread " + getId() + " started.");
       try {
-        handleConnection(mmSocket);
+        if(isRpc) {
+          Log.d("Sock state 2: "+mmSocket.isClosed());
+          Log.d("Handling RPC connection in "+getId());
+          handleRPCConnection(mmSocket, UID, reader, writer);
+        }else{
+          Log.d("Handling Non-RPC connection in "+getId());
+          handleConnection(mmSocket);
+        }
       } catch (Exception e) {
         if (!mStopServer) {
           Log.e("Server error.", e);
@@ -241,6 +268,10 @@
             if (!mStopServer) {
               Log.e("Failed to accept connection.", e);
             }
+          } catch (JSONException e) {
+            if (!mStopServer) {
+              Log.e("Failed to parse request.", e);
+            }
           }
         }
       }
@@ -250,11 +281,57 @@
     return mServer.getLocalPort();
   }
 
-  private void startConnectionThread(final Socket sock) {
-    ConnectionThread networkThread = new ConnectionThread(sock);
-    mConnectionThreads.add(networkThread);
-    networkThread.start();
-    notifyOnConnect();
+  private void startConnectionThread(final Socket sock) throws IOException, JSONException {
+    BufferedReader reader =
+        new BufferedReader(new InputStreamReader(sock.getInputStream()), 8192);
+    PrintWriter writer = new PrintWriter(sock.getOutputStream(), true);
+    String data;
+    if((data = reader.readLine()) != null) {
+      Log.v("Received: " + data);
+      JSONObject request = new JSONObject(data);
+      if(request.has("cmd") && request.has("uid")) {
+        String cmd = request.getString("cmd");
+        int uid = request.getInt("uid");
+        JSONObject result = new JSONObject();
+        if(cmd.equals("initiate")) {
+          Log.d("Initiate a new session");
+          threadIndex += 1;
+          int mUID = threadIndex;
+          //Log.d("Sock state 1: "+sock.isClosed());
+          ConnectionThread networkThread = new ConnectionThread(sock,true,mUID,reader,writer);
+          mConnectionThreads.put(uid, networkThread);
+          networkThread.start();
+          notifyOnConnect();
+          result.put("uid", mUID);
+          result.put("status",true);
+        }else if(cmd.equals("continue")) {
+          Log.d("Continue an existing session");
+          ConnectionThread networkThread = new ConnectionThread(sock,true,uid,reader,writer);
+          mConnectionThreads.put(uid, networkThread);
+          networkThread.start();
+          notifyOnConnect();
+          result.put("uid", uid);
+          result.put("status",true);
+        }else if(cmd.equals("terminate")) {
+          Log.d("Terminate an existing session");
+          mConnectionThreads.remove(uid);
+          result.put("uid", uid);
+          result.put("status",true);
+        }else {
+          result.put("uid", uid);
+          result.put("status",false);
+          result.put("message", "Unrecognized command.");
+        }
+        writer.write(result + "\n");
+        writer.flush();
+        Log.v("Sent: " + result);
+      }else{
+        ConnectionThread networkThread = new ConnectionThread(sock,false,0,reader,writer);
+        mConnectionThreads.put(0, networkThread);
+        networkThread.start();
+        notifyOnConnect();
+      }
+    }
   }
 
   public void shutdown() {
@@ -271,7 +348,7 @@
     // threads. In the worst case, one of the running threads will already have
     // shut down. Since this is a CopyOnWriteList, we don't have to worry about
     // concurrency issues while iterating over the set of threads.
-    for (ConnectionThread connectionThread : mConnectionThreads) {
+    for (ConnectionThread connectionThread : mConnectionThreads.values()) {
       connectionThread.close();
     }
     for (SimpleServerObserver observer : mObservers) {
diff --git a/WebCamFacade/src/com/googlecode/android_scripting/facade/MjpegServer.java b/WebCamFacade/src/com/googlecode/android_scripting/facade/MjpegServer.java
index a79c1ff..ad1e615 100644
--- a/WebCamFacade/src/com/googlecode/android_scripting/facade/MjpegServer.java
+++ b/WebCamFacade/src/com/googlecode/android_scripting/facade/MjpegServer.java
@@ -16,9 +16,11 @@
 
 package com.googlecode.android_scripting.facade;
 
+import java.io.BufferedReader;
 import java.io.OutputStream;
+import java.io.PrintWriter;
 import java.net.Socket;
-
+import com.googlecode.android_scripting.Log;
 import com.googlecode.android_scripting.SimpleServer;
 
 class MjpegServer extends SimpleServer {
@@ -31,6 +33,7 @@
 
   @Override
   protected void handleConnection(Socket socket) throws Exception {
+    Log.d("handle Mjpeg connection");
     byte[] data = mProvider.getJpeg();
     if (data == null) {
       return;
@@ -58,4 +61,9 @@
       outputStream.flush();
     }
   }
-}
\ No newline at end of file
+
+  @Override
+  protected void handleRPCConnection(Socket sock, Integer UID, BufferedReader reader, PrintWriter writer)
+      throws Exception {
+  }
+}
diff --git a/android.py b/android.py
new file mode 100644
index 0000000..ca7eaf4
--- /dev/null
+++ b/android.py
@@ -0,0 +1,73 @@
+# Copyright (C) 2009 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.
+
+__author__ = 'Damon Kohler <damonkohler@gmail.com>'
+
+import collections
+import json
+import os
+import socket
+import sys
+
+PORT = os.environ.get('AP_PORT')
+HOST = os.environ.get('AP_HOST')
+HANDSHAKE = os.environ.get('AP_HANDSHAKE')
+Result = collections.namedtuple('Result', 'id,result,error')
+
+
+class Android(object):
+
+  def __init__(self, cmd='initiate', uid=-1, port=None, addr=None):
+    self.PORT = os.environ.get('AP_PORT')
+    if port is not None:
+      self.PORT = port
+    if addr is None:
+      addr = HOST, self.PORT
+    self.conn = socket.create_connection(addr)
+    self.client = self.conn.makefile()
+    self.id = 0
+    handshake = {'cmd':cmd,'uid':uid}
+    self.client.write(json.dumps(handshake)+'\n')
+    self.client.flush()
+    resp = self.client.readline()
+    #print(resp)
+    result = json.loads(resp)
+    self.uid = uid
+    if result['status']:
+      self.uid = result['uid']
+    #self._authenticate(HANDSHAKE)
+
+  def _rpc(self, method, *args):
+    data = {'id': self.id,
+            'method': method,
+            'params': args}
+    request = json.dumps(data)
+    #print(request)
+    self.client.write(request+'\n')
+    self.client.flush()
+    response = self.client.readline()
+    self.id += 1
+    print("Response: "+str(response))
+    result = json.loads(response)
+    if result['error'] is not None:
+      print(result['error'])
+    # namedtuple doesn't work with unicode keys.
+    return Result(id=result['id'], result=result['result'],
+                  error=result['error'], )
+
+  def __getattr__(self, name):
+    def rpc_call(*args):
+      #print(args)
+      return self._rpc(name, *args)
+    return rpc_call
