diff --git a/app/assets/images/icons/postreport.png b/app/assets/images/icons/report.png
similarity index 100%
rename from app/assets/images/icons/postreport.png
rename to app/assets/images/icons/report.png
diff --git a/app/assets/javascripts/app/models/post_report.js b/app/assets/javascripts/app/models/post_report.js
deleted file mode 100644
index 7a9705bb56fe9ac94e4f3a1b145661f636e2d65f..0000000000000000000000000000000000000000
--- a/app/assets/javascripts/app/models/post_report.js
+++ /dev/null
@@ -1,3 +0,0 @@
-app.models.PostReport = Backbone.Model.extend({
-  urlRoot: '/post_report'
-});
diff --git a/app/assets/javascripts/app/models/report.js b/app/assets/javascripts/app/models/report.js
new file mode 100644
index 0000000000000000000000000000000000000000..594c7565b30f0bda4f3b3ba65300de3d971fc165
--- /dev/null
+++ b/app/assets/javascripts/app/models/report.js
@@ -0,0 +1,8 @@
+app.models.Report = Backbone.Model.extend({
+  urlRoot: '/report',
+
+  getReason: function() {
+    return prompt(Diaspora.I18n.t('report_prompt'), Diaspora.I18n.t('report_prompt_default'));
+  }
+
+});
diff --git a/app/assets/javascripts/app/views/comment_view.js b/app/assets/javascripts/app/views/comment_view.js
index 8ed7ff48a5f087f04bad183c0c2ebc24c2465a44..a02676ffffefc971aa49554b3797e781de1284e4 100644
--- a/app/assets/javascripts/app/views/comment_view.js
+++ b/app/assets/javascripts/app/views/comment_view.js
@@ -5,7 +5,8 @@ app.views.Comment = app.views.Content.extend({
 
   events : function() {
     return _.extend({}, app.views.Content.prototype.events, {
-      "click .comment_delete": "destroyModel"
+      "click .comment_delete": "destroyModel",
+      "click .comment_report": "report"
     });
   },
 
@@ -31,6 +32,20 @@ app.views.Comment = app.views.Content.extend({
 
   canRemove : function() {
     return app.currentUser.authenticated() && (this.ownComment() || this.postOwner())
+  },
+
+  report: function(evt) {
+    if(evt) { evt.preventDefault(); }
+    var report = new app.models.Report();
+    var msg = report.getReason();
+    if (msg !== null) {
+      var id = this.model.id;
+      var type = $(evt.currentTarget).data("type");
+      report.fetch({
+        data: { id: id, type: type, text: msg },
+        type: 'POST'
+      });
+    }
   }
 });
 
diff --git a/app/assets/javascripts/app/views/feedback_view.js b/app/assets/javascripts/app/views/feedback_view.js
index d7f84a653897474ea908e8746a5035807c3c04d7..62e898f049dcaeb8ec76cfb99e68b6a1020d61f7 100644
--- a/app/assets/javascripts/app/views/feedback_view.js
+++ b/app/assets/javascripts/app/views/feedback_view.js
@@ -6,7 +6,8 @@ app.views.Feedback = app.views.Base.extend({
   events: {
     "click *[rel='auth-required']" : "requireAuth",
     "click .like" : "toggleLike",
-    "click .reshare" : "resharePost"
+    "click .reshare" : "resharePost",
+    "click .post_report" : "report"
   },
 
   tooltipSelector : ".label",
@@ -44,5 +45,19 @@ app.views.Feedback = app.views.Base.extend({
     if( app.currentUser.authenticated() ) { return }
     alert("you must be logged in to do that!")
     return false;
+  },
+
+  report: function(evt) {
+    if(evt) { evt.preventDefault(); }
+    var report = new app.models.Report();
+    var msg = report.getReason();
+    if (msg !== null) {
+      var id = this.model.id;
+      var type = $(evt.currentTarget).data("type");
+      report.fetch({
+        data: { id: id, type: type, text: msg },
+        type: 'POST'
+      });
+    }
   }
 });
diff --git a/app/assets/javascripts/app/views/post_view.js b/app/assets/javascripts/app/views/post_view.js
index 7d45e6bdfacf61107c4dd72fa5e532abbb71a9ce..9aef827287c9f85146658f24e818611bf1f646f1 100644
--- a/app/assets/javascripts/app/views/post_view.js
+++ b/app/assets/javascripts/app/views/post_view.js
@@ -13,5 +13,20 @@ app.views.Post = app.views.Base.extend({
 
   showPost : function() {
     return (app.currentUser.get("showNsfw")) || !this.model.get("nsfw")
+  },
+
+  report: function(evt) {
+    if(evt) { evt.preventDefault(); }
+    var report = new app.models.Report();
+    var msg = report.getReason();
+    if (msg !== null) {
+      var id = this.model.id;
+      var type = $(evt.currentTarget).data("type");
+      report.fetch({
+        data: { id: id, type: type, text: msg },
+        type: 'POST'
+      });
+    }
   }
+
 });
diff --git a/app/assets/javascripts/app/views/stream_post_views.js b/app/assets/javascripts/app/views/stream_post_views.js
index fb1d846d460516ea4027373651b9bec75cfab9e7..ef557362d0e69770013d2efbac24d774ee284fad 100644
--- a/app/assets/javascripts/app/views/stream_post_views.js
+++ b/app/assets/javascripts/app/views/stream_post_views.js
@@ -20,7 +20,7 @@ app.views.StreamPost = app.views.Post.extend({
 
     "click .remove_post": "destroyModel",
     "click .hide_post": "hidePost",
-    "click .post_report": "postReport",
+    "click .post_report": "report",
     "click .block_user": "blockUser"
   },
 
@@ -108,21 +108,6 @@ app.views.StreamPost = app.views.Post.extend({
     this.remove();
   },
 
-  postReport : function(evt) {
-    if(evt) { evt.preventDefault(); }
-    var text = prompt(Diaspora.I18n.t('post_report_prompt'),
-		      Diaspora.I18n.t('post_report_prompt_default'));
-
-    var postReport = new app.models.PostReport();
-    postReport.fetch({
-      data: {
-        post_id: this.model.id,
-        text: text
-      },
-      type: 'POST'
-    });
-  },
-
   focusCommentTextarea: function(evt){
     evt.preventDefault();
     this.$(".new_comment_form_wrapper").removeClass("hidden");
diff --git a/app/assets/stylesheets/application.css.sass b/app/assets/stylesheets/application.css.sass
index 96184c31582ed2f8abd4e578e58914f1bf019b7b..52199d047022cb56e655b57570ad0bdf686b03ef 100644
--- a/app/assets/stylesheets/application.css.sass
+++ b/app/assets/stylesheets/application.css.sass
@@ -17,8 +17,8 @@
 @import 'facebox'
 @import 'aspects'
 @import 'popover'
-@import 'post_report'
 @import 'stream_element'
+@import 'report'
 
 /* ====== media ====== */
 .media
@@ -211,10 +211,10 @@ ul.as-selections
   :z-index 6
   :float right
 
-  .post_report
+  .post_report, .comment_report
     :display inline-block
 
-    .icons-postreport
+    .icons-report
       :height 14px
       :width 14px
 
diff --git a/app/assets/stylesheets/entypo.css.scss b/app/assets/stylesheets/entypo.css.scss
index a2d2a3774567db7952867a65e710cb0461d53c74..615ed4e28cc9fd2dc8c94423b6b0a2bdeac874e8 100644
--- a/app/assets/stylesheets/entypo.css.scss
+++ b/app/assets/stylesheets/entypo.css.scss
@@ -141,6 +141,7 @@
   &.globe:before { content: '\1f30e'; } /* 1f30e */
   &.graduation-cap:before { content: '\1f393 '; } /* 1f393 */
   &.heart-empty:before { content: '\2661'; } /* 2661 */
+  &.report:before { content: '\21'; } /* 21 */
   &.heart:before { content: '\2665'; } /* 2665 */
   &.help:before { content: '\2753'; } /* 2753 */
   &.home:before { content: '\2302'; } /* 2302 */
diff --git a/app/assets/stylesheets/post_report.css.scss b/app/assets/stylesheets/report.css.scss
similarity index 71%
rename from app/assets/stylesheets/post_report.css.scss
rename to app/assets/stylesheets/report.css.scss
index ba865f9da007c83e33d65d66c500658adf151f6b..6fa29ce0758b33a2fcbf6befb219ad03c2c960a5 100644
--- a/app/assets/stylesheets/post_report.css.scss
+++ b/app/assets/stylesheets/report.css.scss
@@ -1,4 +1,4 @@
-#post_report {
+#report {
   padding-top: 2em;
   span {
     display: block;
@@ -11,6 +11,8 @@
   }
   .clear {
     clear: both;
+    border-bottom: 1px solid #808080;
     padding-bottom: 1em;
+    margin-bottom: 1em;
   }
 }
diff --git a/app/assets/stylesheets/single-post-view.css.scss b/app/assets/stylesheets/single-post-view.css.scss
index 2fd30c8882defaa733ebe8b16427eee32aefaa7f..0568634071f09ce7adc86001ea8e8380f87d6650 100644
--- a/app/assets/stylesheets/single-post-view.css.scss
+++ b/app/assets/stylesheets/single-post-view.css.scss
@@ -61,6 +61,12 @@
       i.comment:hover {
         color: #424242;
       }
+      i.report.gray:hover {
+        color: $red;
+      }
+      i.report.red:hover {
+        color: #f55f5a;
+      }
       i.heart.gray:hover {
         color: $red;
       }
diff --git a/app/assets/templates/comment_tpl.jst.hbs b/app/assets/templates/comment_tpl.jst.hbs
index e87eb2eeb35626f60915d58805ee65d46d1baf6d..71be0bd4e4f2f99b50081e6054f58388d94aff07 100644
--- a/app/assets/templates/comment_tpl.jst.hbs
+++ b/app/assets/templates/comment_tpl.jst.hbs
@@ -6,13 +6,17 @@
   </div>
 
   <div class="bd">
+    <div class="controls">
     {{#if canRemove}}
-      <div class="controls">
-        <a href="#" class="delete comment_delete" title="{{t "delete"}}">
-          <div alt="Deletelabel" class="icons-deletelabel" />
-        <a/>
-      </div>
+      <a href="#" class="delete comment_delete" title="{{t "delete"}}">
+        <div alt="Deletelabel" class="icons-deletelabel" />
+      <a/>
+    {{else}}
+      <a href="#" data-type="comment" class="comment_report" title="{{t "report"}}">
+        <div class="icons-report control_icon"/>
+      </a>
     {{/if}}
+    </div>
 
     {{#with author}}
       <a href="/people/{{guid}}" class="author author-name {{hovercardable this}}">
diff --git a/app/assets/templates/single-post-viewer/single-post-actions_tpl.jst.hbs b/app/assets/templates/single-post-viewer/single-post-actions_tpl.jst.hbs
index 66a5101aab5fd52fa9b72dbf70759f04a6463072..26fcd0822e0e1b642415974e3a8fe8ccde9b6fc6 100644
--- a/app/assets/templates/single-post-viewer/single-post-actions_tpl.jst.hbs
+++ b/app/assets/templates/single-post-viewer/single-post-actions_tpl.jst.hbs
@@ -22,5 +22,9 @@
             </a>
         {{/if}}
     {{/if}}
+
+    <a href="#" rel="auth-required" data-type="post" class="post_report" title="{{t "report"}}">
+      <i class="entypo report gray large"/>
+    </a>
   </div>
 </div>
diff --git a/app/assets/templates/stream-element_tpl.jst.hbs b/app/assets/templates/stream-element_tpl.jst.hbs
index 21ed75fd4cf2e60979a82264d425a70d01555004..45a73f9a04cab47b4e5cfe876a82a6bffeaa5342 100644
--- a/app/assets/templates/stream-element_tpl.jst.hbs
+++ b/app/assets/templates/stream-element_tpl.jst.hbs
@@ -10,8 +10,8 @@
     {{#if loggedIn}}
       <div class="controls">
         {{#unless authorIsCurrentUser}}
-          <a href="#" rel="nofollow" class="post_report" title="{{t "post_report"}}">
-            <div class="icons-postreport control_icon"/>
+          <a href="#" rel="nofollow" data-type="post" class="post_report" title="{{t "report"}}">
+            <div class="icons-report control_icon"/>
           </a>
           <a href="#" rel="nofollow" class="block_user" title="{{t "ignore"}}">
             <div class="icons-ignoreuser control_icon"></div>
diff --git a/app/controllers/post_report_controller.rb b/app/controllers/post_report_controller.rb
deleted file mode 100644
index cd8dba827de27430b9e9bdb4cd46b5be84404f67..0000000000000000000000000000000000000000
--- a/app/controllers/post_report_controller.rb
+++ /dev/null
@@ -1,61 +0,0 @@
-class PostReportController < ApplicationController
-  before_filter :authenticate_user!
-  before_filter :redirect_unless_admin, :except => [:create]
-
-  def index
-    @post_report = PostReport.where(reviewed: false).all
-  end
-
-  def update
-    if PostReport.exists?(post_id: params[:id])
-      mark_as_reviewed
-    end
-    redirect_to :action => :index and return
-  end
-
-  def destroy
-    if Post.exists?(params[:id])
-      delete_post
-      mark_as_reviewed
-    end
-    redirect_to :action => :index and return
-  end
-
-  def create
-    username = current_user.username
-    unless PostReport.where(post_id: params[:post_id]).exists?(user_id: username)
-      post = PostReport.new(
-        :post_id => params[:post_id],
-        :user_id => username,
-        :text => params[:text])
-      result = post.save
-      status(( 200 if result ) || ( 422 if !result ))
-    else
-      status(409)
-    end
-  end
-
-  private
-    def delete_post
-      post = Post.find(params[:id])
-      current_user.retract(post)
-      flash[:notice] = I18n.t 'post_report.status.destroyed'
-    end
-
-    def mark_as_reviewed id = params[:id]
-      posts = PostReport.where(post_id: id)
-      posts.each do |post|
-        post.update_attributes(reviewed: true)
-      end
-      flash[:notice] = I18n.t 'post_report.status.marked'
-    end
-
-    def status(code)
-      if code == 200
-        flash[:notice] = I18n.t 'post_report.status.created'
-      else
-        flash[:error] = I18n.t 'post_report.status.failed'
-      end
-      render :nothing => true, :status => code
-    end
-end
diff --git a/app/controllers/report_controller.rb b/app/controllers/report_controller.rb
new file mode 100644
index 0000000000000000000000000000000000000000..a5dcef21d787b770fc2709c1dfdc87df77fe3e68
--- /dev/null
+++ b/app/controllers/report_controller.rb
@@ -0,0 +1,67 @@
+class ReportController < ApplicationController
+  before_filter :authenticate_user!
+  before_filter :redirect_unless_admin, :except => [:create]
+
+  def index
+    @report = Report.where(reviewed: false).all
+  end
+
+  def update
+    if Report.where(post_type: params[:type]).exists?(post_id: params[:id])
+      mark_as_reviewed
+    end
+    redirect_to :action => :index and return
+  end
+
+  def destroy
+    if (params[:type].eql? "post")
+      if Post.exists?(params[:id])
+        delete_post
+      end
+    elsif (params[:type].eql? "comment")
+      if Comment.exists?(params[:id])
+        delete_comment
+      end
+    end
+    redirect_to :action => :index and return
+  end
+
+  def create
+    code = 400
+    username = current_user.username
+    post = Report.new(
+      :post_id => params[:id],
+      :post_type => params[:type],
+      :user_id => username,
+      :text => params[:text])
+    unless Report.where("post_id = ? AND post_type = ?", params[:id], params[:type]).exists?(user_id: username)
+      result = post.save
+      code = 200 if result
+    end
+    render :nothing => true, :status => code
+  end
+
+  private
+    def delete_post
+      post = Post.find(params[:id])
+      current_user.retract(post)
+      mark_as_reviewed
+      flash[:notice] = I18n.t 'report.status.destroyed'
+    end
+
+    def delete_comment
+      comment = Comment.find(params[:id])
+      #current_user.retract(comment)
+      comment.destroy
+      mark_as_reviewed
+      flash[:notice] = I18n.t 'report.status.destroyed'
+    end
+
+    def mark_as_reviewed
+      posts = Report.where("post_id = ? AND post_type = ?", params[:id], params[:type])
+      posts.each do |post|
+        post.update_attributes(reviewed: true)
+      end
+      flash[:notice] = I18n.t 'report.status.marked'
+    end
+end
diff --git a/app/helpers/report_helper.rb b/app/helpers/report_helper.rb
new file mode 100644
index 0000000000000000000000000000000000000000..91b94e49f51fd79d7198d1b530c4576f7891ece5
--- /dev/null
+++ b/app/helpers/report_helper.rb
@@ -0,0 +1,13 @@
+#   Copyright (c) 2012, Diaspora Inc.  This file is
+#   licensed under the Affero General Public License version 3 or later.  See
+#   the COPYRIGHT file.
+
+module ReportHelper
+  def report_content(id, type)
+    if type.eql? "post"
+      raw t('report.post_label', title: link_to(post_page_title(Post.find_by_id(id)), post_path(id)))
+    elsif type.eql? "comment"
+      raw t('report.comment_label', data: comment_message(Comment.find_by_id(id)))
+    end
+  end
+end
diff --git a/app/mailers/post_report_mailer.rb b/app/mailers/post_report_mailer.rb
deleted file mode 100644
index 46b6737ccf124e5a9961d50bb47cc151cc84d29e..0000000000000000000000000000000000000000
--- a/app/mailers/post_report_mailer.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-class PostReportMailer < ActionMailer::Base
-  default :from => AppConfig.mail.sender_address
-
-  def new_report
-    Role.admins.each do |role|
-      email = User.find_by_id(role.person_id).email
-      format(email).deliver
-    end
-  end
-
-  private
-    def format(email)
-      mail(to: email, subject: I18n.t('notifier.post_report_email.subject')) do |format|
-        format.text { render 'post_report/post_report_email' }
-        format.html { render 'post_report/post_report_email' }
-      end
-    end
-end
diff --git a/app/mailers/report_mailer.rb b/app/mailers/report_mailer.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e7dbb911c32b14c64ba7813d398ccd21175e4607
--- /dev/null
+++ b/app/mailers/report_mailer.rb
@@ -0,0 +1,26 @@
+class ReportMailer < ActionMailer::Base
+  default :from => AppConfig.mail.sender_address
+
+  def new_report(type, id)
+    url = AppConfig.pod_uri.to_s
+    url << report_index_path
+    resource = Hash[
+      :subject => I18n.t('notifier.report_email.subject', :type => type),
+      :url => url,
+      :type => type,
+      :id => id
+    ]
+    Role.admins.each do |role|
+      resource[:email] = User.find_by_id(role.person_id).email
+      format(resource).deliver
+    end
+  end
+
+  private
+    def format(resource)
+      mail(to: resource[:email], subject: resource[:subject]) do |format|
+        format.html { render 'report/report_email', :locals => { :resource => resource } }
+        format.text { render 'report/report_email', :locals => { :resource => resource } }
+      end
+    end
+end
diff --git a/app/models/post_report.rb b/app/models/report.rb
similarity index 53%
rename from app/models/post_report.rb
rename to app/models/report.rb
index a521162ada3c8aa920dc784a786c979d75289b23..b47a006dcf983ef2d42ce41bb94dee5cd9e2fc1f 100644
--- a/app/models/post_report.rb
+++ b/app/models/report.rb
@@ -1,15 +1,16 @@
-class PostReport < ActiveRecord::Base
+class Report < ActiveRecord::Base
   validates :user_id, presence: true
   validates :post_id, presence: true
+  validates :post_type, presence: true
 
   belongs_to :user
   belongs_to :post
 
-  has_many :post_reports  
+  has_many :reports  
 
   after_create :send_report_notification
 
   def send_report_notification
-    Workers::Mail::PostReportWorker.perform_async
+    Workers::Mail::ReportWorker.perform_async(self.post_type, self.post_id)
   end
 end
diff --git a/app/views/admins/_admin_bar.haml b/app/views/admins/_admin_bar.haml
index dff8955fad3346536295032541dc439d09422c67..cb6ac9b34a095d99ad6556167c30556760f9503a 100644
--- a/app/views/admins/_admin_bar.haml
+++ b/app/views/admins/_admin_bar.haml
@@ -5,7 +5,7 @@
       %li= link_to t('.user_search'), user_search_path
       %li= link_to t('.weekly_user_stats'), weekly_user_stats_path
       %li= link_to t('.pod_stats'), pod_stats_path
-      %li= link_to t('.post_report'), post_report_index_path
+      %li= link_to t('.report'), report_index_path
       %li= link_to t('.correlations'), correlations_path
       %li= link_to t('.sidekiq_monitor'), sidekiq_path
 	
diff --git a/app/views/post_report/index.html.haml b/app/views/post_report/index.html.haml
deleted file mode 100644
index 538ff39b0efb7f1afd07f1d8ff57e1968a2390be..0000000000000000000000000000000000000000
--- a/app/views/post_report/index.html.haml
+++ /dev/null
@@ -1,21 +0,0 @@
-.span-24
-  = render :partial => 'admins/admin_bar'
-
-.span-24.last
-  %h1
-    = t('post_report.title')
-  %div#post_report
-    - @post_report.each do |report|
-      %div.content
-        %span
-          = raw t('post_report.post_label', title: link_to(post_page_title(Post.find_by_id(report.post_id)), post_path(report.post_id)))
-        %span
-          = raw t('post_report.reported_label', person: link_to(report.user_id, user_profile_path(report.user_id)))
-        %span
-          = t('post_report.reason_label', text: report.text)
-      %div.options
-        %span
-          = link_to t('post_report.review_link'), post_report_path(report.post_id), method: :put
-        %span
-          = link_to t('post_report.delete_link'), post_report_path(report.post_id), method: :delete
-      %div.clear
diff --git a/app/views/post_report/post_report_email.markerb b/app/views/post_report/post_report_email.markerb
deleted file mode 100644
index fb4b688f1d1e43ca9e4184ee61c3098f613edbba..0000000000000000000000000000000000000000
--- a/app/views/post_report/post_report_email.markerb
+++ /dev/null
@@ -1,2 +0,0 @@
-<%= t('notifier.post_report_email.body') %>
-
diff --git a/app/views/report/index.html.haml b/app/views/report/index.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..8da7c73bdffacd6b717ad9e2182cd98001cd0ddf
--- /dev/null
+++ b/app/views/report/index.html.haml
@@ -0,0 +1,21 @@
+.span-24
+  = render :partial => 'admins/admin_bar'
+
+.span-24.last
+  %h1
+    = t('report.title')
+  %div#report
+    - @report.each do |r|
+      %div.content
+        %span
+          = report_content(r.post_id, r.post_type)
+        %span
+          = raw t('report.reported_label', person: link_to(r.user_id, user_profile_path(r.user_id)))
+        %span
+          = t('report.reason_label', text: r.text)
+      %div.options
+        %span
+          = link_to t('report.review_link'), report_path(r.post_id, :type => r.post_type), method: :put
+        %span
+          = link_to t('report.delete_link'), report_path(r.post_id, :type => r.post_type), method: :delete
+      %div.clear
diff --git a/app/views/report/report_email.markerb b/app/views/report/report_email.markerb
new file mode 100644
index 0000000000000000000000000000000000000000..ba787d56a352436ea6ab02df266000a9dd999cc0
--- /dev/null
+++ b/app/views/report/report_email.markerb
@@ -0,0 +1,2 @@
+<%= t('notifier.report_email.body', url: resource[:url], type: resource[:type], id: resource[:id]) %>
+
diff --git a/app/workers/mail/post_report_worker.rb b/app/workers/mail/post_report_worker.rb
deleted file mode 100644
index a3f84194269bc22c09a87f00f8d874b855c1e323..0000000000000000000000000000000000000000
--- a/app/workers/mail/post_report_worker.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-module Workers
-  module Mail
-    class PostReportWorker < Base
-      sidekiq_options queue: :mail
-
-      def perform
-        PostReportMailer.new_report
-      end
-    end
-  end
-end
-
diff --git a/app/workers/mail/report_worker.rb b/app/workers/mail/report_worker.rb
new file mode 100644
index 0000000000000000000000000000000000000000..92c201dcbbe89ac6afadda667b94b3b484bb2fae
--- /dev/null
+++ b/app/workers/mail/report_worker.rb
@@ -0,0 +1,12 @@
+module Workers
+  module Mail
+    class ReportWorker < Base
+      sidekiq_options queue: :mail
+
+      def perform(type, id)
+        ReportMailer.new_report(type, id)
+      end
+    end
+  end
+end
+
diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml
index 60dc8c116d281ed893a6316e3c0152b85303142d..e5a440f766aae44dfc1337295d2c3e81f81e78c0 100644
--- a/config/locales/diaspora/en.yml
+++ b/config/locales/diaspora/en.yml
@@ -99,7 +99,7 @@ en:
       user_search: "User Search"
       weekly_user_stats: "Weekly User Stats"
       pod_stats: "Pod Stats"
-      post_report: "Reported Posts"
+      report: "Reports"
       correlations: "Correlations"
       sidekiq_monitor: "Sidekiq monitor"
     correlations:
@@ -736,9 +736,23 @@ en:
     confirm_email:
         subject: "Please activate your new email address %{unconfirmed_email}"
         click_link: "To activate your new email address %{unconfirmed_email}, please follow this link:"
-    post_report_email:
-        subject: "A new post was marked as offensive"
-        body: "Please review as soon as possible!"
+    report_email:
+        subject: "A new %{type} was marked as offensive"
+        body: |-
+          Hello,
+
+          the %{type} with ID %{id} was marked as offensive.
+
+          [%{url}][1]
+
+          Please review as soon as possible!
+
+
+          Cheers,
+
+          The diaspora* email robot!
+
+          [1]: %{url}
     accept_invite: "Accept Your diaspora* invite!"
     invited_you: "%{name} invited you to diaspora*"
     invite:
@@ -868,9 +882,10 @@ en:
         other: "%{count} photos by %{author}"
       reshare_by: "Reshare by %{author}"
 
-  post_report:
-    title: "Marked Reports Overview"
+  report:
+    title: "Reports Overview"
     post_label: "<b>Post</b>: %{title}"
+    comment_label: "<b>Comment</b>:<br>%{data}"
     reported_label: "<b>Reported by</b> %{person}"
     reason_label: "Reason: %{text}"
     review_link: "Mark as reviewed"
diff --git a/config/locales/javascript/javascript.en.yml b/config/locales/javascript/javascript.en.yml
index 5a619206ed664eb540791061d80426b91ba0d482..e10959db646a38924dc7bcb28e4dde25ac7ff72b 100644
--- a/config/locales/javascript/javascript.en.yml
+++ b/config/locales/javascript/javascript.en.yml
@@ -6,11 +6,11 @@
 en:
   javascripts:
     confirm_dialog: "Are you sure?"
-    post_report_prompt: "Please enter a reason:"
-    post_report_prompt_default: "offensive content"
+    report_prompt: "Please enter a reason:"
+    report_prompt_default: "offensive content"
     delete: "Delete"
     ignore: "Ignore"
-    post_report: "Report"
+    report: "Report"
     ignore_user: "Ignore this user?"
     and: "and"
     comma: ","
diff --git a/config/routes.rb b/config/routes.rb
index 39b66432e59eab3b330bc076c39ef2bb855e9f99..dc659bbbbd49e88ea21df44e73946f412eec3605 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -5,7 +5,7 @@
 require 'sidekiq/web'
 
 Diaspora::Application.routes.draw do
-  resources :post_report, :except => [:edit]
+  resources :report, :except => [:edit, :new]
 
   if Rails.env.production?
     mount RailsAdmin::Engine => '/admin_panel', :as => 'rails_admin'
diff --git a/db/migrate/20140121132816_add_post_type_to_post_report.rb b/db/migrate/20140121132816_add_post_type_to_post_report.rb
new file mode 100644
index 0000000000000000000000000000000000000000..be50eca0afb4d633c978d2fbfe8acccb3a2d7384
--- /dev/null
+++ b/db/migrate/20140121132816_add_post_type_to_post_report.rb
@@ -0,0 +1,5 @@
+class AddPostTypeToPostReport < ActiveRecord::Migration
+  def change
+    add_column :post_reports, :post_type, :string, :null => false, :after => :post_id
+  end
+end
diff --git a/db/migrate/20140214104217_rename_post_report_to_report.rb b/db/migrate/20140214104217_rename_post_report_to_report.rb
new file mode 100644
index 0000000000000000000000000000000000000000..2d477491e35b96cca828bc8d02c5dd7361c53399
--- /dev/null
+++ b/db/migrate/20140214104217_rename_post_report_to_report.rb
@@ -0,0 +1,8 @@
+class RenamePostReportToReport < ActiveRecord::Migration
+  def self.up
+    rename_table :post_reports, :reports
+  end
+  def self.down
+    rename_table :reports, :post_reports
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 97f7cb6c28366c54783384d469717d7536ab8d88..b483d9b033393a88d93c41e8bd75341228285877 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -410,6 +410,18 @@ ActiveRecord::Schema.define(:version => 20140308154022) do
 
   add_index "rails_admin_histories", ["item", "table", "month", "year"], :name => "index_rails_admin_histories"
 
+  create_table "reports", :force => true do |t|
+    t.integer  "post_id",                       :null => false
+    t.string   "post_type",                     :null => false
+    t.string   "user_id"
+    t.boolean  "reviewed",   :default => false
+    t.text     "text"
+    t.datetime "created_at",                    :null => false
+    t.datetime "updated_at",                    :null => false
+  end
+
+  add_index "reports", ["post_id"], :name => "index_post_reports_on_post_id"
+
   create_table "roles", :force => true do |t|
     t.integer  "person_id"
     t.string   "name"
diff --git a/spec/controllers/post_report_controller_spec.rb b/spec/controllers/post_report_controller_spec.rb
deleted file mode 100644
index 513e19164255c9931ba233e9dfbb5a7478d08027..0000000000000000000000000000000000000000
--- a/spec/controllers/post_report_controller_spec.rb
+++ /dev/null
@@ -1,79 +0,0 @@
-require 'spec_helper'
-
-describe PostReportController do
-  before do
-    sign_in alice
-    @message = alice.post(:status_message, :text => "hey", :to => alice.aspects.first.id)
-  end
-
-  describe '#index' do
-    context 'admin not signed in' do
-      it 'is behind redirect_unless_admin' do
-        get :index
-        response.should redirect_to stream_path
-      end
-    end
-    
-    context 'admin signed in' do
-      before do
-        Role.add_admin(alice.person)
-      end
-      it 'succeeds and renders index' do
-        get :index
-        response.should render_template('index')
-      end
-    end
-  end
-
-  describe '#create' do
-    context 'report offensive content' do
-      it 'succeeds' do
-        put :create, :post_id => @message.id, :text => 'offensive content'
-        response.status.should == 200
-        PostReport.exists?(:post_id => @message.id).should be_true
-      end
-    end
-  end
-
-  describe '#update' do
-    context 'mark report as user' do
-      it 'is behind redirect_unless_admin' do
-        put :update, :id => @message.id
-        response.should redirect_to stream_path
-        PostReport.where(:reviewed => false, :post_id => @message.id).should be_true
-      end
-    end
-
-    context 'mark report as admin' do
-      before do
-        Role.add_admin(alice.person)
-      end
-      it 'succeeds' do
-        put :update, :id => @message.id
-        response.status.should == 302
-        PostReport.where(:reviewed => true, :post_id => @message.id).should be_true
-      end
-    end
-  end
-
-  describe '#destroy' do
-    context 'destroy post as user' do
-      it 'is behind redirect_unless_admin' do
-        delete :destroy, :id => @message.id
-        response.should redirect_to stream_path
-        PostReport.where(:reviewed => false, :post_id => @message.id).should be_true
-      end
-    end
-
-    context 'destroy post as admin' do
-      before do
-        Role.add_admin(alice.person)
-      end
-      it 'succeeds' do
-        delete :destroy, :id => @message.id
-        response.status.should == 302
-        PostReport.where(:reviewed => true, :post_id => @message.id).should be_true
-      end
-    end
-  end
-end
diff --git a/spec/controllers/report_controller_spec.rb b/spec/controllers/report_controller_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..614dc1b4511badf568dca001455b1428c4237cc0
--- /dev/null
+++ b/spec/controllers/report_controller_spec.rb
@@ -0,0 +1,126 @@
+require 'spec_helper'
+
+describe ReportController do
+  before do
+    sign_in alice
+    @message = alice.post(:status_message, :text => "hey", :to => alice.aspects.first.id)
+    @comment = alice.comment!(@message, "flying pigs, everywhere")
+  end
+
+  describe '#index' do
+    context 'admin not signed in' do
+      it 'is behind redirect_unless_admin' do
+        get :index
+        response.should redirect_to stream_path
+      end
+    end
+    
+    context 'admin signed in' do
+      before do
+        Role.add_admin(alice.person)
+      end
+      it 'succeeds and renders index' do
+        get :index
+        response.should render_template('index')
+      end
+    end
+  end
+
+  describe '#create' do
+    let(:comment_hash) {
+      {:text    =>"facebook, is that you?",
+       :post_id =>"#{@post.id}"}
+    }
+
+    context 'report offensive post' do
+      it 'succeeds' do
+        put :create, :id => @message.id, :type => 'post', :text => 'offensive content'
+        response.status.should == 200
+        Report.exists?(:post_id => @message.id, :post_type => 'post').should be_true
+      end
+    end
+    context 'report offensive comment' do
+      it 'succeeds' do
+        put :create, :id => @comment.id, :type => 'comment', :text => 'offensive content'
+        response.status.should == 200
+        Report.exists?(:post_id => @comment.id, :post_type => 'comment').should be_true
+      end
+    end
+  end
+
+  describe '#update' do
+    context 'mark post report as user' do
+      it 'is behind redirect_unless_admin' do
+        put :update, :id => @message.id, :type => 'post'
+        response.should redirect_to stream_path
+        Report.where(:reviewed => false, :post_id => @message.id, :post_type => 'post').should be_true
+      end
+    end
+    context 'mark comment report as user' do
+      it 'is behind redirect_unless_admin' do
+        put :update, :id => @comment.id, :type => 'comment'
+        response.should redirect_to stream_path
+        Report.where(:reviewed => false, :post_id => @comment.id, :post_type => 'comment').should be_true
+      end
+    end
+
+    context 'mark post report as admin' do
+      before do
+        Role.add_admin(alice.person)
+      end
+      it 'succeeds' do
+        put :update, :id => @message.id, :type => 'post'
+        response.status.should == 302
+        Report.where(:reviewed => true, :post_id => @message.id, :post_type => 'post').should be_true
+      end
+    end
+    context 'mark comment report as admin' do
+      before do
+        Role.add_admin(alice.person)
+      end
+      it 'succeeds' do
+        put :update, :id => @comment.id, :type => 'comment'
+        response.status.should == 302
+        Report.where(:reviewed => true, :post_id => @comment.id, :post_type => 'comment').should be_true
+      end
+    end
+  end
+
+  describe '#destroy' do
+    context 'destroy post as user' do
+      it 'is behind redirect_unless_admin' do
+        delete :destroy, :id => @message.id, :type => 'post'
+        response.should redirect_to stream_path
+        Report.where(:reviewed => false, :post_id => @message.id, :post_type => 'post').should be_true
+      end
+    end
+    context 'destroy comment as user' do
+      it 'is behind redirect_unless_admin' do
+        delete :destroy, :id => @comment.id, :type => 'comment'
+        response.should redirect_to stream_path
+        Report.where(:reviewed => false, :post_id => @comment.id, :post_type => 'comment').should be_true
+      end
+    end
+
+    context 'destroy post as admin' do
+      before do
+        Role.add_admin(alice.person)
+      end
+      it 'succeeds' do
+        delete :destroy, :id => @message.id, :type => 'post'
+        response.status.should == 302
+        Report.where(:reviewed => true, :post_id => @message.id, :post_type => 'post').should be_true
+      end
+    end
+    context 'destroy comment as admin' do
+      before do
+        Role.add_admin(alice.person)
+      end
+      it 'succeeds' do
+        delete :destroy, :id => @comment.id, :type => 'comment'
+        response.status.should == 302
+        Report.where(:reviewed => true, :post_id => @comment.id, :post_type => 'comment').should be_true
+      end
+    end
+  end
+end