diff --git a/Source/DasherVR/Private/Dasher3DWidget.cpp b/Source/DasherVR/Private/Dasher3DWidget.cpp
index 131080ea1456346ac2dbabd1d20113a5a6f97c56..163510ade75899c5633f5bfcd72b400b8cac4823 100644
--- a/Source/DasherVR/Private/Dasher3DWidget.cpp
+++ b/Source/DasherVR/Private/Dasher3DWidget.cpp
@@ -103,13 +103,16 @@ void ADasher3DWidget::DrawCube(Dasher::screenint posX, Dasher::screenint posY, D
 	BackBuffer->second.Add(Scale.X);
 	BackBuffer->second.Add(Scale.Y);
 	BackBuffer->second.Add(Scale.Z);
-	BackBuffer->second.Add(0.5f * iThickness); //Allows for individual adjustment
+	BackBuffer->second.Add(0.5f * iThickness * (outlineColor.isFullyTransparent() ? 0.0f : 1.0f)); //Allows for individual adjustment
 }
 
 // x & y are given as upper left corner of the character
 void ADasher3DWidget::Draw3DLabel(Label* label, Dasher::screenint x, Dasher::screenint y, Dasher::myint extrusionLevel, Dasher::myint groupRecursionDepth, unsigned int iFontSize, const Dasher::ColorPalette::Color& color) {
 		float CharacterOffset = 0; // in Meters
 
+		if(LabelBackBuffer->first.Max() < LabelBackBuffer->first.Num() + label->m_strText.length()) LabelBackBuffer->first.Reserve(LabelBackBuffer->first.Num() + label->m_strText.length());
+		if(LabelBackBuffer->second.Max() < LabelBackBuffer->second.Num() + label->m_strText.length()) LabelBackBuffer->second.Reserve(LabelBackBuffer->second.Num() + label->m_strText.length());
+
 		FString labelText = UTF8_TO_TCHAR(label->m_strText.c_str());
 		for (int i = 0; i < labelText.Len(); i++)
 		{
@@ -144,7 +147,7 @@ void ADasher3DWidget::Draw3DLabel(Label* label, Dasher::screenint x, Dasher::scr
 			const FVector CharTranslation = FVector(
 					(x / DrawingSize.X + CharScale.X * 0.5f) * WorldToMeters + CharacterOffset, 
 					((y + CharacterVerticalOffset) / DrawingSize.Y) * WorldToMeters,
-					(FMath::Max(ExtrusionLevelToHeight(extrusionLevel), 0.001) + groupRecursionDepth*0.001) * WorldToMeters + 0.01f
+					(FMath::Max(ExtrusionLevelToHeight(extrusionLevel), 0.001) + groupRecursionDepth*0.001) * WorldToMeters + 0.05f
 				)
 				- FVector(0.5f, 0.5f, 0) * WorldToMeters; // Move to upper left corner of parent
 
@@ -238,6 +241,23 @@ void ADasher3DWidget::Display()
 			LetterInstances->SetCustomData(i, data);
 	}
 
+	//Events:
+	const FString Buffer = DasherMainInterface->GetBuffer();
+	if (CharacterEnteredFlag && CharacterDeletedFlag) {
+		CharacterSwitched(AlteredChar, Buffer);
+        BufferAltered(Buffer);
+	}
+	else if (CharacterEnteredFlag) {
+		CharacterEntered(AlteredChar, Buffer);
+		BufferAltered(Buffer);
+	}
+	else if (CharacterDeletedFlag) {
+		CharacterDeleted(AlteredChar, Buffer);
+		BufferAltered(Buffer);
+	}
+
+	CharacterEnteredFlag = false;
+	CharacterDeletedFlag = false;
 }
 
 bool ADasher3DWidget::IsPointVisible(Dasher::screenint x, Dasher::screenint y)
@@ -265,11 +285,11 @@ void ADasher3DWidget::SimulateClick(FKey Key, bool pressed)
 {
 	if(Key == EKeys::LeftMouseButton || Key == EKeys::RightMouseButton)
 	if(pressed)
-	{
-		DasherMainInterface->KeyDown(FDateTime::Now().GetSecond() + FDateTime::Now().GetMillisecond(), (Key == EKeys::LeftMouseButton)?100:101);
+	{ 
+		DasherMainInterface->KeyDown(FDateTime::Now().GetSecond() + FDateTime::Now().GetMillisecond(), (Key == EKeys::LeftMouseButton) ? Dasher::Keys::Primary_Input : Dasher::Keys::Secondary_Input);
 	} else
 	{
-		DasherMainInterface->KeyUp(FDateTime::Now().GetSecond() + FDateTime::Now().GetMillisecond(), (Key == EKeys::LeftMouseButton)?100:101);
+		DasherMainInterface->KeyUp(FDateTime::Now().GetSecond() + FDateTime::Now().GetMillisecond(), (Key == EKeys::LeftMouseButton) ? Dasher::Keys::Primary_Input : Dasher::Keys::Secondary_Input);
 	}
 }
 
@@ -293,13 +313,14 @@ void ADasher3DWidget::InitializeDasher() {
 	resize(DrawingSize.X, DrawingSize.Y);
 
 	static Dasher::XMLErrorDisplay display;
-	Dasher::XmlSettingsStore* Settings = new Dasher::XmlSettingsStore("Settings.xml"/*, &fileUtils*/, &display); //Gets deleted somewhere else
+	Dasher::XmlSettingsStore* Settings = new Dasher::XmlSettingsStore("Settings3D.xml"/*, &fileUtils*/, &display); //Gets deleted somewhere else
 	Settings->Load();
 	Settings->Save();
 	DasherMainInterface = MakeShared<Dasher::DasherInterface>(Settings);
-	DasherMainInterface->SetDefaultInputDevice(this);
-	//change dasher parameters
-	DasherMainInterface->SetLongParameter(Dasher::LP_SHAPE_TYPE, Dasher::Options::CUBE);
+	DasherMainInterface->GetModuleManager()->RegisterInputDeviceModule(this, true);
+
+	DasherMainInterface->SetCharEnteredCallback([this](FString Char, FString Buffer) {CharacterEnteredFlag = true; AlteredChar = Char; });
+	DasherMainInterface->SetCharDeletedCallback([this](FString Char, FString Buffer) {CharacterDeletedFlag = true; AlteredChar = Char; });
 
 	DasherMainInterface->SetScreen(this);
 	DasherMainInterface->SetBuffer(0);
diff --git a/Source/DasherVR/Private/DasherInterface.cpp b/Source/DasherVR/Private/DasherInterface.cpp
index bf2a2eb4c6c2d4e3105b84f382138ba1038cad70..b6b085be38e353ac3334ae91bd50eaa379499206 100644
--- a/Source/DasherVR/Private/DasherInterface.cpp
+++ b/Source/DasherVR/Private/DasherInterface.cpp
@@ -28,11 +28,11 @@ namespace Dasher
 	//The next functions operate on the buffer
 
 	//For now can only return one character around the cursor
-	std::string DasherInterface::GetTextAroundCursor(Dasher::CControlManager::EditDistance iDist)
+	std::string DasherInterface::GetTextAroundCursor(Dasher::EditDistance iDist)
 	{		
 		if (Buffer.Len()>Cursor)
 		{
-			if (iDist == Dasher::CControlManager::EditDistance::EDIT_CHAR)
+			if (iDist == Dasher::EditDistance::EDIT_CHAR)
 			{
 				const FString Output = Buffer.Mid(Cursor, 1);
 				return TCHAR_TO_UTF8(*Output);
@@ -47,9 +47,9 @@ namespace Dasher
 		return std::string("Cursor out of bounds");
 	}
 
-	unsigned int DasherInterface::ctrlMove(bool bForwards, Dasher::CControlManager::EditDistance dist)
+	unsigned int DasherInterface::ctrlMove(bool bForwards, Dasher::EditDistance dist)
 	{
-		if (dist == Dasher::CControlManager::EditDistance::EDIT_CHAR)
+		if (dist == Dasher::EditDistance::EDIT_CHAR)
 		{
 			if (bForwards) Cursor++;
 			else Cursor--;
@@ -57,9 +57,9 @@ namespace Dasher
 		return Cursor;
 	}
 
-	unsigned int DasherInterface::ctrlDelete(bool bForwards, Dasher::CControlManager::EditDistance dist)
+	unsigned int DasherInterface::ctrlDelete(bool bForwards, Dasher::EditDistance dist)
 	{
-		if (dist == Dasher::CControlManager::EditDistance::EDIT_CHAR)
+		if (dist == Dasher::EditDistance::EDIT_CHAR)
 		{
 			const int Index = Cursor - (bForwards ? 0 : 1);
 			const FString DeletedChar = Buffer.Mid(Index, 1);
diff --git a/Source/DasherVR/Private/SDasherWidget.cpp b/Source/DasherVR/Private/SDasherWidget.cpp
index c533fc775f94695ca56599a8ed250d1cad2519f6..255d07b34c576cde7e033bac5136d116a26118ae 100644
--- a/Source/DasherVR/Private/SDasherWidget.cpp
+++ b/Source/DasherVR/Private/SDasherWidget.cpp
@@ -52,7 +52,7 @@ FReply SDasherWidget::HandleMouseDownEvent(const FGeometry& Geometry, const FPoi
         CurrentlyUsingVectorInput = false;
         return FReply::Handled().LockMouseToWidget(AsShared());
     }
-    DasherMainInterface->KeyDown(FDateTime::Now().GetSecond() + FDateTime::Now().GetMillisecond(), 100); //100 is the keycode for LMB
+    DasherMainInterface->KeyDown(FDateTime::Now().GetSecond() + FDateTime::Now().GetMillisecond(), Dasher::Keys::Primary_Input);
     MouseDownListeners.ExecuteIfBound();
   }
   return FReply::Handled().LockMouseToWidget(AsShared());
@@ -65,7 +65,7 @@ FReply SDasherWidget::HandleMouseUpEvent(const FGeometry& Geometry, const FPoint
         CurrentlyUsingVectorInput = false;
         return FReply::Handled().ReleaseMouseLock();
     }
-    DasherMainInterface->KeyUp(FDateTime::Now().GetSecond() + FDateTime::Now().GetMillisecond(), 100); //100 is the keycode for LMB
+    DasherMainInterface->KeyUp(FDateTime::Now().GetSecond() + FDateTime::Now().GetMillisecond(), Dasher::Keys::Primary_Input);
     MouseUpListeners.ExecuteIfBound();
 
     return FReply::Handled().ReleaseMouseLock();
@@ -80,7 +80,7 @@ FReply SDasherWidget::HandleMouseDoubleClickEvent(const FGeometry& Geometry, con
             CurrentlyUsingVectorInput = false;
             return FReply::Handled();
         }
-        DasherMainInterface->KeyUp(FDateTime::Now().GetSecond() + FDateTime::Now().GetMillisecond(), 100); //100 is the keycode for LMB
+        DasherMainInterface->KeyUp(FDateTime::Now().GetSecond() + FDateTime::Now().GetMillisecond(), Dasher::Keys::Primary_Input);
     }
         return FReply::Handled();
 }
@@ -117,10 +117,10 @@ void SDasherWidget::InputButton(bool Pressed)
         CurrentlyUsingVectorInput = true;
         if (Pressed)
         {
-            DasherMainInterface->KeyDown(FDateTime::Now().GetSecond() + FDateTime::Now().GetMillisecond(), 100); //100 is the keycode for LMB	
+            DasherMainInterface->KeyDown(FDateTime::Now().GetSecond() + FDateTime::Now().GetMillisecond(), Dasher::Keys::Primary_Input);
         }
         else {
-            DasherMainInterface->KeyUp(FDateTime::Now().GetSecond() + FDateTime::Now().GetMillisecond(), 100); //100 is the keycode for LMB
+            DasherMainInterface->KeyUp(FDateTime::Now().GetSecond() + FDateTime::Now().GetMillisecond(), Dasher::Keys::Primary_Input);
         }
     }
 }
@@ -142,11 +142,10 @@ void SDasherWidget::Construct(const FArguments& InArgs)
   Settings->Load();
   Settings->Save();
   DasherMainInterface = MakeShared<Dasher::DasherInterface>(Settings);
-  DasherMainInterface->SetDefaultInputDevice(this);
+  DasherMainInterface->GetModuleManager()->RegisterInputDeviceModule(this, true);
 
   DasherMainInterface->SetScreen(this);
   DasherMainInterface->SetBuffer(0);
-  DasherMainInterface->SetLongParameter(Dasher::LP_SHAPE_TYPE, Dasher::Options::OVERLAPPING_RECTANGLE);
 
   DasherMainInterface->SetCharEnteredCallback([this](FString Char, FString Buffer) {CharacterEnteredFlag = true; AlteredChar = Char; });
   DasherMainInterface->SetCharDeletedCallback([this](FString Char, FString Buffer) {CharacterDeletedFlag = true; AlteredChar = Char; });
@@ -215,8 +214,8 @@ int32 SDasherWidget::OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGe
         break;
       case PolyLine:
         LineObject = static_cast<FPolyLine*>(GeneralObject.Get());
-        FSlateDrawElement::MakeLines(OutDrawElements, LayerId++, AllottedGeometry.ToPaintGeometry(), LineObject->points, ESlateDrawEffect::None, LineObject->color, true, LineObject->linewidth);
-        break;
+        FSlateDrawElement::MakeLines(OutDrawElements, LayerId++, AllottedGeometry.ToPaintGeometry(), LineObject->points, ESlateDrawEffect::None, LineObject->color, LineObject->AntiAliasing, LineObject->linewidth);
+    	break;
       default: break;
     }
   }
@@ -275,30 +274,24 @@ void SDasherWidget::Display() {
 //Functions for Drawing
 void SDasherWidget::DrawRectangle(Dasher::screenint x1, Dasher::screenint y1, Dasher::screenint x2, Dasher::screenint y2, const Dasher::ColorPalette::Color& color, const Dasher::ColorPalette::Color& outlineColor, int iThickness)
 {
-	FVector2D TopBG = FVector2D(x1, y1);
-	FVector2D BottomBG = FVector2D(x2, y2);
-	FVector2D TopFG(x1, y1);
-	FVector2D BottomFG(x2, y2);
+    if(outlineColor == Dasher::ColorPalette::noColor) iThickness = 0; // Draw till brim if no outline color is given
 
-	if (iThickness)
+	if(color != Dasher::ColorPalette::noColor && !color.isFullyTransparent())
 	{
-		TopFG = FVector2D(x1+iThickness, y1+iThickness);
-		BottomFG = FVector2D(x2-iThickness, y2-iThickness);
-
-		TArray<FVector2D> PointArray = {
-		{TopBG.X, TopBG.Y},
-		{TopBG.X, BottomBG.Y},
-		{BottomBG.X, BottomBG.Y},
-		{BottomBG.X, TopBG.Y},
-		{TopBG.X, TopBG.Y}
-		};
-
-		BackBuffer->Add(MakeUnique<FPolyLine>(PointArray, static_cast<float>(iThickness), FLinearColor(color.Red / 255.0, color.Green / 255.0, color.Blue / 255.0, color.Alpha / 255.0f)));
+		BackBuffer->Add(MakeUnique<FFilledRect>(FVector2D(x1 + iThickness, y1 + iThickness), FVector2D(x2 - iThickness, y2 - iThickness), FLinearColor(color.Red / 255.0f, color.Green / 255.0f, color.Blue / 255.0f, color.Alpha / 255.0f)));
 	}
 
-	if(color != Dasher::ColorPalette::noColor)
+	if (iThickness && outlineColor != Dasher::ColorPalette::noColor && !outlineColor.isFullyTransparent())
 	{
-		BackBuffer->Add(MakeUnique<FFilledRect>(TopFG, BottomFG, FLinearColor(color.Red / 255.0f, color.Green / 255.0f, color.Blue / 255.0f, color.Alpha / 255.0f)));
+        const float hThickness = iThickness / 2.0f;
+		const FVector2D CornerMin = FVector2D(x1 + hThickness, y1 + hThickness);
+		const FVector2D CornerMax = FVector2D(x2 - hThickness, y2 - hThickness);
+
+        const FLinearColor oColor = FLinearColor(outlineColor.Red / 255.0, outlineColor.Green / 255.0, outlineColor.Blue / 255.0, outlineColor.Alpha / 255.0f);
+        BackBuffer->Add(MakeUnique<FPolyLine>(TArray({FVector2D(CornerMin.X, CornerMin.Y - hThickness),FVector2D(CornerMin.X, CornerMax.Y + hThickness)}), static_cast<float>(iThickness), oColor, false));
+        BackBuffer->Add(MakeUnique<FPolyLine>(TArray({FVector2D(CornerMin.X - hThickness, CornerMax.Y),FVector2D(CornerMax.X + hThickness, CornerMax.Y)}), static_cast<float>(iThickness), oColor, false));
+        BackBuffer->Add(MakeUnique<FPolyLine>(TArray({FVector2D(CornerMax.X, CornerMax.Y + hThickness),FVector2D(CornerMax.X, CornerMin.Y - hThickness)}), static_cast<float>(iThickness), oColor, false));
+        BackBuffer->Add(MakeUnique<FPolyLine>(TArray({FVector2D(CornerMax.X + hThickness, CornerMin.Y),FVector2D(CornerMin.X - hThickness, CornerMin.Y)}), static_cast<float>(iThickness), oColor, false));
 	}
 }
 
@@ -313,7 +306,7 @@ void SDasherWidget::Polyline(CDasherScreen::point* points, int number, int iwidt
     PointArray.Add(Point);
   }
   
-  BackBuffer->Add(MakeUnique<FPolyLine>(PointArray, static_cast<float>(iwidth), FLinearColor(color.Red / 255.0, color.Green / 255.0, color.Blue / 255.0, color.Alpha / 255.0f)));
+  BackBuffer->Add(MakeUnique<FPolyLine>(PointArray, static_cast<float>(iwidth), FLinearColor(color.Red / 255.0, color.Green / 255.0, color.Blue / 255.0, color.Alpha / 255.0f), true));
 }
 
 //techincally polygons are just multiple polylines. Dasher doesn't actually draw polygons in our case.
@@ -325,7 +318,7 @@ void SDasherWidget::Polygon(CDasherScreen::point* points, int number, const Dash
   }
   PointArray.Add(FVector2D(points[0].x, points[0].y));
 
-  BackBuffer->Add(MakeUnique<FPolyLine>(PointArray, static_cast<float>(iwidth), FLinearColor(outlinecolor.Red / 255.0, outlinecolor.Green / 255.0, outlinecolor.Blue / 255.0, outlinecolor.Alpha / 255.0)));
+  BackBuffer->Add(MakeUnique<FPolyLine>(PointArray, static_cast<float>(iwidth), FLinearColor(outlinecolor.Red / 255.0, outlinecolor.Green / 255.0, outlinecolor.Blue / 255.0, outlinecolor.Alpha / 255.0), true));
 }
 
 //We pass through the contents of the dasher buffer
diff --git a/Source/DasherVR/Public/Dasher3DWidget.h b/Source/DasherVR/Public/Dasher3DWidget.h
index 936e4074bafe6e262f14b83de16af027b0a0937f..84daed0d7bf85a3e5cb8b179602d9680151f4e66 100644
--- a/Source/DasherVR/Public/Dasher3DWidget.h
+++ b/Source/DasherVR/Public/Dasher3DWidget.h
@@ -7,20 +7,19 @@
 #include "GameFramework/Actor.h"
 #include "DasherCoreWrapper.h"
 #include "DasherInterface.h"
-#include "Fonts/FontMeasure.h"
 #include "Components/InstancedStaticMeshComponent.h"
 #include "Engine/Texture2DArray.h"
 #include "Materials/Material.h"
-#include "Dasher3DWidget.generated.h"
 
 class DasherParents : public Dasher::CDasherScreen, public Dasher::CScreenCoordInput
 {
 public:
-	DasherParents() : CDasherScreen(0,0), CScreenCoordInput(0, _("Mouse Input")){};
+	DasherParents() : CDasherScreen(0,0), CScreenCoordInput("Mouse Input"){};
 };
 
+#include "Dasher3DWidget.generated.h"
 
-UCLASS()
+UCLASS(BlueprintType)
 class DASHERVR_API ADasher3DWidget : public AActor, public DasherParents
 {
 	GENERATED_BODY()
@@ -52,7 +51,6 @@ public:
 	virtual void Display() override;
 	virtual bool IsPointVisible(Dasher::screenint x, Dasher::screenint y) override;
 	virtual bool GetScreenCoords(Dasher::screenint& iX, Dasher::screenint& iY, Dasher::CDasherView* pView) override;
-	virtual bool MultiSizeFonts() override { return true; }
 	virtual void SendMarker(int Marker) override {};
 
 	FVector2D GetCursorPosition(){return CursorPosition;};
@@ -69,7 +67,17 @@ public:
 	UFUNCTION(BlueprintCallable) void SetMouseLocation(FVector WorldLocation);
 	UFUNCTION(BlueprintCallable) void SimulateClick(FKey Key, bool pressed);
 	virtual void PostInitializeComponents() override;
+
+public:
+	UFUNCTION(BlueprintImplementableEvent) void CharacterEntered(const FString& Char, const FString& Buffer);
+	UFUNCTION(BlueprintImplementableEvent) void CharacterDeleted(const FString& Char, const FString& Buffer);
+	UFUNCTION(BlueprintImplementableEvent) void CharacterSwitched(const FString& Char, const FString& Buffer);
+	UFUNCTION(BlueprintImplementableEvent) void BufferAltered(const FString& Buffer);
+private:
 	
+	bool CharacterEnteredFlag = false;
+	bool CharacterDeletedFlag = false;
+	FString AlteredChar = "";
 
 private:
 	FVector2D CursorPosition;
diff --git a/Source/DasherVR/Public/DasherInterface.h b/Source/DasherVR/Public/DasherInterface.h
index bc2de9c7651949b6664df88755feda0884b8d0a9..6ff93a03db10f9d7c146f9293c49dfa47f245295 100644
--- a/Source/DasherVR/Public/DasherInterface.h
+++ b/Source/DasherVR/Public/DasherInterface.h
@@ -37,7 +37,7 @@ namespace Dasher
 		/// For character around cursor decision is arbitrary. Let's settle for character before cursor.
 		/// TODO. Consistently name functions dealing with dasher context, versus functions dealing with editor text.
 		/// I.E. GetAllContext should be named GetAllTtext
-		virtual std::string GetTextAroundCursor(Dasher::CControlManager::EditDistance) override;
+		virtual std::string GetTextAroundCursor(Dasher::EditDistance) override;
 
 		
 		///Called to execute a control-mode "move" command.
@@ -45,7 +45,7 @@ namespace Dasher
 		///\param dist how far to move: character, word, line, file. (Usually defined
 		/// by OS, e.g. for non-european languages)
 		///\return the offset, into the edit buffer of the cursor *after* the move.
-		virtual unsigned int ctrlMove(bool bForwards, Dasher::CControlManager::EditDistance dist) override;
+		virtual unsigned int ctrlMove(bool bForwards, Dasher::EditDistance dist) override;
 
 		
 		///Called to execute a control-mode "delete" command.
@@ -54,7 +54,7 @@ namespace Dasher
 		/// by OS, e.g. for non-european languages)
 		///\return the offset, into the edit buffer, of the cursor *after* the delete
 		/// (for forwards deletion, this will be the same as the offset *before
-		virtual unsigned int ctrlDelete(bool bForwards, Dasher::CControlManager::EditDistance dist) override;
+		virtual unsigned int ctrlDelete(bool bForwards, Dasher::EditDistance dist) override;
 		
 		///Clears all written text from edit buffer and rebuilds the model. The default
 		/// implementation does this using the control mode editDelete mechanism
diff --git a/Source/DasherVR/Public/SDasherWidget.h b/Source/DasherVR/Public/SDasherWidget.h
index b3fa7adc03b039b667fc8125628a4c0e076f222a..ead5b120b45b995fbc2ea9b333dcb94f63164ebd 100644
--- a/Source/DasherVR/Public/SDasherWidget.h
+++ b/Source/DasherVR/Public/SDasherWidget.h
@@ -49,9 +49,10 @@ struct FWriting : DasherDrawGeometry{
 struct FPolyLine : DasherDrawGeometry{
 	TArray<FVector2D> points;
 	float linewidth;
+	bool AntiAliasing;
 	FLinearColor color;
 
-	FPolyLine(TArray<FVector2D> Points, float LineWidth, FLinearColor Color): DasherDrawGeometry(PolyLine), points(Points), linewidth(LineWidth), color(Color)  {}
+	FPolyLine(TArray<FVector2D> Points, float LineWidth, FLinearColor Color, bool AntiAliasing): DasherDrawGeometry(PolyLine), points(Points), linewidth(LineWidth), AntiAliasing(AntiAliasing), color(Color)  {}
 };
 
 DECLARE_DELEGATE(FDasherMouseUpDelegate);
@@ -74,7 +75,7 @@ public:
 
 	typedef Dasher::screenint screenint;
 	
-	SDasherWidget(): CDasherScreen(0,0), CScreenCoordInput(0, _("Mouse Input")) {}
+	SDasherWidget(): CDasherScreen(0,0), CScreenCoordInput("Mouse Input") {}
 
 	// Constructs this widget with InArgs. Needed for every widget. Builds this widget and any of its children
 	void Construct(const FArguments& InArgs);
@@ -104,8 +105,6 @@ public:
 
 	virtual bool IsPointVisible(screenint x, screenint y) override { return true; }
 
-	virtual bool MultiSizeFonts() override {return true;}
-
 	//Pass-me-down returning Buffer
 	FString GetBuffer() const;
 	void ResetBuffer();
@@ -124,7 +123,7 @@ public:
 	FReply HandleMouseUpEvent(const FGeometry& Geometry, const FPointerEvent& MouseEvent);
     FReply HandleMouseDoubleClickEvent(const FGeometry& Geometry, const FPointerEvent& MouseEvent);
 
-	virtual bool SupportsKeyboardFocus() const override {return true;};
+	virtual bool SupportsKeyboardFocus() const override {return true;}
 
 	virtual bool GetScreenCoords(screenint& iX, screenint& iY, Dasher::CDasherView* pView) override;
 
@@ -150,8 +149,8 @@ private:
 	TArray<TUniquePtr<DasherDrawGeometry>>* BackBuffer = &GeometryBufferA;
 	TArray<TUniquePtr<DasherDrawGeometry>>* FrontBuffer = &GeometryBufferB;
 	
-	int Height;
-	int Width;
+	int Height = 0;
+	int Width = 0;
 	bool HasBeenPainted = false;
 	bool CurrentlyUsingVectorInput = false;
 	FVector2D CursorPosition;
diff --git a/Source/Thirdparty/Dasher/DasherCore b/Source/Thirdparty/Dasher/DasherCore
index 841a75e6a3410f40a44696a5ba4b224fac32566c..a4df257624722cae45b8d9dd5d14dea8ce1dc4a5 160000
--- a/Source/Thirdparty/Dasher/DasherCore
+++ b/Source/Thirdparty/Dasher/DasherCore
@@ -1 +1 @@
-Subproject commit 841a75e6a3410f40a44696a5ba4b224fac32566c
+Subproject commit a4df257624722cae45b8d9dd5d14dea8ce1dc4a5
diff --git a/Source/Thirdparty/Dasher/Lib/DasherCore.lib b/Source/Thirdparty/Dasher/Lib/DasherCore.lib
index 211eee4b20608207d8122a1c2a774eabf90dbc57..f6fcc0b262a35b3beb1cd44e1d76c564867c54ab 100644
--- a/Source/Thirdparty/Dasher/Lib/DasherCore.lib
+++ b/Source/Thirdparty/Dasher/Lib/DasherCore.lib
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:6b5181c3f79660521838bb8c41ba794ef0520053e866f40be22e12913b5de066
-size 20109586
+oid sha256:aabffff7bea2fe1a696c01b35344a381f1da6075928bc3dbee9131143eef7d66
+size 29696466
diff --git a/Source/Thirdparty/Dasher/Lib/DasherCore.pdb b/Source/Thirdparty/Dasher/Lib/DasherCore.pdb
index c5fff29c9228c3de21efa84677b30bac89437b21..70bf6b88afa9394bf1c2a60e6895c731a985b585 100644
Binary files a/Source/Thirdparty/Dasher/Lib/DasherCore.pdb and b/Source/Thirdparty/Dasher/Lib/DasherCore.pdb differ
diff --git a/Source/Thirdparty/Dasher/Lib/pugixml.lib b/Source/Thirdparty/Dasher/Lib/pugixml.lib
index 0c2d22f788751b38a0d3b9de1e36661de8012548..cc5f076671ff70b42d2c22427a759760c21d7f69 100644
--- a/Source/Thirdparty/Dasher/Lib/pugixml.lib
+++ b/Source/Thirdparty/Dasher/Lib/pugixml.lib
@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:4ba9e6aa5ee9fae8c09359967d418ad10f9929acb2d0ae35285f9ad73e21bd95
-size 1492554
+oid sha256:50b65a51cb2f9725e9aa50ec22d9b96566400dd18c424bf28bdb98a6bdc63782
+size 1492990
diff --git a/Source/Thirdparty/Dasher/Lib/pugixml.pdb b/Source/Thirdparty/Dasher/Lib/pugixml.pdb
index b94dafb163cafd6c3357df13b6a2005a3c608016..ce063a7660e3e0bfde4796129e03c37b0abd4082 100644
Binary files a/Source/Thirdparty/Dasher/Lib/pugixml.pdb and b/Source/Thirdparty/Dasher/Lib/pugixml.pdb differ