Index: include/AdblockPlus/Notification.h
diff --git a/include/AdblockPlus/Notification.h b/include/AdblockPlus/Notification.h
index a47e40ed0df8ee8042ebe560f46aa0436044521b..921489e827377ee8a91f8cc6871659c6c8a1e053 100644
--- a/include/AdblockPlus/Notification.h
+++ b/include/AdblockPlus/Notification.h
@@ -35,14 +35,24 @@ namespace AdblockPlus
     NOTIFICATION_TYPE_CRITICAL
   };
 
+  /**
+   * Contains notification title and message. It's returned by
+   * `Notification::GetTexts`.
+   */
+  struct NotificationTexts
+  {
+    std::string title;
+    std::string message;
+  };
+ 
   /**
    * Wrapper for an Adblock Plus notification object.
    */
-  class Notification: public JsValue
+  class Notification: public JsValue,
+                      public std::tr1::enable_shared_from_this<Notification>
   {
     friend class FilterEngine;
   protected:
-    static std::shared_ptr<Notification> JsValueToNotification(const JsValuePtr& jsValue);
     /**
      * Constructor.
      * @param jsValue `JsValuePtr` notification JavaScript object.
@@ -56,16 +66,10 @@ namespace AdblockPlus
     NotificationType GetType() const;
 
     /**
-     * Retrieves the title of this notification.
-     * @return Title of this notification.
+     * Retrieves the title and message of this notification.
+     * @return Translated texts.
      */
-    const std::string& GetTitle() const;
-
-    /**
-     * Retrieves the message of this notification.
-     * @return Message of this notification.
-     */
-    const std::string& GetMessageString() const;
+    NotificationTexts GetTexts();
 
     /**
      * Retrieves the URLs which should be mapped to the links in the message.
@@ -79,9 +83,6 @@ namespace AdblockPlus
      */
     void MarkAsShown();
   private:
-    std::string title;
-    std::string message;
-    NotificationType type;
   };
   typedef std::shared_ptr<Notification> NotificationPtr;
 }
Index: src/FilterEngine.cpp
diff --git a/src/FilterEngine.cpp b/src/FilterEngine.cpp
index eed08b9a8c467749609a0e63186ab603fec66eda..0acb34b3860d6e8e56604ccd0c2b0ff45f6ef77d 100644
--- a/src/FilterEngine.cpp
+++ b/src/FilterEngine.cpp
@@ -446,7 +446,11 @@ void FilterEngine::ShowNotification(const ShowNotificationCallback& callback,
   if (params.size() < 1)
     return;
 
-  callback(Notification::JsValueToNotification(params[0]));
+  if (!params[0]->IsObject())
+  {
+    return;
+  }
+  callback(NotificationPtr(new Notification(params[0])));
 }
 
 
Index: src/Notification.cpp
diff --git a/src/Notification.cpp b/src/Notification.cpp
index d7514889f260caab664503cdf176d111532e896a..25cd425f6acc84c2665716901cec5e78fbcac2f0 100644
--- a/src/Notification.cpp
+++ b/src/Notification.cpp
@@ -64,17 +64,26 @@ Notification::Notification(const JsValuePtr& jsValue)
 
 NotificationType Notification::GetType() const
 {
-  return type;
+  return StringToNotificationType(GetProperty("type")->AsString());
 }
 
-const std::string& Notification::GetTitle() const
+NotificationTexts Notification::GetTexts()
 {
-  return title;
-}
-
-const std::string& Notification::GetMessageString() const
-{
-  return message;
+  JsValueList params;
+  params.push_back(shared_from_this());
+  JsValuePtr jsTexts = jsEngine->Evaluate("API.getNotificationTexts")->Call(params);
+  NotificationTexts notificationTexts;
+  JsValuePtr jsTitle = jsTexts->GetProperty("title");
+  if (jsTitle->IsString())
+  {
+    notificationTexts.title = jsTitle->AsString();
+  }
+  JsValuePtr jsMessage = jsTexts->GetProperty("message");
+  if (jsMessage->IsString())
+  {
+    notificationTexts.message = jsMessage->AsString();
+  }
+  return notificationTexts;
 }
 
 std::vector<std::string> Notification::GetLinks() const
@@ -99,32 +108,4 @@ void Notification::MarkAsShown()
   JsValueList params;
   params.push_back(GetProperty("id"));
   jsEngine->Evaluate("API.markNotificationAsShown")->Call(params);
-}
-
-NotificationPtr Notification::JsValueToNotification(const JsValuePtr& jsValue)
-{
-  if (!jsValue || !jsValue->IsObject())
-  {
-    return NotificationPtr();
-  }
-
-  NotificationPtr notification(new Notification(jsValue));
-  JsValuePtr jsType = notification->GetProperty("type");
-  notification->type = StringToNotificationType(jsType ? jsType->AsString() : "");
-
-  JsValueList params;
-  params.push_back(notification);
-  JsValuePtr func = notification->jsEngine->Evaluate("API.getNotificationTexts");
-  JsValuePtr jsTexts = func->Call(params);
-  JsValuePtr jsTitle = jsTexts->GetProperty("title");
-  if (jsTitle->IsString())
-  {
-    notification->title = jsTitle->AsString();
-  }
-  JsValuePtr jsMessage = jsTexts->GetProperty("message");
-  if (jsMessage->IsString())
-  {
-    notification->message = jsMessage->AsString();
-  }
-  return notification;
 }
\ No newline at end of file
Index: test/Notification.cpp
diff --git a/test/Notification.cpp b/test/Notification.cpp
index 148bf11c3ea28956e23bc1c378ae5f77fc611a5f..84898576190c38ab1ed7220f249593d31f1561cc 100644
--- a/test/Notification.cpp
+++ b/test/Notification.cpp
@@ -125,8 +125,8 @@ namespace
       isNotificationCallbackCalled = true;
       ASSERT_TRUE(notification);
       EXPECT_EQ(NotificationType::NOTIFICATION_TYPE_INFORMATION, notification->GetType());
-      EXPECT_EQ("Title", notification->GetTitle());
-      EXPECT_EQ("message", notification->GetMessageString());
+      EXPECT_EQ("Title", notification->GetTexts().title);
+      EXPECT_EQ("message", notification->GetTexts().message);
       notification->MarkAsShown();
     }
   };
@@ -156,8 +156,8 @@ TEST_F(NotificationTest, AddNotification)
   NotificationPtr notification = PeekNotification();
   ASSERT_TRUE(notification);
   EXPECT_EQ(NotificationType::NOTIFICATION_TYPE_CRITICAL, notification->GetType());
-  EXPECT_EQ("testTitle", notification->GetTitle());
-  EXPECT_EQ("testMessage", notification->GetMessageString());
+  EXPECT_EQ("testTitle", notification->GetTexts().title);
+  EXPECT_EQ("testMessage", notification->GetTexts().message);
 }
 
 TEST_F(NotificationTest, FilterByUrl)
