diff --git a/LEGO1/mxbitmap.h b/LEGO1/mxbitmap.h
index ba90b7da..791581c6 100644
--- a/LEGO1/mxbitmap.h
+++ b/LEGO1/mxbitmap.h
@@ -25,6 +25,8 @@ struct MxBITMAPINFO {
 #define LOWCOLOR 0 // 256 color
 #define HIGHCOLOR 1 // High Color (16-bit)
 
+// SIZE 0x20
+// VTABLE 0x100dc7b0
 class MxBitmap : public MxCore
 {
 public:
@@ -44,6 +46,8 @@ public:
   virtual MxResult SetBitDepth(MxBool); // vtable+3c
   virtual MxResult StretchBits(HDC p_hdc, int p_xSrc, int p_ySrc, int p_xDest, int p_yDest, int p_destWidth, int p_destHeight); // vtable+40
 
+  inline BITMAPINFOHEADER *GetBmiHeader() const { return m_bmiHeader; }
+
 private:
   MxResult ImportColorsToPalette(RGBQUAD*, MxPalette*);
 
diff --git a/LEGO1/mxdisplaysurface.cpp b/LEGO1/mxdisplaysurface.cpp
index 05a50475..af7e57db 100644
--- a/LEGO1/mxdisplaysurface.cpp
+++ b/LEGO1/mxdisplaysurface.cpp
@@ -176,7 +176,7 @@ void MxDisplaySurface::SetPalette(MxPalette *p_palette)
 }
 
 // OFFSET: LEGO1 0x100bc200 STUB
-void MxDisplaySurface::vtable24(LPDDSURFACEDESC, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4)
+void MxDisplaySurface::vtable24(LPDDSURFACEDESC, MxBitmap*, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4)
 {
 
 }
@@ -188,7 +188,7 @@ MxBool MxDisplaySurface::vtable28(undefined4, undefined4, undefined4, undefined4
 }
 
 // OFFSET: LEGO1 0x100bc630 STUB
-MxBool MxDisplaySurface::vtable2c(LPDDSURFACEDESC, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, MxBool)
+MxBool MxDisplaySurface::vtable2c(LPDDSURFACEDESC, MxBitmap*, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, MxBool)
 {
   return 0;
 }
diff --git a/LEGO1/mxdisplaysurface.h b/LEGO1/mxdisplaysurface.h
index 8e79f6e8..8a80a0f4 100644
--- a/LEGO1/mxdisplaysurface.h
+++ b/LEGO1/mxdisplaysurface.h
@@ -3,6 +3,7 @@
 
 #include <ddraw.h>
 
+#include "mxbitmap.h"
 #include "mxcore.h"
 #include "mxpalette.h"
 #include "mxvideoparam.h"
@@ -25,9 +26,9 @@ public:
   virtual MxResult Create(MxVideoParam &p_videoParam);
   virtual void Clear();
   virtual void SetPalette(MxPalette *p_palette);
-  virtual void vtable24(LPDDSURFACEDESC, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4);
+  virtual void vtable24(LPDDSURFACEDESC, MxBitmap*, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4);
   virtual MxBool vtable28(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4);
-  virtual MxBool vtable2c(LPDDSURFACEDESC, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, MxBool);
+  virtual MxBool vtable2c(LPDDSURFACEDESC, MxBitmap*, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, MxBool);
   virtual MxBool vtable30(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, MxBool);
   virtual undefined4 vtable34(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4);
   virtual void Display(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4);
diff --git a/LEGO1/mxpresenter.h b/LEGO1/mxpresenter.h
index 81ea14ad..156065f4 100644
--- a/LEGO1/mxpresenter.h
+++ b/LEGO1/mxpresenter.h
@@ -68,17 +68,19 @@ public:
 
   MxBool IsEnabled();
 
-  inline MxS32 GetCurrentTickleState() { return this->m_currentTickleState; }
-  inline MxPoint32 GetLocation() { return this->m_location; }
-  inline MxS32 GetDisplayZ() { return this->m_displayZ; }
-  inline MxDSAction *GetAction() { return this->m_action; }
+  inline MxS32 GetCurrentTickleState() const { return this->m_currentTickleState; }
+  inline MxPoint32 GetLocation() const { return this->m_location; }
+  inline MxS32 GetLocationX() const { return this->m_location.m_x; }
+  inline MxS32 GetLocationY() const { return this->m_location.m_y; }
+  inline MxS32 GetDisplayZ() const { return this->m_displayZ; }
+  inline MxDSAction *GetAction() const { return this->m_action; }
 
 protected:
   __declspec(dllexport) void Init();
   void SendTo_unkPresenter(MxOmni *);
 
 private:
-  MxS32 m_currentTickleState; // 0x8
+  TickleState m_currentTickleState; // 0x8
   MxU32 m_previousTickleStates;
   MxPoint32 m_location;
   MxS32 m_displayZ;
diff --git a/LEGO1/mxsmkpresenter.cpp b/LEGO1/mxsmkpresenter.cpp
index cc7efec1..99faae22 100644
--- a/LEGO1/mxsmkpresenter.cpp
+++ b/LEGO1/mxsmkpresenter.cpp
@@ -15,3 +15,14 @@ void MxSmkPresenter::Init()
 {
   // TODO
 }
+
+// OFFSET: LEGO1 0x100b3960
+void MxSmkPresenter::VTable0x60()
+{
+  if (m_bitmap) {
+    delete m_bitmap;
+  }
+
+  m_bitmap = new MxBitmap();
+  m_bitmap->SetSize(m_smkWidth, m_smkHeight, NULL, NULL);
+}
diff --git a/LEGO1/mxsmkpresenter.h b/LEGO1/mxsmkpresenter.h
index 325091bb..34a78dab 100644
--- a/LEGO1/mxsmkpresenter.h
+++ b/LEGO1/mxsmkpresenter.h
@@ -12,7 +12,12 @@ class MxSmkPresenter : public MxVideoPresenter
 public:
   MxSmkPresenter();
 
-  undefined4 m_unk64[430];
+  virtual void VTable0x60() override;
+
+  undefined4 m_unk64;
+  MxS32 m_smkWidth; // 0x68
+  MxS32 m_smkHeight; // 0x6c
+  undefined4 m_unk70[427];
   undefined4 m_unk71c;
 private:
   void Init();
diff --git a/LEGO1/mxtransitionmanager.cpp b/LEGO1/mxtransitionmanager.cpp
index 8d52266c..d7d16544 100644
--- a/LEGO1/mxtransitionmanager.cpp
+++ b/LEGO1/mxtransitionmanager.cpp
@@ -29,7 +29,7 @@ MxTransitionManager::MxTransitionManager()
 // OFFSET: LEGO1 0x1004ba00
 MxTransitionManager::~MxTransitionManager()
 {
-  free(m_copyBuffer);
+  delete[] m_copyBuffer;
 
   if (m_waitIndicator != NULL) {
     delete m_waitIndicator->GetAction();
@@ -324,17 +324,17 @@ void MxTransitionManager::SubmitCopyRect(LPDDSURFACEDESC ddsc)
   }
 
   // Copy the copy rect onto the surface
-  char *dst;
+  MxU8 *dst;
 
-  DWORD bytesPerPixel = ddsc->ddpfPixelFormat.dwRGBBitCount / 8;
+  MxU32 bytesPerPixel = ddsc->ddpfPixelFormat.dwRGBBitCount / 8;
 
-  const char *src = (const char *)m_copyBuffer;
+  const MxU8 *src = (const MxU8 *)m_copyBuffer;
 
-  LONG copyPitch;
+  MxS32 copyPitch;
   copyPitch = ((m_copyRect.right - m_copyRect.left) + 1) * bytesPerPixel;
 
-  LONG y;
-  dst = (char *)ddsc->lpSurface + (ddsc->lPitch * m_copyRect.top) + (bytesPerPixel * m_copyRect.left);
+  MxS32 y;
+  dst = (MxU8 *)ddsc->lpSurface + (ddsc->lPitch * m_copyRect.top) + (bytesPerPixel * m_copyRect.left);
 
   for (y = 0; y < m_copyRect.bottom - m_copyRect.top + 1; ++y) {
     memcpy(dst, src, copyPitch);
@@ -343,7 +343,7 @@ void MxTransitionManager::SubmitCopyRect(LPDDSURFACEDESC ddsc)
   }
 
   // Free the copy buffer
-  free(m_copyBuffer);
+  delete[] m_copyBuffer;
   m_copyBuffer = NULL;
 }
 
@@ -361,11 +361,11 @@ void MxTransitionManager::SetupCopyRect(LPDDSURFACEDESC ddsc)
   // Check if wait indicator has started
   if (m_waitIndicator->GetCurrentTickleState() >= MxPresenter::TickleState_Streaming) {
     // Setup the copy rect
-    DWORD copyPitch = (ddsc->ddpfPixelFormat.dwRGBBitCount / 8) * (m_copyRect.right - m_copyRect.left + 1); // This uses m_copyRect, seemingly erroneously
-    DWORD bytesPerPixel = ddsc->ddpfPixelFormat.dwRGBBitCount / 8;
+    MxU32 copyPitch = (ddsc->ddpfPixelFormat.dwRGBBitCount / 8) * (m_copyRect.right - m_copyRect.left + 1); // This uses m_copyRect, seemingly erroneously
+    MxU32 bytesPerPixel = ddsc->ddpfPixelFormat.dwRGBBitCount / 8;
 
-    m_copyRect.left = m_waitIndicator->GetLocation().m_x;
-    m_copyRect.top = m_waitIndicator->GetLocation().m_y;
+    m_copyRect.left = m_waitIndicator->GetLocationX();
+    m_copyRect.top = m_waitIndicator->GetLocationY();
 
     MxS32 height = m_waitIndicator->GetHeight();
     MxS32 width = m_waitIndicator->GetWidth();
@@ -374,14 +374,14 @@ void MxTransitionManager::SetupCopyRect(LPDDSURFACEDESC ddsc)
     m_copyRect.bottom = m_copyRect.top + height - 1;
 
     // Allocate the copy buffer
-    const char *src = (const char*)ddsc->lpSurface + m_copyRect.top * ddsc->lPitch + bytesPerPixel * m_copyRect.left;
+    const MxU8 *src = (const MxU8*)ddsc->lpSurface + m_copyRect.top * ddsc->lPitch + bytesPerPixel * m_copyRect.left;
 
-    m_copyBuffer = malloc(bytesPerPixel * width * height);
+    m_copyBuffer = new MxU8[bytesPerPixel * width * height];
     if (!m_copyBuffer)
       return;
 
     // Copy into the copy buffer
-    char *dst = (char*)m_copyBuffer;
+    MxU8 *dst = m_copyBuffer;
 
     for (MxS32 i = 0; i < (m_copyRect.bottom - m_copyRect.top + 1); i++)
     {
@@ -396,11 +396,11 @@ void MxTransitionManager::SetupCopyRect(LPDDSURFACEDESC ddsc)
   {
     MxDisplaySurface *displaySurface = VideoManager()->GetDisplaySurface();
     MxBool unkbool = FALSE;
-    displaySurface->vtable2c(ddsc, m_waitIndicator->m_unk50, 0, 0, m_waitIndicator->GetLocation().m_x, m_waitIndicator->GetLocation().m_y, m_waitIndicator->GetWidth(), m_waitIndicator->GetHeight(), unkbool);
+    displaySurface->vtable2c(ddsc, m_waitIndicator->m_bitmap, 0, 0, m_waitIndicator->GetLocationX(), m_waitIndicator->GetLocationY(), m_waitIndicator->GetWidth(), m_waitIndicator->GetHeight(), unkbool);
   }
   else
   {
     MxDisplaySurface *displaySurface = VideoManager()->GetDisplaySurface();
-    displaySurface->vtable24(ddsc, m_waitIndicator->m_unk50, 0, 0, m_waitIndicator->GetLocation().m_x, m_waitIndicator->GetLocation().m_y, m_waitIndicator->GetWidth(), m_waitIndicator->GetHeight());
+    displaySurface->vtable24(ddsc, m_waitIndicator->m_bitmap, 0, 0, m_waitIndicator->GetLocationX(), m_waitIndicator->GetLocationY(), m_waitIndicator->GetWidth(), m_waitIndicator->GetHeight());
   }
 }
diff --git a/LEGO1/mxtransitionmanager.h b/LEGO1/mxtransitionmanager.h
index b4a9ba30..58a8079e 100644
--- a/LEGO1/mxtransitionmanager.h
+++ b/LEGO1/mxtransitionmanager.h
@@ -59,7 +59,7 @@ private:
 
   MxVideoPresenter *m_waitIndicator;
   RECT m_copyRect;
-  void *m_copyBuffer;
+  MxU8 *m_copyBuffer;
 
   flag_bitfield m_copyFlags;
   undefined4 m_unk24;
diff --git a/LEGO1/mxvideopresenter.cpp b/LEGO1/mxvideopresenter.cpp
index fe83a2dc..42dc34f3 100644
--- a/LEGO1/mxvideopresenter.cpp
+++ b/LEGO1/mxvideopresenter.cpp
@@ -8,10 +8,10 @@ void MxVideoPresenter::VTable0x5c()
   // TODO
 }
 
-// OFFSET: LEGO1 0x1000c710 STUB
+// OFFSET: LEGO1 0x1000c710
 void MxVideoPresenter::VTable0x60()
 {
-  // TODO
+  // Empty
 }
 
 // OFFSET: LEGO1 0x1000c720 STUB
@@ -44,24 +44,24 @@ void MxVideoPresenter::VTable0x78()
   // TODO
 }
 
-// OFFSET: LEGO1 0x1000c7c0 STUB
-void MxVideoPresenter::VTable0x7c()
+// OFFSET: LEGO1 0x1000c7c0
+MxBool MxVideoPresenter::VTable0x7c()
 {
-  // TODO
+  return (m_bitmap != NULL) || (m_unk54 != NULL);
 }
 
-// OFFSET: LEGO1 0x1000c7e0 STUB
+// OFFSET: LEGO1 0x1000c7e0
 MxS32 MxVideoPresenter::GetWidth()
 {
-  // TODO
-  return 0;
+  return m_unk54 ? m_unk54->width
+                 : m_bitmap->GetBmiHeader()->biWidth;
 }
 
-// OFFSET: LEGO1 0x1000c800 STUB
+// OFFSET: LEGO1 0x1000c800
 MxS32 MxVideoPresenter::GetHeight()
 {
-  // TODO
-  return 0;
+  return m_unk54 ? m_unk54->height
+                 : m_bitmap->GetBmiHeader()->biHeight;
 }
 
 // OFFSET: LEGO1 0x100b2760 STUB
diff --git a/LEGO1/mxvideopresenter.h b/LEGO1/mxvideopresenter.h
index 84822f71..9c9a21a3 100644
--- a/LEGO1/mxvideopresenter.h
+++ b/LEGO1/mxvideopresenter.h
@@ -2,9 +2,11 @@
 #define MXVIDEOPRESENTER_H
 
 #include "mxmediapresenter.h"
+#include "mxbitmap.h"
 
 #include "decomp.h"
 
+// VTABLE 0x100d4be8
 class MxVideoPresenter : public MxMediaPresenter
 {
 public:
@@ -41,12 +43,20 @@ public:
   virtual void VTable0x70(); // vtable+0x70
   virtual void VTable0x74(); // vtable+0x74
   virtual void VTable0x78(); // vtable+0x78
-  virtual void VTable0x7c(); // vtable+0x7c
+  virtual MxBool VTable0x7c(); // vtable+0x7c
   virtual MxS32 GetWidth();  // vtable+0x80
   virtual MxS32 GetHeight(); // vtable+0x84
 
-  undefined4 m_unk50;
-  undefined4 m_unk54;
+  // TODO: Not sure what this is. Seems to have size of 12 bytes
+  // based on 0x100b9e9a. Values are copied from the bitmap header.
+  typedef struct {
+    undefined unk0[8];
+    MxU16 width;
+    MxU16 height;
+  } unknown_meta_struct;
+
+  MxBitmap *m_bitmap;
+  unknown_meta_struct *m_unk54;
   undefined4 m_unk58;
   undefined2 m_unk5c;
   unsigned char m_flags; // 0x5e