diff --git a/src/app/components/shared/tag-cloud/tag-cloud.component.ts b/src/app/components/shared/tag-cloud/tag-cloud.component.ts
index 9515eec1bae969a021716c2d6830d2c4a36b9aaa..73765a66b5e184e8b6def8046e1e7e28e543b9a0 100644
--- a/src/app/components/shared/tag-cloud/tag-cloud.component.ts
+++ b/src/app/components/shared/tag-cloud/tag-cloud.component.ts
@@ -23,7 +23,7 @@ import { ThemeService } from '../../../../theme/theme.service';
 import { TopicCloudAdministrationComponent } from '../_dialogs/topic-cloud-administration/topic-cloud-administration.component';
 import { WsCommentService } from '../../../services/websockets/ws-comment.service';
 import { CreateCommentWrapper } from '../../../utils/create-comment-wrapper';
-import { TopicCloudAdminService } from '../../../services/util/topic-cloud-admin.service';
+import { regexMaskKeyword, TopicCloudAdminService } from '../../../services/util/topic-cloud-admin.service';
 import { TagCloudPopUpComponent } from './tag-cloud-pop-up/tag-cloud-pop-up.component';
 import { TagCloudDataService, TagCloudDataTagEntry } from '../../../services/util/tag-cloud-data.service';
 import { WsRoomService } from '../../../services/websockets/ws-room.service';
@@ -318,7 +318,8 @@ export class TagCloudComponent implements OnInit, OnDestroy, AfterContentInit {
           if (rotation === null || this._currentSettings.randomAngles) {
             rotation = Math.floor(Math.random() * 30 - 15);
           }
-          const filteredTag = tag.replace(maskedCharsRegex, '').trim();
+          const filteredTag = tag.replace(maskedCharsRegex, '')
+            .replace(regexMaskKeyword, '').replace(/ +/, ' ').trim();
           newElements.push(new TagComment(filteredTag, tag, rotation, tagData.weight, tagData, newElements.length));
         }
       }
diff --git a/src/app/services/util/profanity-filter.service.ts b/src/app/services/util/profanity-filter.service.ts
index c77e5bd5eb45437f03204879db9bea16ea08ad82..3d710236f1c748f182ee6de2f2463f3ed72e834b 100644
--- a/src/app/services/util/profanity-filter.service.ts
+++ b/src/app/services/util/profanity-filter.service.ts
@@ -70,34 +70,33 @@ export class ProfanityFilterService {
                        censorPartialWordsCheck: boolean,
                        censorLanguageSpecificCheck: boolean,
                        lang?: string): [string, boolean] {
-    let filteredString = str;
-    let profWords = [];
+    let profWords: any[];
     if (censorLanguageSpecificCheck) {
       profWords = BadWords[(lang !== 'AUTO' ? lang.toLowerCase() : localStorage.getItem('currentLang'))];
     } else {
       profWords = this.profanityWords;
     }
-    str = str.replace(new RegExp(/[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi), '');
-    const toCensoredString = censorPartialWordsCheck ? str.toLowerCase() : str.toLowerCase().split(/[\s,.]+/);
+    const list = profWords.concat(this.getProfanityListFromStorage());
+    if (list.length < 1) {
+      return [str, false];
+    }
+    const escapeRegex = /[.*+\-?^${}()|\[\]\\]/g;
+    const censoredWords = list
+      .reduce((acc, elem) => acc + (acc.length > 1 ? '|' : '') + elem.replace(escapeRegex, '\\$&'), '(') + ')';
+    const regex = new RegExp(censorPartialWordsCheck ? censoredWords : '\\b' + censoredWords + '\\b', 'gmi');
+    let result = '';
     let censored = false;
-    profWords.concat(this.getProfanityListFromStorage()).forEach(word => {
-      if (toCensoredString.includes(word)) {
-        filteredString = this.replaceString(filteredString, word, this.generateCensoredWord(word.length));
-        censored = true;
+    let m: RegExpExecArray;
+    let lastIndex = 0;
+    while ((m = regex.exec(str)) !== null) {
+      result += str.substring(lastIndex, m.index) + '*'.repeat(regex.lastIndex - m.index);
+      lastIndex = regex.lastIndex;
+      censored = true;
+      if (m.index === regex.lastIndex) {
+        regex.lastIndex++;
       }
-    });
-    return [filteredString, censored];
-  }
-
-  private replaceString(str: string, search: string, replace: string) {
-    return str.replace(new RegExp(search, 'gi'), replace);
-  }
-
-  private generateCensoredWord(count: number) {
-    let res = '';
-    for (let i = 0; i < count; i++) {
-      res += '*';
     }
-    return res;
+    result += str.substring(lastIndex);
+    return [result, censored];
   }
 }
diff --git a/src/app/services/util/topic-cloud-admin.service.ts b/src/app/services/util/topic-cloud-admin.service.ts
index bcd43931b9af8300960728f5a55e255a05d755e3..0ab7787b47a6d2078eeb16671339589aa0daf15e 100644
--- a/src/app/services/util/topic-cloud-admin.service.ts
+++ b/src/app/services/util/topic-cloud-admin.service.ts
@@ -17,6 +17,8 @@ import { UserRole } from '../../models/user-roles.enum';
 import { CloudParameters } from '../../utils/cloud-parameters';
 import { RoomDataService } from './room-data.service';
 
+export const regexMaskKeyword = /\b(frage|antwort|aufgabe|hallo|test|bzw|muss|more to come)\b/gmi;
+
 @Injectable({
   providedIn: 'root',
 })
@@ -59,7 +61,6 @@ export class TopicCloudAdminService {
                                   roomDataService: RoomDataService,
                                   config: TopicCloudAdminData,
                                   keywordFunc: (SpacyKeyword, boolean) => void) {
-    const regexMaskKeyword = /\b(frage|antwort|aufgabe|hallo|test|bzw|muss|more to come)\b/gmi;
     let source = comment.keywordsFromQuestioner;
     let censored = roomDataService.getCensoredInformation(comment).userKeywordsCensored;
     let isFromQuestioner = true;
@@ -80,8 +81,7 @@ export class TopicCloudAdminService {
     const wantedLabels = config.wantedLabels[comment.language.toLowerCase()];
     for (let i = 0; i < source.length; i++) {
       const keyword = source[i];
-      keyword.text = keyword.text.replace(regexMaskKeyword, '').replace(/ +/, ' ');
-      if (keyword.text.trim().length < 1) {
+      if (keyword.text.replace(regexMaskKeyword, '').replace(/ +/, ' ').trim().length < 3) {
         continue;
       }
       if (censored[i]) {