Index: graphics.h
===================================================================
--- graphics.h	(revision 48496)
+++ graphics.h	(working copy)
@@ -444,14 +444,15 @@
 	void unpackBlt(const Common::Rect& r, byte *data, uint size, Graphics::Surface *surf, uint16 z, uint scale, byte transparentColor);
 
 	// labels
-	void showFloatingLabel(uint label);
+	void showFloatingLabel(GfxObj *label);
 	void hideFloatingLabel();
 
-	uint renderFloatingLabel(Font *font, char *text);
-	uint createLabel(Font *font, const char *text, byte color);
-	void showLabel(uint id, int16 x, int16 y);
-	void hideLabel(uint id);
+	GfxObj *renderFloatingLabel(Font *font, char *text);
+	GfxObj *createLabel(Font *font, const char *text, byte color);
+	void showLabel(GfxObj *label, int16 x, int16 y);
+	void hideLabel(GfxObj *label);
 	void freeLabels();
+	void unregisterLabel(GfxObj *label);
 
 	// dialogue handling
 	GfxObj* registerBalloon(Frames *frames, const char *text);
@@ -528,11 +529,18 @@
 	void				scroll();
 	#define NO_FLOATING_LABEL	1000
 
+	struct Label {
+		Common::String _text;
+		int  _x, _y;
+		int color;
+		bool _floating;
+	};
+
 	GfxObjArray	_labels;
 	GfxObjArray _balloons;
 	GfxObjArray	_items;
 
-	uint _floatingLabel;
+	GfxObj *_floatingLabel;
 
 	// overlay mode enables drawing of graphics with automatic screen-to-game coordinate translation
 	bool				_overlayMode;
Index: parallaction.h
===================================================================
--- parallaction.h	(revision 48496)
+++ parallaction.h	(working copy)
@@ -547,7 +547,7 @@
 	uint		_subtitleLipSync;
 #endif
 	int			_subtitleY;
-	int			_subtitle[2];
+	GfxObj		*_subtitle[2];
 	ZonePtr		_activeZone2;
 	uint32		_zoneFlags[NUM_LOCATIONS][NUM_ZONES];
 
Index: parallaction_br.cpp
===================================================================
--- parallaction_br.cpp	(revision 48496)
+++ parallaction_br.cpp	(working copy)
@@ -87,8 +87,8 @@
 
 	_part = -1;
 
-	_subtitle[0] = -1;
-	_subtitle[1] = -1;
+	_subtitle[0] = 0;
+	_subtitle[1] = 0;
 
 	memset(_zoneFlags, 0, sizeof(_zoneFlags));
 
@@ -226,7 +226,7 @@
 void Parallaction_br::freeLocation(bool removeAll) {
 	// free open location stuff
 	clearSubtitles();
-	_subtitle[0] = _subtitle[1] = -1;
+	_subtitle[0] = _subtitle[1] = 0;
 
 	_localFlagNames->clear();
 
Index: objects.h
===================================================================
--- objects.h	(revision 48496)
+++ objects.h	(working copy)
@@ -272,7 +272,7 @@
 
 	uint32			_type;
 	uint32			_flags;
-	uint			_label;
+	GfxObj			*_label;
 
 	TypeData		u;
 	CommandList		_commands;
Index: graphics.cpp
===================================================================
--- graphics.cpp	(revision 48496)
+++ graphics.cpp	(working copy)
@@ -524,7 +524,7 @@
 	surf.fillRect(Common::Rect(w,h), LABEL_TRANSPARENT_COLOR);
 }
 
-uint Gfx::renderFloatingLabel(Font *font, char *text) {
+GfxObj *Gfx::renderFloatingLabel(Font *font, char *text) {
 
 	Graphics::Surface *cnv = new Graphics::Surface;
 
@@ -555,34 +555,32 @@
 	obj->transparentKey = LABEL_TRANSPARENT_COLOR;
 	obj->layer = LAYER_FOREGROUND;
 
-	uint id = _labels.size();
-	_labels.insert_at(id, obj);
-
-	return id;
+	return obj;
 }
 
-void Gfx::showFloatingLabel(uint label) {
-	assert(label < _labels.size());
-
+void Gfx::showFloatingLabel(GfxObj *label) {
 	hideFloatingLabel();
 
-	_labels[label]->x = -1000;
-	_labels[label]->y = -1000;
-	_labels[label]->setFlags(kGfxObjVisible);
-
-	_floatingLabel = label;
+	if (label) {
+		label->x = -1000;
+		label->y = -1000;
+		label->setFlags(kGfxObjVisible);
+	
+		_floatingLabel = label;
+		_labels.push_back(label);
+	}
 }
 
 void Gfx::hideFloatingLabel() {
-	if (_floatingLabel != NO_FLOATING_LABEL) {
-		_labels[_floatingLabel]->clearFlags(kGfxObjVisible);
+	if (_floatingLabel != 0) {
+		_floatingLabel->clearFlags(kGfxObjVisible);
 	}
-	_floatingLabel = NO_FLOATING_LABEL;
+	_floatingLabel = 0;
 }
 
 
 void Gfx::updateFloatingLabel() {
-	if (_floatingLabel == NO_FLOATING_LABEL) {
+	if (_floatingLabel == 0) {
 		return;
 	}
 
@@ -596,7 +594,7 @@
 	} *traits;
 
 	Common::Rect r;
-	_labels[_floatingLabel]->getRect(0, r);
+	_floatingLabel->getRect(0, r);
 
 	if (_gameType == GType_Nippon) {
 		FloatingLabelTraits traits_NS = {
@@ -619,14 +617,14 @@
 	_vm->_input->getCursorPos(cursor);
 	Common::Point offset = (_vm->_input->_activeItem._id) ? traits->_offsetWithItem : traits->_offsetWithoutItem;
 
-	_labels[_floatingLabel]->x = CLIP(cursor.x + offset.x, traits->_minX, traits->_maxX);
-	_labels[_floatingLabel]->y = CLIP(cursor.y + offset.y, traits->_minY, traits->_maxY);
+	_floatingLabel->x = CLIP(cursor.x + offset.x, traits->_minX, traits->_maxX);
+	_floatingLabel->y = CLIP(cursor.y + offset.y, traits->_minY, traits->_maxY);
 }
 
 
 
 
-uint Gfx::createLabel(Font *font, const char *text, byte color) {
+GfxObj *Gfx::createLabel(Font *font, const char *text, byte color) {
 	Graphics::Surface *cnv = new Graphics::Surface;
 
 	uint w, h;
@@ -652,19 +650,18 @@
 	obj->transparentKey = LABEL_TRANSPARENT_COLOR;
 	obj->layer = LAYER_FOREGROUND;
 
-	int id = _labels.size();
+	return obj;
+}
 
-	_labels.insert_at(id, obj);
+void Gfx::showLabel(GfxObj *label, int16 x, int16 y) {
+	if (!label) {
+		return;
+	}
 
-	return id;
-}
+	label->setFlags(kGfxObjVisible);
 
-void Gfx::showLabel(uint id, int16 x, int16 y) {
-	assert(id < _labels.size());
-	_labels[id]->setFlags(kGfxObjVisible);
-
 	Common::Rect r;
-	_labels[id]->getRect(0, r);
+	label->getRect(0, r);
 
 	if (x == CENTER_LABEL_HORIZONTAL) {
 		x = CLIP<int16>((_backgroundInfo->width - r.width()) / 2, 0, _backgroundInfo->width/2);
@@ -674,21 +671,35 @@
 		y = CLIP<int16>((_vm->_screenHeight - r.height()) / 2, 0, _vm->_screenHeight/2);
 	}
 
-	_labels[id]->x = x;
-	_labels[id]->y = y;
+	label->x = x;
+	label->y = y;
+	
+	_labels.push_back(label);
 }
 
-void Gfx::hideLabel(uint id) {
-	assert(id < _labels.size());
-	_labels[id]->clearFlags(kGfxObjVisible);
+void Gfx::hideLabel(GfxObj *label) {
+	label->clearFlags(kGfxObjVisible);
 }
 
 void Gfx::freeLabels() {
+//	for (uint i = 0; i < _labels.size(); i++) {
+//		delete _labels[i];
+//	}
+	_labels.clear();
+	_floatingLabel = 0;
+}
+
+void Gfx::unregisterLabel(GfxObj *label) {
+	int toBeRemoved = -1;
 	for (uint i = 0; i < _labels.size(); i++) {
-		delete _labels[i];
+		if (_labels[i] == label) {
+			toBeRemoved = i;
+		}
 	}
-	_labels.clear();
-	_floatingLabel = NO_FLOATING_LABEL;
+	
+	if (toBeRemoved != -1) {
+		_labels.remove_at(toBeRemoved);
+	}
 }
 
 
@@ -724,7 +735,7 @@
 
 	setPalette(_palette);
 
-	_floatingLabel = NO_FLOATING_LABEL;
+	_floatingLabel = 0;
 
 	_backgroundInfo = 0;
 
Index: exec_br.cpp
===================================================================
--- exec_br.cpp	(revision 48496)
+++ exec_br.cpp	(working copy)
@@ -96,7 +96,7 @@
 		_subtitle[1] = _gfx->createLabel(_labelFont, s2, color);
 		_gfx->showLabel(_subtitle[1], CENTER_LABEL_HORIZONTAL, _subtitleY + 5 + _labelFont->height());
 	} else {
-		_subtitle[1] = -1;
+		_subtitle[1] = 0;
 	}
 #if 0	// disabled because no references to lip sync has been found in the scripts
 	_subtitleLipSync = 0;
@@ -104,11 +104,11 @@
 }
 
 void Parallaction_br::clearSubtitles() {
-	if (_subtitle[0] != -1) {
+	if (_subtitle[0]) {
 		_gfx->hideLabel(_subtitle[0]);
 	}
 
-	if (_subtitle[1] != -1) {
+	if (_subtitle[1]) {
 		_gfx->hideLabel(_subtitle[1]);
 	}
 }
Index: parallaction_ns.cpp
===================================================================
--- parallaction_ns.cpp	(revision 48496)
+++ parallaction_ns.cpp	(working copy)
@@ -355,8 +355,7 @@
 
 	if (locname.hasSlide()) {
 		showSlide(locname.slide());
-		uint id = _gfx->createLabel(_menuFont, _location._slideText[0].c_str(), 1);
-		_gfx->showLabel(id, CENTER_LABEL_HORIZONTAL, 14);
+		_gfx->showLabel(_gfx->createLabel(_menuFont, _location._slideText[0].c_str(), 1), CENTER_LABEL_HORIZONTAL, 14);
 		_gfx->updateScreen();
 
 		_input->waitForButtonEvent(kMouseLeftUp);
Index: callables_ns.cpp
===================================================================
--- callables_ns.cpp	(revision 48496)
+++ callables_ns.cpp	(working copy)
@@ -409,12 +409,12 @@
 
 	parseLocation("common");
 
-	uint id[2];
-	id[0] = _gfx->createLabel(_menuFont, _location._slideText[0].c_str(), 1);
-	id[1] = _gfx->createLabel(_menuFont, _location._slideText[1].c_str(), 1);
+	GfxObj *labels[2];
+	labels[0] = _gfx->createLabel(_menuFont, _location._slideText[0].c_str(), 1);
+	labels[1] = _gfx->createLabel(_menuFont, _location._slideText[1].c_str(), 1);
 
-	_gfx->showLabel(id[0], CENTER_LABEL_HORIZONTAL, 38);
-	_gfx->showLabel(id[1], CENTER_LABEL_HORIZONTAL, 58);
+	_gfx->showLabel(labels[0], CENTER_LABEL_HORIZONTAL, 38);
+	_gfx->showLabel(labels[1], CENTER_LABEL_HORIZONTAL, 58);
 
 	return;
 }
Index: gui_ns.cpp
===================================================================
--- gui_ns.cpp	(revision 48496)
+++ gui_ns.cpp	(working copy)
@@ -175,8 +175,7 @@
 		// user can choose language in this version
 		_vm->showSlide("lingua");
 
-		uint id = _vm->_gfx->createLabel(_vm->_introFont, "SELECT LANGUAGE", 1);
-		_vm->_gfx->showLabel(id, 60, 30);
+		_vm->_gfx->showLabel(_vm->_gfx->createLabel(_vm->_introFont, "SELECT LANGUAGE", 1), 60, 30);
 
 		_vm->_input->setArrowCursor();
 	}
@@ -201,7 +200,7 @@
 	int _choice, _oldChoice;
 	Common::String _nextState[2];
 
-	uint	_labels[2];
+	GfxObj	*_labels[2];
 
 	Parallaction *_vm;
 
@@ -321,7 +320,7 @@
 		_vm->changeBackground("test");
 		_vm->_input->setMouseState(MOUSE_ENABLED_HIDE);
 
-		uint id[4];
+		GfxObj *id[4];
 		id[0] = _vm->_gfx->createLabel(_vm->_menuFont, introMsg3[0], 1);
 		id[1] = _vm->_gfx->createLabel(_vm->_menuFont, introMsg3[1], 1);
 		id[2] = _vm->_gfx->createLabel(_vm->_menuFont, introMsg3[2], 1);
@@ -402,7 +401,7 @@
 	Graphics::Surface _block;
 	Graphics::Surface _emptySlots;
 
-	uint	_labels[2];
+	GfxObj	*_labels[2];
 	uint	_len;
 	uint32	_startTime;
 
@@ -634,7 +633,7 @@
 	}
 
 	void drawCurrentLabel() {
-		uint id[2];
+		GfxObj *id[2];
 		id[0] = _vm->_gfx->createLabel(_vm->_menuFont, _credits[_current]._role, 1);
 		id[1] = _vm->_gfx->createLabel(_vm->_menuFont, _credits[_current]._name, 1);
 		_vm->_gfx->showLabel(id[0], CENTER_LABEL_HORIZONTAL, 80);
@@ -713,8 +712,7 @@
 
 		if (!_isDemo) {
 			_vm->_soundManI->stopMusic();
-			int label = _vm->_gfx->createLabel(_vm->_menuFont, "CLICK MOUSE BUTTON TO START", 1);
-			_vm->_gfx->showLabel(label, CENTER_LABEL_HORIZONTAL, 80);
+			_vm->_gfx->showLabel(_vm->_gfx->createLabel(_vm->_menuFont, "CLICK MOUSE BUTTON TO START", 1), CENTER_LABEL_HORIZONTAL, 80);
 		}
 	}
 };
@@ -763,7 +761,7 @@
 		_vm->_input->setMouseState(MOUSE_DISABLED);
 
 		uint16 language = _vm->getInternLanguage();
-		uint id[4];
+		GfxObj *id[4];
 		if (_allPartsComplete) {
 			id[0] = _vm->_gfx->createLabel(_vm->_menuFont, endMsg4[language], 1);
 			id[1] = _vm->_gfx->createLabel(_vm->_menuFont, endMsg5[language], 1);
Index: objects.cpp
===================================================================
--- objects.cpp	(revision 48496)
+++ objects.cpp	(working copy)
@@ -204,6 +204,8 @@
 }
 
 Zone::~Zone() {
+	_vm->_gfx->unregisterLabel(_label);
+	delete _label;
 }
 
 void Zone::translate(int16 x, int16 y) {
