Index: reactapp/src/Pages/Faculty.js
===================================================================
--- reactapp/src/Pages/Faculty.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
+++ reactapp/src/Pages/Faculty.js	(revision 9bf1f8db5dd66185ddc4f7d093582ff73006f66b)
@@ -20,18 +20,19 @@
 const Faculty = () => {
   let params = useParams();
+
+  const [professors, setProfessors] = useState(null);
+  const [studyProgrammes, setStudyProgrammes] = useState(null);
+  const [professorOpinionCount, setProfessorOpinionCount] = useState(null);
   const [loadedProfessors, setLoadedProfessors] = useState(false);
   const [loadedStudyProgrammes, setLoadedStudyProgrammes] = useState(false);
-  const [professors, setProfessors] = useState(null);
-  const [studyProgrammes, setStudyProgrammes] = useState(null);
+  const [loadedProfessorOpinionCount, setLoadedProfessorOpinionCount] = useState(false);
+
   const [fetchError, setFetchError] = useState(false);
   const [entityType, setEntityType] = useState(0);
 
   useEffect(() => {
-    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 () => {
+    const fetchProfessors = async () => {
       try {
-        const response = await fetch(urlProfessors);
+        const response = await fetch(`http://192.168.1.254:8080/public/professors?facultyId=${params.facultyId}`);
         let cyclicGraph = await response.json();
         let jsogStructure = JSOG.encode(cyclicGraph);
@@ -44,7 +45,7 @@
     };
 
-    const fetchDataStudyProgrammes = async () => {
+    const fetchStudyProgrammes = async () => {
       try {
-        const response2 = await fetch(urlStudyProgrammes);
+        const response2 = await fetch(`http://192.168.1.254:8080/public/study_programmes?facultyId=${params.facultyId}`);
         let cyclicGraph2 = await response2.json();
         let jsogStructure2 = JSOG.encode(cyclicGraph2);
@@ -57,9 +58,23 @@
     };
 
-    fetchDataProfessors();
-    fetchDataStudyProgrammes();
+    const fetchProfessorOpinionCount = async () => {
+      try {
+        const response3 = await fetch(`http://192.168.1.254:8080/public/faculty/${params.facultyId}/opinionCountForEachProfessor`);
+        let cyclicGraph3 = await response3.json();
+        let jsogStructure3 = JSOG.encode(cyclicGraph3);
+        cyclicGraph3 = JSOG.decode(jsogStructure3);
+        setProfessorOpinionCount(cyclicGraph3);
+        setLoadedProfessorOpinionCount(true);
+      } catch (error) {
+        setFetchError(true);
+      }
+    }
+
+    fetchProfessors();
+    fetchStudyProgrammes();
+    fetchProfessorOpinionCount();
   }, [params.facultyId]);
 
-  return loadedProfessors && professors.length != 0 ? (
+  return loadedProfessors && professors.length !== 0 ? (
     entityType === 0 ? (
       <>
@@ -106,7 +121,6 @@
         </div>
         <div key={params.facultyId}>
-          {professors.map((professor) => {
-            let totalPosts = professor.relatedOpinions.length;
-
+          {professors.map((professor, idx) => {
+            let totalPosts = loadedProfessorOpinionCount ? parseInt(professorOpinionCount[idx].split(",")[1]) : 0;
             return (
               <EntityUl key={professor.professorId}>
@@ -215,5 +229,4 @@
                   key={studyProgramme.studyProgrammeId}
                   title={studyProgramme}
-                  content={studyProgramme.subjects}
                 ></SubjectsAccordion>
               );
Index: reactapp/src/Pages/Home.js
===================================================================
--- reactapp/src/Pages/Home.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
+++ reactapp/src/Pages/Home.js	(revision 9bf1f8db5dd66185ddc4f7d093582ff73006f66b)
@@ -1,33 +1,136 @@
-import React, { useContext } from "react";
-import { MainWrapper, MainTitle } from "../Components/Styled/Main.style";
-import { Outlet } from "react-router-dom";
-import Search from "../Components/Search";
-import UserHeader from "../Components/UserHeader";
-import AuthApi from "../api/AuthApi";
+import React, {useEffect, useState} from 'react';
+import JSOG from "jsog";
+import {OpinionCard, OpinionCardContent, OpinionCardContentTime} from "../Components/Styled/OpinionCard.style";
+import LoadingSpinner from "../Components/Styled/LoadingSpinner.style";
+import {dateConverter} from "../Util/dateConverter";
+import {findParentThread} from "../Util/findParentThread";
+import {CurrentPageNav} from "../Components/Styled/Main.style";
 
-function Home({ user, userLoaded }) {
-  const { auth, setAuth } = useContext(AuthApi);
+const Home = () => {
+    const [latestOpinions, setLatestOpinions] = useState(null);
+    const [loadedLatestOpinions, setLoadedLatestOpinions] = useState(false);
+    const [latestThreads, setLatestThreads] = useState(null);
+    const [loadedLatestThreads, setLoadedLatestThreads] = useState(false);
 
-  return (
-    <MainWrapper>
-      <style>
-        @import
-        url('https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap');
-      </style>
-      <style>
-        {
-          "body { background-color: papayawhip;} * {margin: 0; padding: 0; box-sizing: border-box;}"
-        }
-      </style>
-      <a href="/">
-        <MainTitle>profesori.mk</MainTitle>
-      </a>{" "}
-      <Search />
-      {auth && <UserHeader />}
-      <div style={{ marginTop: "140px" }}></div>
-      <Outlet />
-    </MainWrapper>
-  );
-}
+    useEffect(() => {
+        Promise.all([fetch(`http://192.168.1.254:8080/public/latest10opinions`),
+            fetch(`http://192.168.1.254:8080/public/latest10threads`)])
+            .then(([resOpinions, resThreads]) => Promise.all([resOpinions.json(), resThreads.json()]))
+            .then(([dataOpinions, dataThreads]) => {
+                let cyclicGraph1 = dataOpinions;
+                let jsogStructure1 = JSOG.encode(cyclicGraph1);
+                cyclicGraph1 = JSOG.decode(jsogStructure1);
+                setLatestOpinions(cyclicGraph1);
+                setLoadedLatestOpinions(true);
+
+                let cyclicGraph2 = dataThreads;
+                let jsogStructure2 = JSOG.encode(cyclicGraph2);
+                cyclicGraph2 = JSOG.decode(jsogStructure2);
+                setLatestThreads(cyclicGraph2);
+                setLoadedLatestThreads(true);
+            })
+
+    }, []);
+
+    return (
+        <>
+            <CurrentPageNav>
+                &#187;{" "}
+                <a href={"/university/1"}>
+                    Универзитет „Св. Кирил и Методиј“
+                </a>
+            </CurrentPageNav>
+        <div style={{display:"grid", gridTemplateColumns:"1fr 1fr", gap:"40px", marginTop:"60px"}}>
+
+        <div id="latestOpinions" style={{gridColumn:"1", paddingLeft:"20px"}}>
+            <h2 style={{fontWeight:"normal", marginBottom:"30px"}}>Последни мислења за <span style={{fontWeight:"bold"}}>професори</span></h2>
+            {loadedLatestOpinions ? latestOpinions.slice(5).map(opinion => {
+                opinion.timePosted = undefined;
+                return <OpinionCard key={opinion.postId}>
+                    <OpinionCardContent>
+                        <p style={{marginBottom:"10px"}}>
+                        во дискусија за{" "}
+                        <a href={"/professor/" + opinion.targetProfessor.professorId}>
+                                    {opinion.targetProfessor.professorName}
+                        </a>
+                        </p>
+                        <p style={{ fontStyle: "italic", marginBottom: "10px" }}>
+                            <a href={"/user/" + opinion.author.id}>
+                                {opinion.author.username}
+                            </a>{" "}
+                            напишал
+                        </p>
+                        <p style={{ marginBottom: "10px", maxWidth: "90%" }}>
+                            {opinion.content}
+                        </p>
+                        {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>
+                        ) : (
+                            <OpinionCardContentTime>
+                                {dateConverter(
+                                    new Date(opinion.timeLastEdited)
+                                        .toString()
+                                        .slice(4, -43)
+                                )}{" "} <span style={{fontStyle:"normal",color:"blue"}}>#{opinion.postId}</span>{" "}
+                                (едитирано од модератор)
+                            </OpinionCardContentTime>
+                        )}
+                    </OpinionCardContent>
+                </OpinionCard>
+            }) : <LoadingSpinner/>}
+        </div>
+
+    <div id="latestThreads" style={{gridColumn:"2", paddingRight:"20px"}}>
+        <h2 style={{fontWeight:"normal", marginBottom:"30px"}}>Последни мислења за <span style={{fontWeight:"bold"}}>предмети</span></h2>
+        {loadedLatestThreads ? latestThreads.slice(5).map(thread => {
+            return <OpinionCard key={thread.postId}>
+                <OpinionCardContent>
+                    <p style={{marginBottom:"10px"}}>
+                        во дискусија за{" "}
+                        <a href={
+                                thread.parent === null
+                                    ? "/topic/" + thread.postId
+                                    : "/topic/" + findParentThread(thread).postId
+                            }
+                        > {thread.targetSubject.subjectName}
+                        </a>
+                    </p>
+                    <p style={{ fontStyle: "italic", marginBottom: "10px" }}>
+                        <a href={"/user/" + thread.author.id}>
+                            {thread.author.username}
+                        </a>{" "}
+                        напишал
+                    </p>
+                    <p style={{ marginBottom: "10px", maxWidth: "90%" }}>
+                        {thread.content}
+                    </p>
+                    {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>
+                    ) : (
+                        <OpinionCardContentTime>
+                            {dateConverter(
+                                new Date(thread.timeLastEdited)
+                                    .toString()
+                                    .slice(4, -43)
+                            )}{" "} <span style={{fontStyle:"normal",color:"blue"}}>#{thread.postId}</span>{" "}
+                            (едитирано од модератор)
+                        </OpinionCardContentTime>
+                    )}
+                </OpinionCardContent>
+            </OpinionCard>
+        }) : null}
+    </div>
+        </div>
+        </>
+    );
+};
 
 export default Home;
Index: reactapp/src/Pages/Professor.js
===================================================================
--- reactapp/src/Pages/Professor.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
+++ reactapp/src/Pages/Professor.js	(revision 9bf1f8db5dd66185ddc4f7d093582ff73006f66b)
@@ -32,4 +32,6 @@
   const [professor, setProfessor] = useState(null);
   const [loadedProfessor, setLoadedProfessor] = useState(false);
+  const [relatedOpinions, setRelatedOpinions] = useState(null);
+  const [loadedRelatedOpinions, setLoadedRelatedOpinions] = useState(false);
 
   const [postModalDisplay, setPostModalDisplay] = useState("none");
@@ -40,21 +42,22 @@
 
   useEffect(() => {
-    const url = `http://192.168.0.29:8080/public/professor/${params.professorId}`;
+     Promise.all([fetch(`http://192.168.1.254:8080/public/professor/${params.professorId}`),
+     fetch(`http://192.168.1.254:8080/public/professor/${params.professorId}/relatedOpinions`)])
+        .then(([resProfessor, resRelatedOpinions]) => Promise.all([resProfessor.json(), resRelatedOpinions.json()]))
+        .then(([dataProfessor, dataRelatedOpinions]) => {
+          let cyclicGraph1 = dataProfessor;
+          let jsogStructure1 = JSOG.encode(cyclicGraph1);
+          cyclicGraph1 = JSOG.decode(jsogStructure1);
+          setProfessor(cyclicGraph1);
+          setLoadedProfessor(true);
 
-    const fetchProfessor = async () => {
-      try {
-        const response = await fetch(url);
-        var cyclicGraph = await response.json();
-        var jsogStructure = JSOG.encode(cyclicGraph);
-        cyclicGraph = JSOG.decode(jsogStructure);
-        setProfessor(cyclicGraph);
-        setLoadedProfessor(true);
-      } catch (error) {
-        setFetchError(true);
-      }
-    };
+          let cyclicGraph2 = dataRelatedOpinions;
+          let jsogStructure2 = JSOG.encode(cyclicGraph2);
+          cyclicGraph2 = JSOG.decode(jsogStructure2);
+          setRelatedOpinions(cyclicGraph2);
+          setLoadedRelatedOpinions(true);
+        })
 
-    fetchProfessor();
-  }, [params.professorId]);
+  }, []);
 
   const handleAddOpinionButtonClick = () => {
@@ -77,5 +80,5 @@
     if (!postContent.length < 1) {
       const response = await axios(
-        `http://192.168.0.29:8080/secure/professor/${params.professorId}/addOpinion`,
+        `http://192.168.1.254:8080/secure/professor/${params.professorId}/addOpinion`,
         {
           method: "post",
@@ -129,6 +132,6 @@
             }}
           >
-            {professor.relatedOpinions.length}{" "}
-            {professor.relatedOpinions.length !== 1 ? "мислења" : "мислење"}
+            {relatedOpinions.length}{" "}
+            {relatedOpinions.length !== 1 ? "мислења" : "мислење"}
           </h3>
           {auth && (
@@ -172,5 +175,5 @@
 
         <div className="opinionTree">
-          <OpinionTree professor={professor} />
+          <OpinionTree professor={professor} relatedOpinions={relatedOpinions}/>
         </div>
         <Outlet />
Index: reactapp/src/Pages/PublicUserProfile.js
===================================================================
--- reactapp/src/Pages/PublicUserProfile.js	(revision 9bf1f8db5dd66185ddc4f7d093582ff73006f66b)
+++ reactapp/src/Pages/PublicUserProfile.js	(revision 9bf1f8db5dd66185ddc4f7d093582ff73006f66b)
@@ -0,0 +1,57 @@
+import React, {useEffect, useState} from 'react';
+import {UserDetailsCard, UserDetailsCardContent} from "../Components/Styled/UserDetails.style";
+import {useParams} from "react-router-dom";
+import JSOG from "jsog";
+import LoadingSpinner from "../Components/Styled/LoadingSpinner.style";
+
+const PublicUserProfile = () => {
+    let params = useParams();
+
+    const [publicProfile, setPublicProfile] = useState(null);
+    const [loadedPublicProfile, setLoadedPublicProfile] = useState(false);
+
+    useEffect(() => {
+            const fetchPublicProfile = async () => {
+                const resp = await fetch(`http://192.168.1.254:8080/public/user/${params.userId}`)
+                let cyclicGraph = await resp.json();
+                let jsogStructure = JSOG.encode(cyclicGraph);
+                cyclicGraph = JSOG.decode(jsogStructure);
+                setPublicProfile(cyclicGraph);
+                setLoadedPublicProfile(true);
+            }
+            fetchPublicProfile();
+        },
+        []
+    )
+
+    return <>
+        {loadedPublicProfile ?
+            (<>
+                <h3>Кориснички податоци за корисник #{publicProfile.id}:</h3>
+            <UserDetailsCard>
+                {publicProfile.fullName && (
+                    <UserDetailsCardContent>
+                        <b>Име:</b> {publicProfile.fullName}{" "}
+                    </UserDetailsCardContent>
+                )}
+                <UserDetailsCardContent>
+                    <b>Корисничко име:</b> {publicProfile.username}{" "}
+                </UserDetailsCardContent>
+                <UserDetailsCardContent>
+                    <b>E-mail:</b> {publicProfile.email}
+                </UserDetailsCardContent>
+                <UserDetailsCardContent>
+                    <b>Карма:</b>{" "}
+                    <span style={{color: publicProfile.karma < 0 ? "indianred" : "green"}}>
+                {publicProfile.karma}
+              </span>
+                </UserDetailsCardContent>
+            </UserDetailsCard>
+            </>)
+            :
+            <LoadingSpinner/>
+        }
+    </>
+};
+
+export default PublicUserProfile;
Index: reactapp/src/Pages/SearchResults.js
===================================================================
--- reactapp/src/Pages/SearchResults.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
+++ reactapp/src/Pages/SearchResults.js	(revision 9bf1f8db5dd66185ddc4f7d093582ff73006f66b)
@@ -14,12 +14,12 @@
     <SearchResultsWrapper>
       <h3 style={{ marginBottom: "30px" }}>Резултати од пребарувањето:</h3>
-      {location.state.map((professor) => (
-        <SearchResult key={professor.professorId} margin="10px">
-          <SearchResultLink href={"/professor/" + professor.professorId}>
+      {location.state.map((match) => (
+        <SearchResult key={match.professorId !== undefined ? match.professorId : match.subjectId} margin="10px">
+          <SearchResultLink href={`/${match.professorId !== undefined ? 'professor': 'subject'}/` + `${match.professorId !== undefined ? match.professorId : match.subjectId}`}>
             <SearchResultText weight="bold" size="medium">
-              {professor.professorName}
+              {match.professorId !== undefined ? match.professorName : match.subjectName}
             </SearchResultText>
             <SearchResultText weight="normal" size="er">
-              {professor.faculty.facultyName}
+              {match.professorId !== undefined ? match.faculty.facultyName : match.studyProgramme.faculty.facultyName}
             </SearchResultText>
           </SearchResultLink>
Index: reactapp/src/Pages/Subject.js
===================================================================
--- reactapp/src/Pages/Subject.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
+++ reactapp/src/Pages/Subject.js	(revision 9bf1f8db5dd66185ddc4f7d093582ff73006f66b)
@@ -33,9 +33,12 @@
   let params = useParams();
   let navigate = useNavigate();
-
   const { auth, setAuth } = useContext(AuthApi);
+
   const [subject, setSubject] = useState(null);
-  const [loaded, setLoaded] = useState(false);
+  const [loadedSubject, setLoadedSubject] = useState(false);
+  const [threads, setThreads] = useState(null);
+  const [loadedThreads, setLoadedThreads] = useState(false);
   const [fetchError, setFetchError] = useState(false);
+
   var totalTopics = 0;
   var topics = [];
@@ -47,21 +50,22 @@
 
   useEffect(() => {
-    const url = `http://192.168.0.29:8080/public/subject/${params.subjectId}`;
-
-    const fetchData = async () => {
-      try {
-        const response = await fetch(url);
-        let cyclicGraph = await response.json();
-        let jsogStructure = JSOG.encode(cyclicGraph);
-        cyclicGraph = JSOG.decode(jsogStructure);
-        setSubject(cyclicGraph);
-        setLoaded(true);
-      } catch (error) {
-        setFetchError(true);
-      }
-    };
-
-    fetchData();
-  }, [params.subjectId]);
+    Promise.all([fetch(`http://192.168.1.254:8080/public/subject/${params.subjectId}`),
+                        fetch(`http://192.168.1.254:8080/public/subject/${params.subjectId}/threads`)])
+        .then(([resSubject, resThreads]) => Promise.all([resSubject.json(), resThreads.json()]))
+        .then(([dataSubject, dataThreads]) => {
+          let cyclicGraph1 = dataSubject;
+          let jsogStructure1 = JSOG.encode(cyclicGraph1);
+          cyclicGraph1 = JSOG.decode(jsogStructure1);
+          setSubject(cyclicGraph1);
+          setLoadedSubject(true);
+
+          let cyclicGraph2 = dataThreads;
+          let jsogStructure2 = JSOG.encode(cyclicGraph2);
+          cyclicGraph2 = JSOG.decode(jsogStructure2);
+          setThreads(cyclicGraph2);
+          setLoadedThreads(true);
+        })
+
+  }, []);
 
   const handleAddTopicButtonClick = () => {
@@ -84,5 +88,5 @@
     if (!topicTitle.length < 1 && !topicContent.length < 1) {
       const response = await axios(
-        `http://192.168.0.29:8080/secure/subject/${params.subjectId}/addThread`,
+        `http://192.168.1.254:8080/secure/subject/${params.subjectId}/addThread`,
         {
           method: "post",
@@ -109,5 +113,5 @@
   };
 
-  return loaded ? (
+  return loadedSubject ? (
     <>
       <CurrentPageNav>
@@ -151,5 +155,5 @@
           }}
         >
-          {subject.threads.map((thread) => {
+          {threads.map((thread) => {
             if (thread.parent === null) {
               totalTopics++;
@@ -210,5 +214,5 @@
             <EntityUl key={topic.postId}>
               <EntityLi bgcolor="cornsilk">
-                <a href={"/topic/" + topic.postId}>{topic.title}</a>
+                <a href={"/topic/" + topic.postId}>{topic.title.length >= 99 ? topic.title.slice(0,98) + "..." : topic.title}</a>
                 <EntityParam right="30px">
                   <span style={{ fontWeight: "normal" }}>
Index: reactapp/src/Pages/Topic.js
===================================================================
--- reactapp/src/Pages/Topic.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
+++ reactapp/src/Pages/Topic.js	(revision 9bf1f8db5dd66185ddc4f7d093582ff73006f66b)
@@ -43,12 +43,18 @@
   const [postModalDisplay, setPostModalDisplay] = useState("none");
   const [postContent, setPostContent] = useState("");
+
   const [replyModalDisplay, setReplyModalDisplay] = useState("none");
   const [replyContent, setReplyContent] = useState("");
-  const [postForModal, setPostForModal] = useState(null);
+  const [postForReplyModal, setPostForReplyModal] = useState(null);
+
+  const [reportModalDisplay, setReportModalDisplay] = useState("none");
+  const [reportContent, setReportContent] = useState("");
+  const [postForReportModal, setPostForReportModal] = useState(null);
+
   const [errorMessage, setErrorMessage] = useState("");
 
   useEffect(() => {
-    const url1 = `http://192.168.0.29:8080/public/thread/${params.topicId}`;
-    const url2 = `http://192.168.0.29:8080/secure/currentUser`;
+    const url1 = `http://192.168.1.254:8080/public/thread/${params.topicId}`;
+    const url2 = `http://192.168.1.254:8080/secure/currentUser`;
 
     const fetchTopic = async () => {
@@ -79,10 +85,20 @@
 
     fetchTopic().then(fetchUser);
-  }, []);
+  }, [loadedThread]);
 
   const handleReply = (post) => {
     if (auth) {
       setReplyModalDisplay("block");
-      setPostForModal(post);
+      setPostForReplyModal(post);
+      document.body.style.overflowY = "hidden";
+    } else {
+      navigate("/login");
+    }
+  };
+
+  const handleReport = (post) => {
+    if (auth) {
+      setReportModalDisplay("block");
+      setPostForReportModal(post);
       document.body.style.overflowY = "hidden";
     } else {
@@ -95,4 +111,9 @@
   };
 
+  const handleReportContentChange = (e) => {
+    e.preventDefault();
+    setReportContent(e.target.value);
+  };
+
   const handleReplySubmit = async (e, postId) => {
     e.preventDefault();
@@ -100,5 +121,5 @@
     if (!replyContent.length < 1) {
       const response = await axios(
-        `http://192.168.0.29:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${postId}`,
+        `http://192.168.1.254:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${postId}`,
         {
           method: "post",
@@ -116,4 +137,25 @@
   };
 
+  const handleReportSubmit = async (e, postId) => {
+    e.preventDefault();
+
+    if (!reportContent.length < 1) {
+      const response = await axios(
+          `http://192.168.1.254:8080/secure/reportThread/${postId}`,
+          {
+            method: "post",
+            data: {
+              description: reportContent,
+            },
+            withCredentials: true,
+          }
+      );
+      setErrorMessage("");
+      window.location.reload();
+    } else {
+      setErrorMessage("Полето за содржина не смее да биде празно");
+    }
+  };
+
   const handleAddOpinionButtonClick = () => {
     if (auth) {
@@ -129,5 +171,5 @@
     if (!postContent.length < 1) {
       const response = await axios(
-        `http://192.168.0.29:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${params.topicId}`,
+        `http://192.168.1.254:8080/secure/subject/${thread.targetSubject.subjectId}/replyToThread/${params.topicId}`,
         {
           method: "post",
@@ -147,4 +189,5 @@
     setPostModalDisplay("none");
     setReplyModalDisplay("none");
+    setReportModalDisplay("none");
     document.body.style.overflowY = "auto";
   };
@@ -161,5 +204,5 @@
       ) {
         const response = await axios(
-          `http://192.168.0.29:8080/secure/upvoteThread/${post.postId}`,
+          `http://192.168.1.254:8080/secure/upvoteThread/${post.postId}`,
           {
             method: "get",
@@ -184,5 +227,5 @@
       ) {
         const response = await axios(
-          `http://192.168.0.29:8080/secure/downvoteThread/${post.postId}`,
+          `http://192.168.1.254:8080/secure/downvoteThread/${post.postId}`,
           {
             method: "get",
@@ -280,4 +323,11 @@
                 color="darkgrey"
                 onClick={() => handleReply(child)}
+              />
+
+              <StyledFontAwesomeIcon
+                  icon={solid("flag")}
+                  right={130 + "px"}
+                  color="darkgrey"
+                  onClick={() => handleReport(child)}
               />
             </div>
@@ -393,4 +443,10 @@
           >
             <StyledFontAwesomeIcon
+                icon={solid("flag")}
+                right={90 + "px"}
+                color="darkgrey"
+                onClick={() => handleReport(thread)}
+            />
+            <StyledFontAwesomeIcon
               icon={solid("thumbs-up")}
               right={50 + "px"}
@@ -517,4 +573,11 @@
                   onClick={() => handleReply(directChild)}
                 />
+
+                <StyledFontAwesomeIcon
+                    icon={solid("flag")}
+                    right={130 + "px"}
+                    color="darkgrey"
+                    onClick={() => handleReport(directChild)}
+                />
               </div>
             </OpinionCardContent>
@@ -525,5 +588,5 @@
         );
       })}
-      {postForModal && (
+      {postForReplyModal && (
         <Modal display={replyModalDisplay}>
           <ModalContent>
@@ -531,8 +594,8 @@
               <ModalClose onClick={handleModalCloseClick}>&times;</ModalClose>
               <h3 style={{ marginTop: "5px" }}>
-                Реплика на {postForModal.author.username}
+                Реплика на {postForReplyModal.author.username}
               </h3>
             </ModalHeader>
-            <form onSubmit={(e) => handleReplySubmit(e, postForModal.postId)}>
+            <form onSubmit={(e) => handleReplySubmit(e, postForReplyModal.postId)}>
               <ModalBody>
                 <label htmlFor="content">
@@ -557,4 +620,36 @@
         </Modal>
       )}
+      {postForReportModal && (
+          <Modal display={reportModalDisplay}>
+            <ModalContent>
+              <ModalHeader>
+                <ModalClose onClick={handleModalCloseClick}>&times;</ModalClose>
+                <h3 style={{ marginTop: "5px" }}>
+                  Пријава за мислење #{postForReportModal.postId}
+                </h3>
+              </ModalHeader>
+              <form onSubmit={(e) => handleReportSubmit(e, postForReportModal.postId)}>
+                <ModalBody>
+                  <label htmlFor="content">
+                    <b>Наведете причина</b>:
+                    <ModalTextarea
+                        id="content"
+                        rows="8"
+                        cols="100"
+                        value={reportContent}
+                        onChange={handleReportContentChange}
+                    />
+                  </label>
+                </ModalBody>
+                <p
+                    style={{ color: "red", marginLeft: "15px", marginTop: "10px" }}
+                >
+                  {errorMessage}
+                </p>
+                <ModalFooter type="submit">ПРИЈАВИ</ModalFooter>
+              </form>
+            </ModalContent>
+          </Modal>
+      )}
     </>
   ) : !fetchError && !loadedThread ? (
Index: reactapp/src/Pages/University.js
===================================================================
--- reactapp/src/Pages/University.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
+++ reactapp/src/Pages/University.js	(revision 9bf1f8db5dd66185ddc4f7d093582ff73006f66b)
@@ -18,27 +18,34 @@
 const University = () => {
   let params = useParams();
-  const [loaded, setLoaded] = useState(false);
+
   const [faculties, setFaculties] = useState(null);
+  const [loadedFaculties, setLoadedFaculties] = useState(false);
+
+  const [counts, setCounts] = useState(null);
+  const [loadedCounts, setLoadedCounts] = useState(false);
+
   const [fetchError, setFetchError] = useState(false);
 
   useEffect(() => {
-    const url = `http://192.168.0.29:8080/public/faculties?universityId=${params.universityId}`;
+        Promise.all([fetch(`http://192.168.1.254:8080/public/faculties?universityId=${params.universityId}`),
+        fetch(`http://192.168.1.254:8080/public/university/${params.universityId}/sectionAndPostCount`)])
+            .then(([resFaculties, counts]) => Promise.all([resFaculties.json(), counts.json()]))
+            .then(([dataFaculties, dataCounts]) => {
+                let cyclicGraph1 = dataFaculties;
+                let jsogStructure1 = JSOG.encode(cyclicGraph1);
+                cyclicGraph1 = JSOG.decode(jsogStructure1);
+                setFaculties(cyclicGraph1);
+                setLoadedFaculties(true);
 
-    const fetchData = async () => {
-      try {
-        const response = await fetch(url);
-        var cyclicGraph = await response.json();
-        var jsogStructure = JSOG.encode(cyclicGraph);
-        cyclicGraph = JSOG.decode(jsogStructure);
-        setFaculties(cyclicGraph);
-        setLoaded(true);
-      } catch (error) {
-        setFetchError(true);
-      }
-    };
-    fetchData();
-  }, [params.universityId]);
+                let cyclicGraph2 = dataCounts;
+                let jsogStructure2 = JSOG.encode(cyclicGraph2);
+                cyclicGraph2 = JSOG.decode(jsogStructure2);
+                setCounts(cyclicGraph2);
+                setLoadedCounts(true);
+            })
 
-  return loaded && !fetchError && faculties.length !== 0 ? (
+  }, []);
+
+  return loadedFaculties && !fetchError && faculties.length !== 0 ? (
     <>
       <CurrentPageNav>
@@ -55,18 +62,8 @@
       </ProfessorCard>
       <div key={params.universityId}>
-        {faculties.map((faculty) => {
-          let totalPosts = 0;
-          let totalSections = 0;
-          faculty.professors.map((professor) => {
-            totalPosts += professor.relatedOpinions.length;
-            totalSections++;
-          });
-          faculty.studyProgrammes.map((studyProgramme) => {
-            studyProgramme.subjects.map((subject) => {
-              totalPosts += subject.threads.length;
-              totalSections++;
-            });
-          });
-
+        {faculties.map((faculty, idx) => {
+          let totalPosts = parseInt(counts[idx].split(",")[2]);
+          let totalSections = parseInt(counts[idx].split(",")[1]);
+          console.log(counts)
           return (
             <EntityUl key={faculty.facultyId}>
@@ -104,5 +101,5 @@
       </div>
     </>
-  ) : !fetchError && !loaded ? (
+  ) : !fetchError && !loadedFaculties ? (
     <div>
       <LoadingSpinner style={{ marginTop: "140px" }}/>
Index: reactapp/src/Pages/UserDashboard.js
===================================================================
--- reactapp/src/Pages/UserDashboard.js	(revision af801e3ae2a87e526d2053085fdbb077aafd6741)
+++ reactapp/src/Pages/UserDashboard.js	(revision 9bf1f8db5dd66185ddc4f7d093582ff73006f66b)
@@ -27,4 +27,5 @@
 } from "../Components/Styled/Modal.style";
 import LoadingSpinner from "../Components/Styled/LoadingSpinner.style";
+import {findParentThread} from "../Util/findParentThread";
 
 function UserDashboard() {
@@ -33,4 +34,7 @@
   const [user, setUser] = useState(null);
   const [loadedUser, setLoadedUser] = useState(false);
+  const [authoredPosts, setAuthoredPosts] = useState(null);
+  const [loadedAuthoredPosts, setLoadedAuthoredPosts] = useState(false);
+
   const [fetchError, setFetchError] = useState(false);
 
@@ -45,6 +49,4 @@
   const [newPostContent, setNewPostContent] = useState("");
   const [newOpinionTargetProfessorId, setNewOpinionTargetProfessorId] = useState("");
-  const [newOpinionTargetProfessor, setNewOpinionTargetProfessor] = useState(null);
-  const [loadedNewProfessor,setLoadedNewProfessor] = useState(false);
   const [newParentPostId, setNewParentPostId] = useState("-1");
 
@@ -52,6 +54,5 @@
   const [newParentThreadId,setNewParentThreadId] = useState("-1");
   const [newTargetSubjectId, setNewTargetSubjectId] = useState("");
-  const [newTargetSubject, setNewTargetSubject] = useState(null);
-  const [loadedNewSubject, setLoadedNewSubject] = useState(null);
+
 
   const [markResolved, setMarkResolved] = useState(false);
@@ -83,5 +84,9 @@
   }, [reportForModal]);
 
-  const[loadingProf, setLoadingProf] = useState(false);
+  const [newOpinionTargetProfessor, setNewOpinionTargetProfessor] = useState(null);
+  const [loadedNewProfessor,setLoadedNewProfessor] = useState(false);
+  const [newProfessorRelatedOpinions, setNewProfessorRelatedOpinions] = useState(null);
+  const [loadedNewProfessorRelatedOpinions, setLoadedNewProfessorRelatedOpinions] = useState(false);
+  const [loadingProf, setLoadingProf] = useState(false);
 
   const handleNewTargetProfessorChange = async (e) => {
@@ -90,11 +95,22 @@
     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);
+          Promise.all([fetch(`http://192.168.1.254:8080/public/professor/${newOpinionTargetProfessorId}`),
+            fetch(`http://192.168.1.254:8080/public/professor/${newOpinionTargetProfessorId}/relatedOpinions`)])
+              .then(([resNewOpinionTargetProfessor, resNewProfessorRelatedOpinions]) => Promise.all([resNewOpinionTargetProfessor.json(), resNewProfessorRelatedOpinions.json()]))
+              .then(([dataNewOpinionTargetProfessor, dataNewProfessorRelatedOpinions]) => {
+                let cyclicGraph1 = dataNewOpinionTargetProfessor;
+                var jsogStructure1 = JSOG.encode(cyclicGraph1);
+                cyclicGraph1 = JSOG.decode(jsogStructure1);
+                setNewOpinionTargetProfessor(cyclicGraph1);
+                setLoadedNewProfessor(true);
+
+                let cyclicGraph2 = dataNewProfessorRelatedOpinions;
+                var jsogStructure2 = JSOG.encode(cyclicGraph2);
+                cyclicGraph2 = JSOG.decode(jsogStructure2);
+                setNewProfessorRelatedOpinions(cyclicGraph2);
+                setLoadedNewProfessorRelatedOpinions(true);
+
+                setLoadingProf(false);
+              })
         } catch (error) {
           setFetchError(true);
@@ -103,5 +119,9 @@
   }
 
-  const[loadingSubj, setLoadingSubj] = useState(false);
+  const [newTargetSubject, setNewTargetSubject] = useState(null);
+  const [loadedNewSubject, setLoadedNewSubject] = useState(false);
+  const [newTargetSubjectThreads, setNewTargetSubjectThreads] = useState(null);
+  const [loadedNewSubjectThreads, setLoadedNewSubjectThreads] = useState(false);
+  const [loadingSubj, setLoadingSubj] = useState(false);
 
   const handleNewTargetSubjectChange = async (e) => {
@@ -110,32 +130,50 @@
     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);
-      }
+        Promise.all([fetch(`http://192.168.1.254:8080/public/subject/${newTargetSubjectId}`),
+        fetch(`http://192.168.1.254:8080/public/subject/${newTargetSubjectId}/threads`)])
+            .then(([resNewTargetSubject, resNewTargetSubjectThreads]) => Promise.all([resNewTargetSubject.json(), resNewTargetSubjectThreads.json()]))
+            .then(([dataNewTargetSubject, dataNewTargetSubjectThreads]) => {
+              let cyclicGraph1 = dataNewTargetSubject;
+              var jsogStructure1 = JSOG.encode(cyclicGraph1);
+              cyclicGraph1 = JSOG.decode(jsogStructure1);
+              setNewTargetSubject(cyclicGraph1);
+              setLoadedNewSubject(true);
+
+              let cyclicGraph2 = dataNewTargetSubjectThreads;
+              var jsogStructure2 = JSOG.encode(cyclicGraph2);
+              cyclicGraph2 = JSOG.decode(jsogStructure2);
+              setNewTargetSubjectThreads(cyclicGraph2);
+              setLoadedNewSubjectThreads(true);
+
+              setLoadingSubj(false);
+            })
+        } catch (error) {
+            setFetchError(true);
+        }
     }
   }
 
   useEffect(() => {
-    const url1 = `http://192.168.0.29:8080/secure/currentUser`;
-    const url2 = `http://192.168.0.29:8080/secure/getAllPostReports`;
-
-    const fetchUser = async () => {
+    const fetchUser = () => {
       try {
         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);
+          Promise.all([axios.get(`http://192.168.1.254:8080/secure/currentUser`, {withCredentials:true}),
+            axios.get(`http://192.168.1.254:8080/secure/currentUser/posts`, {withCredentials:true})])
+              .then(([resUser, resAuthoredPosts]) => Promise.all([resUser.data, resAuthoredPosts.data]))
+              .then(([dataUser, dataAuthoredPosts]) => {
+                let cyclicGraph1 = dataUser;
+                let jsogStructure1 = JSOG.encode(cyclicGraph1);
+                cyclicGraph1 = JSOG.decode(jsogStructure1);
+                setUser(cyclicGraph1);
+                setLoadedUser(true);
+
+                let cyclicGraph2 = dataAuthoredPosts;
+                let jsogStructure2 = JSOG.encode(cyclicGraph2);
+                cyclicGraph2 = JSOG.decode(jsogStructure2);
+                setAuthoredPosts(cyclicGraph2);
+                setLoadedAuthoredPosts(true);
+              })
         }
-        if(user.userRole==='MODERATOR')fetchPostReports();
+        if(user.userRole==='MODERATOR') fetchPostReports();
       } catch (error) {
         setFetchError(true);
@@ -145,5 +183,5 @@
     const fetchPostReports = async () => {
       try {
-        const response = await axios.get(url2, {withCredentials: true});
+        const response = await axios.get(`http://192.168.1.254:8080/secure/getAllPostReports`, {withCredentials: true});
         var cyclicGraph = await response.data;
         var jsogStructure = JSOG.encode(cyclicGraph);
@@ -160,21 +198,9 @@
   }, [user]);
 
-  // useEffect(() => {
-  //   const timer = setTimeout(() => {
-  //     if (user === null) window.location.reload(); <---- :-)
-  //   }, 3000);
-  //   return () => clearTimeout(timer);
-  // }, []);
-
-  function findParentThread(post) {
-    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.29:8080/secure/updateOpinion/${reportForModal.post.postId}`,
+        await axios(`http://192.168.1.254:8080/secure/updateOpinion/${reportForModal.post.postId}`,
             {
               method: "put",
@@ -186,6 +212,10 @@
               withCredentials: true,
             })
+        await axios(`http://192.168.1.254:8080/secure/markReportResolved/${reportForModal.postReportId}/${markResolved ? `resolve` : `open`}`,{
+          method: "get",
+          withCredentials: true
+        })
       } else if(reportForModal.post !== null && reportForModal.post.targetProfessor === undefined) {
-        await axios(`http://192.168.0.29:8080/secure/updateThread/${reportForModal.post.postId}`,
+        await axios(`http://192.168.1.254:8080/secure/updateThread/${reportForModal.post.postId}`,
             {
               method: "put",
@@ -199,8 +229,8 @@
             })
       }
-        await axios(`http://192.168.0.29:8080/secure/markReportResolved/${reportForModal.postReportId}/${markResolved ? `resolve` : `open`}`,{
+      await axios(`http://192.168.1.254:8080/secure/markReportResolved/${reportForModal.postReportId}/${markResolved ? `resolve` : `open`}`,{
           method: "get",
           withCredentials: true
-        })
+      })
     } catch (error) {
       setFetchError(true);
@@ -213,5 +243,5 @@
     try {
       if(reportForModal.post !== null && reportForModal.post.targetProfessor !== undefined) {
-        var response = await axios(`http://192.168.0.29:8080/secure/updateOpinion/${reportForModal.post.postId}`,
+        var response = await axios(`http://192.168.1.254:8080/secure/updateOpinion/${reportForModal.post.postId}`,
             {
               method: "put",
@@ -223,6 +253,10 @@
               withCredentials: true,
             })
+        await axios(`http://192.168.1.254:8080/secure/markReportResolved/${reportForModal.postReportId}/${markResolved ? `resolve` : `open`}`,{
+          method: "get",
+          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}`,
+        var response = await axios(`http://192.168.1.254:8080/secure/updateThread/${reportForModal.post.postId}`,
             {
               method: "put",
@@ -236,5 +270,5 @@
             })
       }
-      await axios(`http://192.168.0.29:8080/secure/markReportResolved/${reportForModal.postReportId}/${markResolved ? `resolve` : `open`}`,{
+      await axios(`http://192.168.1.254:8080/secure/markReportResolved/${reportForModal.postReportId}/${markResolved ? `resolve` : `open`}`,{
         method: "get",
         withCredentials: true
@@ -251,5 +285,5 @@
     try {
       if(reportForModal.post !== null && reportForModal.post.targetProfessor !== undefined) {
-        await axios(`http://192.168.0.29:8080/secure/deleteOpinion/${reportForModal.post.postId}`,
+        await axios(`http://192.168.1.254:8080/secure/deleteOpinion/${reportForModal.post.postId}`,
             {
               method: "delete",
@@ -258,5 +292,5 @@
         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}`,
+        await axios(`http://192.168.1.254:8080/secure/deleteThread/${reportForModal.post.postId}`,
             {
               method: "delete",
@@ -312,10 +346,10 @@
       })}
       </EntityUl>
-      {user.authoredPosts.length > 0 ? (
+      {authoredPosts.length > 0 ? (
         <h3 style={{ marginBottom: "10px", marginTop:"30px" }}>Ваши мислења:</h3>
       ) : (
         <h3 style={{ marginBottom: "10px" }}>Немате објавени мислења</h3>
       )}
-      {user.authoredPosts.map((post) => {
+      {authoredPosts.map((post) => {
         return (
           <div key={post.postId}>
@@ -527,5 +561,4 @@
                                     во која треба да биде преместено мислењето:</p>
                                     <div style={{marginTop:"15px"}}>
-                                      <label>
                                         <ModalInput
                                             value={newOpinionTargetProfessorId}
@@ -542,16 +575,16 @@
                                         <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) => {
+                                          {newProfessorRelatedOpinions.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>
+                                        <label>
+                                          <input
+                                              type="checkbox"
+                                              onChange={handleMarkResolved}
+                                          />
+                                          <span style={{marginLeft:"10px", fontWeight:"bold"}}>Означи како разрешено</span>
+                                        </label>
                                     </div>
                                 {errMsg!=="" && <p style={{color:"red", display:"flex", justifyContent:"space-around"}}>{errMsg}</p>}
@@ -578,5 +611,5 @@
                                         <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) => {
+                                          {newTargetSubjectThreads.filter((thread)=>thread.postId!==reportForModal.post.postId).map((thread) => {
                                             return <option key={thread.postId} value={thread.postId}>{thread.postId}</option>})
                                           }
