diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php
index c775d9377..832cb88c9 100644
--- a/app/Http/Controllers/ReportController.php
+++ b/app/Http/Controllers/ReportController.php
@@ -2,12 +2,25 @@
 
 namespace App\Http\Controllers;
 
+use Auth;
 use Illuminate\Http\Request;
+use App\{Avatar, Profile, Report, Status, User};
 
 class ReportController extends Controller
 {
+    protected $profile;
+
+    public function __construct()
+    {
+      $this->middleware('auth');
+    }
+
     public function showForm(Request $request)
     {
+      $this->validate($request, [
+          'type'    => 'required|alpha_dash',
+          'id'      => 'required|integer|min:1'
+      ]);
       return view('report.form');
     }
 
@@ -35,4 +48,92 @@ class ReportController extends Controller
     {
       return view('report.spam.profile');
     }
+
+    public function sensitiveCommentForm(Request $request)
+    {
+      return view('report.sensitive.comment');
+    }
+
+    public function sensitivePostForm(Request $request)
+    {
+      return view('report.sensitive.post');
+    }
+
+    public function sensitiveProfileForm(Request $request)
+    {
+      return view('report.sensitive.profile');
+    }
+
+    public function abusiveCommentForm(Request $request)
+    {
+      return view('report.abusive.comment');
+    }
+
+    public function abusivePostForm(Request $request)
+    {
+      return view('report.abusive.post');
+    }
+
+    public function abusiveProfileForm(Request $request)
+    {
+      return view('report.abusive.profile');
+    }
+    
+    public function formStore(Request $request)
+    {
+      $this->validate($request, [
+          'report'  => 'required|alpha_dash',
+          'type'    => 'required|alpha_dash',
+          'id'      => 'required|integer|min:1',
+          'msg'     => 'nullable|string|max:150'
+      ]);
+
+      $profile = Auth::user()->profile;
+      $reportType = $request->input('report');
+      $object_id = $request->input('id');
+      $object_type = $request->input('type');
+      $msg = $request->input('msg');
+      $object = null;
+      $types = ['spam', 'sensitive', 'abusive'];
+
+      if(!in_array($reportType, $types)) {
+        return redirect('/timeline')->with('error', 'Invalid report type');
+      }
+
+      switch ($object_type) {
+        case 'post':
+          $object = Status::findOrFail($object_id);
+          $object_type = 'App\Status';
+          $exists = Report::whereUserId(Auth::id())
+                    ->whereObjectId($object->id)
+                    ->whereObjectType('App\Status')
+                    ->count();
+          break;
+        
+        default:
+          return redirect('/timeline')->with('error', 'Invalid report type');
+          break;
+      }
+
+      if($exists !== 0) {
+        return redirect('/timeline')->with('error', 'You have already reported this!');
+      }
+
+      if($object->profile_id == $profile->id) {
+        return redirect('/timeline')->with('error', 'You cannot report your own content!');
+      }
+
+      $report = new Report;
+      $report->profile_id = $profile->id;
+      $report->user_id = Auth::id();
+      $report->object_id = $object->id;
+      $report->object_type = $object_type;
+      $report->reported_profile_id = $object->profile_id;
+      $report->type = $request->input('report');
+      $report->message = $request->input('msg');
+      $report->save();
+
+      return redirect('/timeline')->with('status', 'Report successfully sent!');
+    }
+
 }