Utilized more C++11 constructs. Also attempted to fix issue with the Info Box not wanting to come up anymore if the file doesn't exist.
Utilized more C++11 constructs. Also attempted to fix issue with the Info Box not wanting to come up anymore if the file doesn't exist.

--- a/src/in_2sf/XSFPlayer_2SF.cpp
+++ b/src/in_2sf/XSFPlayer_2SF.cpp
@@ -488,9 +488,9 @@
 	if (level <= 10 && xSF->GetTagExists("_lib"))
 	{
 #ifdef _WIN32
-		auto libxSF = std::auto_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetWStr()) + xSF->GetTagValue("_lib").GetWStr(), 4, 8));
+		auto libxSF = std::unique_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetWStr()) + xSF->GetTagValue("_lib").GetWStr(), 4, 8));
 #else
-		auto libxSF = std::auto_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetAnsi()) + xSF->GetTagValue("_lib").GetAnsi(), 4, 8));
+		auto libxSF = std::unique_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetAnsi()) + xSF->GetTagValue("_lib").GetAnsi(), 4, 8));
 #endif
 		if (!RecursiveLoad2SF(libxSF.get(), level + 1))
 			return false;
@@ -509,9 +509,9 @@
 		{
 			found = true;
 #ifdef _WIN32
-			auto libxSF = std::auto_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetWStr()) + xSF->GetTagValue(libTag).GetWStr(), 4, 8));
+			auto libxSF = std::unique_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetWStr()) + xSF->GetTagValue(libTag).GetWStr(), 4, 8));
 #else
-			auto libxSF = std::auto_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetAnsi()) + xSF->GetTagValue(libTag).GetAnsi(), 4, 8));
+			auto libxSF = std::unique_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetAnsi()) + xSF->GetTagValue(libTag).GetAnsi(), 4, 8));
 #endif
 			if (!RecursiveLoad2SF(libxSF.get(), level + 1))
 				return false;

--- a/src/in_gsf/XSFPlayer_GSF.cpp
+++ b/src/in_gsf/XSFPlayer_GSF.cpp
@@ -149,9 +149,9 @@
 	if (level <= 10 && xSF->GetTagExists("_lib"))
 	{
 #ifdef _WIN32
-		auto libxSF = std::auto_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetWStr()) + xSF->GetTagValue("_lib").GetWStr(), 8, 12));
+		auto libxSF = std::unique_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetWStr()) + xSF->GetTagValue("_lib").GetWStr(), 8, 12));
 #else
-		auto libxSF = std::auto_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetAnsi()) + xSF->GetTagValue("_lib").GetAnsi(), 8, 12));
+		auto libxSF = std::unique_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetAnsi()) + xSF->GetTagValue("_lib").GetAnsi(), 8, 12));
 #endif
 		if (!RecursiveLoad2SF(libxSF.get(), level + 1))
 			return false;
@@ -170,9 +170,9 @@
 		{
 			found = true;
 #ifdef _WIN32
-			auto libxSF = std::auto_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetWStr()) + xSF->GetTagValue(libTag).GetWStr(), 8, 12));
+			auto libxSF = std::unique_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetWStr()) + xSF->GetTagValue(libTag).GetWStr(), 8, 12));
 #else
-			auto libxSF = std::auto_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetAnsi()) + xSF->GetTagValue(libTag).GetAnsi(), 8, 12));
+			auto libxSF = std::unique_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetAnsi()) + xSF->GetTagValue(libTag).GetAnsi(), 8, 12));
 #endif
 			if (!RecursiveLoad2SF(libxSF.get(), level + 1))
 				return false;

--- a/src/in_ncsf/SSEQPlayer/SDAT.h
+++ b/src/in_ncsf/SSEQPlayer/SDAT.h
@@ -18,9 +18,9 @@
 
 struct SDAT
 {
-	std::auto_ptr<SSEQ> sseq;
-	std::auto_ptr<SBNK> sbnk;
-	std::auto_ptr<SWAR> swar[4];
+	std::unique_ptr<SSEQ> sseq;
+	std::unique_ptr<SBNK> sbnk;
+	std::unique_ptr<SWAR> swar[4];
 
 	SDAT(PseudoFile &file, uint32_t sseqToLoad);
 private:

--- a/src/in_ncsf/XSFPlayer_NCSF.cpp
+++ b/src/in_ncsf/XSFPlayer_NCSF.cpp
@@ -61,9 +61,9 @@
 	if (level <= 10 && xSFToLoad->GetTagExists("_lib"))
 	{
 #ifdef _WIN32
-		auto libxSF = std::auto_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSFToLoad->GetFilename().GetWStr()) + xSFToLoad->GetTagValue("_lib").GetWStr(), 8, 12));
+		auto libxSF = std::unique_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSFToLoad->GetFilename().GetWStr()) + xSFToLoad->GetTagValue("_lib").GetWStr(), 8, 12));
 #else
-		auto libxSF = std::auto_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSFToLoad->GetFilename().GetAnsi()) + xSFToLoad->GetTagValue("_lib").GetAnsi(), 8, 12));
+		auto libxSF = std::unique_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSFToLoad->GetFilename().GetAnsi()) + xSFToLoad->GetTagValue("_lib").GetAnsi(), 8, 12));
 #endif
 		if (!this->RecursiveLoadNCSF(libxSF.get(), level + 1))
 			return false;
@@ -82,9 +82,9 @@
 		{
 			found = true;
 #ifdef _WIN32
-			auto libxSF = std::auto_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSFToLoad->GetFilename().GetWStr()) + xSFToLoad->GetTagValue(libTag).GetWStr(), 8, 12));
+			auto libxSF = std::unique_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSFToLoad->GetFilename().GetWStr()) + xSFToLoad->GetTagValue(libTag).GetWStr(), 8, 12));
 #else
-			auto libxSF = std::auto_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSFToLoad->GetFilename().GetAnsi()) + xSFToLoad->GetTagValue(libTag).GetAnsi(), 8, 12));
+			auto libxSF = std::unique_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSFToLoad->GetFilename().GetAnsi()) + xSFToLoad->GetTagValue(libTag).GetAnsi(), 8, 12));
 #endif
 			if (!this->RecursiveLoadNCSF(libxSF.get(), level + 1))
 				return false;

--- a/src/in_ncsf/XSFPlayer_NCSF.h
+++ b/src/in_ncsf/XSFPlayer_NCSF.h
@@ -22,7 +22,7 @@
 {
 	uint32_t sseq;
 	std::vector<uint8_t> sdatData;
-	std::auto_ptr<SDAT> sdat;
+	std::unique_ptr<SDAT> sdat;
 	Player player;
 	double secondsPerSample, secondsIntoPlayback, secondsUntilNextClock;
 	std::bitset<16> mutes;

--- a/src/in_snsf/XSFPlayer_SNSF.cpp
+++ b/src/in_snsf/XSFPlayer_SNSF.cpp
@@ -160,9 +160,9 @@
 	if (level <= 10 && xSF->GetTagExists("_lib"))
 	{
 #ifdef _WIN32
-		auto libxSF = std::auto_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetWStr()) + xSF->GetTagValue("_lib").GetWStr(), 4, 8));
+		auto libxSF = std::unique_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetWStr()) + xSF->GetTagValue("_lib").GetWStr(), 4, 8));
 #else
-		auto libxSF = std::auto_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetAnsi()) + xSF->GetTagValue("_lib").GetAnsi(), 4, 8));
+		auto libxSF = std::unique_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetAnsi()) + xSF->GetTagValue("_lib").GetAnsi(), 4, 8));
 #endif
 		if (!RecursiveLoad2SF(libxSF.get(), level + 1))
 			return false;
@@ -181,9 +181,9 @@
 		{
 			found = true;
 #ifdef _WIN32
-			auto libxSF = std::auto_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetWStr()) + xSF->GetTagValue(libTag).GetWStr(), 4, 8));
+			auto libxSF = std::unique_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetWStr()) + xSF->GetTagValue(libTag).GetWStr(), 4, 8));
 #else
-			auto libxSF = std::auto_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetAnsi()) + xSF->GetTagValue(libTag).GetAnsi(), 4, 8));
+			auto libxSF = std::unique_ptr<XSFFile>(new XSFFile(ExtractDirectoryFromPath(xSF->GetFilename().GetAnsi()) + xSF->GetTagValue(libTag).GetAnsi(), 4, 8));
 #endif
 			if (!RecursiveLoad2SF(libxSF.get(), level + 1))
 				return false;

--- a/src/in_xsf_framework/DialogBuilder.cpp
+++ b/src/in_xsf_framework/DialogBuilder.cpp
@@ -21,7 +21,7 @@
 	short x = 0, num = this->controls.empty() ? 0 : this->controls.size();
 	for (; x < num; ++x)
 	{
-		DialogControl *control = this->controls[x];
+		auto &control = this->controls[x];
 		if (control->relativePosition.get())
 		{
 			bool valid = true;
@@ -58,10 +58,8 @@
 void DialogTemplate::DialogGroup::CalculateSize()
 {
 	short maxX = 0, maxY = 0, maxOtherWidth = 0, maxOtherHeight = 0;
-	for (DialogTemplate::Controls::const_iterator curr = this->controls.begin(), end = this->controls.end(); curr != end; ++curr)
-	{
-		DialogControl *control = *curr;
-
+	std::for_each(this->controls.begin(), this->controls.end(), [&](const std::unique_ptr<DialogControl> &control)
+	{
 		bool usePosition = true;
 		if (control->relativePosition.get())
 		{
@@ -92,7 +90,7 @@
 			if (control->rect.position.y + control->GetControlHeight() > maxY)
 				maxY = control->rect.position.y + control->GetControlHeight();
 		}
-	}
+	});
 	this->rect.size.width = (maxX - this->rect.position.x) + maxOtherWidth + 4;
 	this->rect.size.height = (maxY - this->rect.position.y) + maxOtherHeight + 7;
 }
@@ -100,8 +98,7 @@
 uint16_t DialogTemplate::DialogGroup::GetControlCount() const
 {
 	uint16_t count = 1;
-	for (auto curr = this->controls.begin(), end = this->controls.end(); curr != end; ++curr)
-		count += (*curr)->GetControlCount();
+	std::for_each(this->controls.begin(), this->controls.end(), [&](const std::unique_ptr<DialogControl> &control) { count += control->GetControlCount(); });
 	return count;
 }
 
@@ -120,11 +117,11 @@
 	*reinterpret_cast<uint16_t *>(&data[20]) = 0x0080;
 	memcpy(reinterpret_cast<wchar_t *>(&data[22]), this->groupName.c_str(), this->groupName.length() * sizeof(wchar_t));
 
-	for (auto curr = this->controls.begin(), end = this->controls.end(); curr != end; ++curr)
-	{
-		auto controlData = (*curr)->GenerateControlTemplate();
+	std::for_each(this->controls.begin(), this->controls.end(), [&](const std::unique_ptr<DialogControl> &control)
+	{
+		auto controlData = control->GenerateControlTemplate();
 		data.insert(data.end(), controlData.begin(), controlData.end());
-	}
+	});
 
 	return data;
 }
@@ -165,53 +162,52 @@
 uint16_t DialogTemplate::GetTotalControlCount() const
 {
 	uint16_t count = 0;
-	for (auto curr = this->controls.begin(), end = this->controls.end(); curr != end; ++curr)
-		count += (*curr)->GetControlCount();
+	std::for_each(this->controls.begin(), this->controls.end(), [&](const std::unique_ptr<DialogControl> &control) { count += control->GetControlCount(); });
 	return count;
 }
 
 void DialogTemplate::AddGroupControl(const DialogControlBuilder<DialogGroupBuilder> &builder)
 {
-	DialogGroup *newGroup = DialogGroup::CreateControl(builder);
+	std::unique_ptr<DialogControl> newGroup = DialogGroup::CreateControl(builder);
 	if (builder.index == -1)
-		this->controls.push_back(newGroup);
+		this->controls.push_back(std::move(newGroup));
 	else
-		this->controls.insert(this->controls.begin() + builder.index, newGroup);
+		this->controls.insert(this->controls.begin() + builder.index, std::move(newGroup));
 }
 
 void DialogTemplate::AddEditBoxControl(const DialogControlBuilder<DialogEditBoxBuilder> &builder)
 {
-	this->AddControlToGroup(DialogEditBox::CreateControl(builder), builder);
+	this->AddControlToGroup(std::move(DialogEditBox::CreateControl(builder)), builder);
 }
 
 void DialogTemplate::AddLabelControl(const DialogControlBuilder<DialogLabelBuilder> &builder)
 {
-	this->AddControlToGroup(DialogLabel::CreateControl(builder), builder);
+	this->AddControlToGroup(std::move(DialogLabel::CreateControl(builder)), builder);
 }
 
 void DialogTemplate::AddCheckBoxControl(const DialogControlBuilder<DialogCheckBoxBuilder> &builder)
 {
-	this->AddControlToGroup(DialogButton::CreateControl(builder), builder);
+	this->AddControlToGroup(std::move(DialogButton::CreateControl(builder)), builder);
 }
 
 void DialogTemplate::AddButtonControl(const DialogControlBuilder<DialogButtonBuilder> &builder)
 {
-	this->AddControlToGroup(DialogButton::CreateControl(builder), builder);
+	this->AddControlToGroup(std::move(DialogButton::CreateControl(builder)), builder);
 }
 
 void DialogTemplate::AddListBoxControl(const DialogControlBuilder<DialogListBoxBuilder> &builder)
 {
-	this->AddControlToGroup(DialogListBox::CreateControl(builder), builder);
+	this->AddControlToGroup(std::move(DialogListBox::CreateControl(builder)), builder);
 }
 
 void DialogTemplate::AddComboBoxControl(const DialogControlBuilder<DialogComboBoxBuilder> &builder)
 {
-	this->AddControlToGroup(DialogComboBox::CreateControl(builder), builder);
+	this->AddControlToGroup(std::move(DialogComboBox::CreateControl(builder)), builder);
 }
 
 bool DialogTemplate::CalculateControlPosition(short index, bool doRightAndBottom)
 {
-	DialogControl *control = this->controls[index];
+	auto &control = this->controls[index];
 	bool valid = true;
 	if (control->relativePosition.get())
 	{
@@ -248,10 +244,8 @@
 void DialogTemplate::CalculateSize()
 {
 	short maxX = 0, maxY = 0, maxOtherWidth = 0, maxOtherHeight = 0;
-	for (auto curr = this->controls.begin(), end = this->controls.end(); curr != end; ++curr)
-	{
-		DialogControl *control = *curr;
-
+	std::for_each(this->controls.begin(), this->controls.end(), [&](const std::unique_ptr<DialogControl> &control)
+	{
 		bool usePosition = true;
 		if (control->relativePosition.get())
 		{
@@ -282,7 +276,7 @@
 			if (control->rect.position.y + control->GetControlHeight() > maxY)
 				maxY = control->rect.position.y + control->GetControlHeight();
 		}
-	}
+	});
 	this->size.width = maxX + maxOtherWidth + 7;
 	this->size.height = maxY + maxOtherHeight + 7;
 }
@@ -293,13 +287,13 @@
 	short x = 0, num = this->controls.empty() ? 0 : this->controls.size(), maxGroupWidth = 0;
 	for (; x < num; ++x)
 	{
-		DialogControl *control = this->controls[x];
+		auto &control = this->controls[x];
 		bool valid = this->CalculateControlPosition(x, false);
 		if (valid && control->controlType == GROUP_CONTROL)
 		{
-			dynamic_cast<DialogGroup *>(control)->CalculatePositions(false);
+			dynamic_cast<DialogGroup *>(control.get())->CalculatePositions(false);
 			// Techically step 2, but calculate the size of the group
-			dynamic_cast<DialogGroup *>(control)->CalculateSize();
+			dynamic_cast<DialogGroup *>(control.get())->CalculateSize();
 			if (control->rect.size.width > maxGroupWidth)
 				maxGroupWidth = control->rect.size.width;
 		}
@@ -307,11 +301,11 @@
 	// Step 2: Resize all group controls to be the same width, and then within the group, recalculate positions for all controls
 	for (x = 0; x < num; ++x)
 	{
-		DialogControl *control = this->controls[x];
+		auto &control = this->controls[x];
 		if (control->controlType != GROUP_CONTROL)
 			continue;
 		control->rect.size.width = maxGroupWidth;
-		dynamic_cast<DialogGroup *>(control)->CalculatePositions(true);
+		dynamic_cast<DialogGroup *>(control.get())->CalculatePositions(true);
 	}
 	// Step 3: Resize the dialog box itself
 	this->CalculateSize();
@@ -337,11 +331,11 @@
 		memcpy(reinterpret_cast<wchar_t *>(&this->templateData[24 + sizeof(wchar_t) * (this->title.length() + 1)]), this->fontName.c_str(), this->fontName.length() * sizeof(wchar_t));
 	}
 
-	for (auto curr = this->controls.begin(), end = this->controls.end(); curr != end; ++curr)
-	{
-		auto controlData = (*curr)->GenerateControlTemplate();
+	std::for_each(this->controls.begin(), this->controls.end(), [&](const std::unique_ptr<DialogControl> &control)
+	{
+		auto controlData = control->GenerateControlTemplate();
 		this->templateData.insert(this->templateData.end(), controlData.begin(), controlData.end());
-	}
+	});
 
 	return reinterpret_cast<const DLGTEMPLATE *>(&this->templateData[0]);
 }

--- a/src/in_xsf_framework/DialogBuilder.h
+++ b/src/in_xsf_framework/DialogBuilder.h
@@ -10,6 +10,7 @@
 #include <string>
 #include <memory>
 #include <vector>
+#include <algorithm>
 #include <stdexcept>
 #include "pstdint.h"
 #include "windowsh_wrapper.h"
@@ -162,7 +163,7 @@
 	Rect<short> rect;
 	short id;
 	int index;
-	std::auto_ptr<RelativePosition> relativePosition;
+	std::unique_ptr<RelativePosition> relativePosition;
 
 	T &me() { return dynamic_cast<T &>(*this); }
 public:
@@ -385,7 +386,7 @@
 {
 	class DialogControl;
 
-	typedef std::vector<DialogControl *> Controls;
+	typedef std::vector<std::unique_ptr<DialogControl>> Controls;
 
 	class DialogControl
 	{
@@ -394,7 +395,7 @@
 		uint32_t style, exstyle;
 		Rect<short> rect;
 		short id;
-		std::auto_ptr<RelativePosition> relativePosition;
+		std::unique_ptr<RelativePosition> relativePosition;
 
 		friend class DialogTemplate;
 		DialogControl() : controlType(NO_CONTROL), style(0), exstyle(0), rect(), id(-1), relativePosition() { }
@@ -416,9 +417,9 @@
 		}
 	public:
 		virtual ~DialogControl() { }
-		template<typename Control, typename Builder> static Control *CreateControl(const DialogControlBuilder<Builder> &builder)
-		{
-			Control *control = new Control();
+		template<typename Control, typename Builder> static std::unique_ptr<Control> CreateControl(const DialogControlBuilder<Builder> &builder)
+		{
+			auto control = std::unique_ptr<Control>(new Control());
 
 			control->controlType = builder.controlType;
 			control->style = builder.style;
@@ -447,30 +448,23 @@
 		DialogGroup() : DialogControl(), controls(), groupName(L"") { }
 		DialogGroup(const DialogGroup &control) : DialogControl(control), controls(), groupName(control.groupName)
 		{
-			for (auto curr = control.controls.begin(), end = control.controls.end(); curr != end; ++curr)
-				this->controls.push_back((*curr)->Clone());
+			std::for_each(control.controls.begin(), control.controls.end(), [&](const std::unique_ptr<DialogControl> &control) { this->controls.push_back(std::unique_ptr<DialogControl>(control->Clone())); });
 		}
 		DialogGroup &operator=(const DialogGroup &control)
 		{
 			DialogControl::operator=(control);
 
-			if (!this->controls.empty())
-				this->ClearControls();
-			for (auto curr = control.controls.begin(), end = control.controls.end(); curr != end; ++curr)
-				this->controls.push_back((*curr)->Clone());
+			this->controls.clear();
+			std::for_each(control.controls.begin(), control.controls.end(), [&](const std::unique_ptr<DialogControl> &control) { this->controls.push_back(std::unique_ptr<DialogControl>(control->Clone())); });
+
+			this->groupName = control.groupName;
 
 			return *this;
 		}
-		void ClearControls()
-		{
-			for (auto curr = this->controls.begin(), end = this->controls.end(); curr != end; ++curr)
-				delete *curr;
-		}
-	public:
-		~DialogGroup() { this->ClearControls(); }
-		static DialogGroup *CreateControl(const DialogControlBuilder<DialogGroupBuilder> &builder)
-		{
-			DialogGroup *control = DialogControl::CreateControl<DialogGroup>(builder);
+	public:
+		static std::unique_ptr<DialogGroup> CreateControl(const DialogControlBuilder<DialogGroupBuilder> &builder)
+		{
+			auto control = DialogControl::CreateControl<DialogGroup>(builder);
 
 			control->groupName = dynamic_cast<const DialogGroupBuilder &>(builder).groupName;
 
@@ -501,9 +495,9 @@
 			return *this;
 		}
 	public:
-		template<typename Control, typename Builder> static Control *CreateControl(const DialogControlBuilder<Builder> &builder, uint16_t Type)
-		{
-			Control *control = DialogControl::CreateControl<Control>(builder);
+		template<typename Control, typename Builder> static std::unique_ptr<Control> CreateControl(const DialogControlBuilder<Builder> &builder, uint16_t Type)
+		{
+			auto control = DialogControl::CreateControl<Control>(builder);
 
 			control->type = Type;
 
@@ -533,9 +527,9 @@
 			return *this;
 		}
 	public:
-		template<typename Control, typename Builder> static Control *CreateControl(const DialogControlBuilder<Builder> &builder, uint16_t Type)
-		{
-			Control *control = DialogControl::CreateControl<Control>(builder);
+		template<typename Control, typename Builder> static std::unique_ptr<Control> CreateControl(const DialogControlBuilder<Builder> &builder, uint16_t Type)
+		{
+			auto control = DialogControl::CreateControl<Control>(builder);
 
 			control->type = Type;
 			control->label = dynamic_cast<const DialogControlWithLabelBuilder<Builder> &>(builder).label;
@@ -553,7 +547,7 @@
 		friend class DialogControl;
 		DialogEditBox() : DialogControlWithoutLabel() { }
 	public:
-		static DialogEditBox *CreateControl(const DialogControlBuilder<DialogEditBoxBuilder> &builder)
+		static std::unique_ptr<DialogEditBox> CreateControl(const DialogControlBuilder<DialogEditBoxBuilder> &builder)
 		{
 			return DialogControlWithoutLabel::CreateControl<DialogEditBox>(builder, 0x0081);
 		}
@@ -566,7 +560,7 @@
 		friend class DialogControl;
 		DialogLabel() : DialogControlWithLabel() { }
 	public:
-		static DialogLabel *CreateControl(const DialogControlBuilder<DialogLabelBuilder> &builder)
+		static std::unique_ptr<DialogLabel> CreateControl(const DialogControlBuilder<DialogLabelBuilder> &builder)
 		{
 			return DialogControlWithLabel::CreateControl<DialogLabel>(builder, 0x0082);
 		}
@@ -579,7 +573,7 @@
 		friend class DialogControl;
 		DialogButton() : DialogControlWithLabel() { }
 	public:
-		template<typename Builder> static DialogButton *CreateControl(const DialogControlBuilder<Builder> &builder)
+		template<typename Builder> static std::unique_ptr<DialogButton> CreateControl(const DialogControlBuilder<Builder> &builder)
 		{
 			return DialogControlWithLabel::CreateControl<DialogButton>(builder, 0x0080);
 		}
@@ -592,7 +586,7 @@
 		friend class DialogControl;
 		DialogListBox() : DialogControlWithoutLabel() { }
 	public:
-		static DialogListBox *CreateControl(const DialogControlBuilder<DialogListBoxBuilder> &builder)
+		static std::unique_ptr<DialogListBox> CreateControl(const DialogControlBuilder<DialogListBoxBuilder> &builder)
 		{
 			return DialogControlWithoutLabel::CreateControl<DialogListBox>(builder, 0x0083);
 		}
@@ -605,7 +599,7 @@
 		friend class DialogControl;
 		DialogComboBox() : DialogControlWithoutLabel() { }
 	public:
-		static DialogComboBox *CreateControl(const DialogControlBuilder<DialogComboBoxBuilder> &builder)
+		static std::unique_ptr<DialogComboBox> CreateControl(const DialogControlBuilder<DialogComboBoxBuilder> &builder)
 		{
 			return DialogControlWithoutLabel::CreateControl<DialogComboBox>(builder, 0x0085);
 		}
@@ -617,32 +611,32 @@
 	std::wstring fontName;
 	uint16_t fontSizeInPts;
 	Size<short> size;
-	Controls controls;
+	DialogTemplate::Controls controls;
 	std::vector<uint8_t> templateData;
 
-	template<typename Builder> void AddControlToGroup(DialogControl *control, const DialogControlBuilder<Builder> &builder)
+	template<typename Builder> void AddControlToGroup(std::unique_ptr<DialogControl> &&control, const DialogControlBuilder<Builder> &builder)
 	{
 		const DialogInGroupBuilder<Builder> &groupBuilder = dynamic_cast<const DialogInGroupBuilder<Builder> &>(builder);
 		if (groupBuilder.groupName.empty())
 		{
 			if (builder.index == -1)
-				this->controls.push_back(control);
+				this->controls.push_back(std::move(control));
 			else
-				this->controls.insert(this->controls.begin() + builder.index, control);
+				this->controls.insert(this->controls.begin() + builder.index, std::move(control));
 		}
 		else
 		{
-			for (DialogTemplate::Controls::iterator curr = this->controls.begin(), end = this->controls.end(); curr != end; ++curr)
+			for (auto curr = this->controls.begin(), end = this->controls.end(); curr != end; ++curr)
 			{
 				if ((*curr)->controlType != GROUP_CONTROL)
 					continue;
-				DialogGroup *group = dynamic_cast<DialogGroup *>(*curr);
+				DialogGroup *group = dynamic_cast<DialogGroup *>(curr->get());
 				if (group->groupName == groupBuilder.groupName)
 				{
 					if (builder.index == -1)
-						group->controls.push_back(control);
+						group->controls.push_back(std::move(control));
 					else
-						group->controls.insert(group->controls.begin() + builder.index, control);
+						group->controls.insert(group->controls.begin() + builder.index, std::move(control));
 					return;
 				}
 			}
@@ -652,11 +646,6 @@
 	uint16_t GetTotalControlCount() const;
 	bool CalculateControlPosition(short index, bool doRightAndBottom = false);
 	void CalculateSize();
-	void ClearControls()
-	{
-		for (auto curr = this->controls.begin(), end = this->controls.end(); curr != end; ++curr)
-			delete *curr;
-	}
 public:
 	DialogTemplate() : title(L""), style(0), exstyle(0), fontName(L""), fontSizeInPts(0), size(), controls(), templateData() { }
 	DialogTemplate(const DialogBuilder &builder) : title(builder.title), style(builder.style), exstyle(builder.exstyle), fontName(builder.fontName), fontSizeInPts(builder.fontSizeInPts),
@@ -664,8 +653,7 @@
 	DialogTemplate(const DialogTemplate &dlg) : title(dlg.title), style(dlg.style), exstyle(dlg.style), fontName(dlg.fontName), fontSizeInPts(dlg.fontSizeInPts), size(dlg.size),
 		controls(), templateData()
 	{
-		for (auto curr = dlg.controls.begin(), end = dlg.controls.end(); curr != end; ++curr)
-			this->controls.push_back((*curr)->Clone());
+		std::for_each(dlg.controls.begin(), dlg.controls.end(), [&](const std::unique_ptr<DialogControl> &control) { this->controls.push_back(std::unique_ptr<DialogControl>(control->Clone())); });
 	}
 	DialogTemplate &operator=(const DialogBuilder &builder)
 	{
@@ -675,8 +663,8 @@
 		this->fontName = builder.fontName;
 		this->fontSizeInPts = builder.fontSizeInPts;
 		this->size = builder.size;
-		if (builder.resetControls && !this->controls.empty())
-			this->ClearControls();
+		if (builder.resetControls)
+			this->controls.clear();
 
 		return *this;
 	}
@@ -688,14 +676,11 @@
 		this->fontName = dlg.fontName;
 		this->fontSizeInPts = dlg.fontSizeInPts;
 		this->size = dlg.size;
-		if (!this->controls.empty())
-			this->ClearControls();
-		for (auto curr = dlg.controls.begin(), end = dlg.controls.end(); curr != end; ++curr)
-			this->controls.push_back((*curr)->Clone());
+		this->controls.clear();
+		std::for_each(dlg.controls.begin(), dlg.controls.end(), [&](const std::unique_ptr<DialogControl> &control) { this->controls.push_back(std::unique_ptr<DialogControl>(control->Clone())); });
 
 		return *this;
 	}
-	~DialogTemplate() { this->ClearControls(); }
 	void AddGroupControl(const DialogControlBuilder<DialogGroupBuilder> &builder);
 	void AddEditBoxControl(const DialogControlBuilder<DialogEditBoxBuilder> &builder);
 	void AddLabelControl(const DialogControlBuilder<DialogLabelBuilder> &builder);

--- a/src/in_xsf_framework/XSFConfig.h
+++ b/src/in_xsf_framework/XSFConfig.h
@@ -45,7 +45,7 @@
 	std::wstring titleFormat;
 	DialogTemplate configDialog, configDialogProperty, infoDialog;
 	std::vector<unsigned> supportedSampleRates;
-	std::auto_ptr<XSFConfigIO> configIO;
+	std::unique_ptr<XSFConfigIO> configIO;
 
 	XSFConfig();
 	std::wstring GetTextFromWindow(HWND hwnd);

--- a/src/in_xsf_framework/XSFFile.cpp
+++ b/src/in_xsf_framework/XSFFile.cpp
@@ -466,11 +466,11 @@
 	if (!allTags.empty())
 	{
 		xSF.write("[TAG]", 5);
-		for (auto curr = allTags.begin(), end = allTags.end(); curr != end; ++curr)
-		{
-			xSF.write(curr->c_str(), curr->length());
+		std::for_each(allTags.begin(), allTags.end(), [&](const std::string &tag)
+		{
+			xSF.write(tag.c_str(), tag.length());
 			xSF.write("\n", 1);
-		}
-	}
-}
-
+		});
+	}
+}
+

--- a/src/in_xsf_framework/convert.h
+++ b/src/in_xsf_framework/convert.h
@@ -71,7 +71,7 @@
 		auto inputChars = std::vector<char>(input.begin(), input.end());
 		size_t length = inputChars.size();
 		auto masks = std::vector<std::ctype<char>::mask>(length);
-		std::use_facet<std::ctype<char> >(loc).is(&inputChars[0], &inputChars[length], &masks[0]);
+		std::use_facet<std::ctype<char>>(loc).is(&inputChars[0], &inputChars[length], &masks[0]);
 		for (size_t x = 0; x < length; ++x)
 			if (inputChars[x] != '.' && !(masks[x] & std::ctype<char>::digit))
 				return false;

--- a/src/in_xsf_framework/eqstr.h
+++ b/src/in_xsf_framework/eqstr.h
@@ -31,7 +31,7 @@
 	{
 		for (int i = CHAR_MIN; i <= CHAR_MAX; ++i)
 			this->tab[i - CHAR_MIN] = static_cast<char>(i);
-		std::use_facet<std::ctype<char> >(L).toupper(this->tab, this->tab + (CHAR_MAX - CHAR_MIN + 1));
+		std::use_facet<std::ctype<char>>(L).toupper(this->tab, this->tab + (CHAR_MAX - CHAR_MIN + 1));
 	}
 
 	bool operator()(const std::string &x, const std::string &y) const

--- a/src/in_xsf_framework/in_xsf.cpp
+++ b/src/in_xsf_framework/in_xsf.cpp
@@ -117,13 +117,20 @@
 
 int infoBox(const in_char *file, HWND hwndParent)
 {
-	auto xSF = std::auto_ptr<XSFFile>(new XSFFile());
+	auto xSF = std::unique_ptr<XSFFile>(new XSFFile());
 	if (!file || !*file)
 		*xSF = *xSFFile;
 	else
 	{
-		auto tmpxSF = std::auto_ptr<XSFFile>(new XSFFile(file));
-		*xSF = *tmpxSF;
+		try
+		{
+			auto tmpxSF = std::unique_ptr<XSFFile>(new XSFFile(file));
+			*xSF = *tmpxSF;
+		}
+		catch (const std::exception &)
+		{
+			return INFOBOX_UNCHANGED;
+		}
 	}
 	// TODO: Eventually make a dialog box for editing the info
 	/*xSFFileInInfo = xSF.get();
@@ -151,7 +158,7 @@
 {
 	try
 	{
-		auto tmpxSFPlayer = std::auto_ptr<XSFPlayer>(XSFPlayer::Create(fn));
+		auto tmpxSFPlayer = std::unique_ptr<XSFPlayer>(XSFPlayer::Create(fn));
 		xSFConfig->CopyConfigToMemory(tmpxSFPlayer.get(), true);
 		if (!tmpxSFPlayer->Load())
 			return 1;
@@ -356,7 +363,7 @@
 	}
 }
 
-std::auto_ptr<XSFFile> extendedXSFFile;
+std::unique_ptr<XSFFile> extendedXSFFile;
 
 int wrapperWinampSetExtendedFileInfo(const char *data, const wchar_t *val)
 {
@@ -391,7 +398,7 @@
 	return 0;
 }
 
-intptr_t wrapperWinampGetExtendedRead_open(std::auto_ptr<XSFPlayer> tmpxSFPlayer, int *size, int *bps, int *nch, int *srate)
+intptr_t wrapperWinampGetExtendedRead_open(std::unique_ptr<XSFPlayer> tmpxSFPlayer, int *size, int *bps, int *nch, int *srate)
 {
 	xSFConfig->CopyConfigToMemory(tmpxSFPlayer.get(), true);
 	if (!tmpxSFPlayer->Load())
@@ -411,14 +418,14 @@
 
 extern "C" __declspec(dllexport) intptr_t winampGetExtendedRead_open(const char *fn, int *size, int *bps, int *nch, int *srate)
 {
-	auto tmpxSFPlayer = std::auto_ptr<XSFPlayer>(XSFPlayer::Create(fn));
-	return wrapperWinampGetExtendedRead_open(tmpxSFPlayer, size, bps, nch, srate);
+	auto tmpxSFPlayer = std::unique_ptr<XSFPlayer>(XSFPlayer::Create(fn));
+	return wrapperWinampGetExtendedRead_open(std::move(tmpxSFPlayer), size, bps, nch, srate);
 }
 
 extern "C" __declspec(dllexport) intptr_t winampGetExtendedRead_openW(const wchar_t *fn, int *size, int *bps, int *nch, int *srate)
 {
-	auto tmpxSFPlayer = std::auto_ptr<XSFPlayer>(XSFPlayer::Create(fn));
-	return wrapperWinampGetExtendedRead_open(tmpxSFPlayer, size, bps, nch, srate);
+	auto tmpxSFPlayer = std::unique_ptr<XSFPlayer>(XSFPlayer::Create(fn));
+	return wrapperWinampGetExtendedRead_open(std::move(tmpxSFPlayer), size, bps, nch, srate);
 }
 
 int extendedSeekNeeded = -1;

--- a/src/in_xsf_framework/ltstr.h
+++ b/src/in_xsf_framework/ltstr.h
@@ -31,7 +31,7 @@
 	{
 		for (int i = CHAR_MIN; i <= CHAR_MAX; ++i)
 			this->tab[i - CHAR_MIN] = static_cast<char>(i);
-		std::use_facet<std::ctype<char> >(L).toupper(this->tab, this->tab + (CHAR_MAX - CHAR_MIN + 1));
+		std::use_facet<std::ctype<char>>(L).toupper(this->tab, this->tab + (CHAR_MAX - CHAR_MIN + 1));
 	}
 
 	bool operator()(const std::string &x, const std::string &y) const