diff --git a/plugins/ap-list.css b/plugins/ap-list.css
index 1ccb441c..c54365f6 100644
--- a/plugins/ap-list.css
+++ b/plugins/ap-list.css
@@ -46,11 +46,16 @@
 }
 
 .ap-list-td-link-eny {
-  width: 80%;
+  width: 70%;
 }
 
 .ap-list-td-link-frd {
-  width: 85%;
+  width: 75%;
+}
+
+.ap-list-td-ap {
+  width: 18%;
+  white-space:nowrap;
 }
 
 .ap-list-checkbox-outer {
diff --git a/plugins/ap-list.user.js b/plugins/ap-list.user.js
index 7185b3cf..d94203f7 100644
--- a/plugins/ap-list.user.js
+++ b/plugins/ap-list.user.js
@@ -1,7 +1,7 @@
 // ==UserScript==
 // @id             iitc-plugin-ap-list@xelio
 // @name           IITC plugin: AP List
-// @version        0.4.2.@@DATETIMEVERSION@@
+// @version        0.4.3.@@DATETIMEVERSION@@
 // @namespace      https://github.com/jonatkins/ingress-intel-total-conversion
 // @updateURL      @@UPDATEURL@@
 // @downloadURL    @@DOWNLOADURL@@
@@ -33,6 +33,7 @@ window.plugin.apList.playerApGainFunc = new Array(2);
 
 window.plugin.apList.topMaxCount = 10;
 window.plugin.apList.sideLabelClass = {};
+window.plugin.apList.tableColumns = new Array(2);
 
 window.plugin.apList.useCachedPortals = false;
 window.plugin.apList.cacheBounds;
@@ -52,32 +53,51 @@ window.plugin.apList.handleUpdate = function() {
 
 // Generate html table from top portals
 window.plugin.apList.updatePortalTable = function(side) {
-  var displayEnemy = (plugin.apList.displaySide === window.plugin.apList.SIDE_ENEMY);
-  
-  var content = '
';
+  var table = ''
+              + ''
+              + plugin.apList.tableHeaderBuilder(side)
+              + '';
+
   for(var i = 0; i < plugin.apList.topMaxCount; i++) {
     var portal = plugin.apList.sortedPortals[side][i];
-    content += '';
-    // Only enemy portal list will display destroy checkbox
-    if(displayEnemy) {
-      content += '| '
-               + (portal ? plugin.apList.getPortalDestroyCheckbox(portal) : ' ')
-               + ' | ';
-    }
-    content += ''
-             + (portal ? plugin.apList.getPortalLink(portal) : ' ')
-             + ' | '
-             + ''
-             + (portal ? plugin.apList.getPortalApText(portal) : ' ')
-             + ' | '
-             + ''
-             + (portal ? plugin.apList.getPortalEffectiveLvText(portal) : ' ')
-             + ' | '
-             + '
';
+    table += ''
+             + plugin.apList.tableRowBuilder(side, portal)
+             + '';
   }
-  content += "
";
-  $('div#ap-list-table').html(content);
+
+  table += "
";
+  $('div#ap-list-table').html(table);
+}
+
+window.plugin.apList.tableHeaderBuilder = function(side) {
+  var headerRow = '';
+
+  $.each(plugin.apList.tableColumns[side], function(ind, column){
+    var cssClass = column.headerTooltip ? (column.cssClass + ' help') : column.cssClass;
+    var title = column.headerTooltip ? column.headerTooltip : '';
+    headerRow += '| '
+               + column.header
+               + ' | ';
+  });
+
+  headerRow += '
';
+  return headerRow;
+}
+
+window.plugin.apList.tableRowBuilder = function(side,portal) {
+  var row = "";
+
+  $.each(plugin.apList.tableColumns[side], function(ind, column){
+    var content = portal ? column.contentFunction(portal) : ' ';
+    row += '| '
+         + content
+         + ' | ';
+  });
+
+  row += '
';
+  return row;
 }
 
 window.plugin.apList.getPortalDestroyCheckbox = function(portal) {
@@ -152,7 +172,8 @@ window.plugin.apList.getPortalEffectiveLvText = function(portal) {
 window.plugin.apList.getPortalEffectiveLvTitle = function(portal) {
   var t = 'Effective energy:\t' + portal.effectiveLevel.effectiveEnergy + '\n'
         + 'Effect of Shields:\t' + portal.effectiveLevel.effectOfShields + '\n'
-        + 'Effect of resos dist:\t' + portal.effectiveLevel.effectOfResoDistance + '\n';
+        + 'Effect of resos dist:\t' + portal.effectiveLevel.effectOfResoDistance + '\n'
+        + 'Origin Level:\t' + portal.effectiveLevel.originLevel;
   return t;
 }
 
@@ -469,7 +490,8 @@ window.plugin.apList.getEffectiveLevel = function(portal) {
     effectiveLevel: effectiveLevel.toFixed(1),
     effectiveEnergy: parseInt(effectiveEnergy),
     effectOfShields: effectOfShields.toFixed(2),
-    effectOfResoDistance: effectOfResoDistance.toFixed(2)
+    effectOfResoDistance: effectOfResoDistance.toFixed(2),
+    originLevel: portalLevel
   };
 }
 
@@ -597,6 +619,52 @@ window.plugin.apList.setupVar = function() {
     = "#ap-list-eny";
 }
 
+// Setup table columns for header builder and row builder
+window.plugin.apList.setupTableColumns = function() {
+  var enemyColumns = new Array();
+  var friendlyColumns = new Array();
+
+  // AP and Eff. LV columns are same in enemy and friendly table
+  var apColumn = {
+    header: 'AP',
+    cssClass: 'ap-list-td-ap',
+    contentFunction: plugin.apList.getPortalApText
+  };
+  var effectiveLevelColumn = {
+    header: 'EL',
+    headerTooltip: 'Effective Level',
+    cssClass: 'ap-list-td-eff-lv',
+    contentFunction: plugin.apList.getPortalEffectiveLvText
+  };
+
+  // Columns: Checkbox | Portal | AP | Eff. LV
+  enemyColumns.push({
+    header: '',
+    headerTooltip: 'Select checkbox to \nsimulating destruction',
+    cssClass: 'ap-list-td-checkbox',
+    contentFunction: plugin.apList.getPortalDestroyCheckbox
+  });
+  enemyColumns.push({
+    header: 'Portal',
+    cssClass: 'ap-list-td-link ap-list-td-link-eny',
+    contentFunction: plugin.apList.getPortalLink
+  });
+  enemyColumns.push(apColumn);
+  enemyColumns.push(effectiveLevelColumn);
+
+  // Columns: Portal | AP | Eff. LV
+  friendlyColumns.push({
+    header: 'Portal',
+    cssClass: 'ap-list-td-link ap-list-td-link-frd',
+    contentFunction: plugin.apList.getPortalLink
+  });
+  friendlyColumns.push(apColumn);
+  friendlyColumns.push(effectiveLevelColumn);
+
+  plugin.apList.tableColumns[plugin.apList.SIDE_ENEMY] = enemyColumns;
+  plugin.apList.tableColumns[plugin.apList.SIDE_FRIENDLY] = friendlyColumns;
+}
+
 window.plugin.apList.setupCSS = function() {
   $("