diff --git a/AudioFilter/FilterAudioSubscriber.cpp b/AudioFilter/FilterAudioSubscriber.cpp
index 0ff8a27138b5f0fd7074687fd31b2ec666c07c34..f4542fee2245149e7b5c2533010edc6b04301da9 100644
--- a/AudioFilter/FilterAudioSubscriber.cpp
+++ b/AudioFilter/FilterAudioSubscriber.cpp
@@ -29,7 +29,7 @@ extern "C" {
 
 #include <pluglog.h>
 
-const std::string TAG = "filter";
+const std::string TAG = "Filter";
 const char sep = separator();
 
 namespace jami {
@@ -43,7 +43,7 @@ FilterAudioSubscriber::FilterAudioSubscriber(const std::string& dataPath, const
 FilterAudioSubscriber::~FilterAudioSubscriber()
 {
     std::ostringstream oss;
-    oss << "~filterMediaProcessor" << std::endl;
+    oss << "~FilterMediaProcessor" << std::endl;
     Plog::log(Plog::LogPriority::INFO, TAG, oss.str());
 }
 
diff --git a/AudioFilter/FilterAudioSubscriber.h b/AudioFilter/FilterAudioSubscriber.h
index 98ab5d4c4b270178366048a4d274f6b437f266cb..6fa9a4e8ae5108f74273741822b0bda3b7573550 100644
--- a/AudioFilter/FilterAudioSubscriber.h
+++ b/AudioFilter/FilterAudioSubscriber.h
@@ -45,7 +45,7 @@ public:
 
 private:
     // Observer pattern
-    Observable<AVFrame*>* observable_ = nullptr;
+    Observable<AVFrame*>* observable_{};
 
     // Data
     std::string path_;
diff --git a/AudioFilter/FilterMediaHandler.cpp b/AudioFilter/FilterMediaHandler.cpp
index 0c85734bd123ee5653d97d94c8cf4829d8b9a30a..3d978c28fb381ebf2b2e55b1b55e93940f0f522e 100644
--- a/AudioFilter/FilterMediaHandler.cpp
+++ b/AudioFilter/FilterMediaHandler.cpp
@@ -24,9 +24,9 @@
 #include <string_view>
 
 const char sep = separator();
-const std::string TAG = "filter";
+const std::string TAG = "Filter";
 
-#define NAME "filter"
+#define NAME "Filter"
 
 namespace jami {
 
diff --git a/AudioFilter/data/preferences.json b/AudioFilter/data/preferences.json
index c878d467696a813f5cedfa43124aa30b9ae34aa0..8da6414955c23d7c5768e3d1eafbe9edf9a3c130 100644
--- a/AudioFilter/data/preferences.json
+++ b/AudioFilter/data/preferences.json
@@ -6,7 +6,7 @@
         "title": "Impulse Response",
         "summary": "Choose a impulse response",
         "defaultValue": "average_space_ir_0.mp3",
-        "scope": "plugin, filter",
+        "scope": "plugin,Filter",
         "entryValues": [
             "average_space_ir_0.mp3",
             "rir_jack_lyons_lp2_96k.mp3",
diff --git a/AutoAnswer/BotChatHandler.cpp b/AutoAnswer/BotChatHandler.cpp
index 371e51ce1179374198aec96bc9520b0ba2f74aaf..fa70e4792ae6dbebefb40d6826fe8122bd4b1d44 100644
--- a/AutoAnswer/BotChatHandler.cpp
+++ b/AutoAnswer/BotChatHandler.cpp
@@ -23,9 +23,9 @@
 #include "pluglog.h"
 
 const char sep = separator();
-const std::string TAG = "bot";
+const std::string TAG = "Bot";
 
-#define NAME "bot"
+#define NAME "Bot"
 
 namespace jami {
 
@@ -37,14 +37,19 @@ BotChatHandler::BotChatHandler(const JAMI_PluginAPI* api,
 {
     preferences_ = preferences;
     setId(datapath_);
-    peerChatSubscriber_ = std::make_shared<BotPeerChatSubscriber>(api_, dataPath);
+    auto answerIt = preferences_.find("answer");
+    auto inTextIt = preferences_.find("inText");
+    if (answerIt != preferences_.end() && inTextIt != preferences_.end())
+        peerChatSubscriber_ = std::make_shared<BotPeerChatSubscriber>(api_,
+                                                                      answerIt->second,
+                                                                      inTextIt->second);
 };
 
 void
 BotChatHandler::notifyChatSubject(std::pair<std::string, std::string>& subjectConnection,
                                   chatSubjectPtr subject)
 {
-    if (subjects.find(subject) == subjects.end()) {
+    if (peerChatSubscriber_ && subjects.find(subject) == subjects.end()) {
         std::ostringstream oss;
         oss << "NEW SUBJECT: account = " << subjectConnection.first
             << " peer = " << subjectConnection.second << std::endl;
@@ -63,10 +68,14 @@ BotChatHandler::getChatHandlerDetails()
 void
 BotChatHandler::setPreferenceAttribute(const std::string& key, const std::string& value)
 {
-    auto it = preferences_.find(key);
-    if (it != preferences_.end()) {
-        if (preferences_[key] != value) {
-            preferences_[key] = value;
+    if (peerChatSubscriber_) {
+        auto it = preferences_.find(key);
+        if (it != preferences_.end() && it->second != value) {
+            it->second = value;
+            if (key == "answer")
+                peerChatSubscriber_->setAnswer(value);
+            if (key == "inText")
+                peerChatSubscriber_->setInText(value);
         }
     }
 }
@@ -74,24 +83,23 @@ BotChatHandler::setPreferenceAttribute(const std::string& key, const std::string
 bool
 BotChatHandler::preferenceMapHasKey(const std::string& key)
 {
-    return false;
+    return key == "answer" || key == "inText";
 }
 
 void
 BotChatHandler::detach(chatSubjectPtr subject)
 {
-    if (subjects.find(subject) != subjects.end()) {
+    auto it = subjects.find(subject);
+    if (it != subjects.end()) {
         subject->detach(peerChatSubscriber_.get());
-        subjects.erase(subject);
+        subjects.erase(it);
     }
 }
 
 BotChatHandler::~BotChatHandler()
 {
-    auto& copy(subjects);
-    for (const auto& subject : copy) {
+    for (const auto& subject : subjects) {
         detach(subject);
     }
-    copy.clear();
 }
 } // namespace jami
diff --git a/AutoAnswer/BotChatHandler.h b/AutoAnswer/BotChatHandler.h
index ee0f72fbca0fff0f7c435d523531b9ad9c2970e6..7b3eb78d2280fb476d49ff5bb91b0c961120bd9c 100644
--- a/AutoAnswer/BotChatHandler.h
+++ b/AutoAnswer/BotChatHandler.h
@@ -40,7 +40,7 @@ public:
     BotChatHandler(const JAMI_PluginAPI* api,
                    std::map<std::string, std::string>&& preferences,
                    std::string&& dataPath);
-    ~BotChatHandler() override;
+    ~BotChatHandler();
 
     virtual void notifyChatSubject(std::pair<std::string, std::string>& subjectConnection,
                                    chatSubjectPtr subject) override;
@@ -49,7 +49,7 @@ public:
     virtual void setPreferenceAttribute(const std::string& key, const std::string& value) override;
     virtual bool preferenceMapHasKey(const std::string& key) override;
 
-    std::shared_ptr<BotPeerChatSubscriber> peerChatSubscriber_;
+    std::shared_ptr<BotPeerChatSubscriber> peerChatSubscriber_{};
 
 private:
     const JAMI_PluginAPI* api_;
diff --git a/AutoAnswer/BotPeerChatSubscriber.cpp b/AutoAnswer/BotPeerChatSubscriber.cpp
index 0d30eb65362f57279644d6ea2feec6a2899c3059..f02b12103d740021359795ecdee20da21ccd839a 100644
--- a/AutoAnswer/BotPeerChatSubscriber.cpp
+++ b/AutoAnswer/BotPeerChatSubscriber.cpp
@@ -25,10 +25,14 @@ const std::string TAG = "bot";
 
 namespace jami {
 
-BotPeerChatSubscriber::BotPeerChatSubscriber(const JAMI_PluginAPI* api, std::string& textAnswer)
+BotPeerChatSubscriber::BotPeerChatSubscriber(const JAMI_PluginAPI* api,
+                                             const std::string& textAnswer,
+                                             const std::string& inText)
     : api_ {api}
-    , textAnswer_ {textAnswer}
-{}
+{
+    setAnswer(textAnswer);
+    setInText(inText);
+}
 
 BotPeerChatSubscriber::~BotPeerChatSubscriber()
 {
@@ -37,6 +41,18 @@ BotPeerChatSubscriber::~BotPeerChatSubscriber()
     Plog::log(Plog::LogPriority::INFO, TAG, oss.str());
 }
 
+void
+BotPeerChatSubscriber::setAnswer(const std::string& textAnswer)
+{
+    textAnswer_ = textAnswer;
+}
+
+void
+BotPeerChatSubscriber::setInText(const std::string& inText)
+{
+    inText_ = inText;
+}
+
 void
 BotPeerChatSubscriber::update(Observable<pluginMessagePtr>*, const pluginMessagePtr& message)
 {
@@ -44,10 +60,8 @@ BotPeerChatSubscriber::update(Observable<pluginMessagePtr>*, const pluginMessage
         if (message->direction) {
             std::map<std::string, std::string> sendMsg;
             for (auto& pair : message->data) {
-                if (pair.first == "text/plain" && pair.second == "hi") {
-                    std::ostringstream sendMsgStream;
-                    sendMsgStream << "HelloWorld from bot plugin";
-                    sendMsg[pair.first] = sendMsgStream.str();
+                if (pair.first == "text/plain" && pair.second == inText_) {
+                    sendMsg[pair.first] = textAnswer_;
                 }
             }
             if (!sendMsg.empty()) {
@@ -72,8 +86,9 @@ BotPeerChatSubscriber::attached(Observable<pluginMessagePtr>* observable)
 void
 BotPeerChatSubscriber::detached(Observable<pluginMessagePtr>* observable)
 {
-    if (observables_.find(observable) != observables_.end()) {
-        observables_.erase(observable);
+    auto it = observables_.find(observable);
+    if (it != observables_.end()) {
+        observables_.erase(it);
         std::ostringstream oss;
         oss << "::Detached()" << std::endl;
         Plog::log(Plog::LogPriority::INFO, TAG, oss.str());
diff --git a/AutoAnswer/BotPeerChatSubscriber.h b/AutoAnswer/BotPeerChatSubscriber.h
index faaffd3a2728904ce8060eba01c0c1a49e43bf5f..ca6416a82969f8579f5d7b6b7db386d903c7c20f 100644
--- a/AutoAnswer/BotPeerChatSubscriber.h
+++ b/AutoAnswer/BotPeerChatSubscriber.h
@@ -34,7 +34,9 @@ namespace jami {
 class BotPeerChatSubscriber : public Observer<pluginMessagePtr>
 {
 public:
-    BotPeerChatSubscriber(const JAMI_PluginAPI* api, std::string& textAnswer);
+    BotPeerChatSubscriber(const JAMI_PluginAPI* api,
+                          const std::string& textAnswer,
+                          const std::string& inText);
     ~BotPeerChatSubscriber();
     virtual void update(Observable<pluginMessagePtr>*, pluginMessagePtr const&) override;
     virtual void attached(Observable<pluginMessagePtr>*) override;
@@ -43,12 +45,15 @@ public:
     void sendText(std::string& accountId,
                   std::string& peerId,
                   std::map<std::string, std::string>& sendMsg);
+    void setAnswer(const std::string& textAnswer);
+    void setInText(const std::string& inText);
 
 protected:
     // Observer pattern
     std::set<Observable<pluginMessagePtr>*> observables_;
     bool isAttached {false};
     const JAMI_PluginAPI* api_;
-    std::string textAnswer_{};
+    std::string textAnswer_ {};
+    std::string inText_ {};
 };
 } // namespace jami
diff --git a/AutoAnswer/data/preferences.json b/AutoAnswer/data/preferences.json
index 1e3ec7217afba05e6dcd456b0e89ec7f17bf7b55..5552907d2551e684c3c4be5171563bb1061a7d13 100644
--- a/AutoAnswer/data/preferences.json
+++ b/AutoAnswer/data/preferences.json
@@ -1 +1,20 @@
-[ ]
+[
+    {
+        "category": "text",
+        "type": "EditText",
+        "key": "answer",
+        "title": "Bot Answer",
+        "summary": "Set bot text",
+        "defaultValue": "Hello World from bot preference",
+        "scope": "plugin,Bot"
+    },
+    {
+        "category": "text",
+        "type": "EditText",
+        "key": "inText",
+        "title": "Bot Trigger",
+        "summary": "Text that bot will answer to",
+        "defaultValue": "Hi",
+        "scope": "plugin,Bot"
+    }
+]
\ No newline at end of file
diff --git a/GreenScreen/videoSubscriber.h b/GreenScreen/videoSubscriber.h
index 5ca66180d2286944a186370a1343751331446964..8598feb48d88bb69befa0d5f88a48dcc15232ed8 100644
--- a/GreenScreen/videoSubscriber.h
+++ b/GreenScreen/videoSubscriber.h
@@ -67,7 +67,7 @@ public:
 
 private:
     // Observer pattern
-    Observable<AVFrame*>* observable_ = nullptr;
+    Observable<AVFrame*>* observable_{};
 
     // Data
     std::string path_;
diff --git a/HelloWorld/CenterCircleVideoSubscriber.h b/HelloWorld/CenterCircleVideoSubscriber.h
index 512d7f2d5b98096984a7fdc9472fc3b2445d43c6..e12d84c4c96486ee921b6f16b9d816020f5bf62d 100644
--- a/HelloWorld/CenterCircleVideoSubscriber.h
+++ b/HelloWorld/CenterCircleVideoSubscriber.h
@@ -45,7 +45,7 @@ public:
 
 private:
     // Observer pattern
-    Observable<AVFrame*>* observable_ = nullptr;
+    Observable<AVFrame*>* observable_{};
 
     // Data
     std::string path_;
diff --git a/HelloWorld/CoinCircleVideoSubscriber.h b/HelloWorld/CoinCircleVideoSubscriber.h
index fb82a7f5076f6aca61d802b9b1650bff90b1244c..9d38c6e8e780ffeb4027f064b50407712f5f961f 100644
--- a/HelloWorld/CoinCircleVideoSubscriber.h
+++ b/HelloWorld/CoinCircleVideoSubscriber.h
@@ -45,7 +45,7 @@ public:
 
 private:
     // Observer pattern
-    Observable<AVFrame*>* observable_ = nullptr;
+    Observable<AVFrame*>* observable_{};
 
     // Data
     std::string path_;
diff --git a/SDK/Templates/preferences.json b/SDK/Templates/preferences.json
index 4caacdccee262f605a68e6defd32edbc3715d595..c8b86d51877a44512a6f2803cfa544376b48506d 100644
--- a/SDK/Templates/preferences.json
+++ b/SDK/Templates/preferences.json
@@ -19,5 +19,14 @@
         "defaultValue": "default values",
         "scope": "plugin, Name of API implementation",
         "mimeType": "*/*"
+    },
+    {
+        "category" : "genericEditText",
+        "type" : "EditText",
+        "key": "keyName",
+        "title" : "preference title",
+        "summary" : "preference summary",
+        "defaultValue" : "default value",
+        "scope" : "plugin, Name of API implementation"
     }
 ]
diff --git a/lib/frameFilter.cpp b/lib/frameFilter.cpp
index 9766b33b37c5c402fbd054fde9c4121e41352e76..0d5b07f1ca4938ec4b98ac0b6c2fa12f8e0c32d8 100644
--- a/lib/frameFilter.cpp
+++ b/lib/frameFilter.cpp
@@ -236,7 +236,7 @@ FrameFilter::initOutputFilter(AVFilterInOut* out)
 {
     int ret = 0;
     const AVFilter* buffersink;
-    AVFilterContext* buffersinkCtx = nullptr;
+    AVFilterContext* buffersinkCtx{};
     AVMediaType mediaType = avfilter_pad_get_type(out->filter_ctx->input_pads, out->pad_idx);
 
     if (mediaType == AVMEDIA_TYPE_VIDEO)
@@ -283,7 +283,7 @@ FrameFilter::initInputFilter(AVFilterInOut* in, MediaStream msp)
         buffersrc = avfilter_get_by_name("abuffer");
     }
 
-    AVFilterContext* buffersrcCtx = nullptr;
+    AVFilterContext* buffersrcCtx{};
     if (buffersrc) {
         char name[128];
         snprintf(name, sizeof(name), "buffersrc_%s_%d", in->name, in->pad_idx);
diff --git a/lib/frameFilter.h b/lib/frameFilter.h
index 4376fb68e70b477bfebdd2f0e21e5c6d45a4f0ea..f06197c77bdc84e0a0939c7bc727e130c0740ebe 100644
--- a/lib/frameFilter.h
+++ b/lib/frameFilter.h
@@ -138,14 +138,14 @@ private:
     /**
      * @brief Filter graph pointer.
      */
-    AVFilterGraph* graph_ = nullptr;
+    AVFilterGraph* graph_{};
 
     /**
      * @brief Filter graph output.
      *
      * Corresponds to a buffersink/abuffersink filter.
      */
-    AVFilterContext* output_ = nullptr;
+    AVFilterContext* output_{};
 
     /**
      * @brief List of filter graph inputs.