Index: reactapp/src/App.js
===================================================================
--- reactapp/src/App.js	(revision 3b6962d804b15d4cf06da32490fdbafc33fe3ea5)
+++ reactapp/src/App.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
@@ -14,4 +14,5 @@
 import NotFound from "./Pages/NotFound";
 import Topic from "./Pages/Topic";
+import LoadingSpinner from "./Components/Styled/LoadingSpinner.style";
 
 export default function App() {
@@ -42,5 +43,5 @@
       return children;
     } else {
-      return <div>се вчитува cookie...</div>;
+      return <LoadingSpinner/>;
     }
   };
Index: reactapp/src/Components/OpinionTree.js
===================================================================
--- reactapp/src/Components/OpinionTree.js	(revision 3b6962d804b15d4cf06da32490fdbafc33fe3ea5)
+++ reactapp/src/Components/OpinionTree.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
@@ -42,5 +42,5 @@
 
   useEffect(() => {
-    const url = `http://192.168.0.19:8080/secure/currentUser`;
+    const url = `http://192.168.0.29:8080/secure/currentUser`;
 
     const fetchUser = async () => {
@@ -68,5 +68,5 @@
       ) {
         const response = await axios(
-          `http://192.168.0.19:8080/secure/upvoteOpinion/${post.postId}`,
+          `http://192.168.0.29:8080/secure/upvoteOpinion/${post.postId}`,
           {
             method: "get",
@@ -74,5 +74,5 @@
           }
         );
-        window.location.reload(false);
+        window.location.reload();
       } else {
         return;
@@ -91,5 +91,5 @@
       ) {
         const response = await axios(
-          `http://192.168.0.19:8080/secure/downvoteOpinion/${post.postId}`,
+          `http://192.168.0.29:8080/secure/downvoteOpinion/${post.postId}`,
           {
             method: "get",
@@ -98,5 +98,5 @@
         );
 
-        window.location.reload(false);
+        window.location.reload();
       } else {
         return;
@@ -131,5 +131,5 @@
     if (!replyContent.length < 1) {
       const response = await axios(
-        `http://192.168.0.19:8080/secure/professor/${professor.professorId}/replyToOpinion/${postId}`,
+        `http://192.168.0.29:8080/secure/professor/${professor.professorId}/replyToOpinion/${postId}`,
         {
           method: "post",
@@ -141,5 +141,5 @@
       );
       setErrorMessage("");
-      window.location.reload(false);
+      window.location.reload();
     } else {
       setErrorMessage("Полето за содржина не смее да биде празно");
@@ -161,9 +161,9 @@
               {child.content}
             </p>
-            {child.timePosted === child.timeLastEdited ? (
+            {new Date(child.timePosted).setMilliseconds(0) === new Date(child.timeLastEdited).setMilliseconds(0) ? (
               <OpinionCardContentTime>
                 {dateConverter(
                   new Date(child.timePosted).toString().slice(4, -43)
-                )}
+                )} <span style={{fontStyle:"normal",color:"blue"}}>#{child.postId}</span>
               </OpinionCardContentTime>
             ) : (
@@ -171,5 +171,5 @@
                 {dateConverter(
                   new Date(child.timeLastEdited).toString().slice(4, -43)
-                )}{" "}
+                )}{" "} <span style={{fontStyle:"normal",color:"blue"}}>#{child.postId}</span>{" "}
                 (едитирано од модератор)
               </OpinionCardContentTime>
@@ -260,9 +260,9 @@
                     {opinion.content}
                   </p>
-                  {opinion.timePosted === opinion.timeLastEdited ? (
+                  {new Date(opinion.timePosted).setMilliseconds(0) === new Date(opinion.timeLastEdited).setMilliseconds(0) ? (
                     <OpinionCardContentTime>
                       {dateConverter(
                         new Date(opinion.timePosted).toString().slice(4, -43)
-                      )}
+                      )} <span style={{fontStyle:"normal",color:"blue"}}>#{opinion.postId}</span>
                     </OpinionCardContentTime>
                   ) : (
@@ -272,5 +272,5 @@
                           .toString()
                           .slice(4, -43)
-                      )}{" "}
+                      )}{" "} <span style={{fontStyle:"normal",color:"blue"}}>#{opinion.postId}</span>{" "}
                       (едитирано од модератор)
                     </OpinionCardContentTime>
Index: reactapp/src/Components/Search.js
===================================================================
--- reactapp/src/Components/Search.js	(revision 3b6962d804b15d4cf06da32490fdbafc33fe3ea5)
+++ reactapp/src/Components/Search.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
@@ -15,5 +15,5 @@
 
   useEffect(() => {
-    const url = `http://192.168.0.19:8080/public/professors/nameContains/${transliterate(
+    const url = `http://192.168.0.29:8080/public/professors/nameContains/${transliterate(
       query
     )}`;
Index: reactapp/src/Components/Styled/LoadingSpinner.style.js
===================================================================
--- reactapp/src/Components/Styled/LoadingSpinner.style.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
+++ reactapp/src/Components/Styled/LoadingSpinner.style.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
@@ -0,0 +1,11 @@
+import React from "react";
+import "../../static/spinner.css";
+
+export default function LoadingSpinner() {
+    return (
+        <div className="spinner-container">
+            <div className="loading-spinner">
+            </div>
+        </div>
+    );
+}
Index: reactapp/src/Components/Styled/ProfessorCard.style.js
===================================================================
--- reactapp/src/Components/Styled/ProfessorCard.style.js	(revision 3b6962d804b15d4cf06da32490fdbafc33fe3ea5)
+++ reactapp/src/Components/Styled/ProfessorCard.style.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
@@ -2,5 +2,4 @@
 
 export const ProfessorCard = styled.div`
-  background-color: cornsilk;
   width: auto;
   padding: 10px;
Index: reactapp/src/Components/UserHeader.js
===================================================================
--- reactapp/src/Components/UserHeader.js	(revision 3b6962d804b15d4cf06da32490fdbafc33fe3ea5)
+++ reactapp/src/Components/UserHeader.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
@@ -3,4 +3,5 @@
 import axios from "../api/axios";
 import Logout from "./Logout";
+import LoadingSpinner from "./Styled/LoadingSpinner.style";
 
 function UserHeader({}) {
@@ -10,5 +11,5 @@
 
   useEffect(() => {
-    const url = `http://192.168.0.19:8080/secure/currentUser`;
+    const url = `http://192.168.0.29:8080/secure/currentUser`;
 
     const fetchUser = async () => {
@@ -34,5 +35,5 @@
   ) : (
     <div style={{ float: "left", marginTop: 25, marginLeft: 60 }}>
-      се вчитува...
+      <LoadingSpinner/>
     </div>
   );
Index: reactapp/src/Pages/Faculty.js
===================================================================
--- reactapp/src/Pages/Faculty.js	(revision 3b6962d804b15d4cf06da32490fdbafc33fe3ea5)
+++ reactapp/src/Pages/Faculty.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
@@ -16,4 +16,5 @@
 import SubjectsAccordion from "../Components/SubjectsAccordion";
 import { CurrentPageNav } from "../Components/Styled/Main.style";
+import LoadingSpinner from "../Components/Styled/LoadingSpinner.style";
 
 const Faculty = () => {
@@ -27,6 +28,6 @@
 
   useEffect(() => {
-    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 urlProfessors = `http://192.168.0.29:8080/public/professors?facultyId=${params.facultyId}`;
+    const urlStudyProgrammes = `http://192.168.0.29:8080/public/study_programmes?facultyId=${params.facultyId}`;
 
     const fetchDataProfessors = async () => {
@@ -224,5 +225,5 @@
   ) : !fetchError && !loadedProfessors ? (
     <div>
-      <p style={{ marginTop: "140px" }}>се вчитува...</p>
+      <LoadingSpinner style={{ marginTop: "140px" }}/>
       <Outlet />
     </div>
Index: reactapp/src/Pages/Login.js
===================================================================
--- reactapp/src/Pages/Login.js	(revision 3b6962d804b15d4cf06da32490fdbafc33fe3ea5)
+++ reactapp/src/Pages/Login.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
@@ -17,5 +17,5 @@
 
   useEffect(() => {
-    userRef.current.focus();
+    if (!auth) userRef.current.focus();
   }, []);
 
Index: reactapp/src/Pages/Professor.js
===================================================================
--- reactapp/src/Pages/Professor.js	(revision 3b6962d804b15d4cf06da32490fdbafc33fe3ea5)
+++ reactapp/src/Pages/Professor.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
@@ -24,4 +24,5 @@
 import axios from "../api/axios";
 import { CurrentPageNav } from "../Components/Styled/Main.style";
+import LoadingSpinner from "../Components/Styled/LoadingSpinner.style";
 
 function Professor() {
@@ -39,5 +40,5 @@
 
   useEffect(() => {
-    const url = `http://192.168.0.19:8080/public/professor/${params.professorId}`;
+    const url = `http://192.168.0.29:8080/public/professor/${params.professorId}`;
 
     const fetchProfessor = async () => {
@@ -76,5 +77,5 @@
     if (!postContent.length < 1) {
       const response = await axios(
-        `http://192.168.0.19:8080/secure/professor/${params.professorId}/addOpinion`,
+        `http://192.168.0.29:8080/secure/professor/${params.professorId}/addOpinion`,
         {
           method: "post",
@@ -86,5 +87,5 @@
       );
       setErrorMessage("");
-      window.location.reload(false);
+      window.location.reload();
     } else {
       setErrorMessage("Полето за содржина не смее да биде празно");
@@ -111,5 +112,5 @@
         </CurrentPageNav>
         <ProfessorCard>
-          <ProfessorCardName>{professor.professorName}</ProfessorCardName>
+          <ProfessorCardName>{professor.professorName} <span style={{opacity:"50%", fontSize:"16px"}}>#{professor.professorId}</span></ProfessorCardName>
           <ProfessorCardSeparator />
           <div style={{ marginTop: "10px" }}>
@@ -179,5 +180,5 @@
     return (
       <div>
-        <p style={{ marginTop: "140px" }}>се вчитува...</p>
+        <LoadingSpinner style={{ marginTop: "140px" }}/>
         <Outlet />
       </div>
Index: reactapp/src/Pages/Subject.js
===================================================================
--- reactapp/src/Pages/Subject.js	(revision 3b6962d804b15d4cf06da32490fdbafc33fe3ea5)
+++ reactapp/src/Pages/Subject.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
@@ -28,4 +28,5 @@
 } from "../Components/Styled/Modal.style";
 import axios from "../api/axios";
+import LoadingSpinner from "../Components/Styled/LoadingSpinner.style";
 
 const Subject = () => {
@@ -46,5 +47,5 @@
 
   useEffect(() => {
-    const url = `http://192.168.0.19:8080/public/subject/${params.subjectId}`;
+    const url = `http://192.168.0.29:8080/public/subject/${params.subjectId}`;
 
     const fetchData = async () => {
@@ -83,5 +84,5 @@
     if (!topicTitle.length < 1 && !topicContent.length < 1) {
       const response = await axios(
-        `http://192.168.0.19:8080/secure/subject/${params.subjectId}/addThread`,
+        `http://192.168.0.29:8080/secure/subject/${params.subjectId}/addThread`,
         {
           method: "post",
@@ -94,5 +95,5 @@
       );
       setErrorMessage("");
-      window.location.reload(false);
+      window.location.reload();
     } else {
       setErrorMessage("Полињата за наслов и содржина не смеат да бидат празни");
@@ -127,5 +128,5 @@
       </CurrentPageNav>
       <ProfessorCard>
-        <ProfessorCardName>{subject.subjectName}</ProfessorCardName>
+        <ProfessorCardName>{subject.subjectName} <span style={{opacity:"50%", fontSize:"16px"}}>#{subject.subjectId}</span></ProfessorCardName>
         <ProfessorCardSeparator />
         <div style={{ marginTop: "10px" }}>
@@ -204,5 +205,6 @@
       <div key={subject.subjectId}>
         {topics.map((topic) => {
-          var numReplies = topic.children.length;
+          var numReplies = 0;
+          topic.children.map((c)=>numReplies += ++c.children.length); // ++c.children.length -> c + decata na c
           return (
             <EntityUl key={topic.postId}>
@@ -268,5 +270,5 @@
   ) : !fetchError ? (
     <div>
-      <p style={{ marginTop: "140px" }}>се вчитува...</p>
+      <LoadingSpinner style={{ marginTop: "140px" }}/>
       <Outlet />
     </div>
Index: reactapp/src/Pages/Topic.js
===================================================================
--- reactapp/src/Pages/Topic.js	(revision 3b6962d804b15d4cf06da32490fdbafc33fe3ea5)
+++ reactapp/src/Pages/Topic.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
@@ -28,4 +28,5 @@
 } from "../Components/Styled/Modal.style";
 import axios from "../api/axios";
+import LoadingSpinner from "../Components/Styled/LoadingSpinner.style";
 
 const Topic = () => {
@@ -48,6 +49,6 @@
 
   useEffect(() => {
-    const url1 = `http://192.168.0.19:8080/public/thread/${params.topicId}`;
-    const url2 = `http://192.168.0.19:8080/secure/currentUser`;
+    const url1 = `http://192.168.0.29:8080/public/thread/${params.topicId}`;
+    const url2 = `http://192.168.0.29:8080/secure/currentUser`;
 
     const fetchTopic = async () => {
@@ -99,5 +100,5 @@
     if (!replyContent.length < 1) {
       const response = await axios(
-        `http://192.168.0.19:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${postId}`,
+        `http://192.168.0.29:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${postId}`,
         {
           method: "post",
@@ -109,5 +110,5 @@
       );
       setErrorMessage("");
-      window.location.reload(false);
+      window.location.reload();
     } else {
       setErrorMessage("Полето за содржина не смее да биде празно");
@@ -128,5 +129,5 @@
     if (!postContent.length < 1) {
       const response = await axios(
-        `http://192.168.0.19:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${params.topicId}`,
+        `http://192.168.0.29:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${params.topicId}`,
         {
           method: "post",
@@ -138,5 +139,5 @@
       );
       setErrorMessage("");
-      window.location.reload(false);
+      window.location.reload();
     } else {
       setErrorMessage("Полето за содржина не смее да биде празно");
@@ -160,5 +161,5 @@
       ) {
         const response = await axios(
-          `http://192.168.0.19:8080/secure/upvoteThread/${post.postId}`,
+          `http://192.168.0.29:8080/secure/upvoteThread/${post.postId}`,
           {
             method: "get",
@@ -166,5 +167,5 @@
           }
         );
-        window.location.reload(false);
+        window.location.reload();
       } else {
         return;
@@ -183,5 +184,5 @@
       ) {
         const response = await axios(
-          `http://192.168.0.19:8080/secure/downvoteThread/${post.postId}`,
+          `http://192.168.0.29:8080/secure/downvoteThread/${post.postId}`,
           {
             method: "get",
@@ -190,5 +191,5 @@
         );
 
-        window.location.reload(false);
+        window.location.reload();
       } else {
         return;
@@ -213,15 +214,15 @@
               {child.content}
             </p>
-            {thread.timePosted === thread.timeLastEdited ? (
+            {new Date(child.timePosted).setMilliseconds(0) === new Date(child.timeLastEdited).setMilliseconds(0) ? (
               <OpinionCardContentTime>
                 {dateConverter(
-                  new Date(thread.timePosted).toString().slice(4, -43)
-                )}
+                  new Date(child.timePosted).toString().slice(4, -43)
+                )} <span style={{fontStyle:"normal",color:"blue"}}>#{child.postId}</span>
               </OpinionCardContentTime>
             ) : (
               <OpinionCardContentTime>
                 {dateConverter(
-                  new Date(thread.timeLastEdited).toString().slice(4, -43)
-                )}{" "}
+                  new Date(child.timeLastEdited).toString().slice(4, -43)
+                )}{" "} <span style={{fontStyle:"normal",color:"blue"}}>#{child.postId}</span>{" "}
                 (едитирано од модератор)
               </OpinionCardContentTime>
@@ -270,5 +271,5 @@
               />
 
-              <VoteCount right={50 + "px"}>
+              <VoteCount right={10 + "px"}>
                 {child.votes.filter((v) => v.vote === "DOWNVOTE").length}
               </VoteCount>
@@ -324,5 +325,5 @@
       </CurrentPageNav>
       <div style={{ height: "20px", marginBottom: "50px", marginTop: "50px" }}>
-        <h3 style={{ float: "left" }}>{thread.title}</h3>
+        <h3 style={{ float: "left" }}>{thread.title} <span style={{opacity:"50%", fontSize:"16px"}}>#{thread.postId}</span></h3>
         {auth && (
           <AddOpinionButton onClick={handleAddOpinionButtonClick}>
@@ -369,9 +370,9 @@
             {thread.content}
           </p>
-          {thread.timePosted === thread.timeLastEdited ? (
+          {new Date(thread.timePosted).setMilliseconds(0) === new Date(thread.timeLastEdited).setMilliseconds(0) ? (
             <OpinionCardContentTime>
               {dateConverter(
                 new Date(thread.timePosted).toString().slice(4, -43)
-              )}
+              )} <span style={{fontStyle:"normal",color:"blue"}}>#{thread.postId}</span>
             </OpinionCardContentTime>
           ) : (
@@ -379,5 +380,5 @@
               {dateConverter(
                 new Date(thread.timeLastEdited).toString().slice(4, -43)
-              )}{" "}
+              )}{" "} <span style={{fontStyle:"normal",color:"blue"}}>#{thread.postId}</span>{" "}
               (едитирано од модератор)
             </OpinionCardContentTime>
@@ -444,9 +445,9 @@
                 {directChild.content}
               </p>
-              {directChild.timePosted === directChild.timeLastEdited ? (
+              {new Date(directChild.timePosted).setMilliseconds(0) === new Date(directChild.timeLastEdited).setMilliseconds(0) ? (
                 <OpinionCardContentTime>
                   {dateConverter(
                     new Date(directChild.timePosted).toString().slice(4, -43)
-                  )}
+                  )} <span style={{fontStyle:"normal",color:"blue"}}>#{directChild.postId}</span>
                 </OpinionCardContentTime>
               ) : (
@@ -456,5 +457,5 @@
                       .toString()
                       .slice(4, -43)
-                  )}{" "}
+                  )}{" "} <span style={{fontStyle:"normal",color:"blue"}}>#{directChild.postId}</span>{" "}
                   (едитирано од модератор)
                 </OpinionCardContentTime>
@@ -559,5 +560,5 @@
   ) : !fetchError && !loadedThread ? (
     <div>
-      <p style={{ marginTop: "140px" }}>се вчитува...</p>
+      <LoadingSpinner style={{ marginTop: "140px" }}/>
       <Outlet />
     </div>
Index: reactapp/src/Pages/University.js
===================================================================
--- reactapp/src/Pages/University.js	(revision 3b6962d804b15d4cf06da32490fdbafc33fe3ea5)
+++ reactapp/src/Pages/University.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
@@ -14,4 +14,5 @@
 } from "../Components/Styled/EntityList.style";
 import { CurrentPageNav } from "../Components/Styled/Main.style";
+import LoadingSpinner from "../Components/Styled/LoadingSpinner.style";
 
 const University = () => {
@@ -22,5 +23,5 @@
 
   useEffect(() => {
-    const url = `http://192.168.0.19:8080/public/faculties?universityId=${params.universityId}`;
+    const url = `http://192.168.0.29:8080/public/faculties?universityId=${params.universityId}`;
 
     const fetchData = async () => {
@@ -105,5 +106,5 @@
   ) : !fetchError && !loaded ? (
     <div>
-      <p style={{ marginTop: "140px" }}>се вчитува...</p>
+      <LoadingSpinner style={{ marginTop: "140px" }}/>
       <Outlet />
     </div>
Index: reactapp/src/Pages/UserDashboard.js
===================================================================
--- reactapp/src/Pages/UserDashboard.js	(revision 3b6962d804b15d4cf06da32490fdbafc33fe3ea5)
+++ reactapp/src/Pages/UserDashboard.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
@@ -1,2 +1,5 @@
+/* eslint-disable no-unused-vars */
+// noinspection JSUnresolvedVariable,ES6ConvertVarToLetConst,JSUnresolvedFunction,SpellCheckingInspection,JSUnusedLocalSymbols
+
 import React, { useEffect, useState, useContext } from "react";
 import {
@@ -23,4 +26,5 @@
     ModalInput
 } from "../Components/Styled/Modal.style";
+import LoadingSpinner from "../Components/Styled/LoadingSpinner.style";
 
 function UserDashboard() {
@@ -40,7 +44,18 @@
 
   const [newPostContent, setNewPostContent] = useState("");
-  const [newPostTitle, setNewPostTitle] = useState("");
+  const [newOpinionTargetProfessorId, setNewOpinionTargetProfessorId] = useState("");
+  const [newOpinionTargetProfessor, setNewOpinionTargetProfessor] = useState(null);
+  const [loadedNewProfessor,setLoadedNewProfessor] = useState(false);
+  const [newParentPostId, setNewParentPostId] = useState("-1");
+
+  const [newThreadTitle, setNewThreadTitle] = useState("");
+  const [newParentThreadId,setNewParentThreadId] = useState("-1");
+  const [newTargetSubjectId, setNewTargetSubjectId] = useState("");
+  const [newTargetSubject, setNewTargetSubject] = useState(null);
+  const [loadedNewSubject, setLoadedNewSubject] = useState(null);
 
   const [markResolved, setMarkResolved] = useState(false);
+
+  const [errMsg, setErrMsg] = useState("");
 
   const handleModalCloseClick = () => {
@@ -59,5 +74,7 @@
       if (reportForModal.post !== null) {
         setNewPostContent(reportForModal.post.content);
-        if(reportForModal.post.title !== null) setNewPostTitle(reportForModal.post.title);
+        if(reportForModal.post.title !== null) setNewThreadTitle(reportForModal.post.title);
+        if(reportForModal.post.targetProfessor !== undefined) setNewOpinionTargetProfessorId(reportForModal.post.targetProfessor.professorId); //prvicnoto
+        if(reportForModal.post.targetProfessor === undefined) setNewTargetSubjectId(reportForModal.post.targetSubject.subjectId); //prvicnoto
       }
       setReportModalDisplay("block");
@@ -66,7 +83,47 @@
   }, [reportForModal]);
 
+  const[loadingProf, setLoadingProf] = useState(false);
+
+  const handleNewTargetProfessorChange = async (e) => {
+    setLoadingProf(true);
+    e.preventDefault();
+    if (newOpinionTargetProfessorId!=="") {
+        try {
+          const response = await axios.get(`http://192.168.0.29:8080/public/professor/${newOpinionTargetProfessorId}`, {withCredentials: true});
+          let cyclicGraph = await response.data;
+          var jsogStructure = JSOG.encode(cyclicGraph);
+          cyclicGraph = JSOG.decode(jsogStructure);
+          setNewOpinionTargetProfessor(cyclicGraph);
+          setLoadedNewProfessor(true);
+          setLoadingProf(false);
+        } catch (error) {
+          setFetchError(true);
+        }
+    }
+  }
+
+  const[loadingSubj, setLoadingSubj] = useState(false);
+
+  const handleNewTargetSubjectChange = async (e) => {
+    e.preventDefault();
+    setLoadingSubj(true);
+    if (newTargetSubjectId!=="") {
+      try {
+        const response = await axios.get(`http://192.168.0.29:8080/public/subject/${newTargetSubjectId}`, {withCredentials: true});
+        let cyclicGraph = await response.data;
+        var jsogStructure = JSOG.encode(cyclicGraph);
+        cyclicGraph = JSOG.decode(jsogStructure);
+        setNewTargetSubject(cyclicGraph);
+        setLoadedNewSubject(true);
+        setLoadingSubj(false);
+      } catch (error) {
+        setFetchError(true);
+      }
+    }
+  }
+
   useEffect(() => {
-    const url1 = `http://192.168.0.19:8080/secure/currentUser`;
-    const url2 = `http://192.168.0.19:8080/secure/getAllPostReports`;
+    const url1 = `http://192.168.0.29:8080/secure/currentUser`;
+    const url2 = `http://192.168.0.29:8080/secure/getAllPostReports`;
 
     const fetchUser = async () => {
@@ -105,5 +162,5 @@
   // useEffect(() => {
   //   const timer = setTimeout(() => {
-  //     if (user === null) window.location.reload(false); <---- :-)
+  //     if (user === null) window.location.reload(); <---- :-)
   //   }, 3000);
   //   return () => clearTimeout(timer);
@@ -119,5 +176,5 @@
     try {
       if(reportForModal.post !== null && reportForModal.post.targetProfessor !== undefined) {
-        await axios(`http://192.168.0.19:8080/secure/updateOpinion/${reportForModal.post.postId}`,
+        await axios(`http://192.168.0.29:8080/secure/updateOpinion/${reportForModal.post.postId}`,
             {
               method: "put",
@@ -125,28 +182,90 @@
                 newContent: newPostContent,
                 newTargetProfessorId: reportForModal.post.targetProfessor.professorId,
+                newParentPostId: reportForModal.post.parent !== null ? reportForModal.post.parent.postId : "-1"
               },
               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}`,
+        await axios(`http://192.168.0.29:8080/secure/updateThread/${reportForModal.post.postId}`,
             {
               method: "put",
               data: {
-                newTitle: newPostTitle,
+                newTitle: newThreadTitle,
                 newContent: newPostContent,
-                newTargetSubjectId: reportForModal.post.targetSubject.subjectId
+                newTargetSubjectId: reportForModal.post.targetSubject.subjectId,
+                newParentThreadId: reportForModal.post.parent !== null ? reportForModal.post.parent.postId : "-1"
               },
               withCredentials: true,
             })
-        window.location.reload(false);
+      }
+        await axios(`http://192.168.0.29:8080/secure/markReportResolved/${reportForModal.postReportId}/${markResolved ? `resolve` : `open`}`,{
+          method: "get",
+          withCredentials: true
+        })
+    } catch (error) {
+      setFetchError(true);
+    }
+    window.location.reload();
+  }
+
+  const handleRelocate = async (e) => {
+    e.preventDefault();
+    try {
+      if(reportForModal.post !== null && reportForModal.post.targetProfessor !== undefined) {
+        var response = await axios(`http://192.168.0.29:8080/secure/updateOpinion/${reportForModal.post.postId}`,
+            {
+              method: "put",
+              data: {
+                newContent: reportForModal.post.content,
+                newTargetProfessorId: newOpinionTargetProfessorId,
+                newParentPostId: newParentPostId==="Постави како самостојно мислење" ? "-1" : newParentPostId //:)
+              },
+              withCredentials: true,
+            })
+      } else if(reportForModal.post !== null && reportForModal.post.targetProfessor === undefined) {
+        var response = await axios(`http://192.168.0.29:8080/secure/updateThread/${reportForModal.post.postId}`,
+            {
+              method: "put",
+              data: {
+                newTitle: newThreadTitle,
+                newContent: reportForModal.post.content,
+                newTargetSubjectId: newTargetSubjectId,
+                newParentThreadId: newParentThreadId==="Постави како самостојно мислење (нова тема)" ? "-1" : newParentThreadId //:)
+              },
+              withCredentials: true,
+            })
+      }
+      await axios(`http://192.168.0.29:8080/secure/markReportResolved/${reportForModal.postReportId}/${markResolved ? `resolve` : `open`}`,{
+        method: "get",
+        withCredentials: true
+      })
+    } catch (error) {
+      setFetchError(true);
+    }
+    setErrMsg(response.data);
+    if (response.data==="") window.location.reload();
+  }
+
+  const handleDelete = async (e) => {
+    e.preventDefault();
+    try {
+      if(reportForModal.post !== null && reportForModal.post.targetProfessor !== undefined) {
+        await axios(`http://192.168.0.29:8080/secure/deleteOpinion/${reportForModal.post.postId}`,
+            {
+              method: "delete",
+              withCredentials: true,
+            })
+        window.location.reload();
+      } else if(reportForModal.post !== null && reportForModal.post.targetProfessor === undefined) {
+        await axios(`http://192.168.0.29:8080/secure/deleteThread/${reportForModal.post.postId}`,
+            {
+              method: "delete",
+              withCredentials: true,
+            })
       }
     } catch (error) {
       setFetchError(true);
     }
-  }
-
-  const handleDelete = (e) => {
-    e.preventDefault();
+    window.location.reload();
   }
 
@@ -181,5 +300,5 @@
       ) : (
           <h3>Нема пријавени мислења</h3>
-      ) : loadedUser && user.userRole==='MODERATOR' ? "се вчитува..." : ""}
+      ) : loadedUser && user.userRole==='MODERATOR' ? <LoadingSpinner/> : ""}
       <EntityUl style={{marginTop:"25px"}}>
       {loadedPostReports && postReports.map((postReport) => {
@@ -225,5 +344,5 @@
                   {dateConverter(
                     new Date(post.timePosted).toString().slice(4, -43)
-                  )}
+                  )} <span style={{fontStyle:"normal",color:"blue"}}>#{post.postId}</span>
                 </OpinionCardContentTime>
               </OpinionCardContent>
@@ -287,5 +406,5 @@
                           {dateConverter(
                               new Date(reportForModal.post.timePosted).toString().slice(4, -43)
-                          )}
+                          )} <span style={{fontStyle:"normal",color:"blue"}}>#{reportForModal.post.postId}</span>
                         </OpinionCardContentTime>
                       </OpinionCardContent>
@@ -353,9 +472,10 @@
                   actionType === 0 ?
               (<form onSubmit={e => handleEdit(e)}>
-                {reportForModal.post.title !== null && <label>
+                {reportForModal.post.title !== null &&
+                    <label>
                   <b>Нов наслов на тема:</b>
                   <ModalInput
-                      value={newPostTitle}
-                      onChange={e => setNewPostTitle(e.target.value)}
+                      value={newThreadTitle}
+                      onChange={e => setNewThreadTitle(e.target.value)}
                       id="title"
                       spellCheck={false}
@@ -379,5 +499,4 @@
                   <input
                       type="checkbox"
-                      checked={markResolved}
                       onChange={handleMarkResolved}
                   />
@@ -403,6 +522,88 @@
                           </form>)
                           :
-                          ("123")
-                          : null
+                          (reportForModal.post.targetProfessor !== undefined ?
+                              (<form onSubmit={e => handleRelocate(e)}>
+                                <p style={{color:"black"}}>Внеси <span style={{fontWeight:"bold"}}>ID</span> на секцијата за дискусија (за <span style={{fontWeight:"bold"}}>професор</span>)
+                                    во која треба да биде преместено мислењето:</p>
+                                    <div style={{marginTop:"15px"}}>
+                                      <label>
+                                        <ModalInput
+                                            value={newOpinionTargetProfessorId}
+                                            onChange={e => {e.preventDefault();setNewOpinionTargetProfessorId(e.target.value)}}
+                                            id="newOpinionTargetProfessorId"
+                                            spellCheck={false}
+                                            style={{marginTop:"10px", marginBottom:"10px", width:"90px"}}
+                                        />
+                                        <button onClick={async (e) => {await handleNewTargetProfessorChange(e);}} style={{marginBottom:"10px", padding:"5px", fontFamily: "Roboto Mono, monospace"}}>Зачувај</button>
+                                        {newOpinionTargetProfessor!==null && !loadingProf ? <p style={{color:"black", marginBottom:"20px", opacity:"50%"}}>Мислењето ќе се премести во секцијата за професорот со <span style={{fontWeight:"bold"}}>ID=
+                                          {newOpinionTargetProfessor.professorId}</span> (<span style={{fontWeight:"bold"}}>{newOpinionTargetProfessor.professorName}</span>)</p> : loadingProf ? <LoadingSpinner style={{marginBottom:"15px", marginTop:"15px"}}/> : null}
+                                        {newOpinionTargetProfessor && <p style={{color:"black", marginBottom:"10px"}}>Постави како дете на мислење со ID:</p>}
+                                        {newOpinionTargetProfessor &&
+                                        <select value={newParentPostId} onChange={e => setNewParentPostId(e.target.value)} style={{width:"280px", display:"block", padding:"5px",marginBottom:"5px", fontFamily: "Roboto Mono, monospace"}}>
+                                          <option value="-1">Постави како самостојно мислење</option>
+                                          {newOpinionTargetProfessor.relatedOpinions.filter((opinion)=>opinion.postId!==reportForModal.post.postId).map((opinion) => {
+                                            return <option key={opinion.postId} value={opinion.postId}>{opinion.postId}</option>})
+                                          }
+                                        </select>}
+                                        <br/>
+                                        <input
+                                            type="checkbox"
+                                            defaultChecked={reportForModal.resolved}
+                                            onChange={handleMarkResolved}
+                                        />
+                                        <span style={{marginLeft:"10px", fontWeight:"bold"}}>Означи како разрешено</span>
+                                      </label>
+                                    </div>
+                                {errMsg!=="" && <p style={{color:"red", display:"flex", justifyContent:"space-around"}}>{errMsg}</p>}
+                                    <ModalFooter type="submit">ПОТВРДИ</ModalFooter>
+                                  </form>) :
+                              //THREAD CASE
+                              (<form onSubmit={e => handleRelocate(e)}>
+                                <p style={{color:"black"}}>Внеси <span style={{fontWeight:"bold"}}>ID</span> на секцијата за дискусија (за <span style={{fontWeight:"bold"}}>предмет</span>)
+                                  во која треба да биде преместено мислењето:</p>
+                                <div style={{marginTop:"15px"}}>
+                                  <label>
+                                    <ModalInput
+                                        value={newTargetSubjectId}
+                                        onChange={e => {e.preventDefault();setNewTargetSubjectId(e.target.value)}}
+                                        id="newTargetSubjectId"
+                                        spellCheck={false}
+                                        style={{marginTop:"10px", marginBottom:"10px", width:"90px"}}
+                                    />
+                                    <button onClick={async (e) => {await handleNewTargetSubjectChange(e);}} style={{marginBottom:"10px", padding:"5px", fontFamily: "Roboto Mono, monospace"}}>Зачувај</button>
+                                    {newTargetSubject!==null && !loadingSubj ? <p style={{color:"black", marginBottom:"20px", opacity:"50%"}}>Мислењето ќе се премести во секцијата за предметот со <span style={{fontWeight:"bold"}}>ID=
+                                      {newTargetSubject.subjectId}</span> (<span style={{fontWeight:"bold"}}>{newTargetSubject.subjectName}</span>)</p> : loadingSubj ? <LoadingSpinner style={{marginBottom:"15px", marginTop:"15px"}}/> : null}
+                                    {newTargetSubject && <p style={{color:"black", marginBottom:"10px"}}>Постави како дете на мислење со ID:</p>}
+                                    {newTargetSubject &&
+                                        <select value={newParentThreadId} onChange={e => setNewParentThreadId(e.target.value)} style={{width:"370px", display:"block", padding:"5px",marginBottom:"5px", fontFamily: "Roboto Mono, monospace"}}>
+                                          <option value="-1">Постави како самостојно мислење (нова тема)</option>
+                                          {newTargetSubject.threads.filter((thread)=>thread.postId!==reportForModal.post.postId).map((thread) => {
+                                            return <option key={thread.postId} value={thread.postId}>{thread.postId}</option>})
+                                          }
+                                        </select>}
+                                    {newParentThreadId==="-1" && loadedNewSubject &&
+                                        <>
+                                        <p style={{marginTop:"10px"}}>Наслов на нова тема:</p>
+                                      <ModalInput
+                                        value={newThreadTitle}
+                                        onChange={e => setNewThreadTitle(e.target.value)}
+                                        id="titleChangeRelocate"
+                                        spellCheck={false}
+                                        style={{marginTop:"10px"}}
+                                    />
+                                    </>}
+                                    <br/>
+                                    <input
+                                        type="checkbox"
+                                        defaultChecked={reportForModal.resolved}
+                                        onChange={handleMarkResolved}
+                                    />
+                                    <span style={{marginLeft:"10px", fontWeight:"bold"}}>Означи како разрешено</span>
+                                  </label>
+                                </div>
+                                {errMsg!=="" && <p style={{color:"red", display:"flex", justifyContent:"space-around"}}>{errMsg}</p>}
+                                <ModalFooter type="submit">ПОТВРДИ</ModalFooter>
+                              </form>))
+                  : null
               }
                 </ModalBody>
@@ -412,5 +613,5 @@
     </>
   ) : (
-    <>се вчитува...</>
+      <LoadingSpinner/>
   );
 }
Index: reactapp/src/api/axios.js
===================================================================
--- reactapp/src/api/axios.js	(revision 3b6962d804b15d4cf06da32490fdbafc33fe3ea5)
+++ reactapp/src/api/axios.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
@@ -2,4 +2,4 @@
 
 export default axios.create({
-  baseURL: "http://192.168.0.19:8080",
+  baseURL: "http://192.168.0.29:8080",
 });
Index: reactapp/src/static/spinner.css
===================================================================
--- reactapp/src/static/spinner.css	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
+++ reactapp/src/static/spinner.css	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
@@ -0,0 +1,17 @@
+@keyframes spinner {
+    0% {
+        transform: rotate(0deg);
+    }
+    100% {
+        transform: rotate(360deg);
+    }
+}
+.loading-spinner {
+    width: 30px;
+    height: 30px;
+    border: 6px solid #0066cc; /* lightblue */
+    border-top: 10px solid #fff; /* white */
+    opacity: 60%;
+    border-radius: 50%;
+    animation: spinner 1.5s linear infinite;
+}
