This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new 7cd3e4316 [OPENMEETINGS-2753] Redo is added
7cd3e4316 is described below

commit 7cd3e431666ed762296b64a737d9dd5855c0535b
Author: Maxim Solodovnik <solomax...@gmail.com>
AuthorDate: Mon Dec 19 11:20:32 2022 +0700

    [OPENMEETINGS-2753] Redo is added
---
 .../db/manager/IWhiteboardManager.java             |   3 +-
 openmeetings-web/src/main/front/wb/src/wb-tools.js |   3 +
 .../web/app/Application.properties.xml             |   3 +-
 .../web/app/Application_ar.properties.xml          |   3 +-
 .../web/app/Application_bg.properties.xml          |   3 +-
 .../web/app/Application_bn.properties.xml          |   3 +-
 .../web/app/Application_ca.properties.xml          |   3 +-
 .../web/app/Application_cs.properties.xml          |   3 +-
 .../web/app/Application_da.properties.xml          |   3 +-
 .../web/app/Application_de.properties.xml          |   3 +-
 .../web/app/Application_el.properties.xml          |   3 +-
 .../web/app/Application_es.properties.xml          |   3 +-
 .../web/app/Application_fa.properties.xml          |   3 +-
 .../web/app/Application_fi.properties.xml          |   3 +-
 .../web/app/Application_fr.properties.xml          |   3 +-
 .../web/app/Application_gl.properties.xml          |   3 +-
 .../web/app/Application_he.properties.xml          |   3 +-
 .../web/app/Application_hi.properties.xml          |   3 +-
 .../web/app/Application_hu.properties.xml          |   3 +-
 .../web/app/Application_id.properties.xml          |   3 +-
 .../web/app/Application_it.properties.xml          |  27 +-
 .../web/app/Application_ja.properties.xml          |   3 +-
 .../web/app/Application_ko.properties.xml          |   3 +-
 .../web/app/Application_ku.properties.xml          |   3 +-
 .../web/app/Application_lo.properties.xml          |   3 +-
 .../web/app/Application_nl.properties.xml          |   3 +-
 .../web/app/Application_pl.properties.xml          |   3 +-
 .../web/app/Application_pt.properties.xml          |   3 +-
 .../web/app/Application_pt_BR.properties.xml       |   3 +-
 .../web/app/Application_ru.properties.xml          |   3 +-
 .../web/app/Application_sk.properties.xml          |   3 +-
 .../web/app/Application_sv.properties.xml          |   3 +-
 .../web/app/Application_ta.properties.xml          |   3 +-
 .../web/app/Application_th.properties.xml          |   3 +-
 .../web/app/Application_tk.properties.xml          |   3 +-
 .../web/app/Application_tr.properties.xml          |   3 +-
 .../web/app/Application_uk.properties.xml          |   3 +-
 .../web/app/Application_ur.properties.xml          |   3 +-
 .../web/app/Application_zh_CN.properties.xml       |   3 +-
 .../web/app/Application_zh_TW.properties.xml       |   3 +-
 .../openmeetings/web/app/WhiteboardManager.java    |   6 +-
 .../openmeetings/web/room/wb/InterviewWbPanel.java |   6 -
 .../openmeetings/web/room/wb/UndoObject.java       |  18 +-
 .../apache/openmeetings/web/room/wb/WbAction.java  |   1 +
 .../apache/openmeetings/web/room/wb/WbPanel.html   |   3 +-
 .../apache/openmeetings/web/room/wb/WbPanel.java   | 484 ++++++++++++---------
 openmeetings-web/src/main/webapp/css/raw-wb.css    |   5 +-
 .../openmeetings/webservice/WbWebService.java      |   2 +-
 48 files changed, 402 insertions(+), 267 deletions(-)

diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/manager/IWhiteboardManager.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/manager/IWhiteboardManager.java
index 9b0323553..2d7cdc2d6 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/manager/IWhiteboardManager.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/manager/IWhiteboardManager.java
@@ -19,7 +19,6 @@
 package org.apache.openmeetings.db.manager;
 
 import java.util.function.BiConsumer;
-import java.util.function.Consumer;
 
 import org.apache.openmeetings.db.dto.room.Whiteboard;
 import org.apache.openmeetings.db.dto.room.Whiteboards;
@@ -29,6 +28,6 @@ import com.github.openjson.JSONArray;
 public interface IWhiteboardManager {
        Whiteboards get(Long roomId);
        void reset(Long roomId, Long userId);
-       void clearAll(Long roomId, long wbId, Consumer<Whiteboard> consumer);
+       void clearAll(Long roomId, long wbId, boolean redo, 
BiConsumer<Whiteboard, Boolean> consumer);
        void cleanSlide(Long roomId, long wbId, int slide, 
BiConsumer<Whiteboard, JSONArray> consumer);
 }
diff --git a/openmeetings-web/src/main/front/wb/src/wb-tools.js 
b/openmeetings-web/src/main/front/wb/src/wb-tools.js
index e299fa5e6..b4c9cb5f4 100644
--- a/openmeetings-web/src/main/front/wb/src/wb-tools.js
+++ b/openmeetings-web/src/main/front/wb/src/wb-tools.js
@@ -361,6 +361,9 @@ module.exports = class WbTools {
                                        
tools.find('.om-icon.undo').click(function() {
                                                OmUtil.wbAction({action: 
'undo', data: {wbId: wb.getId()}});
                                        });
+                                       
tools.find('.om-icon.redo').click(function() {
+                                               OmUtil.wbAction({action: 
'redo', data: {wbId: wb.getId()}});
+                                       });
                                        _initSettings();
                                        _initMath();
                                case Role.NONE:
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml
index 7ab5e50a2..dd9f98409 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[OK]]></entry>
        <entry key="59"><![CDATA[Language]]></entry>
        <entry key="62"><![CDATA[Clear whiteboard]]></entry>
-       <entry key="70"><![CDATA[Undo]]></entry>
        <entry key="72"><![CDATA[Select an object]]></entry>
        <entry key="73"><![CDATA[Text]]></entry>
        <entry key="74"><![CDATA[Paint]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Undo]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ar.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ar.properties.xml
index a990ce8bc..57f077bf2 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ar.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ar.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[موافق]]></entry>
        <entry key="59"><![CDATA[اللغة]]></entry>
        <entry key="62"><![CDATA[مسح اللوح الابيض]]></entry>
-       <entry key="70"><![CDATA[الغاء]]></entry>
        <entry key="72"><![CDATA[اختر جسم]]></entry>
        <entry key="73"><![CDATA[النص]]></entry>
        <entry key="74"><![CDATA[الطلاء]]></entry>
@@ -972,6 +971,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="wb.tool.math.formula"><![CDATA[صيغ الرياضيات]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[دليل بناء الجملة 
الرياضاتيه]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[الغاء]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[تبييض]]></entry>
        <entry key="widget.recent.desc"><![CDATA[تعرض هذه الأقسام الغرف التي 
فتحتها مؤخرًا]]></entry>
        <entry key="widget.recent.title"><![CDATA[الغرف الحديثة]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bg.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bg.properties.xml
index 6d5908b37..d0bfc4e4d 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bg.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bg.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[ОК]]></entry>
        <entry key="59"><![CDATA[Език:]]></entry>
        <entry key="62"><![CDATA[Изчистване на дъската]]></entry>
-       <entry key="70"><![CDATA[Стъпка назад]]></entry>
        <entry key="72"><![CDATA[Маркиране на обект]]></entry>
        <entry key="73"><![CDATA[Текст]]></entry>
        <entry key="74"><![CDATA[Рисуване]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Стъпка назад]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bn.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bn.properties.xml
index e08f05bbb..943964a62 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bn.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bn.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[ঠিক আছে]]></entry>
        <entry key="59"><![CDATA[ভাষা]]></entry>
        <entry key="62"><![CDATA[হোয়াইটবোর্ড সাফ করুন]]></entry>
-       <entry key="70"><![CDATA[আনডু]]></entry>
        <entry key="72"><![CDATA[একটি বস্তু নির্ধারন করুন]]></entry>
        <entry key="73"><![CDATA[লিখিত]]></entry>
        <entry key="74"><![CDATA[অংকন]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[আনডু]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ca.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ca.properties.xml
index 8c06aa11d..e56508a89 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ca.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ca.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[OK]]></entry>
        <entry key="59"><![CDATA[Idioma:]]></entry>
        <entry key="62"><![CDATA[Eliminar pissarra]]></entry>
-       <entry key="70"><![CDATA[Desfer]]></entry>
        <entry key="72"><![CDATA[Seleccionar un objecte]]></entry>
        <entry key="73"><![CDATA[Text]]></entry>
        <entry key="74"><![CDATA[Pintar]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Desfer]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_cs.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_cs.properties.xml
index 665801242..fd533655d 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_cs.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_cs.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[ok]]></entry>
        <entry key="59"><![CDATA[Jazyk:]]></entry>
        <entry key="62"><![CDATA[Smaž tabuli]]></entry>
-       <entry key="70"><![CDATA[Krok zpět]]></entry>
        <entry key="72"><![CDATA[Vyber Objekt]]></entry>
        <entry key="73"><![CDATA[Text]]></entry>
        <entry key="74"><![CDATA[Kreslení]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Krok zpět]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_da.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_da.properties.xml
index 99dffcd36..3fca24f1b 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_da.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_da.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[ok]]></entry>
        <entry key="59"><![CDATA[Sprog:]]></entry>
        <entry key="62"><![CDATA[Rens skrivebordet]]></entry>
-       <entry key="70"><![CDATA[Fortryd]]></entry>
        <entry key="72"><![CDATA[Vælg et objekt]]></entry>
        <entry key="73"><![CDATA[Tekst]]></entry>
        <entry key="74"><![CDATA[Mal/tegn]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Fortryd]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_de.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_de.properties.xml
index 4600b0921..03ec631ec 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_de.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_de.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[Ok]]></entry>
        <entry key="59"><![CDATA[Kurssprache:]]></entry>
        <entry key="62"><![CDATA[Zeichenbrett leeren]]></entry>
-       <entry key="70"><![CDATA[Rückgängig]]></entry>
        <entry key="72"><![CDATA[Markieren]]></entry>
        <entry key="73"><![CDATA[Text]]></entry>
        <entry key="74"><![CDATA[Frei zeichnen]]></entry>
@@ -976,6 +975,8 @@ Bitte am OM server {3} anmelden und sie unter 
Admininistration -> Gruppen prüfe
        <entry key="wb.tool.math.formula"><![CDATA[Mathe Formeln]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Anleitung zur LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://de.wikibooks.org/wiki/LaTeX-Kompendium:_Für_Mathematiker]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Rückgängig]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[Löschen]]></entry>
        <entry key="widget.recent.desc"><![CDATA[Hier finden Sie kürzlich 
benutzte Räume.]]></entry>
        <entry key="widget.recent.title"><![CDATA[kürzlich benutzte 
Räum]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_el.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_el.properties.xml
index c74655c17..aab8a8f18 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_el.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_el.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[Εντάξει]]></entry>
        <entry key="59"><![CDATA[Γλώσσα:]]></entry>
        <entry key="62"><![CDATA[Εκκαθάριση Πίνακα]]></entry>
-       <entry key="70"><![CDATA[Αναίρεση]]></entry>
        <entry key="72"><![CDATA[Επιλογή Αντικειμένου]]></entry>
        <entry key="73"><![CDATA[Κείμενο]]></entry>
        <entry key="74"><![CDATA[Ζωγραφική]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Αναίρεση]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_es.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_es.properties.xml
index 820a72a5d..e1c57ece6 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_es.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_es.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[Aceptar]]></entry>
        <entry key="59"><![CDATA[Idioma]]></entry>
        <entry key="62"><![CDATA[Borrar pizarra]]></entry>
-       <entry key="70"><![CDATA[Deshacer]]></entry>
        <entry key="72"><![CDATA[Seleccionar un objeto]]></entry>
        <entry key="73"><![CDATA[Texto]]></entry>
        <entry key="74"><![CDATA[Pintar]]></entry>
@@ -974,6 +973,8 @@ Por favor visite el {3} servidor de OM y compruébelo en 
Admin -> Grupos]]></ent
        <entry key="wb.tool.math.formula"><![CDATA[Fórmula matemática]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guía de sintaxis de 
LaTex]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Deshacer]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[Borrador]]></entry>
        <entry key="widget.recent.desc"><![CDATA[Esta sección presenta las 
salas que recientemente visitaste]]></entry>
        <entry key="widget.recent.title"><![CDATA[Salas recientes]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fa.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fa.properties.xml
index a7c6732ba..f5dd65af0 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fa.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fa.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[ادامه]]></entry>
        <entry key="59"><![CDATA[زبان:]]></entry>
        <entry key="62"><![CDATA[پاک کردن وایت بورد]]></entry>
-       <entry key="70"><![CDATA[بازگشت به قبل]]></entry>
        <entry key="72"><![CDATA[موضوع مورد نظر]]></entry>
        <entry key="73"><![CDATA[متن]]></entry>
        <entry key="74"><![CDATA[نقاشی کردن]]></entry>
@@ -967,6 +966,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[بازگشت به قبل]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[این بخش  اتاق هایی که اخیراً 
توسط شما باز شده نمایش می دهد]]></entry>
        <entry key="widget.recent.title"><![CDATA[اتاق های اخیر]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fi.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fi.properties.xml
index bae83bf9c..65e7ec05b 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fi.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fi.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[ok]]></entry>
        <entry key="59"><![CDATA[Kieli:]]></entry>
        <entry key="62"><![CDATA[Tyhjää kirjoitustaulu]]></entry>
-       <entry key="70"><![CDATA[Peru]]></entry>
        <entry key="72"><![CDATA[Valitse objekti]]></entry>
        <entry key="73"><![CDATA[Teksti]]></entry>
        <entry key="74"><![CDATA[Piirrä]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Peru]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fr.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fr.properties.xml
index 22f946df5..b73c3708c 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fr.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fr.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[Ok]]></entry>
        <entry key="59"><![CDATA[Langue :]]></entry>
        <entry key="62"><![CDATA[Nettoyer le tableau blanc]]></entry>
-       <entry key="70"><![CDATA[Annuler]]></entry>
        <entry key="72"><![CDATA[Sélectionner un objet]]></entry>
        <entry key="73"><![CDATA[Texte]]></entry>
        <entry key="74"><![CDATA[Dessiner]]></entry>
@@ -975,6 +974,8 @@ dans {1} jours. Si vous souhaitez sauvegarder cet 
enregistrement, veuillez le t
        <entry key="wb.tool.math.formula"><![CDATA[Formule 
mathématique]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide de la syntaxe 
LaTeX]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://fr.wikibooks.org/wiki/LaTeX/%C3%89crire_des_math%C3%A9matiques]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Annuler]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[Effacez]]></entry>
        <entry key="widget.recent.desc"><![CDATA[Cet espace affiche les salles 
que vous avez fréquenté récemment ]]></entry>
        <entry key="widget.recent.title"><![CDATA[Salles récentes]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_gl.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_gl.properties.xml
index 07b4a23a6..bba5f5613 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_gl.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_gl.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[Aceptar]]></entry>
        <entry key="59"><![CDATA[Idioma:]]></entry>
        <entry key="62"><![CDATA[Borrar o taboleiro]]></entry>
-       <entry key="70"><![CDATA[Desfacer]]></entry>
        <entry key="72"><![CDATA[Seleccionar un obxeto]]></entry>
        <entry key="73"><![CDATA[Texto]]></entry>
        <entry key="74"><![CDATA[Pintar]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Desfacer]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_he.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_he.properties.xml
index 485520eba..135b38c93 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_he.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_he.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[OK]]></entry>
        <entry key="59"><![CDATA[Language]]></entry>
        <entry key="62"><![CDATA[Clear whiteboard]]></entry>
-       <entry key="70"><![CDATA[Undo]]></entry>
        <entry key="72"><![CDATA[Select an object]]></entry>
        <entry key="73"><![CDATA[Text]]></entry>
        <entry key="74"><![CDATA[Paint]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Undo]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hi.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hi.properties.xml
index 5260769c7..72a73f9fc 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hi.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hi.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[OK]]></entry>
        <entry key="59"><![CDATA[Language]]></entry>
        <entry key="62"><![CDATA[Clear whiteboard]]></entry>
-       <entry key="70"><![CDATA[Undo]]></entry>
        <entry key="72"><![CDATA[Select an object]]></entry>
        <entry key="73"><![CDATA[Text]]></entry>
        <entry key="74"><![CDATA[Paint]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Undo]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hu.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hu.properties.xml
index 330535c04..ee2f98b16 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hu.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hu.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[Rendben]]></entry>
        <entry key="59"><![CDATA[Nyelv:]]></entry>
        <entry key="62"><![CDATA[Tábla törlése]]></entry>
-       <entry key="70"><![CDATA[Vissza]]></entry>
        <entry key="72"><![CDATA[Válassz objektumot]]></entry>
        <entry key="73"><![CDATA[Szöveg]]></entry>
        <entry key="74"><![CDATA[Rajz]]></entry>
@@ -961,6 +960,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Vissza]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_id.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_id.properties.xml
index ace2b48b6..4090525a7 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_id.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_id.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[ok]]></entry>
        <entry key="59"><![CDATA[Bahasa:]]></entry>
        <entry key="62"><![CDATA[hapus whiteboard]]></entry>
-       <entry key="70"><![CDATA[Batal]]></entry>
        <entry key="72"><![CDATA[Pilih Objek]]></entry>
        <entry key="73"><![CDATA[Tulisan]]></entry>
        <entry key="74"><![CDATA[Gambar]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Batal]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_it.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_it.properties.xml
index 6c422d26d..7d0e8aa99 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_it.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_it.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[ok]]></entry>
        <entry key="59"><![CDATA[Lingua:]]></entry>
        <entry key="62"><![CDATA[Cancella la lavagna]]></entry>
-       <entry key="70"><![CDATA[Annulla le modifiche]]></entry>
        <entry key="72"><![CDATA[Seleziona un'oggetto]]></entry>
        <entry key="73"><![CDATA[Testo]]></entry>
        <entry key="74"><![CDATA[Disegna]]></entry>
@@ -148,7 +147,7 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="306"><![CDATA[Impostazioni WebCam e Mic]]></entry>
        <entry key="308"><![CDATA[Esci]]></entry>
        <entry key="309"><![CDATA[Torna alle stanze]]></entry>
-       <entry key="310"><![CDATA[Logout]]></entry>
+       <entry key="310"><![CDATA[Esci]]></entry>
        <entry key="311"><![CDATA[Password dimenticata?]]></entry>
        <entry key="312"><![CDATA[Reimposta password]]></entry>
        <entry key="313"><![CDATA[Tramite indirizzo email]]></entry>
@@ -294,7 +293,7 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="815"><![CDATA[Dettagli evento]]></entry>
        <entry key="816"><![CDATA[Moderatori predefiniti]]></entry>
        <entry key="817"><![CDATA[Super]]></entry>
-       <entry key="823"><![CDATA[Se la Stanza è moderata, l'utente con 
permessi di Moderatore o Amministratore sarà automaticamente il Moderatore se 
entra nella Stanza. Se non vuoi questo e vuoi che solo alcuni utenti siano 
Moderatori usa la funzione di Moderatore predefinito. ]]></entry>
+       <entry key="823"><![CDATA[Se la Stanza è moderata, l'utente con 
permessi di Moderatore o Amministratore sarà automaticamente il Moderatore se 
entra nella Stanza. Se non vuoi questo e vuoi che solo alcuni utenti siano 
Moderatori usa la funzione di Moderatore predefinito.]]></entry>
        <entry key="828"><![CDATA[Se aggiungi un'organizzazione alla stanza 
solo gli utenti di questa organizzazione avranno accesso ad essa (Questo vale 
se il Flag Pubblico non è attivo!)]]></entry>
        <entry key="830"><![CDATA[Limitazioni]]></entry>
        <entry key="832"><![CDATA[Sei sicuro?]]></entry>
@@ -556,7 +555,7 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="admin.group.form.days"><![CDATA[giorni]]></entry>
        <entry key="admin.group.form.limited"><![CDATA[Limits enabled]]></entry>
        <entry key="admin.group.form.logo"><![CDATA[Logo]]></entry>
-       <entry key="admin.group.form.maxFilesSize"><![CDATA[Maximum files 
size]]></entry>
+       <entry key="admin.group.form.maxFilesSize"><![CDATA[Dimensione massima 
file]]></entry>
        <entry key="admin.group.form.maxRecordingsSize"><![CDATA[Massima 
dimensione della registrazione]]></entry>
        <entry key="admin.group.form.maxRooms"><![CDATA[Massimo numero di 
stanze]]></entry>
        <entry key="admin.group.form.minutes"><![CDATA[minutes]]></entry>
@@ -564,7 +563,7 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="admin.group.form.reminderDays"><![CDATA[Expire reminder 
sent in]]></entry>
        <entry key="admin.group.form.tag"><![CDATA[Tag]]></entry>
        <entry key="admin.group.new.users.notification.interval"><![CDATA[New 
user notification interval]]></entry>
-       <entry key="admin.oauth.attr.oauth"><![CDATA[OAuth User 
attribute]]></entry>
+       <entry key="admin.oauth.attr.oauth"><![CDATA[Attributo utente 
OAuth]]></entry>
        <entry key="admin.oauth.attr.om"><![CDATA[OM User attribute]]></entry>
        <entry key="admin.oauth.req.info.method"><![CDATA[Request info 
method]]></entry>
        <entry key="admin.oauth.req.token.method"><![CDATA[Request token 
method]]></entry>
@@ -581,7 +580,7 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="appointment.tab.advanced"><![CDATA[Avanzate]]></entry>
        <entry key="bad.captcha.text"><![CDATA[You have entered incorrect 
captcha text]]></entry>
        <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
-       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.lower"><![CDATA[Password insicura: almeno 1 
lettera minuscola è obbligatoria]]></entry>
        <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
        <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
        <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
@@ -589,13 +588,13 @@ see https://openmeetings.apache.org/LanguageEditor.html 
for Details
        <entry key="button.label.share"><![CDATA[Condividi]]></entry>
        <entry key="calendar.addCalendar"><![CDATA[Add External 
Calendar]]></entry>
        <entry key="calendar.defaultTitle"><![CDATA[New Calendar]]></entry>
-       <entry key="calendar.dialogTitle"><![CDATA[Calendar Details]]></entry>
+       <entry key="calendar.dialogTitle"><![CDATA[Dettagli 
calendario]]></entry>
        <entry key="calendar.error"><![CDATA[Error in making connection on the 
URL specified.]]></entry>
        <entry key="calendar.gcal"><![CDATA[Google Calendar]]></entry>
        <entry key="calendar.googleID"><![CDATA[Google Calendar ID]]></entry>
        <entry key="calendar.googleKey"><![CDATA[Google Calendar API 
key]]></entry>
        <entry key="calendar.sync"><![CDATA[Sync]]></entry>
-       <entry key="calendar.url"><![CDATA[External CalDAV Calendar 
URL]]></entry>
+       <entry key="calendar.url"><![CDATA[URL CalDAV esterno]]></entry>
        <entry key="camera.off"><![CDATA[Camera is off. Click to turn 
on.]]></entry>
        <entry key="camera.on"><![CDATA[Camera is on. Click to turn 
off.]]></entry>
        <entry key="captcha.text"><![CDATA[Captcha text]]></entry>
@@ -724,7 +723,7 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry 
key="install.wizard.params.step1.username.title"><![CDATA[Specifica un nome 
utente]]></entry>
        <entry 
key="install.wizard.params.step2.allowFrontendRegister"><![CDATA[Permetti 
auto-registrazione]]></entry>
        <entry 
key="install.wizard.params.step2.configuration"><![CDATA[Configurazione]]></entry>
-       <entry 
key="install.wizard.params.step2.createDefaultObjects"><![CDATA[Default DB 
objects of all types will be created (including Rooms, OAuth2 servers 
etc.)]]></entry>
+       <entry 
key="install.wizard.params.step2.createDefaultObjects"><![CDATA[Saranno creati 
oggetti predefiniti di DB di tutti i tipi (incluse stanze, servers OAuth2, 
etc.)]]></entry>
        <entry key="install.wizard.params.step2.defaultLangId"><![CDATA[Lingua 
predefinita]]></entry>
        <entry key="install.wizard.params.step2.mailAuthName"><![CDATA[Nome 
utente SMTP]]></entry>
        <entry 
key="install.wizard.params.step2.mailAuthName.title"><![CDATA[Specifica il nome 
utente per mail]]></entry>
@@ -854,7 +853,7 @@ please check <tt>openmeetings.log</tt> and contact 
OpenMeetings developers]]></e
        <entry key="microphone.off"><![CDATA[Microphone is off. Click to turn 
on.]]></entry>
        <entry key="microphone.on"><![CDATA[Microphone is on. Click to turn 
off.]]></entry>
        <entry key="my.room.conference"><![CDATA[Mia stanza 
conferenza]]></entry>
-       <entry key="my.room.presentation"><![CDATA[My presentation room (for 
1-120 users)]]></entry>
+       <entry key="my.room.presentation"><![CDATA[La mia stanza di 
presentazione (per 1-120 utenti)]]></entry>
        <entry key="network.test.click.play"><![CDATA[Clicca il pulsante play 
per il test]]></entry>
        <entry key="network.test.copy.log"><![CDATA[Copia il log nella 
clipboard]]></entry>
        <entry key="network.test.dwn"><![CDATA[Velocità Download]]></entry>
@@ -891,7 +890,7 @@ please check <tt>openmeetings.log</tt> and contact 
OpenMeetings developers]]></e
        <entry key="profile.invitations"><![CDATA[Inviti]]></entry>
        <entry key="ptt.info"><![CDATA[Your microphone is muted. You can hold 
Ctrl+Space (Cmd+Space) to temporary unmute it (Push-to-Talk)]]></entry>
        <entry key="recordings.root.group"><![CDATA[Group recordings]]></entry>
-       <entry key="register.privacy.accept"><![CDATA[By clicking 
"${register}", you agree to our ${link}.]]></entry>
+       <entry key="register.privacy.accept"><![CDATA[Facendo click su 
"${register}" vi dichiarate d'accordo con la nostra ${link}.]]></entry>
        <entry key="register.privacy.statement"><![CDATA[privacy 
statement]]></entry>
        <entry key="reset.whiteboard"><![CDATA[Reset Whiteboard]]></entry>
        <entry key="restricted.group.files"><![CDATA[Group files are 
restricted]]></entry>
@@ -935,11 +934,11 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="ulist.right.presenter.request"><![CDATA[Richiedi i permessi 
di presentatore]]></entry>
        <entry key="ulist.right.presenter.revoke"><![CDATA[Elimina i permessi 
di presentatore da questo utente]]></entry>
        <entry key="ulist.right.remote.grant"><![CDATA[Allow Remote Control 
(during screen sharing)]]></entry>
-       <entry key="ulist.right.remote.request"><![CDATA[Request remote control 
permission (during screen sharing)]]></entry>
+       <entry key="ulist.right.remote.request"><![CDATA[Richiedi permesso di 
controllo remoto (durante la condivisione dello schermo)]]></entry>
        <entry key="ulist.right.remote.revoke"><![CDATA[Remove user's Remote 
Control permission (during screen sharing)]]></entry>
        <entry key="ulist.right.share.grant"><![CDATA[Consenti all'utente di 
condividere/registrare lo schermo]]></entry>
        <entry key="ulist.right.share.request"><![CDATA[Richiedi il permesso di 
condividere/registrare lo schermo]]></entry>
-       <entry key="ulist.right.share.revoke"><![CDATA[Remove user's 
screenshare/record permission]]></entry>
+       <entry key="ulist.right.share.revoke"><![CDATA[Revoca permesso di 
condivisione schermo/registrazione all'utente]]></entry>
        <entry key="ulist.right.video.grant"><![CDATA[Consenti all'utente di 
utilizzare la telecamera]]></entry>
        <entry key="ulist.right.video.request"><![CDATA[Richiedi il permesso di 
utilizzare la telecamera]]></entry>
        <entry key="ulist.right.video.revoke"><![CDATA[Spegni la telecamera 
dell'utente e rimuovi l'autorizzazione]]></entry>
@@ -974,6 +973,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Annulla le modifiche]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Stanze recenti]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ja.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ja.properties.xml
index 72d1b8510..12796dec5 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ja.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ja.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[はい]]></entry>
        <entry key="59"><![CDATA[言語:]]></entry>
        <entry key="62"><![CDATA[ホワイトボードのクリア]]></entry>
-       <entry key="70"><![CDATA[取り消し]]></entry>
        <entry key="72"><![CDATA[オブジェクト選択]]></entry>
        <entry key="73"><![CDATA[文字列]]></entry>
        <entry key="74"><![CDATA[自由線]]></entry>
@@ -973,6 +972,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[数式]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[取り消し]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[あなたが最近開設した会議室を表示します。]]></entry>
        <entry key="widget.recent.title"><![CDATA[最近の会議室]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ko.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ko.properties.xml
index eacc1c6d2..5d7edd53f 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ko.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ko.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[네]]></entry>
        <entry key="59"><![CDATA[언어:]]></entry>
        <entry key="62"><![CDATA[칠판 지우기]]></entry>
-       <entry key="70"><![CDATA[원래대로 돌려놓다.]]></entry>
        <entry key="72"><![CDATA[물건을 선택해주십시요.]]></entry>
        <entry key="73"><![CDATA[원문]]></entry>
        <entry key="74"><![CDATA[페인트]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[원래대로 돌려놓다.]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ku.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ku.properties.xml
index 27941f874..a1dafe489 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ku.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ku.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[OK]]></entry>
        <entry key="59"><![CDATA[Language]]></entry>
        <entry key="62"><![CDATA[Clear whiteboard]]></entry>
-       <entry key="70"><![CDATA[Undo]]></entry>
        <entry key="72"><![CDATA[Select an object]]></entry>
        <entry key="73"><![CDATA[Text]]></entry>
        <entry key="74"><![CDATA[Paint]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Undo]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_lo.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_lo.properties.xml
index 98d54be26..90f758bc5 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_lo.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_lo.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[OK]]></entry>
        <entry key="59"><![CDATA[Language]]></entry>
        <entry key="62"><![CDATA[Clear whiteboard]]></entry>
-       <entry key="70"><![CDATA[Undo]]></entry>
        <entry key="72"><![CDATA[Select an object]]></entry>
        <entry key="73"><![CDATA[Text]]></entry>
        <entry key="74"><![CDATA[Paint]]></entry>
@@ -972,6 +971,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Undo]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_nl.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_nl.properties.xml
index a29873bf2..8cc24031e 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_nl.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_nl.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[OK]]></entry>
        <entry key="59"><![CDATA[Taal:]]></entry>
        <entry key="62"><![CDATA[Tekenbord schoonmaken]]></entry>
-       <entry key="70"><![CDATA[Ongedaan maken]]></entry>
        <entry key="72"><![CDATA[Selecteer een object]]></entry>
        <entry key="73"><![CDATA[Tekst]]></entry>
        <entry key="74"><![CDATA[Verf]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Ongedaan maken]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pl.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pl.properties.xml
index 7a5002a75..2cdfd524a 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pl.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pl.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[ok]]></entry>
        <entry key="59"><![CDATA[Język:]]></entry>
        <entry key="62"><![CDATA[Wyczyść tablicę]]></entry>
-       <entry key="70"><![CDATA[Cofnij]]></entry>
        <entry key="72"><![CDATA[Wskaż obiekt]]></entry>
        <entry key="73"><![CDATA[Tekst]]></entry>
        <entry key="74"><![CDATA[Malowanie]]></entry>
@@ -972,6 +971,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Wzór matematyczny]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Przewodnik po składni 
LaTeX]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Cofnij]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Ostatnie pokoje]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt.properties.xml
index aed665167..04fe17abb 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[ok]]></entry>
        <entry key="59"><![CDATA[Idioma:]]></entry>
        <entry key="62"><![CDATA[Limpar a lousa.]]></entry>
-       <entry key="70"><![CDATA[Desfazer]]></entry>
        <entry key="72"><![CDATA[Selecionar um objeto]]></entry>
        <entry key="73"><![CDATA[Texto]]></entry>
        <entry key="74"><![CDATA[Pintura]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Desfazer]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt_BR.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt_BR.properties.xml
index 225669fd0..a85a08612 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt_BR.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt_BR.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[ok]]></entry>
        <entry key="59"><![CDATA[Idioma:]]></entry>
        <entry key="62"><![CDATA[Limpar a lousa.]]></entry>
-       <entry key="70"><![CDATA[Desfazer]]></entry>
        <entry key="72"><![CDATA[Selecionar um objeto]]></entry>
        <entry key="73"><![CDATA[Texto]]></entry>
        <entry key="74"><![CDATA[Pintura]]></entry>
@@ -973,6 +972,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Desfazer]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ru.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ru.properties.xml
index fd800b432..f67309add 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ru.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ru.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[ОК]]></entry>
        <entry key="59"><![CDATA[Язык курса:]]></entry>
        <entry key="62"><![CDATA[Очистить доску]]></entry>
-       <entry key="70"><![CDATA[Отмена]]></entry>
        <entry key="72"><![CDATA[Выбрать объект]]></entry>
        <entry key="73"><![CDATA[Текст]]></entry>
        <entry key="74"><![CDATA[Рисование]]></entry>
@@ -973,6 +972,8 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="wb.tool.math.formula"><![CDATA[Математическая 
формула]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Инструкция по синтаксису 
LaTeX]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Вернуть]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Отмена]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[Корректор]]></entry>
        <entry key="widget.recent.desc"><![CDATA[Эта секция отображает комнаты 
в которые Вы недавно заходили]]></entry>
        <entry key="widget.recent.title"><![CDATA[Последние комнаты]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sk.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sk.properties.xml
index 41a7997a2..be7995299 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sk.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sk.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[OK]]></entry>
        <entry key="59"><![CDATA[Jazyk]]></entry>
        <entry key="62"><![CDATA[Zmazať tabuľu]]></entry>
-       <entry key="70"><![CDATA[Zrušiť]]></entry>
        <entry key="72"><![CDATA[Vybrať objekt]]></entry>
        <entry key="73"><![CDATA[Text]]></entry>
        <entry key="74"><![CDATA[Farba]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Zrušiť]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sv.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sv.properties.xml
index 2e4009400..246f18898 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sv.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sv.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[OK]]></entry>
        <entry key="59"><![CDATA[Språk]]></entry>
        <entry key="62"><![CDATA[Rensa vita tavlan]]></entry>
-       <entry key="70"><![CDATA[Ångra]]></entry>
        <entry key="72"><![CDATA[Välj ett objekt]]></entry>
        <entry key="73"><![CDATA[Text]]></entry>
        <entry key="74"><![CDATA[Måla]]></entry>
@@ -980,6 +979,8 @@ vänligen ladda ned den dessförrinnan. ]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Matematisk formel]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide till 
LaTeX-syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Ångra]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[Denna sektion visar rum 
nyligen skapade av dig]]></entry>
        <entry key="widget.recent.title"><![CDATA[Senaste rum]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ta.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ta.properties.xml
index 1a9ecbd65..86d319261 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ta.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ta.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[OK]]></entry>
        <entry key="59"><![CDATA[Language]]></entry>
        <entry key="62"><![CDATA[Clear whiteboard]]></entry>
-       <entry key="70"><![CDATA[Undo]]></entry>
        <entry key="72"><![CDATA[Select an object]]></entry>
        <entry key="73"><![CDATA[Text]]></entry>
        <entry key="74"><![CDATA[Paint]]></entry>
@@ -983,6 +982,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Undo]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_th.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_th.properties.xml
index 490b0bf64..5e217632a 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_th.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_th.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[ตกลง]]></entry>
        <entry key="59"><![CDATA[ภาษา:]]></entry>
        <entry key="62"><![CDATA[ลบไวท์บอร์ด]]></entry>
-       <entry key="70"><![CDATA[เลิกทำ]]></entry>
        <entry key="72"><![CDATA[เลือกรายการ]]></entry>
        <entry key="73"><![CDATA[ข้อความ]]></entry>
        <entry key="74"><![CDATA[ระบายสี]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[เลิกทำ]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tk.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tk.properties.xml
index 67b84b02d..f8197519a 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tk.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tk.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[OK]]></entry>
        <entry key="59"><![CDATA[Language]]></entry>
        <entry key="62"><![CDATA[Clear whiteboard]]></entry>
-       <entry key="70"><![CDATA[Undo]]></entry>
        <entry key="72"><![CDATA[Select an object]]></entry>
        <entry key="73"><![CDATA[Text]]></entry>
        <entry key="74"><![CDATA[Paint]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Undo]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tr.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tr.properties.xml
index 6bb027963..eb84ca12a 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tr.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tr.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[tamam]]></entry>
        <entry key="59"><![CDATA[Dil:]]></entry>
        <entry key="62"><![CDATA[Tahtayı temizle]]></entry>
-       <entry key="70"><![CDATA[Geri al]]></entry>
        <entry key="72"><![CDATA[Bir Nesne Seçin]]></entry>
        <entry key="73"><![CDATA[Metin]]></entry>
        <entry key="74"><![CDATA[Boyama]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Geri al]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_uk.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_uk.properties.xml
index cf61a133f..6e6fc2cd8 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_uk.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_uk.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[OK]]></entry>
        <entry key="59"><![CDATA[Мова:]]></entry>
        <entry key="62"><![CDATA[Очистити планшет]]></entry>
-       <entry key="70"><![CDATA[Відмінити]]></entry>
        <entry key="72"><![CDATA[Вибрати об'єкт]]></entry>
        <entry key="73"><![CDATA[Текст]]></entry>
        <entry key="74"><![CDATA[Малювання]]></entry>
@@ -972,6 +971,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Відмінити]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ur.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ur.properties.xml
index 7ab5e50a2..dd9f98409 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ur.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ur.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[OK]]></entry>
        <entry key="59"><![CDATA[Language]]></entry>
        <entry key="62"><![CDATA[Clear whiteboard]]></entry>
-       <entry key="70"><![CDATA[Undo]]></entry>
        <entry key="72"><![CDATA[Select an object]]></entry>
        <entry key="73"><![CDATA[Text]]></entry>
        <entry key="74"><![CDATA[Paint]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[Undo]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_CN.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_CN.properties.xml
index 90bfac2dd..4bdce2246 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_CN.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_CN.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[确定]]></entry>
        <entry key="59"><![CDATA[语言:]]></entry>
        <entry key="62"><![CDATA[清除白板]]></entry>
-       <entry key="70"><![CDATA[取消]]></entry>
        <entry key="72"><![CDATA[选择对象]]></entry>
        <entry key="73"><![CDATA[文本]]></entry>
        <entry key="74"><![CDATA[绘画]]></entry>
@@ -973,6 +972,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[取消]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_TW.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_TW.properties.xml
index c14357c32..e154396c7 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_TW.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_TW.properties.xml
@@ -53,7 +53,6 @@ see https://openmeetings.apache.org/LanguageEditor.html for 
Details
        <entry key="54"><![CDATA[设定好了]]></entry>
        <entry key="59"><![CDATA[語言 :]]></entry>
        <entry key="62"><![CDATA[清掉電子白板]]></entry>
-       <entry key="70"><![CDATA[撤消]]></entry>
        <entry key="72"><![CDATA[選擇對象]]></entry>
        <entry key="73"><![CDATA[全文]]></entry>
        <entry key="74"><![CDATA[繪畫]]></entry>
@@ -981,6 +980,8 @@ Please visit {3} OM server and check them under Admin -> 
Groups]]></entry>
        <entry key="wb.tool.math.formula"><![CDATA[Math formula]]></entry>
        <entry key="wb.tool.math.guide.lbl"><![CDATA[Guide to LaTeX 
Syntax]]></entry>
        <entry 
key="wb.tool.math.guide.url"><![CDATA[https://en.wikibooks.org/wiki/LaTeX/Mathematics]]></entry>
+       <entry key="wb.tool.redo"><![CDATA[Redo]]></entry>
+       <entry key="wb.tool.undo"><![CDATA[撤消]]></entry>
        <entry key="wb.tool.white-out"><![CDATA[White-Out]]></entry>
        <entry key="widget.recent.desc"><![CDATA[This sections displays rooms 
recently opened by you]]></entry>
        <entry key="widget.recent.title"><![CDATA[Recent Rooms]]></entry>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WhiteboardManager.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WhiteboardManager.java
index a67e10c37..cda6b6e36 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WhiteboardManager.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WhiteboardManager.java
@@ -205,13 +205,13 @@ public class WhiteboardManager implements 
IWhiteboardManager {
        }
 
        @Override
-       public void clearAll(Long roomId, long wbId, Consumer<Whiteboard> 
consumer) {
+       public void clearAll(Long roomId, long wbId, boolean redo, 
BiConsumer<Whiteboard, Boolean> addUndo) {
                Whiteboard wb = get(roomId).get(wbId);
                if (wb == null) {
                        return;
                }
-               if (consumer != null) {
-                       consumer.accept(wb);
+               if (addUndo != null) {
+                       addUndo.accept(wb, redo);
                }
                wb = clear(roomId, wbId);
                sendWbAll(roomId, WbAction.CLEAR_ALL, new 
JSONObject().put("wbId", wbId));
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/InterviewWbPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/InterviewWbPanel.java
index 07cf5f811..e6a6b49fa 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/InterviewWbPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/InterviewWbPanel.java
@@ -21,7 +21,6 @@ package org.apache.openmeetings.web.room.wb;
 import java.io.IOException;
 
 import org.apache.openmeetings.db.entity.basic.Client;
-import org.apache.openmeetings.db.entity.file.BaseFileItem;
 import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
@@ -44,11 +43,6 @@ public class InterviewWbPanel extends AbstractWbPanel {
                return rp.getClient().hasRight(Right.MODERATOR) ? 
Right.MODERATOR.name() : ROLE_NONE;
        }
 
-       @Override
-       public void sendFileToWb(final BaseFileItem fi, boolean clean) {
-               //no-op
-       }
-
        @Override
        public void processWbAction(WbAction a, JSONObject obj, 
IPartialPageRequestHandler handler) throws IOException {
                Client c = rp.getClient();
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/UndoObject.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/UndoObject.java
index f8416babf..5771d8713 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/UndoObject.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/UndoObject.java
@@ -33,19 +33,33 @@ public class UndoObject implements Serializable {
                , REMOVE
                , MODIFY
        }
+       private final WbAction action;
+       private final String origObject;
        private final Type type;
        private final String object;
 
-       public UndoObject(Type type, JSONObject obj) {
+       public UndoObject(WbAction action, JSONObject origObj, Type type, 
JSONObject obj) {
+               this.action = action;
+               this.origObject = origObj.toString(new NullStringer());
                this.type = type;
                this.object = obj.toString(new NullStringer());
        }
 
-       public UndoObject(Type type, JSONArray arr) {
+       public UndoObject(WbAction action, JSONObject origObj, Type type, 
JSONArray arr) {
+               this.action = action;
+               this.origObject = origObj.toString(new NullStringer());
                this.type = type;
                this.object = arr.toString(new NullStringer());
        }
 
+       public WbAction getAction() {
+               return action;
+       }
+
+       public JSONObject getOrigObject() {
+               return new JSONObject(origObject);
+       }
+
        public Type getType() {
                return type;
        }
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbAction.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbAction.java
index f0a1f297e..6ac562b3d 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbAction.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbAction.java
@@ -34,6 +34,7 @@ public enum WbAction {
        , SAVE("save")
        , LOAD("load")
        , UNDO("undo")
+       , REDO("redo")
        , SET_SIZE("setSize")
        , DOWNLOAD("download")
        , START_RECORDING("startRecording")
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
index 74e87531b..8a45d0765 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
@@ -138,7 +138,8 @@
                                data-btn-ok-class="btn btn-sm btn-danger"
                                data-btn-ok-icon-class="fas 
fa-exclamation-triangle"></div>
                        <div wicket:message="title:199" class="clickable 
om-icon big save"></div>
-                       <div wicket:message="title:70" class="clickable om-icon 
big undo"></div>
+                       <div wicket:message="title:wb.tool.undo" 
class="clickable om-icon big undo"></div>
+                       <div wicket:message="title:wb.tool.redo" 
class="clickable om-icon big redo"></div>
 
                        <div wicket:message="title:72" class="clickable om-icon 
big pointer"></div>
                        <div wicket:message="title:557" class="clickable 
om-icon big apointer"></div>
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
index 1b830283b..b21a2a723 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
@@ -46,7 +46,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.function.Consumer;
-import java.util.function.Function;
+import java.util.function.UnaryOperator;
 
 import org.apache.openmeetings.db.dao.file.FileItemDao;
 import org.apache.openmeetings.db.dto.room.Whiteboard;
@@ -73,7 +73,7 @@ import 
org.apache.wicket.request.resource.JavaScriptResourceReference;
 import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.Strings;
-import org.danekja.java.util.function.serializable.SerializableConsumer;
+import org.danekja.java.util.function.serializable.SerializableBiConsumer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -94,6 +94,7 @@ public class WbPanel extends AbstractWbPanel {
        private final Long roomId;
        private long wb2save = -1;
        private final Map<Long, Deque<UndoObject>> undoList = new HashMap<>();
+       private final Map<Long, Deque<UndoObject>> redoList = new HashMap<>();
        private final NameDialog fileName = new NameDialog("filename") {
                private static final long serialVersionUID = 1L;
 
@@ -123,10 +124,15 @@ public class WbPanel extends AbstractWbPanel {
                        return new ResourceModel("144");
                }
        };
-       private final SerializableConsumer<Whiteboard> addUndo = wb -> {
+       private final SerializableBiConsumer<Whiteboard, Boolean> addUndo = 
(wb, redo) -> {
                JSONArray arr = getArray(wb.toJson(), null);
                if (arr.length() != 0) {
-                       addUndo(wb.getId(), new 
UndoObject(UndoObject.Type.REMOVE, arr));
+                       if (!redo) {
+                               cleanRedo(wb.getId());
+                       }
+                       addUndo(wb.getId(), new UndoObject(WbAction.CLEAR_ALL
+                                       , new JSONObject().put("wbId", 
wb.getId())
+                                       , UndoObject.Type.REMOVE, arr));
                }
        };
        @SpringBean
@@ -161,9 +167,9 @@ public class WbPanel extends AbstractWbPanel {
        @Override
        void internalWbLoad(StringBuilder sb) {
                Long langId = rp.getClient().getUser().getLanguageId();
-               wbm.initFiles(rp.getRoom(), langId, (wbs, wbIdx, roomFiles) -> {
-                       roomFiles.forEach(rf -> addFileToWb(wbs, wbIdx, 
rf.getFile(), false, false));
-               });
+               wbm.initFiles(rp.getRoom(), langId, (wbs, wbIdx, roomFiles)
+                               -> roomFiles.forEach(rf -> addFileToWb(wbs, 
wbIdx, rf.getFile(), false, false))
+               );
                Whiteboards wbs = wbm.get(roomId, langId);
                loadWhiteboards(sb, rp.getClient(), wbs, wbm.list(roomId));
                JSONObject wbj = getWbJson(wbs.getActiveWb());
@@ -188,13 +194,31 @@ public class WbPanel extends AbstractWbPanel {
                if (c == null) {
                        return;
                }
+               doAction(c, a, obj, false, handler);
+       }
+
+       private void doAction(Client c, WbAction a, JSONObject obj, boolean 
redo, IPartialPageRequestHandler handler) throws IOException {
+               if (processActionGeneral(c, a, obj, handler)) {
+                       return;
+               }
+               //presenter-right
+               if (c.hasRight(Right.PRESENTER)) {
+                       processActionPresenter(c, a, obj, redo, handler);
+               }
+               //wb-right
+               if (c.hasRight(Right.PRESENTER) || 
c.hasRight(Right.WHITEBOARD)) {
+                       processActionWhiteboard(c, a, obj, false, handler);
+               }
+       }
+
+       private boolean processActionGeneral(Client c, WbAction a, JSONObject 
obj, IPartialPageRequestHandler handler) throws IOException {
                switch (a) {
                        case CREATE_OBJ, MODIFY_OBJ:
                        {
                                JSONObject o = obj.optJSONObject("obj");
                                if (o != null && 
"pointer".equals(o.getString(ATTR_OMTYPE))) {
                                        sendWbOthers(a, obj);
-                                       return;
+                                       return true;
                                }
                        }
                                break;
@@ -205,7 +229,7 @@ public class WbPanel extends AbstractWbPanel {
                                if (moder && 
!r.isHidden(RoomElement.ACTION_MENU)) {
                                        rp.startDownload(handler, 
obj.getString("type"), obj.getString("fuid"));
                                }
-                               return;
+                               return true;
                        }
                        case LOAD_VIDEOS:
                        {
@@ -232,200 +256,227 @@ public class WbPanel extends AbstractWbPanel {
                                }
                                sb.append(arr.toString()).append(");");
                                handler.appendJavaScript(sb);
-                               return;
+                               return true;
                        }
                        default:
                                break;
                }
+               return false;
+       }
 
-               //presenter-right
-               if (c.hasRight(Right.PRESENTER)) {
-                       switch (a) {
-                               case CREATE_WB:
-                               {
-                                       Whiteboard wb = wbm.add(roomId, 
c.getUser().getLanguageId());
-                                       sendWbAll(WbAction.CREATE_WB, 
wb.getAddJson());
-                               }
-                                       break;
-                               case REMOVE_WB:
-                               {
-                                       long id = obj.optLong("wbId", -1);
-                                       if (id > -1) {
-                                               long prevId = 
obj.optLong("prevWbId", -1);
-                                               wbm.remove(roomId, id, prevId);
-                                               sendWbAll(WbAction.REMOVE_WB, 
obj);
-                                       }
-                               }
-                                       break;
-                               case ACTIVATE_WB:
-                               {
-                                       long wbId = obj.optLong("wbId", -1);
-                                       if (wbId > -1) {
-                                               wbm.activate(roomId, wbId);
-                                               sendWbAll(WbAction.ACTIVATE_WB, 
obj);
-                                       }
-                               }
-                                       break;
-                               case RENAME_WB:
-                               {
-                                       Whiteboard wb = 
wbm.get(roomId).get(obj.optLong("wbId", -1));
-                                       if (wb != null) {
-                                               wbm.update(roomId, 
wb.setName(obj.getString("name")));
-                                               sendWbAll(WbAction.RENAME_WB, 
obj);
-                                       }
+       private void processActionPresenter(Client c, WbAction a, JSONObject 
obj, boolean redo, IPartialPageRequestHandler handler) throws IOException {
+               switch (a) {
+                       case CREATE_WB:
+                       {
+                               Whiteboard wb = wbm.add(roomId, 
c.getUser().getLanguageId());
+                               sendWbAll(WbAction.CREATE_WB, wb.getAddJson());
+                       }
+                               break;
+                       case REMOVE_WB:
+                       {
+                               long id = obj.optLong("wbId", -1);
+                               if (id > -1) {
+                                       long prevId = obj.optLong("prevWbId", 
-1);
+                                       wbm.remove(roomId, id, prevId);
+                                       sendWbAll(WbAction.REMOVE_WB, obj);
                                }
-                                       break;
-                               case SET_SLIDE:
-                               {
-                                       Whiteboard wb = 
wbm.get(roomId).get(obj.optLong("wbId", -1));
-                                       if (wb != null) {
-                                               
wb.setSlide(obj.optInt(ATTR_SLIDE, 0));
-                                               wbm.update(roomId, wb);
-                                               
sendWbOthers(WbAction.SET_SLIDE, obj);
-                                       }
+                       }
+                               break;
+                       case ACTIVATE_WB:
+                       {
+                               long wbId = obj.optLong("wbId", -1);
+                               if (wbId > -1) {
+                                       wbm.activate(roomId, wbId);
+                                       sendWbAll(WbAction.ACTIVATE_WB, obj);
                                }
-                                       break;
-                               case CLEAR_ALL:
-                               {
-                                       wbm.clearAll(roomId, 
obj.getLong("wbId"), addUndo);
+                       }
+                               break;
+                       case RENAME_WB:
+                       {
+                               Whiteboard wb = 
wbm.get(roomId).get(obj.optLong("wbId", -1));
+                               if (wb != null) {
+                                       wbm.update(roomId, 
wb.setName(obj.getString("name")));
+                                       sendWbAll(WbAction.RENAME_WB, obj);
                                }
-                                       break;
-                               case SET_SIZE:
-                               {
-                                       Whiteboard wb = 
wbm.get(roomId).get(obj.getLong("wbId"));
-                                       wb.setWidth(obj.getInt(ATTR_WIDTH));
-                                       wb.setHeight(obj.getInt(ATTR_HEIGHT));
-                                       wb.setZoom(obj.getDouble(ATTR_ZOOM));
-                                       
wb.setZoomMode(ZoomMode.valueOf(obj.getString("zoomMode")));
+                       }
+                               break;
+                       case SET_SLIDE:
+                       {
+                               Whiteboard wb = 
wbm.get(roomId).get(obj.optLong("wbId", -1));
+                               if (wb != null) {
+                                       wb.setSlide(obj.optInt(ATTR_SLIDE, 0));
                                        wbm.update(roomId, wb);
-                                       sendWbOthers(WbAction.SET_SIZE, 
wb.getAddJson());
+                                       sendWbOthers(WbAction.SET_SLIDE, obj);
                                }
-                                       break;
-                               default:
-                                       break;
                        }
+                               break;
+                       case CLEAR_ALL:
+                       {
+                               wbm.clearAll(roomId, obj.getLong("wbId"), redo, 
addUndo);
+                       }
+                               break;
+                       case SET_SIZE:
+                       {
+                               Whiteboard wb = 
wbm.get(roomId).get(obj.getLong("wbId"));
+                               wb.setWidth(obj.getInt(ATTR_WIDTH));
+                               wb.setHeight(obj.getInt(ATTR_HEIGHT));
+                               wb.setZoom(obj.getDouble(ATTR_ZOOM));
+                               
wb.setZoomMode(ZoomMode.valueOf(obj.getString("zoomMode")));
+                               wbm.update(roomId, wb);
+                               sendWbOthers(WbAction.SET_SIZE, 
wb.getAddJson());
+                       }
+                               break;
+                       default:
+                               break;
                }
-               //wb-right
-               if (c.hasRight(Right.PRESENTER) || 
c.hasRight(Right.WHITEBOARD)) {
-                       switch (a) {
-                               case CREATE_OBJ:
-                               {
-                                       Whiteboard wb = 
wbm.get(roomId).get(obj.getLong("wbId"));
-                                       JSONObject o = obj.getJSONObject("obj");
-                                       wb.put(o.getString("uid"), o);
-                                       wbm.update(roomId, wb);
-                                       addUndo(wb.getId(), new 
UndoObject(UndoObject.Type.ADD, o));
+       }
+
+       private void processActionWhiteboard(Client c, WbAction a, JSONObject 
obj, boolean redo, IPartialPageRequestHandler handler) throws IOException {
+               switch (a) {
+                       case CREATE_OBJ:
+                       {
+                               Whiteboard wb = 
wbm.get(roomId).get(obj.getLong("wbId"));
+                               JSONObject o = obj.getJSONObject("obj");
+                               wb.put(o.getString("uid"), o);
+                               wbm.update(roomId, wb);
+                               addUndo(wb.getId(), new UndoObject(a, obj, 
UndoObject.Type.ADD, o));
+                               if (redo) {
+                                       sendWbAll(WbAction.CREATE_OBJ, obj);
+                               } else {
+                                       cleanRedo(wb.getId());
                                        sendWbOthers(WbAction.CREATE_OBJ, obj);
                                }
-                                       break;
-                               case MODIFY_OBJ:
-                               {
-                                       Whiteboard wb = 
wbm.get(roomId).get(obj.getLong("wbId"));
-                                       JSONArray arr = obj.getJSONArray("obj");
-                                       JSONArray undo = new JSONArray();
-                                       for (int i = 0; i < arr.length(); ++i) {
-                                               JSONObject oi = 
arr.getJSONObject(i);
-                                               String uid = 
oi.getString("uid");
-                                               JSONObject po = wb.get(uid);
-                                               if (po != null) {
-                                                       undo.put(po);
-                                                       wb.put(uid, oi);
-                                               }
-                                       }
-                                       if (arr.length() != 0) {
-                                               wbm.update(roomId, wb);
-                                               addUndo(wb.getId(), new 
UndoObject(UndoObject.Type.MODIFY, undo));
+                       }
+                               break;
+                       case MODIFY_OBJ:
+                       {
+                               Whiteboard wb = 
wbm.get(roomId).get(obj.getLong("wbId"));
+                               JSONArray arr = obj.getJSONArray("obj");
+                               JSONArray undo = new JSONArray();
+                               for (int i = 0; i < arr.length(); ++i) {
+                                       JSONObject oi = arr.getJSONObject(i);
+                                       String uid = oi.getString("uid");
+                                       JSONObject po = wb.get(uid);
+                                       if (po != null) {
+                                               undo.put(po);
+                                               wb.put(uid, oi);
                                        }
-                                       sendWbOthers(WbAction.MODIFY_OBJ, obj);
                                }
-                                       break;
-                               case DELETE_OBJ:
-                               {
-                                       Whiteboard wb = 
wbm.get(roomId).get(obj.getLong("wbId"));
-                                       JSONArray arr = obj.getJSONArray("obj");
-                                       JSONArray undo = new JSONArray();
-                                       for (int i = 0; i < arr.length(); ++i) {
-                                               JSONObject oi = 
arr.getJSONObject(i);
-                                               JSONObject u = 
wb.remove(oi.getString("uid"));
-                                               if (u != null) {
-                                                       undo.put(u);
-                                               }
+                               if (arr.length() != 0) {
+                                       wbm.update(roomId, wb);
+                                       addUndo(wb.getId(), new UndoObject(a, 
obj, UndoObject.Type.MODIFY, undo));
+                                       if (redo) {
+                                               sendWbAll(WbAction.MODIFY_OBJ, 
obj);
+                                       } else {
+                                               cleanRedo(wb.getId());
+                                               
sendWbOthers(WbAction.MODIFY_OBJ, obj);
                                        }
-                                       if (undo.length() != 0) {
-                                               wbm.update(roomId, wb);
-                                               addUndo(wb.getId(), new 
UndoObject(UndoObject.Type.REMOVE, undo));
+                               }
+                       }
+                               break;
+                       case DELETE_OBJ:
+                       {
+                               Whiteboard wb = 
wbm.get(roomId).get(obj.getLong("wbId"));
+                               JSONArray arr = obj.getJSONArray("obj");
+                               JSONArray undo = new JSONArray();
+                               for (int i = 0; i < arr.length(); ++i) {
+                                       JSONObject oi = arr.getJSONObject(i);
+                                       JSONObject u = 
wb.remove(oi.getString("uid"));
+                                       if (u != null) {
+                                               undo.put(u);
                                        }
-                                       sendWbAll(WbAction.DELETE_OBJ, obj);
                                }
-                                       break;
-                               case CLEAR_SLIDE:
-                               {
-                                       wbm.cleanSlide(roomId, 
obj.getLong("wbId"), obj.getInt(ATTR_SLIDE)
-                                                       , (wb, arr) -> 
addUndo(wb.getId(), new UndoObject(UndoObject.Type.REMOVE, arr)));
+                               if (undo.length() != 0) {
+                                       wbm.update(roomId, wb);
+                                       addUndo(wb.getId(), new UndoObject(a, 
obj, UndoObject.Type.REMOVE, undo));
+                               }
+                               if (!redo) {
+                                       cleanRedo(wb.getId());
                                }
-                                       break;
-                               case SAVE:
-                                       wb2save = obj.getLong("wbId");
-                                       fileName.show(handler);
-                                       break;
-                               case UNDO:
-                               {
-                                       Long wbId = obj.getLong("wbId");
-                                       UndoObject uo = getUndo(wbId);
-                                       if (uo != null) {
-                                               Whiteboard wb = 
wbm.get(roomId).get(wbId);
-                                               switch (uo.getType()) {
-                                                       case ADD:
-                                                       {
-                                                               JSONObject o = 
new JSONObject(uo.getObject());
-                                                               
wb.remove(o.getString("uid"));
-                                                               
wbm.update(roomId, wb);
-                                                               
sendWbAll(WbAction.DELETE_OBJ, obj.put("obj", new JSONArray().put(o)));
+                               sendWbAll(WbAction.DELETE_OBJ, obj);
+                       }
+                               break;
+                       case CLEAR_SLIDE:
+                       {
+                               wbm.cleanSlide(roomId, obj.getLong("wbId"), 
obj.getInt(ATTR_SLIDE)
+                                               , (wb, arr) -> {
+                                                       if (!redo) {
+                                                               
cleanRedo(wb.getId());
                                                        }
-                                                               break;
-                                                       case REMOVE:
-                                                       {
-                                                               JSONArray arr = 
new JSONArray(uo.getObject());
-                                                               for (int i  = 
0; i < arr.length(); ++i) {
-                                                                       
JSONObject o = arr.getJSONObject(i);
-                                                                       
wb.put(o.getString("uid"), o);
-                                                               }
-                                                               
wbm.update(roomId, wb);
-                                                               
sendWbAll(WbAction.CREATE_OBJ, obj.put("obj", new JSONArray(uo.getObject())));
+                                                       addUndo(wb.getId(), new 
UndoObject(a, obj, UndoObject.Type.REMOVE, arr));
+                                               });
+                       }
+                               break;
+                       case SAVE:
+                               wb2save = obj.getLong("wbId");
+                               fileName.show(handler);
+                               break;
+                       case UNDO:
+                       {
+                               Long wbId = obj.getLong("wbId");
+                               UndoObject uo = getUndo(wbId);
+                               if (uo != null) {
+                                       Whiteboard wb = 
wbm.get(roomId).get(wbId);
+                                       switch (uo.getType()) {
+                                               case ADD:
+                                               {
+                                                       JSONObject o = new 
JSONObject(uo.getObject());
+                                                       
wb.remove(o.getString("uid"));
+                                                       wbm.update(roomId, wb);
+                                                       
sendWbAll(WbAction.DELETE_OBJ, obj.put("obj", new JSONArray().put(o)));
+                                               }
+                                                       break;
+                                               case REMOVE:
+                                               {
+                                                       JSONArray arr = new 
JSONArray(uo.getObject());
+                                                       for (int i  = 0; i < 
arr.length(); ++i) {
+                                                               JSONObject o = 
arr.getJSONObject(i);
+                                                               
wb.put(o.getString("uid"), o);
                                                        }
-                                                               break;
-                                                       case MODIFY:
-                                                       {
-                                                               JSONArray arr = 
new JSONArray(uo.getObject());
-                                                               for (int i  = 
0; i < arr.length(); ++i) {
-                                                                       
JSONObject o = arr.getJSONObject(i);
-                                                                       
wb.put(o.getString("uid"), o);
-                                                               }
-                                                               
wbm.update(roomId, wb);
-                                                               
sendWbAll(WbAction.MODIFY_OBJ, obj.put("obj", arr));
+                                                       wbm.update(roomId, wb);
+                                                       
sendWbAll(WbAction.CREATE_OBJ, obj.put("obj", new JSONArray(uo.getObject())));
+                                               }
+                                                       break;
+                                               case MODIFY:
+                                               {
+                                                       JSONArray arr = new 
JSONArray(uo.getObject());
+                                                       for (int i  = 0; i < 
arr.length(); ++i) {
+                                                               JSONObject o = 
arr.getJSONObject(i);
+                                                               
wb.put(o.getString("uid"), o);
                                                        }
-                                                               break;
+                                                       wbm.update(roomId, wb);
+                                                       
sendWbAll(WbAction.MODIFY_OBJ, obj.put("obj", arr));
                                                }
+                                                       break;
                                        }
                                }
-                                       break;
-                               case VIDEO_STATUS:
-                               {
-                                       Whiteboard wb = 
wbm.get(roomId).get(obj.getLong("wbId"));
-                                       String uid = obj.getString("uid");
-                                       JSONObject po = wb.get(uid);
-                                       if (po != null && 
"Video".equals(po.getString(ATTR_OMTYPE))) {
-                                               JSONObject ns = 
obj.getJSONObject(PARAM_STATUS);
-                                               po.put(PARAM_STATUS, 
ns.put(PARAM_UPDATED, System.currentTimeMillis()));
-                                               wbm.update(roomId, wb.put(uid, 
po));
-                                               obj.put(ATTR_SLIDE, 
po.getInt(ATTR_SLIDE));
-                                               
sendWbAll(WbAction.VIDEO_STATUS, obj);
-                                       }
+                       }
+                               break;
+                       case REDO:
+                       {
+                               Long wbId = obj.getLong("wbId");
+                               UndoObject uo = getRedo(wbId);
+                               if (uo != null) {
+                                       processActionWhiteboard(c, 
uo.getAction(), uo.getOrigObject(), true, handler);
+                               }
+                       }
+                               break;
+                       case VIDEO_STATUS:
+                       {
+                               Whiteboard wb = 
wbm.get(roomId).get(obj.getLong("wbId"));
+                               String uid = obj.getString("uid");
+                               JSONObject po = wb.get(uid);
+                               if (po != null && 
"Video".equals(po.getString(ATTR_OMTYPE))) {
+                                       JSONObject ns = 
obj.getJSONObject(PARAM_STATUS);
+                                       po.put(PARAM_STATUS, 
ns.put(PARAM_UPDATED, System.currentTimeMillis()));
+                                       wbm.update(roomId, wb.put(uid, po));
+                                       obj.put(ATTR_SLIDE, 
po.getInt(ATTR_SLIDE));
+                                       sendWbAll(WbAction.VIDEO_STATUS, obj);
                                }
-                                       break;
-                               default:
-                                       break;
                        }
+                               break;
+                       default:
+                               break;
                }
        }
 
@@ -462,7 +513,7 @@ public class WbPanel extends AbstractWbPanel {
                return file;
        }
 
-       private static JSONArray getArray(JSONObject wb, Function<JSONObject, 
JSONObject> postprocess) {
+       private static JSONArray getArray(JSONObject wb, 
UnaryOperator<JSONObject> postprocess) {
                JSONObject items = wb.getJSONObject(ITEMS_KEY);
                JSONArray arr = new JSONArray();
                for (String uid : items.keySet()) {
@@ -493,28 +544,7 @@ public class WbPanel extends AbstractWbPanel {
                                //do nothing
                                break;
                        case WML_FILE:
-                       {
-                               File f = fi.getFile();
-                               if (f.exists() && f.isFile()) {
-                                       try (BufferedReader br = 
Files.newBufferedReader(f.toPath())) {
-                                               final boolean[] updated = 
{false};
-                                               JSONArray arr = getArray(new 
JSONObject(new JSONTokener(br)), o -> {
-                                                               
wb.put(o.getString("uid"), o);
-                                                               updated[0] = 
true;
-                                                               return 
addFileUrl(rp.getClient(), wbs.getUid(), o, bf -> updateWbSize(wb, bf));
-                                                       });
-                                               if (sendAndUpdate) {
-                                                       if (updated[0]) {
-                                                               
wbm.update(roomId, wb);
-                                                       }
-                                                       
sendWbAll(WbAction.SET_SIZE, wb.getAddJson());
-                                                       
sendWbAll(WbAction.LOAD, getObjWbJson(wb.getId(), arr));
-                                               }
-                                       } catch (Exception e) {
-                                               log.error("Unexpected error 
while loading WB", e);
-                                       }
-                               }
-                       }
+                               addWmlFileToWb(wbs, wb, fi, sendAndUpdate);
                                break;
                        case POLL_CHART:
                                break;
@@ -542,7 +572,7 @@ public class WbPanel extends AbstractWbPanel {
                                }
                                final String ruid = wbs.getUid();
                                if (clean) {
-                                       wbm.clearAll(roomId, wb.getId(), 
addUndo);
+                                       wbm.clearAll(roomId, wb.getId(), false, 
addUndo);
                                }
                                wb.put(wuid, file);
                                updateWbSize(wb, fi);
@@ -556,6 +586,29 @@ public class WbPanel extends AbstractWbPanel {
                }
        }
 
+       private void addWmlFileToWb(Whiteboards wbs, Whiteboard wb, final 
BaseFileItem fi, boolean sendAndUpdate) {
+               File f = fi.getFile();
+               if (f.exists() && f.isFile()) {
+                       try (BufferedReader br = 
Files.newBufferedReader(f.toPath())) {
+                               final boolean[] updated = {false};
+                               JSONArray arr = getArray(new JSONObject(new 
JSONTokener(br)), o -> {
+                                               wb.put(o.getString("uid"), o);
+                                               updated[0] = true;
+                                               return 
addFileUrl(rp.getClient(), wbs.getUid(), o, bf -> updateWbSize(wb, bf));
+                                       });
+                               if (sendAndUpdate) {
+                                       if (updated[0]) {
+                                               wbm.update(roomId, wb);
+                                       }
+                                       sendWbAll(WbAction.SET_SIZE, 
wb.getAddJson());
+                                       sendWbAll(WbAction.LOAD, 
getObjWbJson(wb.getId(), arr));
+                               }
+                       } catch (Exception e) {
+                               log.error("Unexpected error while loading WB", 
e);
+                       }
+               }
+       }
+
        private void sendFileToWb(Long wbId, final BaseFileItem fi, boolean 
clean) {
                if (isVisible()) {
                        Whiteboards wbs = wbm.get(roomId);
@@ -587,11 +640,40 @@ public class WbPanel extends AbstractWbPanel {
        }
 
        private UndoObject getUndo(Long wbId) {
-               if (wbId == null || !undoList.containsKey(wbId)) {
+               if (wbId == null) {
                        return null;
                }
                Deque<UndoObject> deq = undoList.get(wbId);
-               return deq.isEmpty() ? null : deq.pop();
+               if (deq == null || deq.isEmpty()) {
+                       return null;
+               }
+               UndoObject undoObj = deq.pop();
+               redoList
+                       .computeIfAbsent(wbId, id -> new LimitedLinkedList<>())
+                       .push(undoObj);
+               return undoObj;
+       }
+
+       private void cleanRedo(Long wbId) {
+               if (wbId == null) {
+                       return;
+               }
+               Deque<UndoObject> redoDeq = redoList.get(wbId);
+               if (redoDeq != null) {
+                       redoDeq.clear();
+               }
+       }
+
+       private UndoObject getRedo(Long wbId) {
+               if (wbId == null) {
+                       return null;
+               }
+               Deque<UndoObject> deq = redoList.get(wbId);
+               if (deq == null || deq.isEmpty()) {
+                       return null;
+               }
+               UndoObject redoObj = deq.pop();
+               return redoObj;
        }
 
        private static class LimitedLinkedList<T> extends LinkedList<T> {
diff --git a/openmeetings-web/src/main/webapp/css/raw-wb.css 
b/openmeetings-web/src/main/webapp/css/raw-wb.css
index c1d78326f..74c00f9f2 100644
--- a/openmeetings-web/src/main/webapp/css/raw-wb.css
+++ b/openmeetings-web/src/main/webapp/css/raw-wb.css
@@ -144,7 +144,10 @@ html[dir="rtl"] .room-block .sb-wb .wb-block {
        content: '\f0c7';
 }
 .room-block .sb-wb .wb-block .tools .om-icon.big.undo::before {
-       content: '\f0e2';
+       content: '\f3e5';
+}
+.room-block .sb-wb .wb-block .tools .om-icon.big.redo::before {
+       content: '\f064';
 }
 .room-block .sb-wb .wb-block .tools .om-icon.big.math::before {
        content: '\f534';
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/WbWebService.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/WbWebService.java
index f60db4436..2c88b72fd 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/WbWebService.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/WbWebService.java
@@ -154,7 +154,7 @@ public class WbWebService extends BaseWebService {
        {
                log.debug("[cleanWb] room id {}, wb id {}", roomId, wbId);
                return performCall(sid, User.Right.SOAP, sd -> {
-                       wbManager.clearAll(roomId, wbId, null);
+                       wbManager.clearAll(roomId, wbId, false, null);
                        return new ServiceResult("", Type.SUCCESS);
                });
        }

Reply via email to