diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js
index d13111bcc6..dff6772af2 100644
--- a/src/components/views/messages/TextualBody.js
+++ b/src/components/views/messages/TextualBody.js
@@ -91,7 +91,7 @@ module.exports = React.createClass({
         var widget;
         if (this.state.link) {
             var LinkPreviewWidget = sdk.getComponent('rooms.LinkPreviewWidget');
-            widget = <LinkPreviewWidget link={ this.state.link } ts={ this.props.mxEvent.getTs() } onWidgetLoad={ this.props.onWidgetLoad }/>;
+            widget = <LinkPreviewWidget link={ this.state.link } mxEvent={ this.props.mxEvent } onWidgetLoad={ this.props.onWidgetLoad }/>;
         }
 
         switch (content.msgtype) {
diff --git a/src/components/views/rooms/LinkPreviewWidget.js b/src/components/views/rooms/LinkPreviewWidget.js
index 80e03522a4..266ec36ecf 100644
--- a/src/components/views/rooms/LinkPreviewWidget.js
+++ b/src/components/views/rooms/LinkPreviewWidget.js
@@ -31,7 +31,7 @@ module.exports = React.createClass({
 
     propTypes: {
         link: React.PropTypes.string.isRequired,
-        ts: React.PropTypes.number,
+        mxEvent: React.PropTypes.object.isRequired,
         onWidgetLoad: React.PropTypes.func,
     },
 
@@ -42,7 +42,13 @@ module.exports = React.createClass({
     },
 
     componentWillMount: function() {
-        MatrixClientPeg.get().getUrlPreview(this.props.link, this.props.ts).then((res)=>{
+        if (global.localStorage) {
+            if (global.localStorage.getItem("hide_preview_" + this.props.mxEvent.getId()) === "1") {
+                return;
+            }
+        }
+
+        MatrixClientPeg.get().getUrlPreview(this.props.link, this.props.mxEvent.getTs()).then((res)=>{
             this.setState({ preview: res });
             this.props.onWidgetLoad();
         }, (error)=>{
@@ -60,6 +66,15 @@ module.exports = React.createClass({
             linkifyElement(this.refs.description, linkifyMatrix.options);
     },
 
+    onCancelClick: function(event) {
+        this.setState({ preview: null });
+        // FIXME: persist this somewhere smarter than local storage
+        // FIXME: add to event contextual menu ability to unhide hidden previews
+        if (global.localStorage) {
+            global.localStorage.setItem("hide_preview_" + this.props.mxEvent.getId(), "1");
+        }
+    },    
+
     render: function() {
         var p = this.state.preview;
         if (!p) return <div/>;
@@ -93,6 +108,8 @@ module.exports = React.createClass({
                         { p["og:description"] }
                     </div>
                 </div>
+                <img className="mx_LinkPreviewWidget_cancel" src="img/cancel.svg" width="18" height="18"
+                     onClick={ this.onCancelClick }/>
             </div>
         );
     }