diff --git a/source/index.html.erb b/source/index.html.erb
index 1139679..0ab61bf 100644
--- a/source/index.html.erb
+++ b/source/index.html.erb
@@ -23,275 +23,186 @@
 
 <div class="row">
   <div class="col-lg-6">
+
     <div class="panel panel-default">
       <div class="panel-heading">
-
-      Latest Announcement
-
-      <a href="https://blogs.apache.org/cloudstack/feed/entries/atom"><img src="/images/feed-icon-14x14.png" class="pull-right" alt=""></a>
-
-      </div>
-
-      <div id="headline" class="panel-body">
-      </div>
-    </div>
-    <div class="panel panel-default">
-      <div class="panel-heading">
-
         About CloudStack
-
       </div>
-
       <div class="panel-body">
-
-<p>
-Apache CloudStack is open source software designed to deploy and manage large networks of virtual machines, as a highly available, highly scalable Infrastructure as a Service (IaaS) cloud computing platform. CloudStack is used by a number of service providers to offer public cloud services, and by many companies to provide an on-premises (private) cloud offering, or as part of a hybrid cloud solution.
-</p>
-
-<p>
-CloudStack is a turnkey solution that includes the entire "stack" of features most organizations want with an IaaS cloud: compute orchestration, Network-as-a-Service, user and account management, a full and open native API, resource accounting, and a first-class User Interface (UI).
-</p>
-
-<p>
-CloudStack currently supports the most popular hypervisors: VMware, KVM, Citrix XenServer, Xen Cloud Platform (XCP), Oracle VM server and Microsoft Hyper-V.
-</p>
-
-<p>
-Users can manage their cloud with an easy to use Web interface, command line tools, and/or a full-featured RESTful API. In addition, CloudStack provides an API that's compatible with AWS EC2 and S3 for organizations that wish to deploy hybrid clouds.
-</p>
-
-<a href="about.html"><button type="button" class="btn btn-info">Learn More</button></a>
-
+        <p>Apache CloudStack is open source software designed to deploy and manage large networks of virtual machines, as a highly available, highly scalable Infrastructure as a Service (IaaS) cloud computing platform. CloudStack is used by a number of service providers to offer public cloud services, and by many companies to provide an on-premises (private) cloud offering, or as part of a hybrid cloud solution.</p>
+        <p>CloudStack is a turnkey solution that includes the entire "stack" of features most organizations want with an IaaS cloud: compute orchestration, Network-as-a-Service, user and account management, a full and open native API, resource accounting, and a first-class User Interface (UI).</p>
+        <p>CloudStack currently supports the most popular hypervisors: VMware, KVM, Citrix XenServer, Xen Cloud Platform (XCP), Oracle VM server and Microsoft Hyper-V.</p>
+        <p>Users can manage their cloud with an easy to use Web interface, command line tools, and/or a full-featured RESTful API. In addition, CloudStack provides an API that's compatible with AWS EC2 and S3 for organizations that wish to deploy hybrid clouds.</p>
+        <a href="about.html"><button type="button" class="btn btn-info">Learn More</button></a>
       </div>
-
     </div>
 
+
     <div class="panel panel-default">
       <div class="panel-heading">
-
-Join Us
-
+        Latest Announcements
+        <a href="https://blogs.apache.org/cloudstack/feed/entries/atom"><img src="images/feed-icon-14x14.png" class="pull-right" alt=""></a>
       </div>
+      <div class="panel-body">
+        <div id="atom-cloudstack" style="margin-left: 4px;"></div>
+      </div>
+    </div>
 
-	<div class="panel-body">
 
-	<p>
-	Learn more about getting involved with Apache CloudStack on the <a href="contribute.html">Contributing to Apache CloudStack</a> page, or go straight to our <a href="developers.html">Developer Resources</a> page.
-	</p>
-	</div>
+    <div class="panel panel-default">
+      <div class="panel-heading">
+        CloudStack Events
+      </div>
+      <div class="panel-body" id="events">
+        <h4>Upcoming CloudStack Events</h4>
+        <p>There's always plenty of Cloudstack Events happening in different parts of the world. These range from Meetups, User Groups to <a href="http://cloudstackcollab.org/">CloudStack Collaboration Conference</a>
+        events. Each event will feature a lot of opportunities to learn,
+        collaborate and engage with the CloudStack community. The CloudStack
+        Collaboration Conferences are valuable for both developers and users, and
+        are a great way to get involved with the community.</p>
+        <ul type="disc" style="padding-inline-start: 15px">
+          <div id="csv-events"></div> 
+        </ul>
+        <p> View videos from previous CloudStack Collaboration Conferences:</p>
+        <ul type="disc" style="padding-inline-start: 15px">
+            <li>
+                <a
+                    href="https://www.youtube.com/playlist?list=PLU2OcwpQkYCwcPxZMKX2BFoKE0Z7g1ENH"
+                    target="_blank">
+                    CloudStack Collaboration Conference June 2018 in Montreal
+                </a>
+            </li>  
+            <li>
+                <a
+                    href="https://www.youtube.com/playlist?list=PLCfLScXpEyAS4YkJpeqDriP7JcU82Tx2r"
+                    target="_blank">
+                    CloudStack Collaboration Conference June 2016 in Montreal
+                </a>
+            </li>
+            <li>
+                <a
+                    href="https://www.youtube.com/playlist?list=PLGeM09tlguZSeNyOyQKJHNX4pxgK-yoTA"
+                    target="_blank">
+                    CloudStack Collaboration Conference Europe 2015 in Dublin
+                </a>
+            </li>
+        </ul>
+      </div>
+    </div>
 
-</div>
+
+    <div class="panel panel-default">
+      <div class="panel-heading">
+        Join Us
+      </div>
+      <div class="panel-body">
+	<p>Learn more about getting involved with Apache CloudStack on the <a href="contribute.html">Contributing to Apache CloudStack</a> page, or go straight to our <a href="developers.html">Developer Resources</a> page.</p>
+      </div>
+    </div>
+    
+    
+  </div>
+  
+  <div class="col-lg-6">
+
+
+    <div class="panel panel-default">
+      <div class="panel-heading">
+        Get CloudStack
+      </div>
+      <div class="panel-body">
+        <p class="text-warning">Apache CloudStack <%= data.cloudstack.versions.main %> is out!</p>
+        <% if data.cloudstack.versions.main_islts %>
+          <p>This is current CloudStack LTS release.</p>
+        <% else %>
+          <p>This is non-LTS release of CloudStack.</p>
+        <% end %>
+        <a href="downloads.html"><button type="button" class="btn btn-success">Download</button></a>
+        <a href="<%= data.cloudstack.versions.main_docs_url %>"><button type="button" class="btn btn-success">Documentation</button></a>
+        <p style="margin-top: 20px;">If you prefer proven stability rather than the newest features, please take a look at the previous LTS release.</p>
+        <p class="text-warning">Previous Apache CloudStack LTS Release is <%= data.cloudstack.versions.lts %>.</p>
+        <a href="downloads.html"><button type="button" class="btn btn-success">Download</button></a>
+        <a href="<%= data.cloudstack.versions.lts_docs_url %>"><button type="button" class="btn btn-success">Documentation</button></a>
+        <p style="margin-top: 20px;">
+        Looking for other versions of Apache CloudStack? You can find them in our <a href="archives.html">archives</a> page as well.
+        </p>
+      </div>
+    </div>
+
+
+    <div class="panel panel-default">
+      <div class="panel-heading">
+        What are people saying?
+      </div>
+      <div class="panel-body">
+        <div class="tw">
+          <a class="twitter-timeline" data-height="1000" data-theme="light" href="https://twitter.com/CloudStack?ref_src=twsrc%5Etfw">Tweets by CloudStack</a>
+          <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
+        </div>
+      </div>
+    </div>
+  </div>
 </div>
 
-<div class="col-lg-6">
-	<div class="panel panel-default">
-		<div class="panel-heading">
-			Get CloudStack
-		</div>
-		<div class="panel-body">
+<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
+<script type="text/javascript" src="javascripts/FeedEk.min.js"></script>
 
-		<p class="text-warning">Apache CloudStack <%= data.cloudstack.versions.main %> is out!</p>
-		<% if data.cloudstack.versions.main_islts %>
-		<p>This is current CloudStack LTS release.</p>
-		<% else %>
-		<p>This is non-LTS release of CloudStack.</p>
-		<% end %>
+<script type="text/javascript">
+  $(function () {
+    $('#atom-cloudstack').FeedEk({
+      FeedUrl: 'https://blogs.apache.org/cloudstack/feed/entries/atom',
+      ShowDesc: false,
+      MaxCount: 3,
+      DateFormat: 'D',
+      DateFormatLang: 'en'
+    });
+  });
+</script>
 
-		<a href="downloads.html"><button type="button" class="btn btn-success">Download</button></a>
-		<a href="<%= data.cloudstack.versions.main_docs_url %>"><button type="button" class="btn btn-success">Documentation</button></a>
-		
-		<p style="margin-top: 20px;">If you prefer proven stability rather than the newest features, please take a look at the previous LTS release.</p>
-		<p class="text-warning">Previous Apache CloudStack LTS Release is <%= data.cloudstack.versions.lts %>.</p>
-		<a href="downloads.html"><button type="button" class="btn btn-success">Download</button></a>
-		<a href="<%= data.cloudstack.versions.lts_docs_url %>"><button type="button" class="btn btn-success">Documentation</button></a>
+<script type="text/javascript">
+  $(document).ready(function() {
+    $.ajax({
+      type: "GET",
+      // github controlled datasource
+      url: "https://raw.githubusercontent.com/apache/cloudstack-www/master/data/acs-events.csv",
+      dataType: "text",
+      success: function(data) {processData(data);}
+    });
+  });
+  
+ function processData(data) {
+      var lines = data.split(/\r\n|\n/);
 
-		<p style="margin-top: 20px;">
-		Looking for other versions of Apache CloudStack? You can find them in our <a href="archives.html">archives</a> page as well.
-		</p>
+      //Set up the data arrays
 
-		</div>
+      var event_title = [];
+      var event_link = [];
+      var event_location = [];
+      var event_date = [];
 
-	</div>
+      var headings = lines[0].split(','); // Splice up the first row to get the headings - not used after atm
 
-	<div class="panel panel-default">
-		<div class="panel-heading">
-		CloudStack Events
-		</div>
+      for (var j=1; j<lines.length; j++) {
+      var values = lines[j].split(','); // Split up the comma seperated values
+         // read in event details as arrays 
+         event_title.push(values[0]); 
+         event_link.push(values[1]);
+         event_location.push(values[2]);
+         event_date.push(values[3]);
+      }
+// alert(lines);
 
-		<div class="panel-body" id="events">
-
-			<h4>Upcoming CloudStack Events</h4>
-<p>
-    There's always plenty of Cloudstack Events happening in different parts of
-    the world. These range from Meetups, User Groups to
-    <a href="http://cloudstackcollab.org/">
-        CloudStack Collaboration Conference
-    </a>
-    events. Each event will feature a lot of opportunities to learn,
-    collaborate and engage with the CloudStack community. The CloudStack
-    Collaboration Conferences are valuable for both developers and users, and
-    are a great way to get involved with the community.
-</p>
-<ul type="disc">
-    <li>
-        <a
-            href="https://www.meetup.com/de-DE/german-CloudStack-user-group/events/259269366/"
-            target="_blank"
-        >
-            April CloudStack Meetup (Germany)
-        </a>
-        , Sankt Augustin (Bonn), 11<sup>th</sup> April
-    </li>
-    <li>
-        <a
-            href="http://br.cloudstackcollab.org/"
-            target="_blank"
-        >
-            CloudStack Collaboration Conference Brazil
-        </a>
-        , Florianopolis, 26<sup>th</sup> April
-    </li>
-    <li>
-        <a
-            href="https://www.eventbrite.co.uk/e/cloudstack-european-user-group-meetup-tickets-55911193886"
-            target="_blank"
-        >
-            CloudStack European User Group meetup
-        </a>
-        , Sofia, 13<sup>th</sup> June
-    </li>          
-    <li>
-        <a
-            href="http://us.cloudstackcollab.org/"
-            target="_blank"
-        >
-            CloudStack Collaboration Conference North America
-        </a>
-        , Las Vegas, 9<sup>th</sup> - 11<sup>th</sup> September
-    </li>    
-</ul>
-<p>
-    View videos from previous CloudStack Collaboration Conferences:
-</p>
-<ul type="disc">
-    <li>
-        <a
-            href="https://www.youtube.com/playlist?list=PLU2OcwpQkYCwcPxZMKX2BFoKE0Z7g1ENH"
-            target="_blank">
-            CloudStack Collaboration Conference June 2018 in Montreal
-        </a>
-    </li>  
-    <li>
-        <a
-            href="https://www.youtube.com/playlist?list=PLCfLScXpEyAS4YkJpeqDriP7JcU82Tx2r"
-            target="_blank">
-            CloudStack Collaboration Conference June 2016 in Montreal
-        </a>
-    </li>
-    <li>
-        <a
-            href="https://www.youtube.com/playlist?list=PLGeM09tlguZSeNyOyQKJHNX4pxgK-yoTA"
-            target="_blank">
-            CloudStack Collaboration Conference Europe 2015 in Dublin
-        </a>
-    </li>
-</ul>
-
-
-		</div>
-
-	</div>
-
-	<div class="panel panel-default">
-		<div class="panel-heading">
-			What are people saying?
-		</div>
-		<div class="panel-body">
-
-			<a class="twitter-timeline" href="https://twitter.com/search?q=cloudstack" data-widget-id="383337162126544896" data-chrome="nofooter transparent noheader noborders noscrollbar">Tweets about "CloudStack"</a>
-			<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
-
-		</div>
-
-	</div>
-
-</div>
-
-</div>
-
-<script>
-var maxEntries = 3; // if 0 then there will be no limit
-
-function slug(str){
- return str.replace(/\s/g,'-').replace(/[^a-zA-Z0-9\-]/g,'').toLowerCase();
+    var div = document.getElementById("csv-events");
+    var html = "";
+    for (var i=0;i<lines.length;i++) {
+      if (typeof event_location[i] !== "undefined") {
+        html += '<li> <a href=\"' + event_link[i] + '\" target=\"_blank\">' + event_title[i] + "</a> , " + event_location[i] + ", " + event_date[i] + "</li>";
+      }
+    }
+    
+    // write html to page
+    div.innerHTML = html;
 }
-/**
- * This function appends rss feed items to divs with the same slug
- * Name is the title of the feed, when slugged i use it as a div id
- * File is the rss feed
- */
-function newFeed(id, file) {
- $.getJSON("//query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%3D%22"+encodeURIComponent(file)+"%22&format=json&callback=?", function(d) {
-  var count = 0;
-  $(d.query.results.feed.entry).each(function() {
-    if(maxEntries == 0 || maxEntries>count){
-     var title = this.title.content;
-     var content = this.content.content;
-     var pubDate = new Date(this.published);
-     // Format however you want, I only went for link and title
-     var anItem = "<h4>"+title+"</h4><p>"+pubDate+"</p>"+content+"<hr />";
-     $("#"+id).append(anItem);
-     if (count==0)
-      $("#headline").append("<p>"+title+"<br/><a href='#news'>Read more here.</a></p>");
-     count++;
-    }
-   });
- });
-};
+	
 </script>
 
-<p><a name='news'></a><br /> </p><p> </p>
-
-<div class="panel panel-default">
-	<div class="panel-heading">
-		Project Announcements
-	</div>
-	<div class="panel-body">
-		<div id="feed">
-		</div>
-
-	</div>
-
-</div>
-
-<script>
-newFeed("feed", "https://blogs.apache.org/cloudstack/feed/entries/atom");
-</script>
-
-<script>
-var maxEvents = 3; // if 0 then there will be no limit
-
-/**
- * This function appends rss feed items to divs with the same slug
- * Name is the title of the feed, when slugged i use it as a div id
- * File is the rss feed
- */
-function newEventList(id, file) {
- $.getJSON("//query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%3D%22"+encodeURIComponent(file)+"%22&format=json&callback=?", function(d) {
-  var count = 0;
-  $(d.query.results.feed.entry).each(function() {
-    if(maxEvents == 0 || maxEvents>count){
-     var title = this.title;
-     var link = this.link.href;
-     var anItem = "<p><a href='"+link+"' target='_blank'>"+title+"</a></p>";
-     $("#"+id).append(anItem);
-     count++;
-    }
-   });
-   $("#events").append("<p><small>For more events, take a look at the <a href='http://lanyrd.com/topics/apache-cloudstack/' target='_blank'>Apache CloudStack topic page</a> on Lanyrd.</small></p>");
- });
-};
-
-newEventList("events", "http://lanyrd.com/topics/apache-cloudstack/feed/");
-
-</script>
diff --git a/source/javascripts/FeedEk.min.js b/source/javascripts/FeedEk.min.js
new file mode 100644
index 0000000..dd0dcca
--- /dev/null
+++ b/source/javascripts/FeedEk.min.js
@@ -0,0 +1,4 @@
+/*! FeedEk jQuery RSS/ATOM Feed Plugin v3.1.1
+* https://jquery-plugins.net/FeedEk/FeedEk.html  https://github.com/enginkizil/FeedEk
+* Author : Engin KIZIL */
+!function (r) { r.fn.FeedEk = function (t) { var a, i = r.extend({ MaxCount: 5, ShowDesc: !0, ShowPubDate: !0, DescCharacterLimit: 0, TitleLinkTarget: "_blank", DateFormat: "", DateFormatLang: "en" }, t), e = r(this).attr("id"), n = ""; r("#" + e).empty(), null != i.FeedUrl && (r("#" + e).append('<img src="loader.gif" />'), r.ajax({ url: "https://feed.jquery-plugins.net/load?url=" + encodeURIComponent(i.FeedUrl) + "&maxCount=" + i.MaxCount + "&dateCulture=" + i.DateFormatLang + "&dateFormat=" + i.DateFormat, dataType: "json", success: function (t) { r("#" + e).empty(), null != t.data && (r.each(t.data, function (t, e) { n += '<li><div class="itemTitle"><a href="' + e.link + '" target="' + i.TitleLinkTarget + '" >' + e.title + "</a></div>", i.ShowPubDate && (a = new Date(e.publishDate), n += '<div class="itemDate">', 0 < r.trim(i.DateFormat).length ? n += e.publishDateFormatted : n += a.toLocaleDateString(), n += "</div>"), i.ShowDesc && (n += '<div class="itemContent">', 0 < i.DescCharacterLimit && e.description.length > i.DescCharacterLimit ? n += e.description.substring(0, i.DescCharacterLimit) + "..." : n += e.description, n += "</div>") }), r("#" + e).append('<ul class="feedEkList">' + n + "</ul>")) } })) } }(jQuery);
diff --git a/source/layouts/layout.erb b/source/layouts/layout.erb
index 42cce97..fe54454 100644
--- a/source/layouts/layout.erb
+++ b/source/layouts/layout.erb
@@ -1,4 +1,4 @@
-<!doctype html>
+<!DOCTYPE html>
 <html>  
   <head>
     <title>Apache CloudStack: Open Source Cloud Computing</title>
@@ -29,15 +29,7 @@
 
     <link rel="shortcut icon" href="images/favicon.ico">
     <link rel="icon" href="images/favicon.ico">
-
-<!-- Commenting out this template stuff until we figure out how to make it work with middleman
-    {% if headers.atom %}
-      <link rel="alternate" href="{{ headers.atom.url }}"
-            type="application/atom+xml" title="{{ headers.atom.title }}" />
-    {% endif %}
-
-    {% if headers.base %}<base href="{{ headers.base }}" />{% endif %}
--->
+    
 <!--    {% if headers.notice %}{{ headers.notice }}{% endif %} -->
         <!-- Twitter Bootstrap and jQuery after this line. -->
         <script src="https://code.jquery.com/jquery-latest.js"></script>
diff --git a/source/loader.gif b/source/loader.gif
new file mode 100644
index 0000000..1d4bfaf
--- /dev/null
+++ b/source/loader.gif
Binary files differ
diff --git a/source/stylesheets/bootstrap.css b/source/stylesheets/bootstrap.css
index d7527a0..c0e73a2 100755
--- a/source/stylesheets/bootstrap.css
+++ b/source/stylesheets/bootstrap.css
@@ -5299,8 +5299,8 @@
 
 @media screen and (min-width: 768px) {
   .jumbotron {
-    padding-top: 48px;
-    padding-bottom: 48px;
+    padding-top: 24px;
+    padding-bottom: 24px;
   }
   .container .jumbotron {
     padding-right: 60px;
diff --git a/source/stylesheets/custom.css b/source/stylesheets/custom.css
index bd91bb7..3f51ba3 100644
--- a/source/stylesheets/custom.css
+++ b/source/stylesheets/custom.css
@@ -22,4 +22,71 @@
 
     text-decoration: none;
     color: initial;
+}
+
+.ul {
+  padding-inline-start: 4px;
+}
+
+.feedEkList { 
+  padding:4px 6px;
+  color:#3E3E3E;
+  margin-left: 4px;
+  margin-bottom: 0px;
+}
+
+.feedEkList li {
+  border-bottom:1px;
+  padding:4px 0px 4px;
+}
+
+.feedEkList li:last-child {
+  border-bottom:none;
+}
+
+.feedEkList ul {
+  margin-bottom: 0;
+}
+
+
+
+/*
+UNUSED BUT LEFT IN FOR REFERENCE
+.itemTitle a{font-weight:bold; color:#4EBAFF !important; text-decoration:none }
+.itemTitle a:hover{ text-decoration:underline }
+.itemDate{font-size:11px;color:#AAAAAA;}
+*/
+
+blockquote.twitter-tweet {
+  display: inline-block;
+  font-family: "Helvetica Neue", Roboto, "Segoe UI", Calibri, sans-serif;
+  font-size: 9px;
+  font-weight: bold;
+  line-height: 12px;
+  border-color: #eee #ddd #bbb;
+  border-radius: 5px;
+  border-style: solid;
+  border-width: 1px;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
+  margin: 10px 5px;
+  padding: 0 16px 16px 16px;
+  max-width: 468px;
+}
+
+blockquote.twitter-tweet p {
+  font-size: 12px;
+  font-weight: normal;
+  line-height: 16px;
+}
+
+blockquote.twitter-tweet a {	
+  color: inherit;
+  font-weight: normal;
+  text-decoration: none;
+  outline: 0 none;
+}
+
+blockquote.twitter-tweet a:hover,
+blockquote.twitter-tweet a:focus {
+  text-decoration: underline;
 }
\ No newline at end of file
diff --git a/source/who.html.markdown b/source/who.html.markdown
index 9a4cc42..2f320d3 100644
--- a/source/who.html.markdown
+++ b/source/who.html.markdown
@@ -21,7 +21,10 @@
 ## PMC
 
 Active Project Management Committee contains (in alphabetical order of their usernames):
+
 {:.table-bordered}
+
+
 | Username | Name |
 |----------|------|
 |akarasulu|Alex Karasulu|
@@ -66,21 +69,27 @@
 |weizhou|Wei Zhou|
 |widodh|Wido den Hollander|
 |willchan|William Chan|
+  
+  
 
 ## Emeritus PMC Members
+
 PMC members who are no longer active include:
 
 + Alex Huang (ahuang)
 + Disheng Su (edison)
 + Ian Duffy (duffy)
 + Olivier Lamy (olamy)
-
+  
+  
+  
 ## Committers
 
-Active list of committers (in alphabetical order of their usernames)
-
 Active list of committers (in alphabetical order of their usernames):
+
 {:.table-bordered}
+
+
 | Username | Name |
 |----------|------|
 |ahmad|Ahmad Emneina|
@@ -200,6 +209,9 @@
 |willchan|William Chan|
 |yasker|Sheng Yang|
 |ynojima|Yoshikazu Nojima|
-
+  
+  
+  
 ## Emeritus Committers
+
 Committers who are no longer active include:
