diff --git a/modules/path/machines/CBA/PPA.js b/modules/path/machines/CBA/PPA.js
index afe47047bdfffa15fd8ec4da02209744251a7f6c..a711b41bd940818e2e5bfc5d635d9f2c57737a30 100644
--- a/modules/path/machines/CBA/PPA.js
+++ b/modules/path/machines/CBA/PPA.js
@@ -229,18 +229,18 @@ function make_path() {
 
   var path = mod.path;
 
-  ctx.beginPath();
-  ctx.setLineDash([])
-  ctx.moveTo(path[0][0] * mod.scale + mod.drawOffsetX, path[0][1] * mod.scale);
-  for (var i = 1; i < path.length; i++) {
-    if (path[i][2] == 0) {
-      ctx.lineTo(path[i][0] * mod.scale + mod.drawOffsetX, path[i][1] * mod.scale);
-    } else {
-      ctx.moveTo(path[i][0] * mod.scale + mod.drawOffsetX, path[i][1] * mod.scale);
-    }
-  }
-  ctx.strokeStyle = "red";
-  ctx.stroke();
+  // ctx.beginPath();
+  // ctx.setLineDash([])
+  // ctx.moveTo(path[0][0] * mod.scale + mod.drawOffsetX, path[0][1] * mod.scale);
+  // for (var i = 1; i < path.length; i++) {
+  //   if (path[i][2] == 0) {
+  //     ctx.lineTo(path[i][0] * mod.scale + mod.drawOffsetX, path[i][1] * mod.scale);
+  //   } else {
+  //     ctx.moveTo(path[i][0] * mod.scale + mod.drawOffsetX, path[i][1] * mod.scale);
+  //   }
+  // }
+  // ctx.strokeStyle = "red";
+  // ctx.stroke();
 
 
   // construct path
@@ -253,12 +253,15 @@ function make_path() {
    var l1 = mh;
    var l2 = mh;
    var z = 1;
+   var count = 1;
 
-   str += "L1,"+l1.toFixed(4).toString()+",L2,"+l2.toFixed(4).toString()+",Z,"+z.toString()+"\n";
+   //str += "L1,"+l1.toFixed(4).toString()+",L2,"+l2.toFixed(4).toString()+",Z,"+z.toString()+"\n";
 
    var x = bl / 2;
    var y = Math.sqrt(Math.pow(mh, 2) - Math.pow(x, 2));
 
+   str += x.toFixed(4).toString()+","+y.toFixed(4).toString()+"\n";
+
    console.log("Start x,y", x, y);
 
    ctx.beginPath();
@@ -284,7 +287,9 @@ function make_path() {
 
          l1 = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
          l2 = Math.sqrt(Math.pow(bl - x, 2) + Math.pow(y, 2));
-         str += "L1,"+l1.toFixed(4).toString()+",L2,"+l2.toFixed(4).toString()+",Z,"+z.toString()+"\n";
+         //str += "L1,"+l1.toFixed(4).toString()+",L2,"+l2.toFixed(4).toString()+",Z,"+z.toString()+"\n";
+         str += x.toFixed(4).toString()+","+y.toFixed(4).toString()+"\n";
+         count+=1;
 
          ctx.lineTo(x * mod.scale + mod.drawOffsetX, y * mod.scale);
        }
@@ -295,13 +300,19 @@ function make_path() {
      z = new_z;
      l1 = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
      l2 = Math.sqrt(Math.pow(bl - x, 2) + Math.pow(y, 2));
-     str += "L1,"+l1.toFixed(4).toString()+",L2,"+l2.toFixed(4).toString()+",Z,"+z.toString()+"\n";
+     //str += "L1,"+l1.toFixed(4).toString()+",L2,"+l2.toFixed(4).toString()+",Z,"+z.toString()+"\n";
+     str += x.toFixed(4).toString()+","+y.toFixed(4).toString()+"\n";
+     count+=1;
      ctx.lineTo(x * mod.scale + mod.drawOffsetX, y * mod.scale);
    }
    console.log(str);
    ctx.strokeStyle = "blue";
    ctx.stroke();
-   //outputs.file.event(str)
+
+   console.log("Number of lines:", count);
+
+
+   outputs.file.event(str);
 }
 
 //
diff --git a/modules/socket/server/serialpy b/modules/socket/server/serialpy
index 7f6fe2f97f8a3d237a6ed94456dfba425bb14893..26bd7bb7fe31b617ab51f7aa57cc031fe0f46625 100644
--- a/modules/socket/server/serialpy
+++ b/modules/socket/server/serialpy
@@ -1,13 +1,13 @@
 //
 // Python serial server module
 //
-// Neil Gershenfeld 
+// Neil Gershenfeld
 // 1/17/20
-// 
-// This work may be reproduced, modified, distributed, performed, and 
+//
+// This work may be reproduced, modified, distributed, performed, and
 // displayed for any purpose, but must acknowledge the mods
-// project. Copyright is retained and must be preserved. The work is 
-// provided as is; no warranty is provided, and users accept all 
+// project. Copyright is retained and must be preserved. The work is
+// provided as is; no warranty is provided, and users accept all
 // liability.
 //
 // closure
@@ -157,23 +157,23 @@ var interface = function(div){
       input.size = 10
       div.appendChild(input)
       mod.device = input
-   div.appendChild(document.createElement('br'))   
+   div.appendChild(document.createElement('br'))
    //
    // baud rate
    //
    div.appendChild(document.createTextNode('baud rate:'))
-   div.appendChild(document.createElement('br'))   
+   div.appendChild(document.createElement('br'))
    var input = document.createElement('input')
       input.type = 'text'
       input.size = 10
       div.appendChild(input)
       mod.baud = input
-   div.appendChild(document.createElement('br'))   
+   div.appendChild(document.createElement('br'))
    //
    // flow control
    //
    div.appendChild(document.createTextNode('flow control:'))
-   div.appendChild(document.createElement('br'))   
+   div.appendChild(document.createElement('br'))
    var input = document.createElement('input')
       input.type = 'radio'
       input.name = mod.div.id+'flow'
@@ -181,7 +181,7 @@ var interface = function(div){
       div.appendChild(input)
       mod.flow_none = input
    div.appendChild(document.createTextNode('none\u00A0\u00A0\u00A0\u00A0'))
-   div.appendChild(document.createElement('br'))   
+   div.appendChild(document.createElement('br'))
    var input = document.createElement('input')
       input.type = 'radio'
       input.name = mod.div.id+'flow'
@@ -189,7 +189,7 @@ var interface = function(div){
       div.appendChild(input)
       mod.flow_rtscts = input
    div.appendChild(document.createTextNode('RTSCTS'))
-   div.appendChild(document.createElement('br'))   
+   div.appendChild(document.createElement('br'))
    var input = document.createElement('input')
       input.type = 'radio'
       input.name = mod.div.id+'flow'
@@ -197,7 +197,15 @@ var interface = function(div){
       div.appendChild(input)
       mod.flow_dsrdtr = input
    div.appendChild(document.createTextNode('DSRDTR'))
-   div.appendChild(document.createElement('br'))   
+   div.appendChild(document.createElement('br'))
+   var input = document.createElement('input')
+      input.type = 'radio'
+      input.name = mod.div.id+'flow'
+      input.id = mod.div.id+'flow_ppa'
+      div.appendChild(input)
+      mod.flow_ppa = input
+   div.appendChild(document.createTextNode('PPA'))
+   div.appendChild(document.createElement('br'))
    //
    // file button
    //
@@ -279,6 +287,8 @@ function serial_open() {
          msg.flow = 'rtscts'
       else if (mod.flow_dsrdtr.checked)
          msg.flow = 'dsrdtr'
+      else if (mod.flow_ppa.checked)
+         msg.flow = 'ppa'
       mod.socket.send(JSON.stringify(msg))
       }
    }
diff --git a/py/serialserver.py b/py/serialserver.py
index 7ecd07da0d56b93dd2508c3674eddd69db39cb97..e0f486c9504d0e3f7b233f8b20616f6d39353e1e 100644
--- a/py/serialserver.py
+++ b/py/serialserver.py
@@ -9,7 +9,7 @@
 # performed, and displayed for any purpose, but must
 # acknowledge the mods project. Copyright is
 # retained and must be preserved. The work is provided
-# as is; no warranty is provided, and users accept all 
+# as is; no warranty is provided, and users accept all
 # liability.
 #
 # imports
@@ -49,7 +49,8 @@ async def receive(websocket,path):
          #
          device = vars['device']
          speed = int(vars['baud'])
-         flow = vars['flow']
+         flow = "ppa" #vars['flow']
+         print("Flow", flow);
          try:
             if (flow == "xonxoff"):
                s = serial.Serial(
@@ -60,6 +61,9 @@ async def receive(websocket,path):
             elif (flow == "dsrdtr"):
                s = serial.Serial(
                   device,baudrate=speed,dsrdtr=True, timeout=0)
+            elif (flow == "ppa"):
+               s = serial.Serial(
+                  device,baudrate=speed, timeout=None)
             elif (flow == "none"):
                s = serial.Serial(
                   device,baudrate=speed,timeout=0)
@@ -93,7 +97,7 @@ async def receive(websocket,path):
          #
          # send file
          #
-         data = vars['contents']
+         data = vars['contents'].splitlines()
          n = 0
          for c in data:
             if (flow == "dsrdtr"):
@@ -104,6 +108,9 @@ async def receive(websocket,path):
                   time.sleep(0.001)
             s.write(c.encode('ascii'))
             s.flush()
+            if (flow == "ppa"):
+                receive_string = s.readline()
+                #print("Got response", receive_string)
             n += 1
             percent = (100.0*n)/len(data)
             await websocket.send(str(round(percent))+'%')
@@ -111,6 +118,6 @@ async def receive(websocket,path):
 #
 # start server
 #
-start_server = websockets.serve(receive,'localhost',port)
+start_server = websockets.serve(receive,'localhost',port,max_size=2**32)
 asyncio.get_event_loop().run_until_complete(start_server)
 asyncio.get_event_loop().run_forever()