diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationConversionCompletedSysPubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationConversionCompletedSysPubMsgHdlr.scala
index 2cdac5898bd254039ecdc95d17cc2dbb069c75d5..b7940c0665083596d5d6102d1ca857e4caa4eca3 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationConversionCompletedSysPubMsgHdlr.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationConversionCompletedSysPubMsgHdlr.scala
@@ -4,8 +4,8 @@ import org.bigbluebutton.common2.msgs._
 import org.bigbluebutton.core.bus.MessageBus
 import org.bigbluebutton.core.domain.MeetingState2x
 import org.bigbluebutton.core.running.LiveMeeting
-import org.bigbluebutton.common2.domain.{ PageVO }
-import org.bigbluebutton.core.models.PresentationInPod
+import org.bigbluebutton.common2.domain.PageVO
+import org.bigbluebutton.core.models.{ PresentationInPod, PresentationPage }
 
 trait PresentationConversionCompletedSysPubMsgHdlr {
 
@@ -18,16 +18,19 @@ trait PresentationConversionCompletedSysPubMsgHdlr {
 
     val meetingId = liveMeeting.props.meetingProp.intId
 
-    val pages = new collection.mutable.HashMap[String, PageVO]
+    val pages = new collection.mutable.HashMap[String, PresentationPage]
 
     msg.body.presentation.pages.foreach { p =>
-      val page = PageVO(p.id, p.num, p.thumbUri, p.swfUri, p.txtUri, p.svgUri, p.current, p.xOffset, p.yOffset,
+      val urls = Map("swf" -> p.swfUri, "thumb" -> p.thumbUri, "text" -> p.txtUri, "svg" -> p.svgUri, "png" -> "")
+
+      val page = PresentationPage(p.id, p.num, urls, p.current, p.xOffset, p.yOffset,
         p.widthRatio, p.heightRatio)
       pages += page.id -> page
     }
 
     val downloadable = msg.body.presentation.downloadable
     val presentationId = msg.body.presentation.id
+
     val pres = new PresentationInPod(presentationId, msg.body.presentation.name, msg.body.presentation.current,
       pages.toMap, downloadable)
     val presVO = PresentationPodsApp.translatePresentationToPresentationVO(pres)
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationConversionStartedSysMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationConversionStartedSysMsgHdlr.scala
new file mode 100755
index 0000000000000000000000000000000000000000..fbe85c41e6fd9be674f0e5e7c886a77e4bfb092b
--- /dev/null
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationConversionStartedSysMsgHdlr.scala
@@ -0,0 +1,51 @@
+package org.bigbluebutton.core.apps.presentationpod
+
+import org.bigbluebutton.common2.domain.PresentationPageVO
+import org.bigbluebutton.common2.msgs.{ BbbClientMsgHeader, BbbCommonEnvCoreMsg, BbbCoreEnvelope, MessageTypes, PresentationConversionStartedSysMsg, PresentationPageConvertedEventMsg, PresentationPageConvertedEventMsgBody, PresentationPageConvertedSysMsg, Routing }
+import org.bigbluebutton.core.bus.MessageBus
+import org.bigbluebutton.core.domain.MeetingState2x
+import org.bigbluebutton.core.running.LiveMeeting
+
+trait PresentationConversionStartedSysMsgHdlr {
+  this: PresentationPodHdlrs =>
+
+  def handle(msg: PresentationConversionStartedSysMsg, state: MeetingState2x,
+             liveMeeting: LiveMeeting, bus: MessageBus): MeetingState2x = {
+
+    def broadcastEvent(msg: PresentationPageConvertedSysMsg): Unit = {
+      val routing = Routing.addMsgToClientRouting(
+        MessageTypes.BROADCAST_TO_MEETING,
+        liveMeeting.props.meetingProp.intId, msg.header.userId
+      )
+      val envelope = BbbCoreEnvelope(PresentationPageConvertedEventMsg.NAME, routing)
+      val header = BbbClientMsgHeader(
+        PresentationPageConvertedEventMsg.NAME,
+        liveMeeting.props.meetingProp.intId, msg.header.userId
+      )
+
+      val page = PresentationPageVO(
+        id = msg.body.page.id,
+        num = msg.body.page.num,
+        urls = msg.body.page.urls,
+        current = msg.body.page.current
+      )
+
+      val body = PresentationPageConvertedEventMsgBody(
+        msg.body.podId,
+        msg.body.messageKey,
+        msg.body.code,
+        msg.body.presentationId,
+        msg.body.numberOfPages,
+        msg.body.pagesCompleted,
+        msg.body.presName,
+        page
+      )
+      val event = PresentationPageConvertedEventMsg(header, body)
+      val msgEvent = BbbCommonEnvCoreMsg(envelope, event)
+      bus.outGW.send(msgEvent)
+    }
+
+    //broadcastEvent(msg)
+    state
+  }
+}
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPageConvertedSysMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPageConvertedSysMsgHdlr.scala
index f53324260ab5a24295d3e5e09b8091a8e1b3d818..0a5350b0cd5fcce400163f29d6cf37ce05d23f96 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPageConvertedSysMsgHdlr.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPageConvertedSysMsgHdlr.scala
@@ -1,5 +1,6 @@
 package org.bigbluebutton.core.apps.presentationpod
 
+import org.bigbluebutton.common2.domain.PresentationPageVO
 import org.bigbluebutton.common2.msgs._
 import org.bigbluebutton.core.bus.MessageBus
 import org.bigbluebutton.core.domain.MeetingState2x
@@ -22,6 +23,13 @@ trait PresentationPageConvertedSysMsgHdlr {
         liveMeeting.props.meetingProp.intId, msg.header.userId
       )
 
+      val page = PresentationPageVO(
+        id = msg.body.page.id,
+        num = msg.body.page.num,
+        urls = msg.body.page.urls,
+        current = msg.body.page.current
+      )
+
       val body = PresentationPageConvertedEventMsgBody(
         msg.body.podId,
         msg.body.messageKey,
@@ -30,7 +38,7 @@ trait PresentationPageConvertedSysMsgHdlr {
         msg.body.numberOfPages,
         msg.body.pagesCompleted,
         msg.body.presName,
-        msg.body.page
+        page
       )
       val event = PresentationPageConvertedEventMsg(header, body)
       val msgEvent = BbbCommonEnvCoreMsg(envelope, event)
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPodHdlrs.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPodHdlrs.scala
index 00c18af24d9659c983e61a773b5c9bdd5646d1b5..2ac6c8e6cd8365c970a8a6ae3414c2c2a1f714a0 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPodHdlrs.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPodHdlrs.scala
@@ -21,7 +21,8 @@ class PresentationPodHdlrs(implicit val context: ActorContext)
   with ResizeAndMovePagePubMsgHdlr
   with SyncGetPresentationPodsMsgHdlr
   with RemovePresentationPodPubMsgHdlr
-  with PresentationPageConvertedSysMsgHdlr {
+  with PresentationPageConvertedSysMsgHdlr
+  with PresentationConversionStartedSysMsgHdlr {
 
   val log = Logging(context.system, getClass)
 }
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPodsApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPodsApp.scala
index 2440540dbf2f9dc9699e942d51e641083dc236ef..18ef8116dd98593a3616a29ae39fc381d070534e 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPodsApp.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationPodsApp.scala
@@ -41,10 +41,28 @@ object PresentationPodsApp {
 
   def translatePresentationPodToVO(pod: PresentationPod): PresentationPodVO = {
     val presentationObjects = pod.presentations
-    val presentationVOs = presentationObjects.values.map(p => PresentationVO(p.id, p.name, p.current,
-      p.pages.values.toVector, p.downloadable)).toVector
+    val presentationVOs = presentationObjects.values.map { p =>
+      val pages = p.pages.values.map { page =>
+        PageVO(
+          id = page.id,
+          num = page.num,
+          thumbUri = page.urls.getOrElse("thumb", ""),
+          swfUri = page.urls.getOrElse("swf", ""),
+          txtUri = page.urls.getOrElse("text", ""),
+          svgUri = page.urls.getOrElse("svg", ""),
+          current = false,
+          xOffset = 0,
+          yOffset = 0,
+          widthRatio = 100D,
+          heightRatio = 100D
+        )
+      }
+
+      PresentationVO(p.id, p.name, p.current,
+        pages.toVector, p.downloadable)
+    }
 
-    PresentationPodVO(pod.id, pod.currentPresenter, presentationVOs)
+    PresentationPodVO(pod.id, pod.currentPresenter, presentationVOs.toVector)
   }
 
   def findPodsWhereUserIsPresenter(mgr: PresentationPodManager, userId: String): Vector[PresentationPod] = {
@@ -57,7 +75,22 @@ object PresentationPodsApp {
   }
 
   def translatePresentationToPresentationVO(pres: PresentationInPod): PresentationVO = {
-    PresentationVO(pres.id, pres.name, pres.current, pres.pages.values.toVector, pres.downloadable)
+    val pages = pres.pages.values.map { page =>
+      PageVO(
+        id = page.id,
+        num = page.num,
+        thumbUri = page.urls.getOrElse("thumb", ""),
+        swfUri = page.urls.getOrElse("swf", ""),
+        txtUri = page.urls.getOrElse("text", ""),
+        svgUri = page.urls.getOrElse("svg", ""),
+        current = false,
+        xOffset = 0,
+        yOffset = 0,
+        widthRatio = 100D,
+        heightRatio = 100D
+      )
+    }
+    PresentationVO(pres.id, pres.name, pres.current, pages.toVector, pres.downloadable)
   }
 
   def setCurrentPresentationInPod(state: MeetingState2x, podId: String, nextCurrentPresId: String): Option[PresentationPod] = {
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/ResizeAndMovePagePubMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/ResizeAndMovePagePubMsgHdlr.scala
index eb77c7a1b86bdc50296acdcb155c2224feabb6b8..138e513e003927691e244cecabb7289a600df841 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/ResizeAndMovePagePubMsgHdlr.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/ResizeAndMovePagePubMsgHdlr.scala
@@ -1,11 +1,11 @@
 package org.bigbluebutton.core.apps.presentationpod
 
-import org.bigbluebutton.common2.domain.PageVO
 import org.bigbluebutton.common2.msgs._
 import org.bigbluebutton.core.bus.MessageBus
 import org.bigbluebutton.core.domain.MeetingState2x
 import org.bigbluebutton.core.running.LiveMeeting
 import org.bigbluebutton.core.apps.{ PermissionCheck, RightsManagementTrait }
+import org.bigbluebutton.core.models.PresentationPage
 
 trait ResizeAndMovePagePubMsgHdlr extends RightsManagementTrait {
   this: PresentationPodHdlrs =>
@@ -13,7 +13,7 @@ trait ResizeAndMovePagePubMsgHdlr extends RightsManagementTrait {
   def handle(msg: ResizeAndMovePagePubMsg, state: MeetingState2x,
              liveMeeting: LiveMeeting, bus: MessageBus): MeetingState2x = {
 
-    def broadcastEvent(msg: ResizeAndMovePagePubMsg, podId: String, page: PageVO): Unit = {
+    def broadcastEvent(msg: ResizeAndMovePagePubMsg, podId: String, page: PresentationPage): Unit = {
       val routing = Routing.addMsgToClientRouting(
         MessageTypes.BROADCAST_TO_MEETING,
         liveMeeting.props.meetingProp.intId, msg.header.userId
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/PresentationPods.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/PresentationPods.scala
index 40ba0b8e779b5ea026956777c79dea1cccfbdf5f..7a32caf5d97020ef67bf3b8300dad73ff15c91fe 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/PresentationPods.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/PresentationPods.scala
@@ -18,8 +18,19 @@ object PresentationPodFactory {
   }
 }
 
+case class PresentationPage(
+    id:          String,
+    num:         Int,
+    urls:        Map[String, String],
+    current:     Boolean             = false,
+    xOffset:     Double              = 0,
+    yOffset:     Double              = 0,
+    widthRatio:  Double              = 100D,
+    heightRatio: Double              = 100D
+)
+
 case class PresentationInPod(id: String, name: String, current: Boolean = false,
-                             pages: scala.collection.immutable.Map[String, PageVO], downloadable: Boolean) {
+                             pages: scala.collection.immutable.Map[String, PresentationPage], downloadable: Boolean) {
 
   def makePageCurrent(pres: PresentationInPod, pageId: String): Option[PresentationInPod] = {
     pres.pages.get(pageId) match {
@@ -33,7 +44,7 @@ case class PresentationInPod(id: String, name: String, current: Boolean = false,
     }
   }
 
-  def getCurrentPage(pres: PresentationInPod): Option[PageVO] = {
+  def getCurrentPage(pres: PresentationInPod): Option[PresentationPage] = {
     pres.pages.values find (p => p.current)
   }
 
@@ -129,7 +140,7 @@ case class PresentationPod(id: String, currentPresenter: String,
 
   def resizePage(presentationId: String, pageId: String,
                  xOffset: Double, yOffset: Double, widthRatio: Double,
-                 heightRatio: Double): Option[(PresentationPod, PageVO)] = {
+                 heightRatio: Double): Option[(PresentationPod, PresentationPage)] = {
     // Force coordinate that are out-of-bounds inside valid values
     // 0.25D is 400% zoom
     // 100D-checkedWidth is the maximum the page can be moved over
diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala
index 707217d7c0278f854163b5eb76649e737cd0a33a..7046598489b0479ea5a0975510131bcc3c01b635 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala
@@ -439,6 +439,7 @@ class MeetingActor(
       case m: PresentationUploadTokenReqMsg            => state = presentationPodsApp.handle(m, state, liveMeeting, msgBus)
       case m: ResizeAndMovePagePubMsg                  => state = presentationPodsApp.handle(m, state, liveMeeting, msgBus)
       case m: PresentationPageConvertedSysMsg          => state = presentationPodsApp.handle(m, state, liveMeeting, msgBus)
+      case m: PresentationConversionStartedSysMsg      => state = presentationPodsApp.handle(m, state, liveMeeting, msgBus)
 
       // Caption
       case m: EditCaptionHistoryPubMsg                 => captionApp2x.handle(m, liveMeeting, msgBus)
diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Presentation.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Presentation.scala
index 925c5b2c1ad5cb4c454bbb89793f7d10a419d1a9..a7d55b635928a4ba29129042f333edfad6599676 100755
--- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Presentation.scala
+++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/domain/Presentation.scala
@@ -9,3 +9,21 @@ case class PageVO(id: String, num: Int, thumbUri: String = "", swfUri: String,
 
 case class PresentationPodVO(id: String, currentPresenter: String,
                              presentations: Vector[PresentationVO])
+
+case class PresentationPageConvertedVO(
+    id:      String,
+    num:     Int,
+    urls:    Map[String, String],
+    current: Boolean             = false
+)
+
+case class PresentationPageVO(
+    id:          String,
+    num:         Int,
+    urls:        Map[String, String],
+    current:     Boolean             = false,
+    xOffset:     Double              = 0,
+    yOffset:     Double              = 0,
+    widthRatio:  Double              = 100D,
+    heightRatio: Double              = 100D
+)
diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/PresentationPodsMsgs.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/PresentationPodsMsgs.scala
index 65d131066927a3d453ec76814b9cf68cc9b1fe42..addcb1cc5f0c152917402e60cb1f00685130f9b5 100755
--- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/PresentationPodsMsgs.scala
+++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/PresentationPodsMsgs.scala
@@ -1,6 +1,6 @@
 package org.bigbluebutton.common2.msgs
 
-import org.bigbluebutton.common2.domain.{ PageVO, PresentationPodVO, PresentationVO }
+import org.bigbluebutton.common2.domain.{ PageVO, PresentationPageConvertedVO, PresentationPageVO, PresentationPodVO, PresentationVO }
 
 // ------------ client to akka-apps ------------
 object CreateNewPresentationPodPubMsg { val NAME = "CreateNewPresentationPodPubMsg" }
@@ -104,7 +104,7 @@ case class PresentationPageConvertedSysMsgBody(
     numberOfPages:  Int,
     pagesCompleted: Int,
     presName:       String,
-    page:           PageVO
+    page:           PresentationPageConvertedVO
 )
 
 object PresentationConversionStartedSysMsg { val NAME = "PresentationConversionStartedSysMsg" }
@@ -117,7 +117,9 @@ case class PresentationConversionStartedSysMsgBody(
     presentationId: String,
     current:        Boolean,
     presName:       String,
-    downloadable:   Boolean
+    downloadable:   Boolean,
+    numPages:       Int,
+    authzToken:     String
 )
 
 object PresentationConversionEndedSysMsg { val NAME = "PresentationConversionEndedSysMsg" }
@@ -179,7 +181,7 @@ case class PresentationPageConvertedEventMsgBody(
     numberOfPages:  Int,
     pagesCompleted: Int,
     presName:       String,
-    page:           PageVO
+    page:           PresentationPageVO
 )
 
 object PresentationConversionCompletedEvtMsg { val NAME = "PresentationConversionCompletedEvtMsg" }
diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/DocumentConversionServiceImp.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/DocumentConversionServiceImp.java
index 22b489c36a527c311ac278e34cc3c8e8daea7445..355277ea71ad45dab0ecf556e67de4dc68a1f36c 100755
--- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/DocumentConversionServiceImp.java
+++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/DocumentConversionServiceImp.java
@@ -41,40 +41,12 @@ public class DocumentConversionServiceImp implements DocumentConversionService {
   private PdfToSwfSlidesGenerationService pdfToSwfSlidesGenerationService;
   private ImageToSwfSlidesGenerationService imageToSwfSlidesGenerationService;
 
-  private void sendDocConversionStartedProgress(UploadedPresentation pres) {
-      DocConversionStarted progress = new DocConversionStarted(
-              pres.getPodId(),
-                pres.getMeetingId(),
-                pres.getId(),
-                pres.getName(),
-              pres.getAuthzToken(),
-              pres.isDownloadable(),
-                pres.isDownloadable());
-        gw.sendDocConversionMsg(progress);
-    }
+
 
   public void processDocument(UploadedPresentation pres) {
     SupportedDocumentFilter sdf = new SupportedDocumentFilter(gw);
 
-    if (! pres.isConversionStarted()) {
-        Map<String, Object> logData = new HashMap<String, Object>();
 
-        logData.put("podId", pres.getPodId());
-        logData.put("meetingId", pres.getMeetingId());
-        logData.put("presId", pres.getId());
-        logData.put("filename", pres.getName());
-        logData.put("current", pres.isCurrent());
-        logData.put("authzToken", pres.getAuthzToken());
-        logData.put("logCode", "presentation_conversion_start");
-        logData.put("message", "Start presentation conversion.");
-
-        Gson gson = new Gson();
-        String logStr = gson.toJson(logData);
-        log.info(" --analytics-- data={}", logStr);
-
-        pres.startConversion();
-        sendDocConversionStartedProgress(pres);
-    }
 
     if (sdf.isSupported(pres)) {
       String fileType = pres.getFileType();
@@ -95,9 +67,9 @@ public class DocumentConversionServiceImp implements DocumentConversionService {
           ocsf.sendProgress(pres);
         }
       } else if (SupportedFileTypes.isPdfFile(fileType)) {
-        pdfToSwfSlidesGenerationService.generateSlides(pres);
+          pdfToSwfSlidesGenerationService.generateSlides(pres);
       } else if (SupportedFileTypes.isImageFile(fileType)) {
-        imageToSwfSlidesGenerationService.generateSlides(pres);
+          imageToSwfSlidesGenerationService.generateSlides(pres);
       } else {
           Map<String, Object> logData = new HashMap<String, Object>();
           logData = new HashMap<String, Object>();
diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/ImageToSwfSlidesGenerationService.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/ImageToSwfSlidesGenerationService.java
index 1c09f571a4ee9aa02c39a8cb6236c27f1ed5834a..b71ddbaaa165cb9a2a4d48e46f89164e6d052987 100755
--- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/ImageToSwfSlidesGenerationService.java
+++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/ImageToSwfSlidesGenerationService.java
@@ -20,6 +20,8 @@
 package org.bigbluebutton.presentation.imp;
 
 import java.text.DecimalFormat;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CompletionService;
 import java.util.concurrent.ExecutionException;
@@ -30,6 +32,7 @@ import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
+import com.google.gson.Gson;
 import org.bigbluebutton.presentation.FileTypeConstants;
 import org.bigbluebutton.presentation.ImageResizer;
 import org.bigbluebutton.presentation.ImageToSwfSlide;
@@ -39,6 +42,7 @@ import org.bigbluebutton.presentation.SvgImageCreator;
 import org.bigbluebutton.presentation.TextFileCreator;
 import org.bigbluebutton.presentation.ThumbnailCreator;
 import org.bigbluebutton.presentation.UploadedPresentation;
+import org.bigbluebutton.presentation.messages.DocConversionStarted;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -67,10 +71,43 @@ public class ImageToSwfSlidesGenerationService {
 		executor = Executors.newFixedThreadPool(numThreads);
 		completionService = new ExecutorCompletionService<ImageToSwfSlide>(executor);
 	}
-	
+
+	private void sendDocConversionStartedProgress(UploadedPresentation pres) {
+		if (! pres.isConversionStarted()) {
+			Map<String, Object> logData = new HashMap<String, Object>();
+
+			logData.put("podId", pres.getPodId());
+			logData.put("meetingId", pres.getMeetingId());
+			logData.put("presId", pres.getId());
+			logData.put("filename", pres.getName());
+			logData.put("current", pres.isCurrent());
+			logData.put("authzToken", pres.getAuthzToken());
+			logData.put("logCode", "presentation_conversion_start");
+			logData.put("message", "Start presentation conversion.");
+
+			Gson gson = new Gson();
+			String logStr = gson.toJson(logData);
+			log.info(" --analytics-- data={}", logStr);
+
+			pres.startConversion();
+			DocConversionStarted progress = new DocConversionStarted(
+					pres.getPodId(),
+					pres.getMeetingId(),
+					pres.getId(),
+					pres.getName(),
+					pres.getAuthzToken(),
+					pres.isDownloadable(),
+					pres.isDownloadable(),
+					pres.getNumberOfPages());
+			notifier.sendDocConversionProgress(progress);
+		}
+	}
+
 	public void generateSlides(UploadedPresentation pres) {
 		pres.setNumberOfPages(1); // There should be only one image to convert.
 
+		sendDocConversionStartedProgress(pres);
+
 		for (int page = 1; page <= pres.getNumberOfPages(); page++) {
 			if (swfSlidesRequired) {
 				if (pres.getNumberOfPages() > 0) {
diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PdfToSwfSlidesGenerationService.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PdfToSwfSlidesGenerationService.java
index 05620e09e915c3ea3603df18ec7dfbdcde446fb4..e7bd70e49bf588c76b2ce85a0be35faf9ee8b2f0 100755
--- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PdfToSwfSlidesGenerationService.java
+++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/PdfToSwfSlidesGenerationService.java
@@ -38,6 +38,7 @@ import java.util.concurrent.TimeoutException;
 
 import org.bigbluebutton.presentation.*;
 import org.bigbluebutton.presentation.ConversionUpdateMessage.MessageBuilder;
+import org.bigbluebutton.presentation.messages.DocConversionStarted;
 import org.bigbluebutton.presentation.messages.DocPageCountExceeded;
 import org.bigbluebutton.presentation.messages.DocPageCountFailed;
 import org.bigbluebutton.presentation.messages.PdfConversionInvalid;
@@ -72,8 +73,42 @@ public class PdfToSwfSlidesGenerationService {
     executor = Executors.newFixedThreadPool(numConversionThreads);
   }
 
+  private void sendDocConversionStartedProgress(UploadedPresentation pres) {
+    if (! pres.isConversionStarted()) {
+      Map<String, Object> logData = new HashMap<String, Object>();
+
+      logData.put("podId", pres.getPodId());
+      logData.put("meetingId", pres.getMeetingId());
+      logData.put("presId", pres.getId());
+      logData.put("filename", pres.getName());
+      logData.put("current", pres.isCurrent());
+      logData.put("authzToken", pres.getAuthzToken());
+      logData.put("logCode", "presentation_conversion_start");
+      logData.put("message", "Start presentation conversion.");
+
+      Gson gson = new Gson();
+      String logStr = gson.toJson(logData);
+      log.info(" --analytics-- data={}", logStr);
+
+      pres.startConversion();
+      DocConversionStarted progress = new DocConversionStarted(
+              pres.getPodId(),
+              pres.getMeetingId(),
+              pres.getId(),
+              pres.getName(),
+              pres.getAuthzToken(),
+              pres.isDownloadable(),
+              pres.isDownloadable(),
+              pres.getNumberOfPages());
+      notifier.sendDocConversionProgress(progress);
+    }
+  }
+
     public void generateSlides(UploadedPresentation pres) {
         determineNumberOfPages(pres);
+
+      sendDocConversionStartedProgress(pres);
+
         if (pres.getNumberOfPages() > 0) {
           if (pres.getUploadedFile().length() > bigPdfSize) {
              try {
diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/SwfSlidesGenerationProgressNotifier.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/SwfSlidesGenerationProgressNotifier.java
index 0759a80c5cde342a8cf918bc0f1ddc64950177d4..00206efb1286dbf7de620050efd59fd7dd888847 100755
--- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/SwfSlidesGenerationProgressNotifier.java
+++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/SwfSlidesGenerationProgressNotifier.java
@@ -54,7 +54,7 @@ public class SwfSlidesGenerationProgressNotifier {
             ConversionMessageConstants.GENERATED_SLIDE_KEY,
             pres.getNumberOfPages(),
             slidesCompleted,
-            pres.getBaseUrl(),
+            generateBasePresUrl(pres),
             pageGenerated,
             (pageGenerated == 1));
     messagingService.sendDocConversionMsg(progress);
diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/messages/DocConversionStarted.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/messages/DocConversionStarted.java
index 728c73e7ba96a8af2c8b9d8f8f8ae3fb924d4628..0abf241cfdad2e7fb6f85a540e8d7e4d20fdc57f 100755
--- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/messages/DocConversionStarted.java
+++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/messages/DocConversionStarted.java
@@ -8,6 +8,7 @@ public class DocConversionStarted implements IDocConversionMsg {
     public final String authzToken;
     public final Boolean downloadable;
     public final Boolean current;
+    public final Integer numPages;
 
     public DocConversionStarted(String podId,
                                 String meetingId,
@@ -15,7 +16,8 @@ public class DocConversionStarted implements IDocConversionMsg {
                                 String filename,
                                 String authzToken,
                                 Boolean downloadable,
-                                Boolean current) {
+                                Boolean current,
+                                Integer numPages) {
         this.podId = podId;
         this.meetingId = meetingId;
         this.presId = presId;
@@ -23,5 +25,6 @@ public class DocConversionStarted implements IDocConversionMsg {
         this.authzToken = authzToken;
         this.downloadable = downloadable;
         this.current = current;
+        this.numPages = numPages;
     }
 }
diff --git a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/MsgBuilder.scala b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/MsgBuilder.scala
index e696df3dc4ee27152f62787ae2cf7646d14d22aa..36b1247c762752c3c59536572a3ddeee70262d88 100755
--- a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/MsgBuilder.scala
+++ b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/MsgBuilder.scala
@@ -2,7 +2,7 @@ package org.bigbluebutton.api2
 
 import org.bigbluebutton.api.messaging.converters.messages._
 import org.bigbluebutton.api2.meeting.RegisterUser
-import org.bigbluebutton.common2.domain.{ DefaultProps, PageVO, PresentationVO }
+import org.bigbluebutton.common2.domain.{ DefaultProps, PageVO, PresentationPageConvertedVO, PresentationVO }
 import org.bigbluebutton.common2.msgs._
 import org.bigbluebutton.presentation.messages._
 
@@ -64,18 +64,24 @@ object MsgBuilder {
     BbbCommonEnvCoreMsg(envelope, req)
   }
 
-  def generatePresentationPage(presId: String, numPages: Int, presBaseUrl: String, page: Int): PageVO = {
+  def generatePresentationPage(presId: String, numPages: Int, presBaseUrl: String, page: Int): PresentationPageConvertedVO = {
     val id = presId + "/" + page
     val current = if (page == 1) true else false
-    val thumbnail = presBaseUrl + "/thumbnail/" + page
-    val swfUri = presBaseUrl + "/slide/" + page
+    val thumbUrl = presBaseUrl + "/thumbnail/" + page
+    val swfUrl = presBaseUrl + "/slide/" + page
 
-    val txtUri = presBaseUrl + "/textfiles/" + page
-    val svgUri = presBaseUrl + "/svg/" + page
+    val txtUrl = presBaseUrl + "/textfiles/" + page
+    val svgUrl = presBaseUrl + "/svg/" + page
+    val pngUrl = presBaseUrl + "/png/" + page
 
-    PageVO(id = id, num = page, thumbUri = thumbnail, swfUri = swfUri,
-      txtUri = txtUri, svgUri = svgUri,
-      current = current)
+    val urls = Map("swf" -> swfUrl, "thumb" -> thumbUrl, "text" -> txtUrl, "svg" -> svgUrl, "png" -> pngUrl)
+
+    PresentationPageConvertedVO(
+      id = id,
+      num = page,
+      urls = urls,
+      current = current
+    )
   }
 
   def buildPresentationPageConvertedSysMsg(msg: DocPageGeneratedProgress): BbbCommonEnvCoreMsg = {
@@ -202,7 +208,9 @@ object MsgBuilder {
       presentationId = msg.presId,
       current = msg.current,
       presName = msg.filename,
-      downloadable = msg.downloadable
+      downloadable = msg.downloadable,
+      authzToken = msg.authzToken,
+      numPages = msg.numPages
     )
     val req = PresentationConversionStartedSysMsg(header, body)
     BbbCommonEnvCoreMsg(envelope, req)