Index: reactapp/src/Pages/Faculty.js
===================================================================
--- reactapp/src/Pages/Faculty.js	(revision c68150fac8ab8e6f5dc5b8b2a9cd73d391dc1aa7)
+++ reactapp/src/Pages/Faculty.js	(revision e49d1b6f77f15934314680ef2f5f20fec4987e7b)
@@ -27,6 +27,6 @@
 
   useEffect(() => {
-    const urlProfessors = `http://192.168.0.17:8080/public/professors?facultyId=${params.facultyId}`;
-    const urlStudyProgrammes = `http://192.168.0.17:8080/public/study_programmes?facultyId=${params.facultyId}`;
+    const urlProfessors = `http://192.168.0.19:8080/public/professors?facultyId=${params.facultyId}`;
+    const urlStudyProgrammes = `http://192.168.0.19:8080/public/study_programmes?facultyId=${params.facultyId}`;
 
     const fetchDataProfessors = async () => {
Index: reactapp/src/Pages/Professor.js
===================================================================
--- reactapp/src/Pages/Professor.js	(revision c68150fac8ab8e6f5dc5b8b2a9cd73d391dc1aa7)
+++ reactapp/src/Pages/Professor.js	(revision e49d1b6f77f15934314680ef2f5f20fec4987e7b)
@@ -39,5 +39,5 @@
 
   useEffect(() => {
-    const url = `http://192.168.0.17:8080/public/professor/${params.professorId}`;
+    const url = `http://192.168.0.19:8080/public/professor/${params.professorId}`;
 
     const fetchProfessor = async () => {
@@ -60,4 +60,5 @@
     if (auth) {
       setPostModalDisplay("block");
+      document.body.style.overflowY = "hidden";
     } else {
       navigate("/login");
@@ -67,4 +68,5 @@
   const handleModalCloseClick = () => {
     setPostModalDisplay("none");
+    document.body.style.overflowY = "auto";
   };
 
@@ -74,5 +76,5 @@
     if (!postContent.length < 1) {
       const response = await axios(
-        `http://192.168.0.17:8080/secure/professor/${params.professorId}/addOpinion`,
+        `http://192.168.0.19:8080/secure/professor/${params.professorId}/addOpinion`,
         {
           method: "post",
@@ -152,4 +154,5 @@
                     rows="8"
                     cols="100"
+                    spellCheck={false}
                     value={postContent}
                     onChange={handleContentChange}
Index: reactapp/src/Pages/Subject.js
===================================================================
--- reactapp/src/Pages/Subject.js	(revision c68150fac8ab8e6f5dc5b8b2a9cd73d391dc1aa7)
+++ reactapp/src/Pages/Subject.js	(revision e49d1b6f77f15934314680ef2f5f20fec4987e7b)
@@ -46,5 +46,5 @@
 
   useEffect(() => {
-    const url = `http://192.168.0.17:8080/public/subject/${params.subjectId}`;
+    const url = `http://192.168.0.19:8080/public/subject/${params.subjectId}`;
 
     const fetchData = async () => {
@@ -67,4 +67,5 @@
     if (auth) {
       setTopicModalDisplay("block");
+      document.body.style.overflowY = "hidden";
     } else {
       navigate("/login");
@@ -74,4 +75,5 @@
   const handleModalCloseClick = () => {
     setTopicModalDisplay("none");
+    document.body.style.overflowY = "auto";
   };
 
@@ -81,5 +83,5 @@
     if (!topicTitle.length < 1 && !topicContent.length < 1) {
       const response = await axios(
-        `http://192.168.0.17:8080/secure/subject/${params.subjectId}/addThread`,
+        `http://192.168.0.19:8080/secure/subject/${params.subjectId}/addThread`,
         {
           method: "post",
@@ -178,4 +180,5 @@
                   value={topicTitle}
                   onChange={handleTitleChange}
+                  spellCheck={false}
                 />
               </label>
@@ -188,4 +191,5 @@
                   value={topicContent}
                   onChange={handleContentChange}
+                  spellCheck={false}
                 />
               </label>
Index: reactapp/src/Pages/Topic.js
===================================================================
--- reactapp/src/Pages/Topic.js	(revision c68150fac8ab8e6f5dc5b8b2a9cd73d391dc1aa7)
+++ reactapp/src/Pages/Topic.js	(revision e49d1b6f77f15934314680ef2f5f20fec4987e7b)
@@ -48,6 +48,6 @@
 
   useEffect(() => {
-    const url1 = `http://192.168.0.17:8080/public/thread/${params.topicId}`;
-    const url2 = `http://192.168.0.17:8080/secure/currentUser`;
+    const url1 = `http://192.168.0.19:8080/public/thread/${params.topicId}`;
+    const url2 = `http://192.168.0.19:8080/secure/currentUser`;
 
     const fetchTopic = async () => {
@@ -84,4 +84,5 @@
       setReplyModalDisplay("block");
       setPostForModal(post);
+      document.body.style.overflowY = "hidden";
     } else {
       navigate("/login");
@@ -98,5 +99,5 @@
     if (!replyContent.length < 1) {
       const response = await axios(
-        `http://192.168.0.17:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${postId}`,
+        `http://192.168.0.19:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${postId}`,
         {
           method: "post",
@@ -117,4 +118,5 @@
     if (auth) {
       setPostModalDisplay("block");
+      document.body.style.overflowY = "hidden";
     } else {
       navigate("/login");
@@ -126,5 +128,5 @@
     if (!postContent.length < 1) {
       const response = await axios(
-        `http://192.168.0.17:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${params.topicId}`,
+        `http://192.168.0.19:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${params.topicId}`,
         {
           method: "post",
@@ -144,4 +146,5 @@
     setPostModalDisplay("none");
     setReplyModalDisplay("none");
+    document.body.style.overflowY = "auto";
   };
   const handleContentChange = (e) => {
@@ -157,5 +160,5 @@
       ) {
         const response = await axios(
-          `http://192.168.0.17:8080/secure/upvoteThread/${post.postId}`,
+          `http://192.168.0.19:8080/secure/upvoteThread/${post.postId}`,
           {
             method: "get",
@@ -180,5 +183,5 @@
       ) {
         const response = await axios(
-          `http://192.168.0.17:8080/secure/downvoteThread/${post.postId}`,
+          `http://192.168.0.19:8080/secure/downvoteThread/${post.postId}`,
           {
             method: "get",
@@ -210,9 +213,18 @@
               {child.content}
             </p>
-            <OpinionReplyCardContentTime>
-              {dateConverter(
-                new Date(child.timePosted).toString().slice(4, -43)
-              )}
-            </OpinionReplyCardContentTime>
+            {thread.timePosted === thread.timeLastEdited ? (
+              <OpinionCardContentTime>
+                {dateConverter(
+                  new Date(thread.timePosted).toString().slice(4, -43)
+                )}
+              </OpinionCardContentTime>
+            ) : (
+              <OpinionCardContentTime>
+                {dateConverter(
+                  new Date(thread.timeLastEdited).toString().slice(4, -43)
+                )}{" "}
+                (едитирано од модератор)
+              </OpinionCardContentTime>
+            )}
 
             <div
@@ -232,5 +244,5 @@
                         (e) => e.vote === "UPVOTE" && e.user.id === user.id
                       )
-                      ? "greenyellow"
+                      ? "green"
                       : "darkgrey"
                     : "darkgrey"
@@ -337,4 +349,5 @@
                   value={postContent}
                   onChange={handleContentChange}
+                  spellCheck={false}
                 />
               </label>
@@ -356,9 +369,18 @@
             {thread.content}
           </p>
-          <OpinionCardContentTime>
-            {dateConverter(
-              new Date(thread.timePosted).toString().slice(4, -43)
-            )}
-          </OpinionCardContentTime>
+          {thread.timePosted === thread.timeLastEdited ? (
+            <OpinionCardContentTime>
+              {dateConverter(
+                new Date(thread.timePosted).toString().slice(4, -43)
+              )}
+            </OpinionCardContentTime>
+          ) : (
+            <OpinionCardContentTime>
+              {dateConverter(
+                new Date(thread.timeLastEdited).toString().slice(4, -43)
+              )}{" "}
+              (едитирано од модератор)
+            </OpinionCardContentTime>
+          )}
           <div
             style={{
@@ -377,5 +399,5 @@
                       (e) => e.vote === "UPVOTE" && e.user.id === user.id
                     )
-                    ? "greenyellow"
+                    ? "green"
                     : "darkgrey"
                   : "darkgrey"
@@ -422,9 +444,20 @@
                 {directChild.content}
               </p>
-              <OpinionCardContentTime>
-                {dateConverter(
-                  new Date(directChild.timePosted).toString().slice(4, -43)
-                )}
-              </OpinionCardContentTime>
+              {directChild.timePosted === directChild.timeLastEdited ? (
+                <OpinionCardContentTime>
+                  {dateConverter(
+                    new Date(directChild.timePosted).toString().slice(4, -43)
+                  )}
+                </OpinionCardContentTime>
+              ) : (
+                <OpinionCardContentTime>
+                  {dateConverter(
+                    new Date(directChild.timeLastEdited)
+                      .toString()
+                      .slice(4, -43)
+                  )}{" "}
+                  (едитирано од модератор)
+                </OpinionCardContentTime>
+              )}
               <div
                 style={{
@@ -444,5 +477,5 @@
                           (e) => e.vote === "UPVOTE" && e.user.id === user.id
                         )
-                        ? "greenyellow"
+                        ? "green"
                         : "darkgrey"
                       : "darkgrey"
Index: reactapp/src/Pages/University.js
===================================================================
--- reactapp/src/Pages/University.js	(revision c68150fac8ab8e6f5dc5b8b2a9cd73d391dc1aa7)
+++ reactapp/src/Pages/University.js	(revision e49d1b6f77f15934314680ef2f5f20fec4987e7b)
@@ -22,5 +22,5 @@
 
   useEffect(() => {
-    const url = `http://192.168.0.17:8080/public/faculties?universityId=${params.universityId}`;
+    const url = `http://192.168.0.19:8080/public/faculties?universityId=${params.universityId}`;
 
     const fetchData = async () => {
Index: reactapp/src/Pages/UserDashboard.js
===================================================================
--- reactapp/src/Pages/UserDashboard.js	(revision c68150fac8ab8e6f5dc5b8b2a9cd73d391dc1aa7)
+++ reactapp/src/Pages/UserDashboard.js	(revision e49d1b6f77f15934314680ef2f5f20fec4987e7b)
@@ -13,4 +13,14 @@
 import JSOG from "jsog";
 import AuthApi from "../api/AuthApi";
+import {EntityLi, EntityTypeSelector, EntityUl} from "../Components/Styled/EntityList.style";
+import {
+  AddOpinionButton,
+  Modal,
+  ModalBody,
+  ModalClose,
+  ModalContent, ModalFooter,
+  ModalHeader, ModalTextarea,
+    ModalInput
+} from "../Components/Styled/Modal.style";
 
 function UserDashboard() {
@@ -21,15 +31,54 @@
   const [fetchError, setFetchError] = useState(false);
 
+  const [postReports, setPostReports] = useState(null);
+  const [loadedPostReports, setLoadedPostReports] = useState(false);
+
+  const [reportModalDisplay, setReportModalDisplay] = useState("none");
+  const [reportForModal, setReportForModal] = useState(null);
+
+  const [actionType, setActionType] = useState(0);
+
+  const [newPostContent, setNewPostContent] = useState("");
+  const [newPostTitle, setNewPostTitle] = useState("");
+
+  const [markResolved, setMarkResolved] = useState(false);
+
+  const handleModalCloseClick = () => {
+    setReportForModal(null);
+    setReportModalDisplay("none");
+    document.body.style.overflowY = "auto";
+  };
+
+  const handleViewReportButtonClick = (e,report) => {
+    e.preventDefault();
+    setReportForModal(report);
+  }
+
   useEffect(() => {
-    const url = `http://192.168.0.17:8080/secure/currentUser`;
+    if(reportForModal!==null) {
+      if (reportForModal.post !== null) {
+        setNewPostContent(reportForModal.post.content);
+        if(reportForModal.post.title !== null) setNewPostTitle(reportForModal.post.title);
+      }
+      setReportModalDisplay("block");
+      document.body.style.overflowY = "hidden";
+    }
+  }, [reportForModal]);
+
+  useEffect(() => {
+    const url1 = `http://192.168.0.19:8080/secure/currentUser`;
+    const url2 = `http://192.168.0.19:8080/secure/getAllPostReports`;
 
     const fetchUser = async () => {
       try {
-        const response = await axios.get(url, { withCredentials: true });
-        var cyclicGraph = await response.data;
-        var jsogStructure = JSOG.encode(cyclicGraph);
-        cyclicGraph = JSOG.decode(jsogStructure);
-        setUser(cyclicGraph);
-        setLoadedUser(true);
+        if(!loadedUser) {
+          const response = await axios.get(url1, {withCredentials: true});
+          let cyclicGraph = await response.data;
+          var jsogStructure = JSOG.encode(cyclicGraph);
+          cyclicGraph = JSOG.decode(jsogStructure);
+          setUser(cyclicGraph);
+          setLoadedUser(true);
+        }
+        if(user.userRole==='MODERATOR')fetchPostReports();
       } catch (error) {
         setFetchError(true);
@@ -37,6 +86,20 @@
     };
 
+    const fetchPostReports = async () => {
+      try {
+        const response = await axios.get(url2, {withCredentials: true});
+        var cyclicGraph = await response.data;
+        var jsogStructure = JSOG.encode(cyclicGraph);
+        cyclicGraph = JSOG.decode(jsogStructure);
+        setPostReports(cyclicGraph);
+        setLoadedPostReports(true);
+      } catch (error) {
+        setFetchError(true);
+      }
+    };
+
     if (auth) fetchUser();
-  }, []);
+
+  }, [user]);
 
   // useEffect(() => {
@@ -50,4 +113,44 @@
     if (post.parent === null) return post;
     return findParentThread(post.parent);
+  }
+
+  const handleEdit = async (e) => {
+    e.preventDefault();
+    try {
+      if(reportForModal.post !== null && reportForModal.post.targetProfessor !== undefined) {
+        await axios(`http://192.168.0.19:8080/secure/updateOpinion/${reportForModal.post.postId}`,
+            {
+              method: "put",
+              data: {
+                newContent: newPostContent,
+                newTargetProfessorId: reportForModal.post.targetProfessor.professorId,
+              },
+              withCredentials: true,
+            })
+        window.location.reload(false);
+      } else if(reportForModal.post !== null && reportForModal.post.targetProfessor === undefined) {
+        await axios(`http://192.168.0.19:8080/secure/updateThread/${reportForModal.post.postId}`,
+            {
+              method: "put",
+              data: {
+                newTitle: newPostTitle,
+                newContent: newPostContent,
+                newTargetSubjectId: reportForModal.post.targetSubject.subjectId
+              },
+              withCredentials: true,
+            })
+        window.location.reload(false);
+      }
+    } catch (error) {
+      setFetchError(true);
+    }
+  }
+
+  const handleDelete = (e) => {
+    e.preventDefault();
+  }
+
+  const handleMarkResolved = () => {
+    if (actionType !== 1) setMarkResolved(!markResolved);
   }
 
@@ -68,11 +171,30 @@
         </UserDetailsCardContent>
         <UserDetailsCardContent>
-          <b>Карма:</b> {user.karma}
+          <b>Карма:</b>{" "}
+          <span style={{ color: user.karma < 0 ? "indianred" : "green" }}>
+            {user.karma}
+          </span>
         </UserDetailsCardContent>
       </UserDetailsCard>
+      {loadedPostReports ? postReports.length > 0 ? (
+          <h3 style={{ marginBottom: "10px" }}>Пријави за мислења:</h3>
+      ) : (
+          <h3>Нема пријавени мислења</h3>
+      ) : loadedUser && user.userRole==='MODERATOR' ? "се вчитува..." : ""}
+      <EntityUl style={{marginTop:"25px"}}>
+      {loadedPostReports && postReports.map((postReport) => {
+        return <EntityLi bgcolor="cornsilk" key={postReport.postReportId} style={{padding:"15px"}}>
+          <p style={{color: postReport.resolved ? "grey" : "black"}}><span style={{fontSize:"14px", fontStyle:"italic", fontWeight:"normal"}}>{dateConverter(
+              new Date(postReport.time).toString().slice(4, -43)
+          )}</span><br/>{postReport.description.substring(0,45 )}{postReport.description.length >= 45 ? ("...") : ("")} {postReport.resolved ? <span style={{fontStyle:"italic"}}>(разрешено)</span> : ""}
+            </p>
+          <AddOpinionButton onClick={(e)=>handleViewReportButtonClick(e,postReport)} style={{height:"30px", padding:"5px", fontSize:"14px", position:"absolute", top:"30%", right:"20px" }}>Разгледај</AddOpinionButton>
+        </EntityLi>;
+      })}
+      </EntityUl>
       {user.authoredPosts.length > 0 ? (
-        <h3 style={{ marginBottom: "10px" }}>Ваши мислења:</h3>
+        <h3 style={{ marginBottom: "10px", marginTop:"30px" }}>Ваши мислења:</h3>
       ) : (
-        <h3>Немате објавени мислења</h3>
+        <h3 style={{ marginBottom: "10px" }}>Немате објавени мислења</h3>
       )}
       {user.authoredPosts.map((post) => {
@@ -110,4 +232,182 @@
         );
       })}
+      {reportForModal && (
+          <Modal display={reportModalDisplay}>
+            <ModalContent>
+              <ModalHeader>
+                <ModalClose onClick={handleModalCloseClick}>&times;</ModalClose>
+                <h3 style={{ marginTop: "5px" }}>
+                  Преглед на пријава за мислење
+                </h3>
+              </ModalHeader>
+                <ModalBody>
+                  <p style={{fontWeight:"bold",marginBottom:"15px"}}>Пријавил: <span style={{fontWeight:"normal"}}>{reportForModal.user !== null ? <a href={"/user/"+reportForModal.user.id}>{reportForModal.user.username}</a> : "(избришан корисник)"}</span></p>
+                  <p style={{fontWeight:"bold",marginBottom:"15px"}}>Време на пријава: <span style={{fontWeight:"normal"}}>{dateConverter(
+                      new Date(reportForModal.time).toString().slice(4, -43)
+                  )}</span></p>
+                  <p style={{fontWeight:"bold",marginBottom:"15px"}}>Образложение: </p> <p style={{marginBottom:"15px"}}>{reportForModal.description}</p>
+                  <p style={{fontWeight:"bold", marginBottom:"15px"}}>Информации за пријавеното мислење:</p>
+                  {reportForModal.post !== null ?
+                    <OpinionCard>
+                      <OpinionCardContent>
+                        <p style={{fontStyle: "italic", marginBottom: "10px"}}>
+                          во дискусија за{" "}
+                          {reportForModal.post.targetProfessor !== undefined ? (
+                              <a href={"/professor/" + reportForModal.post.targetProfessor.professorId}>
+                                {reportForModal.post.targetProfessor.professorName}
+                              </a>
+                          ) : (
+                              <a
+                                  href={
+                                    reportForModal.post.parent === null
+                                        ? "/topic/" + reportForModal.post.postId
+                                        : "/topic/" + findParentThread(reportForModal.post).postId
+                                  }
+                              >
+                                {reportForModal.post.targetSubject.subjectName}
+                              </a>
+                          )}
+                        </p>
+                        {reportForModal.post.title === null ?
+                        <p style={{ fontStyle: "italic", marginBottom: "10px" }}>
+                          <a href={"/user/" + reportForModal.post.author.id}>
+                            {reportForModal.post.author.username}
+                          </a>{" "}
+                          напишал
+                        </p> :
+                            <p style={{ fontStyle: "italic", marginBottom: "10px" }}>
+                              <a href={"/user/" + reportForModal.post.author.id}>
+                                {reportForModal.post.author.username}
+                              </a>{" "}
+                              отворил тема со наслов <span style={{fontWeight:"bold"}}>{reportForModal.post.title}</span>
+                            </p>
+                        }
+                        <p style={{marginBottom: "10px"}}>{reportForModal.post.content}</p>
+                        <OpinionCardContentTime>
+                          {dateConverter(
+                              new Date(reportForModal.post.timePosted).toString().slice(4, -43)
+                          )}
+                        </OpinionCardContentTime>
+                      </OpinionCardContent>
+                    </OpinionCard>
+                  : "Пријавеното мислење или неговиот автор се избришани"}
+
+              {reportForModal.post !== null &&
+              <div style={{ display: "flex" }}>
+                {actionType===0 ? <EntityTypeSelector
+                    backgroundcolor="rgba(0, 102, 204, 1)"
+                    color="white"
+                    boxshadow="none"
+                    boxshadowhover="none"
+                    opacityhover="0.6"
+                    cursor="auto"
+                >
+                  Измени содржина или наслов
+                </EntityTypeSelector> : <EntityTypeSelector
+                    boxshadow="2px 2px 5px #aaaaaa"
+                    cursor="pointer"
+                    boxshadowhover="2px 2px 10px #aaaaaa"
+                    opacityhover="1"
+                    onClick={() => setActionType(0)}
+                >
+                  Измени содржина или наслов
+                </EntityTypeSelector>}
+                {actionType===1 ? <EntityTypeSelector
+                    backgroundcolor="rgba(0, 102, 204, 1)"
+                    color="white"
+                    boxshadow="none"
+                    boxshadowhover="none"
+                    opacityhover="0.6"
+                    cursor="auto"
+                >
+                  Избриши
+                </EntityTypeSelector> : <EntityTypeSelector
+                    boxshadow="2px 2px 5px #aaaaaa"
+                    cursor="pointer"
+                    boxshadowhover="2px 2px 10px #aaaaaa"
+                    opacityhover="1"
+                    onClick={() => {setActionType(1); setMarkResolved(true)}}
+                >
+                  Избриши
+                </EntityTypeSelector>}
+                {actionType===2 ? <EntityTypeSelector
+                    backgroundcolor="rgba(0, 102, 204, 1)"
+                    color="white"
+                    boxshadow="none"
+                    boxshadowhover="none"
+                    opacityhover="0.6"
+                    cursor="auto"
+                >
+                  Премести
+                </EntityTypeSelector> : <EntityTypeSelector
+                    boxshadow="2px 2px 5px #aaaaaa"
+                    cursor="pointer"
+                    boxshadowhover="2px 2px 10px #aaaaaa"
+                    opacityhover="1"
+                    onClick={() => setActionType(2)}
+                >
+                  Премести
+                </EntityTypeSelector>}
+              </div>}
+              {reportForModal.post !== null ?
+                  actionType === 0 ?
+              (<form onSubmit={e => handleEdit(e)}>
+                {reportForModal.post.title !== null && <label>
+                  <b>Нов наслов на тема:</b>
+                  <ModalInput
+                      value={newPostTitle}
+                      onChange={e => setNewPostTitle(e.target.value)}
+                      id="title"
+                      spellCheck={false}
+                      style={{marginTop:"10px"}}
+                  />
+                </label>}
+                <label>
+                  <b>Нова содржина:</b>
+                  <ModalTextarea
+                      value={newPostContent}
+                      onChange={e => setNewPostContent(e.target.value)}
+                      id="content"
+                      rows="8"
+                      cols="100"
+                      spellCheck={false}
+                      style={{marginTop:"10px"}}
+                  />
+                </label>
+                <div style={{marginTop:"15px"}}>
+                <label>
+                  <input
+                      type="checkbox"
+                      checked={markResolved}
+                      onChange={handleMarkResolved}
+                  />
+                  <span style={{marginLeft:"10px", fontWeight:"bold"}}>Означи како разрешено</span>
+                </label>
+                </div>
+                <ModalFooter type="submit">ПОТВРДИ</ModalFooter>
+              </form>)
+                      : actionType === 1 ?
+                          (<form onSubmit={e => handleDelete(e)}>
+                            <p style={{color:"red", display:"flex", justifyContent:"space-around"}}>Избриши го мислењето? (оваа акција е иреверзибилна)</p>
+                            <div style={{marginTop:"15px"}}>
+                            <label>
+                              <input
+                                  type="checkbox"
+                                  checked={markResolved}
+                                  onChange={handleMarkResolved}
+                              />
+                              <span style={{marginLeft:"10px", fontWeight:"bold"}}>Означи како разрешено</span>
+                            </label>
+                            </div>
+                            <ModalFooter type="submit">ПОТВРДИ</ModalFooter>
+                          </form>)
+                          :
+                          ("123")
+                          : null
+              }
+                </ModalBody>
+            </ModalContent>
+          </Modal>
+      )}
     </>
   ) : (
