From ea8fb7238e6f12383ee4bc081475fa6235637581 Mon Sep 17 00:00:00 2001
From: Josh Bell <josh@lindenlab.com>
Date: Sat, 31 Mar 2007 01:41:19 +0000
Subject: svn merge -r 59364:59813
 svn+ssh://svn.lindenlab.com/svn/linden/branches/maintenance --> release

---
 indra/newview/English.lproj/language.txt        |    1 +
 indra/newview/German.lproj/language.txt         |    1 +
 indra/newview/Japanese.lproj/language.txt       |    1 +
 indra/newview/Korean.lproj/language.txt         |    1 +
 indra/newview/installers/windows/lang_de.nsi    |   57 +
 indra/newview/installers/windows/lang_en-us.nsi |   57 +
 indra/newview/installers/windows/lang_ja.nsi    |   57 +
 indra/newview/installers/windows/lang_ko.nsi    |   57 +
 indra/newview/llagent.cpp                       |   42 +-
 indra/newview/llagent.h                         |    5 -
 indra/newview/llassetuploadresponders.cpp       |    2 +-
 indra/newview/llchatbar.cpp                     |    2 +-
 indra/newview/llchatbar.h                       |    2 +-
 indra/newview/llcolorswatch.cpp                 |    6 +-
 indra/newview/lldrawable.cpp                    |    3 +-
 indra/newview/lldrawpoolalpha.cpp               |    3 +-
 indra/newview/lldrawpoolavatar.cpp              |   59 +-
 indra/newview/lldrawpoolbump.cpp                |   18 +-
 indra/newview/lldrawpoolground.cpp              |    3 +-
 indra/newview/lldrawpoolsimple.cpp              |    3 +-
 indra/newview/lldrawpoolsky.cpp                 |    3 +-
 indra/newview/lldrawpoolterrain.cpp             |   21 +-
 indra/newview/lldrawpooltree.cpp                |    3 +-
 indra/newview/lldrawpoolwater.cpp               |   60 +-
 indra/newview/llface.cpp                        |    8 +-
 indra/newview/llfloateranimpreview.cpp          |    8 +-
 indra/newview/llfloateranimpreview.h            |    2 +-
 indra/newview/llfloateravatarpicker.cpp         |   22 +-
 indra/newview/llfloaterbump.cpp                 |   15 +-
 indra/newview/llfloaterbuyland.cpp              |    6 +-
 indra/newview/llfloatercolorpicker.cpp          |   15 +-
 indra/newview/llfloatercolorpicker.h            |    2 +-
 indra/newview/llfloatergodtools.cpp             |   14 +-
 indra/newview/llfloaterimagepreview.cpp         |    6 +-
 indra/newview/llfloaterland.cpp                 |    6 +-
 indra/newview/llfloaterland.h                   |    2 +-
 indra/newview/llfloatersnapshot.cpp             |    2 +-
 indra/newview/llfloatertools.cpp                |    2 +-
 indra/newview/llfolderview.cpp                  |   63 +-
 indra/newview/llfolderview.h                    |    3 +-
 indra/newview/llimpanel.cpp                     |    2 +-
 indra/newview/llimpanel.h                       |    2 +-
 indra/newview/lljoystickbutton.cpp              |    8 +-
 indra/newview/llnameeditor.cpp                  |    2 +-
 indra/newview/llnameeditor.h                    |    2 +-
 indra/newview/llnamelistctrl.cpp                |   28 +-
 indra/newview/llnetmap.cpp                      |   14 +-
 indra/newview/llpanelavatar.cpp                 |   86 +-
 indra/newview/llpanelavatar.h                   |    3 +-
 indra/newview/llpanelclassified.cpp             |   18 +-
 indra/newview/llpanelclassified.h               |    3 +-
 indra/newview/llpanelgroupgeneral.cpp           |    8 +-
 indra/newview/llpanelgroupinvite.cpp            |   10 +-
 indra/newview/llpanelpick.cpp                   |   12 +-
 indra/newview/llpanelpick.h                     |    3 +-
 indra/newview/llpanelplace.cpp                  |   11 +-
 indra/newview/llpanelplace.h                    |    3 +-
 indra/newview/llpreview.cpp                     |    8 +-
 indra/newview/llpreviewgesture.cpp              |   21 +-
 indra/newview/llpreviewscript.cpp               |   61 +-
 indra/newview/llprogressview.cpp                |    6 +-
 indra/newview/llprogressview.h                  |    4 +-
 indra/newview/llselectmgr.cpp                   |    4 +-
 indra/newview/llspatialpartition.cpp            |   75 +-
 indra/newview/llspatialpartition.h              |   10 +-
 indra/newview/llstartup.cpp                     |   25 +-
 indra/newview/lltexturectrl.cpp                 |    2 +-
 indra/newview/lltexturefetch.cpp                |  111 +-
 indra/newview/lltextureview.cpp                 |   37 +-
 indra/newview/lltool.cpp                        |   22 +-
 indra/newview/lltool.h                          |    1 -
 indra/newview/lltoolcomp.cpp                    |    5 +
 indra/newview/lltooldraganddrop.cpp             |    4 +-
 indra/newview/lltoolpie.cpp                     |   22 +-
 indra/newview/lltoolpie.h                       |    1 +
 indra/newview/lluploaddialog.cpp                |    2 +-
 indra/newview/llviewerjointmesh.cpp             |   13 +-
 indra/newview/llviewerjoystick.cpp              |  252 ++++
 indra/newview/llviewerjoystick.h                |   20 +
 indra/newview/llviewermenu.cpp                  |   17 +-
 indra/newview/llviewermessage.cpp               |   11 +-
 indra/newview/llviewerparcelmgr.cpp             |    4 +-
 indra/newview/llviewerpartsim.cpp               |    2 +-
 indra/newview/llviewerregion.cpp                |   33 +-
 indra/newview/llviewerregion.h                  |   14 +-
 indra/newview/llviewertexteditor.cpp            |   10 +-
 indra/newview/llviewertextureanim.cpp           |   25 +-
 indra/newview/llviewertextureanim.h             |    7 +
 indra/newview/llviewerwindow.cpp                |  370 +++++-
 indra/newview/llviewerwindow.h                  |   25 +-
 indra/newview/llvoavatar.cpp                    |   49 +-
 indra/newview/llvoavatar.h                      |    2 +-
 indra/newview/llvosky.cpp                       |   13 +-
 indra/newview/llvovolume.cpp                    |   47 +-
 indra/newview/llworld.cpp                       |  306 +++--
 indra/newview/llworld.h                         |   15 +-
 indra/newview/llworldmapview.cpp                |    8 +-
 indra/newview/pipeline.cpp                      | 1464 ++---------------------
 indra/newview/pipeline.h                        |  209 +---
 indra/newview/viewer_manifest.py                |    3 -
 100 files changed, 1725 insertions(+), 2473 deletions(-)
 create mode 100644 indra/newview/English.lproj/language.txt
 create mode 100644 indra/newview/German.lproj/language.txt
 create mode 100644 indra/newview/Japanese.lproj/language.txt
 create mode 100644 indra/newview/Korean.lproj/language.txt
 create mode 100644 indra/newview/installers/windows/lang_de.nsi
 create mode 100644 indra/newview/installers/windows/lang_en-us.nsi
 create mode 100644 indra/newview/installers/windows/lang_ja.nsi
 create mode 100644 indra/newview/installers/windows/lang_ko.nsi
 create mode 100644 indra/newview/llviewerjoystick.cpp
 create mode 100644 indra/newview/llviewerjoystick.h

(limited to 'indra/newview')

diff --git a/indra/newview/English.lproj/language.txt b/indra/newview/English.lproj/language.txt
new file mode 100644
index 0000000000..bc0aa577f9
--- /dev/null
+++ b/indra/newview/English.lproj/language.txt
@@ -0,0 +1 @@
+en-us
\ No newline at end of file
diff --git a/indra/newview/German.lproj/language.txt b/indra/newview/German.lproj/language.txt
new file mode 100644
index 0000000000..c42e816f93
--- /dev/null
+++ b/indra/newview/German.lproj/language.txt
@@ -0,0 +1 @@
+de
\ No newline at end of file
diff --git a/indra/newview/Japanese.lproj/language.txt b/indra/newview/Japanese.lproj/language.txt
new file mode 100644
index 0000000000..c6e3ab6f3c
--- /dev/null
+++ b/indra/newview/Japanese.lproj/language.txt
@@ -0,0 +1 @@
+ja
\ No newline at end of file
diff --git a/indra/newview/Korean.lproj/language.txt b/indra/newview/Korean.lproj/language.txt
new file mode 100644
index 0000000000..b03ec72ee0
--- /dev/null
+++ b/indra/newview/Korean.lproj/language.txt
@@ -0,0 +1 @@
+ko
\ No newline at end of file
diff --git a/indra/newview/installers/windows/lang_de.nsi b/indra/newview/installers/windows/lang_de.nsi
new file mode 100644
index 0000000000..71d2138313
--- /dev/null
+++ b/indra/newview/installers/windows/lang_de.nsi
@@ -0,0 +1,57 @@
+; First is default
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\German.nlf"
+
+; subtitle on license text caption (setup new version or update current one
+LangString LicenseSubTitleUpdate ${LANG_GERMAN} " Update"
+LangString LicenseSubTitleSetup ${LANG_GERMAN} " Setup"
+
+; description on license page
+LangString LicenseDescUpdate ${LANG_GERMAN} "Dieses Paket wird Second Life auf Version ${VERSION_LONG}.updaten"
+LangString LicenseDescSetup ${LANG_GERMAN} "Dieses Paket installiert Second Life auf Ihrem Computer."
+LangString LicenseDescNext ${LANG_GERMAN} "N�chster Schritt"
+
+; installation directory text
+LangString DirectoryChooseTitle ${LANG_GERMAN} "Installations Ordner"
+LangString DirectoryChooseUpdate ${LANG_GERMAN} "W�hlen Sie den Second Life Ordner f�r dieses Update:"
+LangString DirectoryChooseSetup ${LANG_GERMAN} "W�hlen Sie den Pfad, in den Sie Second Life installieren m�chten:"
+
+; CheckStartupParams message box
+LangString CheckStartupParamsMB ${LANG_GERMAN} "Konnte Programm '$INSTPROG' nicht finden. Stilles Update fehlgeschlagen."
+
+; installation success dialog
+LangString InstSuccesssQuestion ${LANG_GERMAN} "Second Life jetzt starten?"
+
+; remove old NSIS version
+LangString RemoveOldNSISVersion ${LANG_GERMAN} "�berpr�fe alte Version..."
+
+; check windows version
+LangString CheckWindowsVersionDP ${LANG_GERMAN} "�berpr�fe Windows Version..."
+LangString CheckWindowsVersionMB ${LANG_GERMAN} 'Second Life unterst�tzt nur Windows XP, Windows 2000 und Mac OS X.$\n$\nDer Versuch es auf Windows $R0 zu installieren, k�nnte in unvorhersehbaren Abst�rtzen und zu Datenverlust f�hren.$\n$\nTrotzdem installieren?'
+
+; checkifadministrator function (install)
+LangString CheckAdministratorInstDP ${LANG_GERMAN} "�berpr�fe nach Genehmigung zur Installation..."
+LangString CheckAdministratorInstMB ${LANG_GERMAN} 'Es scheint so, als w�rden Sie einen "limited" Account verwenden.$\nSie m�ssen ein"administrator" sein, um Second Life installieren zu k�nnen..'
+
+; checkifadministrator function (uninstall)
+LangString CheckAdministratorUnInstDP ${LANG_GERMAN} "�berpr�fe Genehmigung zum Deinstallieren..."
+LangString CheckAdministratorUnInstMB ${LANG_GERMAN} 'Es scheint so, als w�rden Sie einen "limited" Account verwenden.$\nSie m�ssen ein"administrator" sein, um Second Life installieren zu k�nnen..'
+
+; checkifalreadycurrent
+LangString CheckIfCurrentMB ${LANG_GERMAN} "Es scheint so, als h�tten Sie Second Life ${VERSION_LONG} bereits installiert.$\n$\nW�rden Sie es gerne erneut installieren?"
+
+; closesecondlife function (install)
+LangString CloseSecondLifeInstDP ${LANG_GERMAN} "Warte darauf, dass Second Life beendet wird..."
+LangString CloseSecondLifeInstMB ${LANG_GERMAN} "Second Life kann nicht installiert werden, wenn es bereits l�uft.$\n$\nBeenden Sie, was Sie gerade tun und w�hlen Sie OK, um Second Life zu beenden oder Continue .$\nSelect CANCEL, um abzubrechen."
+
+; closesecondlife function (uninstall)
+LangString CloseSecondLifeUnInstDP ${LANG_GERMAN} "Warte darauf, dass Second Life beendet wird..."
+LangString CloseSecondLifeUnInstMB ${LANG_GERMAN} "Second Life kann nicht installiert werden, wenn es bereits l�uft.$\n$\nBeenden Sie, was Sie gerade tun und w�hlen Sie OK, um Second Life zu beenden oder Continue .$\nSelect CANCEL, um abzubrechen."
+
+; removecachefiles
+LangString RemoveCacheFilesDP ${LANG_GERMAN} "L�sche alle Cache Files in Dokumente und Einstellungen"
+
+; delete program files
+LangString DeleteProgramFilesMB ${LANG_GERMAN} "Es bestehen weiterhin Dateien in Ihrem SecondLife Programm Ordner.$\n$\nDies sind m�glicherweise Dateien, die sie modifiziert oder bewegt haben:$\n$INSTDIR$\n$\nM�chten Sie diese ebenfalls l�schen?"
+
+; uninstall text
+LangString UninstallTextMsg ${LANG_GERMAN} "Dies wird Second Life ${VERSION_LONG} von Ihrem System entfernen."
\ No newline at end of file
diff --git a/indra/newview/installers/windows/lang_en-us.nsi b/indra/newview/installers/windows/lang_en-us.nsi
new file mode 100644
index 0000000000..c26af12a9c
--- /dev/null
+++ b/indra/newview/installers/windows/lang_en-us.nsi
@@ -0,0 +1,57 @@
+; First is default
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf"
+
+; subtitle on license text caption
+LangString LicenseSubTitleUpdate ${LANG_ENGLISH} " Update"
+LangString LicenseSubTitleSetup ${LANG_ENGLISH} " Setup"
+
+; description on license page
+LangString LicenseDescUpdate ${LANG_ENGLISH} "This package will update Second Life to version ${VERSION_LONG}.(XXX)"
+LangString LicenseDescSetup ${LANG_ENGLISH} "This package will install Second Life on your computer." 
+LangString LicenseDescNext ${LANG_ENGLISH} "Next" 
+
+; installation directory text
+LangString DirectoryChooseTitle ${LANG_ENGLISH} "Installation Directory" 
+LangString DirectoryChooseUpdate ${LANG_ENGLISH} "Select the Second Life directory to update:"
+LangString DirectoryChooseSetup ${LANG_ENGLISH} "Select the directory to install Second Life in:"
+
+; CheckStartupParams message box
+LangString CheckStartupParamsMB ${LANG_ENGLISH} "Could not find the program '$INSTPROG'. Silent update failed."
+
+; installation success dialog
+LangString InstSuccesssQuestion ${LANG_ENGLISH} "Start Second Life now?"
+
+; remove old NSIS version
+LangString RemoveOldNSISVersion ${LANG_ENGLISH} "Checking for old version..."
+
+; check windows version
+LangString CheckWindowsVersionDP ${LANG_ENGLISH} "Checking Windows version..."
+LangString CheckWindowsVersionMB ${LANG_ENGLISH} 'Second Life only supports Windows XP, Windows 2000, and Mac OS X.$\n$\nAttempting to install on Windows $R0 can result in crashes and data loss.$\n$\nInstall anyway?'
+
+; checkifadministrator function (install)
+LangString CheckAdministratorInstDP ${LANG_ENGLISH} "Checking for permission to install..."
+LangString CheckAdministratorInstMB ${LANG_ENGLISH} 'You appear to be using a "limited" account.$\nYou must be an "administrator" to install Second Life.'
+
+; checkifadministrator function (uninstall)
+LangString CheckAdministratorUnInstDP ${LANG_ENGLISH} "Checking for permission to uninstall..."
+LangString CheckAdministratorUnInstMB ${LANG_ENGLISH} 'You appear to be using a "limited" account.$\nYou must be an "administrator" to uninstall Second Life.'
+
+; checkifalreadycurrent
+LangString CheckIfCurrentMB ${LANG_ENGLISH} "It appears that Second Life ${VERSION_LONG} is already installed.$\n$\nWould you like to install it again?"
+
+; closesecondlife function (install)
+LangString CloseSecondLifeInstDP ${LANG_ENGLISH} "Waiting for Second Life to shut down..."
+LangString CloseSecondLifeInstMB ${LANG_ENGLISH} "Second Life can't be installed while it is already running.$\n$\nFinish what you're doing then select OK to close Second Life and continue.$\nSelect CANCEL to cancel installation."
+
+; closesecondlife function (uninstall)
+LangString CloseSecondLifeUnInstDP ${LANG_ENGLISH} "Waiting for Second Life to shut down..."
+LangString CloseSecondLifeUnInstMB ${LANG_ENGLISH} "Second Life can't be uninstalled while it is already running.$\n$\nFinish what you're doing then select OK to close Second Life and continue.$\nSelect CANCEL to cancel."
+
+; removecachefiles
+LangString RemoveCacheFilesDP ${LANG_ENGLISH} "Deleting cache files in Documents and Settings folder"
+
+; delete program files
+LangString DeleteProgramFilesMB ${LANG_ENGLISH} "There are still files in your SecondLife program directory.$\n$\nThese are possibly files you created or moved to:$\n$INSTDIR$\n$\nDo you want to remove them?"
+
+; uninstall text
+LangString UninstallTextMsg ${LANG_ENGLISH} "This will uninstall Second Life ${VERSION_LONG} from your system."
diff --git a/indra/newview/installers/windows/lang_ja.nsi b/indra/newview/installers/windows/lang_ja.nsi
new file mode 100644
index 0000000000..43cb492780
--- /dev/null
+++ b/indra/newview/installers/windows/lang_ja.nsi
@@ -0,0 +1,57 @@
+; First is default
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\Japanese.nlf"
+
+; subtitle on license text caption
+LangString LicenseSubTitleUpdate ${LANG_JAPANESE} " �A�b�v�f�[�g" 
+LangString LicenseSubTitleSetup ${LANG_JAPANESE} " �Z�b�g�A�b�v" 
+
+; description on license page
+LangString LicenseDescUpdate ${LANG_JAPANESE} "���̃p�b�P�[�W�̓Z�J���h���C�t���o�[�W����${VERSION_LONG}.�ɃA�b�v�f�[�g���܂��B" 
+LangString LicenseDescSetup ${LANG_JAPANESE} "���̃p�b�P�[�W�͂��Ȃ��̃R���s���[�^�ɃZ�J���h���C�t���C���X�g�[�����܂��B" 
+LangString LicenseDescNext ${LANG_JAPANESE} "��" 
+
+; installation directory text
+LangString DirectoryChooseTitle ${LANG_JAPANESE} "�C���X�g�[���E�f�B���N�g��" 
+LangString DirectoryChooseUpdate ${LANG_JAPANESE} "�A�b�v�f�[�g����Z�J���h���C�t�̃f�B���N�g����I�����Ă��������B:" 
+LangString DirectoryChooseSetup ${LANG_JAPANESE} "�Z�J���h���C�t���C���X�g�[������f�B���N�g����I�������������B: " 
+
+; CheckStartupParams message box
+LangString CheckStartupParamsMB ${LANG_JAPANESE} "�v���O������'$INSTPROG'�����‚���܂���B�T�C�����g�E�A�b�v�f�[�g�Ɏ��s���܂����B" 
+
+; installation success dialog
+LangString InstSuccesssQuestion ${LANG_JAPANESE} "�����ɃZ�J���h���C�t���J�n���܂����H " 
+
+; remove old NSIS version
+LangString RemoveOldNSISVersion ${LANG_JAPANESE} "�Â��o�[�W���������`�F�b�N���ł��c" 
+
+; check windows version
+LangString CheckWindowsVersionDP ${LANG_JAPANESE} "�E�B���h�E�Y�̃o�[�W���������`�F�b�N���ł�..." 
+LangString CheckWindowsVersionMB ${LANG_JAPANESE} "�Z�J���h���C�t��Windows XP�AWindows 2000�AMac OS X�݂̂��T�|�[�g���Ă��܂��BWindows $R0���C���X�g�[�����鎖�́A�f�[�^�̏�����N���b�V���̌����ɂȂ�”\��������܂��B�C���X�g�[���𑱂��܂����H" 
+
+; checkifadministrator function (install)
+LangString CheckAdministratorInstDP ${LANG_JAPANESE} "�C���X�g�[���̂��߂̌������`�F�b�N���ł�..." 
+LangString CheckAdministratorInstMB ${LANG_JAPANESE} "�Z�J���h���C�t���C���X�g�[������ɂ͊Ǘ��Ҍ������K�v�ł��B"
+
+; checkifadministrator function (uninstall)
+LangString CheckAdministratorUnInstDP ${LANG_JAPANESE} "�A���C���X�g�[���̂��߂̌������`�F�b�N���ł�..." 
+LangString CheckAdministratorUnInstMB ${LANG_JAPANESE} "�Z�J���h���C�t���A���C���X�g�[������ɂ͊Ǘ��Ҍ������K�v�ł��B" 
+
+; checkifalreadycurrent
+LangString CheckIfCurrentMB ${LANG_JAPANESE} "�Z�J���h���C�t${VERSION_LONG} �̓C���X�g�[���ς݂ł��B�ēx�C���X�g�[�����܂����H " 
+
+; closesecondlife function (install)
+LangString CloseSecondLifeInstDP ${LANG_JAPANESE} "�Z�J���h���C�t���I�����ł�..." 
+LangString CloseSecondLifeInstMB ${LANG_JAPANESE} "�Z�J���h���C�t�̋N�����ɃC���X�g�[���͏o���܂���B�����ɃZ�J���h���C�t���I�����ăC���X�g�[�����J�n����ꍇ��OK�{�^���������Ă��������BCANCEL�������ƒ��~���܂��B"
+
+; closesecondlife function (uninstall)
+LangString CloseSecondLifeUnInstDP ${LANG_JAPANESE} "�Z�J���h���C�t���I�����ł�..." 
+LangString CloseSecondLifeUnInstMB ${LANG_JAPANESE} "�Z�J���h���C�t�̋N�����ɃA���C���X�g�[���͏o���܂���B�����ɃZ�J���h���C�t���I�����ăA���C���X�g�[�����J�n����ꍇ��OK�{�^���������Ă��������BCANCEL�������ƒ��~���܂��B" 
+
+; removecachefiles
+LangString RemoveCacheFilesDP ${LANG_JAPANESE} " Documents and Settings �t�H���_�̃L���b�V���t�@�C�����f���[�g���ł��B" 
+
+; delete program files
+LangString DeleteProgramFilesMB ${LANG_JAPANESE} "�Z�J���h���C�t�̃f�B���N�g���ɂ́A�܂��t�@�C�����c����Ă��܂��B$\n$INSTDIR$\n�ɂ��Ȃ����쐬�A�܂��͈ړ��������t�@�C��������”\��������܂��B�S�č폜���܂����H " 
+
+; uninstall text
+LangString UninstallTextMsg ${LANG_JAPANESE} "�Z�J���h���C�t${VERSION_LONG}���A���C���X�g�[�����܂��B"
diff --git a/indra/newview/installers/windows/lang_ko.nsi b/indra/newview/installers/windows/lang_ko.nsi
new file mode 100644
index 0000000000..4e6b5ec0cd
--- /dev/null
+++ b/indra/newview/installers/windows/lang_ko.nsi
@@ -0,0 +1,57 @@
+; First is default
+LoadLanguageFile "${NSISDIR}\Contrib\Language files\Korean.nlf"
+
+; subtitle on license text caption
+LangString LicenseSubTitleUpdate ${LANG_KOREAN} "������Ʈ"
+LangString LicenseSubTitleSetup ${LANG_KOREAN} " ��ġ�ϱ�"
+
+; description on license page
+LangString LicenseDescUpdate ${LANG_KOREAN} "�� ��Ű���� ������������� ����${VERSION_LONG}.���� ������Ʈ �մϴ�. "
+LangString LicenseDescSetup ${LANG_KOREAN} "�� ��Ű���� ������������� ��ǻ�Ϳ� ��ġ�մϴ�."
+LangString LicenseDescNext ${LANG_KOREAN} "����"
+
+; installation directory text
+LangString DirectoryChooseTitle ${LANG_KOREAN} "��ġ ���丮"
+LangString DirectoryChooseUpdate ${LANG_KOREAN} "������������� ������Ʈ�� ���丮�� �����ϼ���. "
+LangString DirectoryChooseSetup ${LANG_KOREAN} "������������� ��ġ�� ���丮�� �����ϼ���:"
+
+; CheckStartupParams message box
+LangString CheckStartupParamsMB ${LANG_KOREAN} " ��$INSTPROG�� ���α׷��� ã�� ���߽��ϴ�. �ڵ� ������Ʈ�� �����߽��ϴ�."
+
+; installation success dialog
+LangString InstSuccesssQuestion ${LANG_KOREAN} "������������� �����ϰڽ��ϱ�?"
+
+; remove old NSIS version
+LangString RemoveOldNSISVersion ${LANG_KOREAN} "���� ������ ã�� �ֽ��ϴ١� "
+
+; check windows version
+LangString CheckWindowsVersionDP ${LANG_KOREAN} "������ ������ Ȯ���ϰ� �ֽ��ϴ�."
+LangString CheckWindowsVersionMB ${LANG_KOREAN} "������������� ������ XP, ������ 2000, �׸��� �� OS X�� �����մϴ�. ������ $R0�� ��ġ�� �õ��ϸ� ���۵��� ������ �н��� �Ͼ �� �ֽ��ϴ�. ��� ��ġ�ϰڽ��ϱ�? "
+
+; checkifadministrator function (install)
+LangString CheckAdministratorInstDP ${LANG_KOREAN} "��ġ ������ Ȯ�� ���Դϴ�... "
+LangString CheckAdministratorInstMB ${LANG_KOREAN} "���� ���մԡ������� ��� ���Դϴ�. ������������� ��ġ�ϱ� ���ؼ� ����ڡ� ������ ����ؾ� �մϴ�."
+
+; checkifadministrator function (uninstall)
+LangString CheckAdministratorUnInstDP ${LANG_KOREAN} "���� ������ Ȯ�� ���Դϴ�. "
+LangString CheckAdministratorUnInstMB ${LANG_KOREAN} " ���� ���մԡ������� ��� ���Դϴ�. ������������� �����ϱ� ���ؼ� ����ڡ� ������ ����ؾ� �մϴ�. "
+
+; checkifalreadycurrent
+LangString CheckIfCurrentMB ${LANG_KOREAN} "����������� ���� ${VERSION_LONG}�� �̹� ��ġ�Ǿ� �ֽ��ϴ�. �ٽ� ��ġ�Ͻðڽ��ϱ�? "
+
+; closesecondlife function (install)
+LangString CloseSecondLifeInstDP ${LANG_KOREAN} "������������� ������ �� ���� ��� �ߡ� "
+LangString CloseSecondLifeInstMB ${LANG_KOREAN} "������������� �̹� �۵� ���� ��� ��ġ�� ��� �� �� �����ϴ�. ���� �۾��� ���߰� ��Ȯ�Ρ��� ���� ������������� ������ ���� �����ϱ� �ٶ��ϴ�. ��ġ�� ����Ϸ��� ����ҡ��� ��������." 
+
+; closesecondlife function (uninstall)
+LangString CloseSecondLifeUnInstDP ${LANG_KOREAN} "������������� ������ �� ���� ��� �ߡ���"
+LangString CloseSecondLifeUnInstMB ${LANG_KOREAN} " ������������� �̹� �۵� ���� ��� ���Ÿ� ��� �� �� �����ϴ�. ���� �۾��� ���߰� ��Ȯ�Ρ��� ���� ������������� ������ ���� �����ϱ� �ٶ��ϴ�. ��ġ�� ���Ϸ��� ����ҡ��� ��������. "
+
+; removecachefiles
+LangString RemoveCacheFilesDP ${LANG_KOREAN} " Documents and Settings ���� ���� ij�� ���ϵ��� ����ϴ�."
+
+; delete program files
+LangString DeleteProgramFilesMB ${LANG_KOREAN} "����������� ���α׷� ���丮�� ���� ���ϵ��� ���� �ֽ��ϴ�. �� ���ϵ��� ����ڰ� ���� �͵��̰ų�$\n$INSTDIR$\n$\n�� �̵��� ���ϵ��� �� �ֽ��ϴ�. �� ���ϵ��� �����ϰڽ��ϱ�?" 
+
+; uninstall text
+LangString UninstallTextMsg ${LANG_KOREAN} "�����������${VERSION_LONG}�� �ý��ۿ��� �����մϴ�."
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index c0ad9ffb03..15ab9bac1d 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -309,9 +309,6 @@ LLAgent::LLAgent()
 
 	mbJump(FALSE),
 
-	mWanderTimer(),
-	mWanderTargetGlobal( LLVector3d::zero ),
-
 	mAutoPilot(FALSE),
 	mAutoPilotFlyOnStop(FALSE),
 	mAutoPilotTargetGlobal(),
@@ -2096,36 +2093,6 @@ BOOL LLAgent::getBusy() const
 }
 
 
-//-----------------------------------------------------------------------------
-// updateWanderTarget()
-//-----------------------------------------------------------------------------
-void LLAgent::updateWanderTarget()
-{
-	S32 num_regions;
-	LLViewerRegion*	rand_region;
-	F32 rand_x;
-	F32 rand_y;
-
-	if (mWanderTimer.checkExpirationAndReset(ll_frand(MAX_WANDER_TIME)))
-	{
-		// Pick a random spot to wander towards
-		num_regions = gWorldPointer->mActiveRegionList.getLength();
-		S32 region_num = llround(ll_frand() * num_regions);
-		rand_region = gWorldPointer->mActiveRegionList.getFirstData();
-		S32 i = 0;
-		while (i < region_num)
-		{
-			rand_region = gWorldPointer->mActiveRegionList.getNextData();
-			i++;
-		}
-		rand_x = ll_frand(rand_region->getWidth());
-		rand_y = ll_frand(rand_region->getWidth());
-		
-		stopAutoPilot();
-		startAutoPilotGlobal(rand_region->getPosGlobalFromRegion(LLVector3(rand_x, rand_y, 0.f)));
-	}
-}
-
 //-----------------------------------------------------------------------------
 // startAutoPilotGlobal()
 //-----------------------------------------------------------------------------
@@ -4043,10 +4010,6 @@ void LLAgent::changeCameraToFollow(BOOL animate)
 			mbFlagsDirty = TRUE;
 		}
 
-		//RN: this doesn't seem to be necessary and destroys the UE for script-driven cameras
-		//gViewerWindow->setKeyboardFocus( NULL, NULL );
-		//gViewerWindow->setMouseCapture( NULL, NULL );
-
 		if (animate)
 		{
 			startCameraAnimation();
@@ -4110,9 +4073,6 @@ void LLAgent::changeCameraToThirdPerson(BOOL animate)
 			mbFlagsDirty = TRUE;
 		}
 
-		//RN: this doesn't seem to be necessary and destroys the UE for script-driven cameras
-		//gViewerWindow->setKeyboardFocus( NULL, NULL );
-		//gViewerWindow->setMouseCapture( NULL, NULL );
 	}
 
 	// Remove any pitch from the avatar
@@ -4185,7 +4145,7 @@ void LLAgent::changeCameraToCustomizeAvatar(BOOL animate)
 		}
 
 		gViewerWindow->setKeyboardFocus( NULL, NULL );
-		gViewerWindow->setMouseCapture( NULL, NULL );
+		gViewerWindow->setMouseCapture( NULL );
 
 		LLVOAvatar::onCustomizeStart();
 	}
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index b86dc03807..d0bda5d46a 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -398,8 +398,6 @@ public:
 
 	void			propagate(const F32 dt);									// BUG: should roll into updateAgentPosition
 
-	void			updateWanderTarget();									// drones will pick points in the world to autopilot towards
-
 	void			startAutoPilotGlobal(const LLVector3d &pos_global, const std::string& behavior_name = "", const LLQuaternion *target_rotation = NULL, 
 									void (*finish_callback)(BOOL, void *) = NULL, void *callback_data = NULL, F32 stop_distance = 0.f, F32 rotation_threshold = 0.03f);
 
@@ -771,9 +769,6 @@ private:
 
 	BOOL 			mbJump;
 
-	LLFrameTimer	mWanderTimer;
-	LLVector3d		mWanderTargetGlobal;
-
 	BOOL			mAutoPilot;
 	BOOL			mAutoPilotFlyOnStop;
 	LLVector3d		mAutoPilotTargetGlobal;
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index 7c615dd159..821bb2a69f 100644
--- a/indra/newview/llassetuploadresponders.cpp
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -79,7 +79,7 @@ void LLAssetUploadResponder::error(U32 statusNum, const std::string& reason)
 		default:
 			args["[FILE]"] = (mFileName.empty() ? mVFileID.asString() : mFileName);
 			args["[REASON]"] = "The server is experiencing unexpected "
-				"difficulties. Please try again later.";
+				"difficulties.";
 			gViewerWindow->alertXml("CannotUploadReason", args);
 			break;
 	}
diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp
index 19b6d80082..ddf0b83e73 100644
--- a/indra/newview/llchatbar.cpp
+++ b/indra/newview/llchatbar.cpp
@@ -583,7 +583,7 @@ void LLChatBar::onInputEditorKeystroke( LLLineEditor* caller, void* userdata )
 }
 
 // static
-void LLChatBar::onInputEditorFocusLost( LLLineEditor* caller, void* userdata)
+void LLChatBar::onInputEditorFocusLost( LLUICtrl* caller, void* userdata)
 {
 	// stop typing animation
 	gAgent.stopTyping();
diff --git a/indra/newview/llchatbar.h b/indra/newview/llchatbar.h
index e0f31ae124..65724a1f45 100644
--- a/indra/newview/llchatbar.h
+++ b/indra/newview/llchatbar.h
@@ -67,7 +67,7 @@ public:
 
 	static void	onTabClick( void* userdata );
 	static void	onInputEditorKeystroke(LLLineEditor* caller, void* userdata);
-	static void	onInputEditorFocusLost(LLLineEditor* caller,void* userdata);
+	static void	onInputEditorFocusLost(LLUICtrl* caller,void* userdata);
 	static void	onInputEditorGainFocus(LLUICtrl* caller,void* userdata);
 
 	static void onCommitGesture(LLUICtrl* ctrl, void* data);
diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp
index 4dade7f683..13e7fef4ec 100644
--- a/indra/newview/llcolorswatch.cpp
+++ b/indra/newview/llcolorswatch.cpp
@@ -148,7 +148,7 @@ BOOL LLColorSwatchCtrl::handleMouseDown(S32 x, S32 y, MASK mask)
 {
 	// Route future Mouse messages here preemptively.  (Release on mouse up.)
 	// No handler is needed for capture lost since this object has no state that depends on it.
-	gViewerWindow->setMouseCapture( this, NULL );
+	gViewerWindow->setMouseCapture( this );
 
 	return TRUE;
 }
@@ -157,10 +157,10 @@ BOOL LLColorSwatchCtrl::handleMouseDown(S32 x, S32 y, MASK mask)
 BOOL LLColorSwatchCtrl::handleMouseUp(S32 x, S32 y, MASK mask)
 {
 	// We only handle the click if the click both started and ended within us
-	if( gViewerWindow->hasMouseCapture( this ) )
+	if( hasMouseCapture() )
 	{
 		// Release the mouse
-		gViewerWindow->setMouseCapture( NULL, NULL );
+		gViewerWindow->setMouseCapture( NULL );
 
 		// If mouseup in the widget, it's been clicked
 		if ( pointInView(x, y) )
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 3418007d41..77bbc1ca81 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -254,7 +254,8 @@ LLFace*	LLDrawable::addFace(LLFacePool *poolp, LLViewerImage *texturep)
 	LLMemType mt(LLMemType::MTYPE_DRAWABLE);
 	
 	LLFace *face = new LLFace(this, mVObjp);
-
+	if (!face) llerrs << "Allocating new Face: " << mFaces.size() << llendl;
+	
 	if (face)
 	{
 		mFaces.push_back(face);
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 93af956466..de82dff95d 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -26,6 +26,7 @@
 #include "llviewerwindow.h"
 #include "pipeline.h"
 #include "llviewerregion.h"
+#include "llglslshader.h"
 
 BOOL LLDrawPoolAlpha::sShowDebugAlpha = FALSE;
 
@@ -47,7 +48,7 @@ LLDrawPoolAlpha::~LLDrawPoolAlpha()
 
 void LLDrawPoolAlpha::prerender()
 {
-	mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_OBJECT);
+	mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_OBJECT);
 }
 
 void LLDrawPoolAlpha::beginRenderPass(S32 pass)
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 9b9825deff..a0cc189c46 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -21,6 +21,7 @@
 #include "llviewerregion.h"
 #include "noise.h"
 #include "pipeline.h"
+#include "llglslshader.h"
 
 static U32 sDataMask = LLDrawPoolAvatar::VERTEX_DATA_MASK;
 static U32 sBufferUsage = GL_STREAM_DRAW_ARB;
@@ -82,12 +83,12 @@ static LLMatrix4 sModelViewMatrix = LLMatrix4();
 
 S32 LLDrawPoolAvatar::getVertexShaderLevel() const
 {
-	return (S32) gPipeline.getVertexShaderLevel(LLPipeline::SHADER_AVATAR);
+	return (S32) LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR);
 }
 
 void LLDrawPoolAvatar::prerender()
 {
-	mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_AVATAR);
+	mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR);
 	sShaderLevel = mVertexShaderLevel;
 	
 	if (sShaderLevel > 0)
@@ -171,15 +172,15 @@ void LLDrawPoolAvatar::endFootShadow()
 
 void LLDrawPoolAvatar::beginRigid()
 {
-	sVertexProgram = &gPipeline.mAvatarEyeballProgram;
+	sVertexProgram = &gAvatarEyeballProgram;
 	glEnableClientState(GL_NORMAL_ARRAY);
 	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 
 	if (sShaderLevel > 0)
 	{	//eyeballs render with the specular shader
-		gPipeline.mAvatarEyeballProgram.bind();
-		gPipeline.mMaterialIndex = gPipeline.mAvatarEyeballProgram.mAttribute[LLPipeline::GLSL_MATERIAL_COLOR];
-		gPipeline.mSpecularIndex = gPipeline.mAvatarEyeballProgram.mAttribute[LLPipeline::GLSL_SPECULAR_COLOR];
+		gAvatarEyeballProgram.bind();
+		gMaterialIndex = gAvatarEyeballProgram.mAttribute[LLShaderMgr::MATERIAL_COLOR];
+		gSpecularIndex = gAvatarEyeballProgram.mAttribute[LLShaderMgr::SPECULAR_COLOR];
 	}
 }
 
@@ -194,7 +195,7 @@ void LLDrawPoolAvatar::beginSkinned()
 	glEnableClientState(GL_NORMAL_ARRAY);
 	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 
-	sVertexProgram = &gPipeline.mAvatarProgram;
+	sVertexProgram = &gAvatarProgram;
 
 	if (sShaderLevel > 0)  // for hardware blending
 	{
@@ -202,22 +203,22 @@ void LLDrawPoolAvatar::beginSkinned()
 		glClientActiveTextureARB(GL_TEXTURE1_ARB);
 		if (sShaderLevel >= SHADER_LEVEL_BUMP)
 		{
-			gPipeline.mMaterialIndex = sVertexProgram->mAttribute[LLPipeline::GLSL_MATERIAL_COLOR];
-			gPipeline.mSpecularIndex = sVertexProgram->mAttribute[LLPipeline::GLSL_SPECULAR_COLOR];
+			gMaterialIndex = sVertexProgram->mAttribute[LLShaderMgr::MATERIAL_COLOR];
+			gSpecularIndex = sVertexProgram->mAttribute[LLShaderMgr::SPECULAR_COLOR];
 		}
 		sVertexProgram->bind();
 		if (sShaderLevel >= SHADER_LEVEL_CLOTH)
 		{
-			enable_cloth_weights(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_CLOTHING]);
+			enable_cloth_weights(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_CLOTHING]);
 		}
-		enable_vertex_weighting(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_WEIGHT]);
+		enable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]);
 
 		if (sShaderLevel >= SHADER_LEVEL_BUMP)
 		{
-			enable_binormals(sVertexProgram->mAttribute[LLPipeline::GLSL_BINORMAL]);
+			enable_binormals(sVertexProgram->mAttribute[LLShaderMgr::BINORMAL]);
 		}
 		
-		sVertexProgram->enableTexture(LLPipeline::GLSL_BUMP_MAP);
+		sVertexProgram->enableTexture(LLShaderMgr::BUMP_MAP);
 		glActiveTextureARB(GL_TEXTURE0_ARB);
 	}
 }
@@ -228,17 +229,17 @@ void LLDrawPoolAvatar::endSkinned()
 	if (sShaderLevel > 0)
 	{
 		sRenderingSkinned = FALSE;
-		sVertexProgram->disableTexture(LLPipeline::GLSL_BUMP_MAP);
+		sVertexProgram->disableTexture(LLShaderMgr::BUMP_MAP);
 		glActiveTextureARB(GL_TEXTURE0_ARB);
 		glClientActiveTextureARB(GL_TEXTURE0_ARB);
-		disable_vertex_weighting(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_WEIGHT]);
+		disable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]);
 		if (sShaderLevel >= SHADER_LEVEL_BUMP)
 		{
-			disable_binormals(sVertexProgram->mAttribute[LLPipeline::GLSL_BINORMAL]);
+			disable_binormals(sVertexProgram->mAttribute[LLShaderMgr::BINORMAL]);
 		}
 		if ((sShaderLevel >= SHADER_LEVEL_CLOTH))
 		{
-			disable_cloth_weights(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_CLOTHING]);
+			disable_cloth_weights(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_CLOTHING]);
 		}
 
 		sVertexProgram->unbind();
@@ -354,7 +355,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
 
 	if (sShaderLevel > 0)
 	{
-		gPipeline.mAvatarMatrixParam = sVertexProgram->mUniform[LLPipeline::GLSL_AVATAR_MATRIX];
+		gAvatarMatrixParam = sVertexProgram->mUniform[LLShaderMgr::AVATAR_MATRIX];
 	}
     
 	if ((sShaderLevel >= SHADER_LEVEL_CLOTH))
@@ -370,16 +371,16 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
 		wind = wind * rot_mat;
 		wind.mV[VW] = avatarp->mWindVec.mV[VW];
 
-		sVertexProgram->vertexAttrib4fv(LLPipeline::GLSL_AVATAR_WIND, wind.mV);
+		sVertexProgram->vertexAttrib4fv(LLShaderMgr::AVATAR_WIND, wind.mV);
 		F32 phase = -1.f * (avatarp->mRipplePhase);
 
 		F32 freq = 7.f + (noise1(avatarp->mRipplePhase) * 2.f);
 		LLVector4 sin_params(freq, freq, freq, phase);
-		sVertexProgram->vertexAttrib4fv(LLPipeline::GLSL_AVATAR_SINWAVE, sin_params.mV);
+		sVertexProgram->vertexAttrib4fv(LLShaderMgr::AVATAR_SINWAVE, sin_params.mV);
 
 		LLVector4 gravity(0.f, 0.f, -CLOTHING_GRAVITY_EFFECT, 0.f);
 		gravity = gravity * rot_mat;
-		sVertexProgram->vertexAttrib4fv(LLPipeline::GLSL_AVATAR_GRAVITY, gravity.mV);
+		sVertexProgram->vertexAttrib4fv(LLShaderMgr::AVATAR_GRAVITY, gravity.mV);
 	}
 
 	if( !single_avatar || (avatarp == single_avatar) )
@@ -507,10 +508,10 @@ void LLDrawPoolAvatar::renderForSelect()
 	glEnableClientState(GL_NORMAL_ARRAY);
 	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 	glGetFloatv(GL_MODELVIEW_MATRIX, (F32*) sModelViewMatrix.mMatrix);
-	sVertexProgram = &gPipeline.mAvatarPickProgram;
+	sVertexProgram = &gAvatarPickProgram;
 	if (sShaderLevel > 0)
 	{
-		gPipeline.mAvatarMatrixParam = sVertexProgram->mUniform[LLPipeline::GLSL_AVATAR_MATRIX];
+		gAvatarMatrixParam = sVertexProgram->mUniform[LLShaderMgr::AVATAR_MATRIX];
 	}
 	glAlphaFunc(GL_GEQUAL, 0.2f);
 	glBlendFunc(GL_ONE, GL_ZERO);
@@ -527,7 +528,7 @@ void LLDrawPoolAvatar::renderForSelect()
 		glClientActiveTextureARB(GL_TEXTURE0_ARB);
 		sRenderingSkinned = TRUE;
 		sVertexProgram->bind();
-		enable_vertex_weighting(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_WEIGHT]);
+		enable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]);
 	}
 	
 	mIndicesDrawn += avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
@@ -537,7 +538,7 @@ void LLDrawPoolAvatar::renderForSelect()
 	{
 		sRenderingSkinned = FALSE;
 		sVertexProgram->unbind();
-		disable_vertex_weighting(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_WEIGHT]);
+		disable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]);
 	}
 
 	glAlphaFunc(GL_GREATER, 0.01f);
@@ -577,7 +578,7 @@ LLColor3 LLDrawPoolAvatar::getDebugColor() const
 
 LLVertexBufferAvatar::LLVertexBufferAvatar()
 : LLVertexBuffer(sDataMask, 
-	gPipeline.getVertexShaderLevel(LLPipeline::SHADER_AVATAR) > 0 ?	
+	LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR) > 0 ?	
 	GL_STATIC_DRAW_ARB : 
 	GL_STREAM_DRAW_ARB)
 {
@@ -599,16 +600,16 @@ void LLVertexBufferAvatar::setupVertexBuffer(U32 data_mask) const
 		glClientActiveTextureARB(GL_TEXTURE0_ARB);
 		glTexCoordPointer(2,GL_FLOAT, mStride, (void*)(base + mOffsets[TYPE_TEXCOORD]));
 		
-		set_vertex_weights(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_WEIGHT], mStride, (F32*)(base + mOffsets[TYPE_WEIGHT]));
+		set_vertex_weights(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT], mStride, (F32*)(base + mOffsets[TYPE_WEIGHT]));
 
 		if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_BUMP)
 		{
-			set_binormals(sVertexProgram->mAttribute[LLPipeline::GLSL_BINORMAL], mStride, (LLVector3*)(base + mOffsets[TYPE_BINORMAL]));
+			set_binormals(sVertexProgram->mAttribute[LLShaderMgr::BINORMAL], mStride, (LLVector3*)(base + mOffsets[TYPE_BINORMAL]));
 		}
 	
 		if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH)
 		{
-			set_vertex_clothing_weights(sVertexProgram->mAttribute[LLPipeline::GLSL_AVATAR_CLOTHING], mStride, (LLVector4*)(base + mOffsets[TYPE_CLOTHWEIGHT]));
+			set_vertex_clothing_weights(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_CLOTHING], mStride, (LLVector4*)(base + mOffsets[TYPE_CLOTHWEIGHT]));
 		}
 	}
 	else
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 377dbea2d0..f0f7130e0b 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -27,7 +27,7 @@
 #include "llviewercamera.h"
 #include "llviewerimagelist.h"
 #include "pipeline.h"
-
+#include "llglslshader.h"
 
 //#include "llimagebmp.h"
 //#include "../tools/imdebug/imdebug.h"
@@ -141,7 +141,7 @@ LLDrawPoolBump::LLDrawPoolBump()
 
 void LLDrawPoolBump::prerender()
 {
-	mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_OBJECT);
+	mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_OBJECT);
 }
 
 // static
@@ -234,14 +234,14 @@ void LLDrawPoolBump::beginShiny()
 		cube_map->setMatrix(0);
 		cube_map->bind();
 
-		if (gPipeline.getVertexShaderLevel(LLPipeline::SHADER_OBJECT) > 0)
+		if (LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_OBJECT) > 0)
 		{
 			LLMatrix4 mat;
 			glGetFloatv(GL_MODELVIEW_MATRIX, (F32*) mat.mMatrix);
-			gPipeline.mObjectShinyProgram.bind();
-			LLVector3 vec = LLVector3(gPipeline.mShinyOrigin) * mat;
-			LLVector4 vec4(vec, gPipeline.mShinyOrigin.mV[3]);
-			glUniform4fvARB(gPipeline.mObjectShinyProgram.mUniform[LLPipeline::GLSL_SHINY_ORIGIN], 1,
+			gObjectShinyProgram.bind();
+			LLVector3 vec = LLVector3(gShinyOrigin) * mat;
+			LLVector4 vec4(vec, gShinyOrigin.mV[3]);
+			glUniform4fvARB(gObjectShinyProgram.mUniform[LLShaderMgr::SHINY_ORIGIN], 1,
 				vec4.mV);
 		}
 		else
@@ -361,9 +361,9 @@ void LLDrawPoolBump::endShiny()
 		cube_map->disable();
 		cube_map->restoreMatrix();
 
-		if (gPipeline.getVertexShaderLevel(LLPipeline::SHADER_OBJECT) > 0)
+		if (LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_OBJECT) > 0)
 		{
-			gPipeline.mObjectShinyProgram.unbind();
+			gObjectShinyProgram.unbind();
 		}
 
 		glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,		GL_MODULATE);
diff --git a/indra/newview/lldrawpoolground.cpp b/indra/newview/lldrawpoolground.cpp
index edbb11ad79..b6c3d638ea 100644
--- a/indra/newview/lldrawpoolground.cpp
+++ b/indra/newview/lldrawpoolground.cpp
@@ -21,6 +21,7 @@
 #include "pipeline.h"
 #include "llagent.h"
 #include "llviewerregion.h"
+#include "llglslshader.h"
 
 LLDrawPoolGround::LLDrawPoolGround() :
 	LLFacePool(POOL_GROUND)
@@ -34,7 +35,7 @@ LLDrawPool *LLDrawPoolGround::instancePool()
 
 void LLDrawPoolGround::prerender()
 {
-	mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_ENVIRONMENT);
+	mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_ENVIRONMENT);
 }
 
 void LLDrawPoolGround::render(S32 pass)
diff --git a/indra/newview/lldrawpoolsimple.cpp b/indra/newview/lldrawpoolsimple.cpp
index 4c09cd4095..26022e362a 100644
--- a/indra/newview/lldrawpoolsimple.cpp
+++ b/indra/newview/lldrawpoolsimple.cpp
@@ -17,6 +17,7 @@
 #include "llface.h"
 #include "llsky.h"
 #include "pipeline.h"
+#include "llglslshader.h"
 
 class LLRenderShinyGlow : public LLDrawPoolBump
 {
@@ -102,7 +103,7 @@ LLDrawPoolSimple::LLDrawPoolSimple() :
 
 void LLDrawPoolSimple::prerender()
 {
-	mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_OBJECT);
+	mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_OBJECT);
 }
 
 void LLDrawPoolSimple::beginRenderPass(S32 pass)
diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp
index 80340f63b9..6448576117 100644
--- a/indra/newview/lldrawpoolsky.cpp
+++ b/indra/newview/lldrawpoolsky.cpp
@@ -23,6 +23,7 @@
 #include "llvosky.h"
 #include "llworld.h" // To get water height
 #include "pipeline.h"
+#include "llglslshader.h"
 
 LLDrawPoolSky::LLDrawPoolSky() :
 	LLFacePool(POOL_SKY)
@@ -36,7 +37,7 @@ LLDrawPool *LLDrawPoolSky::instancePool()
 
 void LLDrawPoolSky::prerender()
 {
-	mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_ENVIRONMENT);
+	mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_ENVIRONMENT);
 }
 
 void LLDrawPoolSky::render(S32 pass)
diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp
index 8c5c2e177a..787cd3167b 100644
--- a/indra/newview/lldrawpoolterrain.cpp
+++ b/indra/newview/lldrawpoolterrain.cpp
@@ -28,6 +28,7 @@
 #include "llviewerimagelist.h" // To get alpha gradients
 #include "llworld.h"
 #include "pipeline.h"
+#include "llglslshader.h"
 
 const F32 DETAIL_SCALE = 1.f/16.f;
 int DebugDetailMap = 0;
@@ -149,10 +150,10 @@ void LLDrawPoolTerrain::render(S32 pass)
 		gPipeline.disableLights();
 		if ((mVertexShaderLevel > 0))
 		{
-			gPipeline.mHighlightProgram.bind();
-			gPipeline.mHighlightProgram.vertexAttrib4f(LLPipeline::GLSL_MATERIAL_COLOR,1,1,1,1);
+			gHighlightProgram.bind();
+			gHighlightProgram.vertexAttrib4f(LLShaderMgr::MATERIAL_COLOR,1,1,1,1);
 			renderOwnership();
-			gPipeline.mTerrainProgram.bind();
+			gTerrainProgram.bind();
 		}
 		else
 		{
@@ -203,9 +204,9 @@ void LLDrawPoolTerrain::renderFull4TUShader()
 	// Stage 0: detail texture 0
 	//
 	
-	S32 detailTex0 = gPipeline.mTerrainProgram.enableTexture(LLPipeline::GLSL_TERRAIN_DETAIL0);
-	S32 detailTex1 = gPipeline.mTerrainProgram.enableTexture(LLPipeline::GLSL_TERRAIN_DETAIL1);
-	S32 rampTex = gPipeline.mTerrainProgram.enableTexture(LLPipeline::GLSL_TERRAIN_ALPHARAMP);
+	S32 detailTex0 = gTerrainProgram.enableTexture(LLShaderMgr::TERRAIN_DETAIL0);
+	S32 detailTex1 = gTerrainProgram.enableTexture(LLShaderMgr::TERRAIN_DETAIL1);
+	S32 rampTex = gTerrainProgram.enableTexture(LLShaderMgr::TERRAIN_ALPHARAMP);
 	
 	LLViewerImage::bindTexture(detail_texture0p,detailTex0);
 
@@ -322,9 +323,9 @@ void LLDrawPoolTerrain::renderFull4TUShader()
 	}
 
 	// Disable multitexture
-	gPipeline.mTerrainProgram.disableTexture(LLPipeline::GLSL_TERRAIN_ALPHARAMP);
-	gPipeline.mTerrainProgram.disableTexture(LLPipeline::GLSL_TERRAIN_DETAIL0);
-	gPipeline.mTerrainProgram.disableTexture(LLPipeline::GLSL_TERRAIN_DETAIL1);
+	gTerrainProgram.disableTexture(LLShaderMgr::TERRAIN_ALPHARAMP);
+	gTerrainProgram.disableTexture(LLShaderMgr::TERRAIN_DETAIL0);
+	gTerrainProgram.disableTexture(LLShaderMgr::TERRAIN_DETAIL1);
 	
 	glClientActiveTextureARB(GL_TEXTURE3_ARB);
 	glActiveTextureARB(GL_TEXTURE3_ARB);
@@ -1061,5 +1062,5 @@ LLColor3 LLDrawPoolTerrain::getDebugColor() const
 
 S32 LLDrawPoolTerrain::getMaterialAttribIndex()
 {
-	return gPipeline.mTerrainProgram.mAttribute[LLPipeline::GLSL_MATERIAL_COLOR];
+	return gTerrainProgram.mAttribute[LLShaderMgr::MATERIAL_COLOR];
 }
diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp
index 170669955c..350ad6a652 100644
--- a/indra/newview/lldrawpooltree.cpp
+++ b/indra/newview/lldrawpooltree.cpp
@@ -17,6 +17,7 @@
 #include "llvotree.h"
 #include "pipeline.h"
 #include "llviewercamera.h"
+#include "llglslshader.h"
 
 S32 LLDrawPoolTree::sDiffTex = 0;
 
@@ -267,5 +268,5 @@ LLColor3 LLDrawPoolTree::getDebugColor() const
 
 S32 LLDrawPoolTree::getMaterialAttribIndex() 
 { 
-	return gPipeline.mObjectSimpleProgram.mAttribute[LLPipeline::GLSL_MATERIAL_COLOR];
+	return gObjectSimpleProgram.mAttribute[LLShaderMgr::MATERIAL_COLOR];
 }
diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp
index 6e372b6f76..fd66d58851 100644
--- a/indra/newview/lldrawpoolwater.cpp
+++ b/indra/newview/lldrawpoolwater.cpp
@@ -28,6 +28,7 @@
 #include "llworld.h"
 #include "pipeline.h"
 #include "viewer.h"			// gSunTextureID, gMoonTextureID
+#include "llglslshader.h"
 
 const LLUUID WATER_TEST("2bfd3884-7e27-69b9-ba3a-3e673f680004");
 
@@ -71,12 +72,9 @@ LLDrawPool *LLDrawPoolWater::instancePool()
 
 void LLDrawPoolWater::prerender()
 {
-#if 1 // 1.9.1
 	mVertexShaderLevel = gSavedSettings.getBOOL("RenderRippleWater") ?
-		gPipeline.getVertexShaderLevel(LLPipeline::SHADER_ENVIRONMENT) : 0;
-#else
-	mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_ENVIRONMENT);
-#endif
+				LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_ENVIRONMENT) : 0;
+
 }
 
 extern LLColor4U MAX_WATER_COLOR;
@@ -319,7 +317,7 @@ void LLDrawPoolWater::renderShaderSimple()
 	glEnableClientState(GL_NORMAL_ARRAY);
 	
 	// Set up second pass first
-	S32 bumpTex = gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_BUMP_MAP);
+	S32 bumpTex = gWaterProgram.enableTexture(LLShaderMgr::BUMP_MAP);
 	mWaterImagep->addTextureStats(1024.f*1024.f);
 	mWaterImagep->bind(bumpTex);
 
@@ -368,7 +366,7 @@ void LLDrawPoolWater::renderShaderSimple()
 
 	if (gSky.mVOSkyp->getCubeMap())
 	{
-		envTex = gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB);
+		envTex = gWaterProgram.enableTexture(LLShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB);
 		gSky.mVOSkyp->getCubeMap()->bind();
 		
 		glMatrixMode(GL_TEXTURE);
@@ -382,9 +380,9 @@ void LLDrawPoolWater::renderShaderSimple()
 		glMatrixMode(GL_MODELVIEW);
 	}
 
-	S32 diffTex = gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_DIFFUSE_MAP);
+	S32 diffTex = gWaterProgram.enableTexture(LLShaderMgr::DIFFUSE_MAP);
     
-	gPipeline.mWaterProgram.bind();
+	gWaterProgram.bind();
 
 	for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
 		 iter != mDrawFace.end(); iter++)
@@ -401,21 +399,21 @@ void LLDrawPoolWater::renderShaderSimple()
 		
 	if (gSky.mVOSkyp->getCubeMap())
 	{
-		gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB);
+		gWaterProgram.disableTexture(LLShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB);
 		glMatrixMode(GL_TEXTURE);
 		glLoadIdentity();
 		glMatrixMode(GL_MODELVIEW);
 	}
 	
 	// Now, disable texture coord generation on texture state 1
-	gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_BUMP_MAP);
+	gWaterProgram.disableTexture(LLShaderMgr::BUMP_MAP);
 	LLImageGL::unbindTexture(bumpTex, GL_TEXTURE_2D);
 
 	glActiveTextureARB(GL_TEXTURE1_ARB);
 	glDisable(GL_TEXTURE_GEN_S); //texture unit 1
 	glDisable(GL_TEXTURE_GEN_T); //texture unit 1
 
-	gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_DIFFUSE_MAP);
+	gWaterProgram.disableTexture(LLShaderMgr::DIFFUSE_MAP);
 	
 	// Disable texture coordinate and color arrays
 	LLImageGL::unbindTexture(diffTex, GL_TEXTURE_2D);
@@ -546,17 +544,17 @@ void LLDrawPoolWater::shade()
 	
 	LLCubeMap* skyMap = gSky.mVOSkyp->getCubeMap();
 	
-	gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB);
+	gWaterProgram.enableTexture(LLShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB);
     skyMap->bind();
 
 	//bind normal map
-	S32 bumpTex = gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_BUMP_MAP);
+	S32 bumpTex = gWaterProgram.enableTexture(LLShaderMgr::BUMP_MAP);
 	mWaterNormp->addTextureStats(1024.f*1024.f);
 	mWaterNormp->bind(bumpTex);
 	
-	gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_WATER_SCREENTEX);	
+	gWaterProgram.enableTexture(LLShaderMgr::WATER_SCREENTEX);	
 
-	gPipeline.mWaterProgram.bind();
+	gWaterProgram.bind();
 	
 	if (!sSkipScreenCopy)
 	{
@@ -567,20 +565,20 @@ void LLDrawPoolWater::shade()
 		glBindTexture(GL_TEXTURE_2D, 0);
 	}
 	
-	glUniform2fvARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_FBSCALE], 1, 
+	glUniform2fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_FBSCALE], 1, 
 			gPipeline.mScreenScale.mV);
 
-	S32 diffTex = gPipeline.mWaterProgram.enableTexture(LLPipeline::GLSL_DIFFUSE_MAP);
+	S32 diffTex = gWaterProgram.enableTexture(LLShaderMgr::DIFFUSE_MAP);
 	
 	LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
 
-	glUniform1fARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_TIME], sTime);
-	glUniform3fvARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_SPECULAR], 1, light_diffuse.mV);
-	glUniform1fARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_SPECULAR_EXP], light_exp);
-	glUniform3fvARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_EYEVEC], 1, gCamera->getOrigin().mV);
-	glUniform2fvARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_WAVE_DIR1], 1, d1.mV);
-	glUniform2fvARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_WAVE_DIR2], 1, d2.mV);
-	glUniform3fvARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_LIGHT_DIR], 1, light_dir.mV);
+	glUniform1fARB(gWaterProgram.mUniform[LLShaderMgr::WATER_TIME], sTime);
+	glUniform3fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_SPECULAR], 1, light_diffuse.mV);
+	glUniform1fARB(gWaterProgram.mUniform[LLShaderMgr::WATER_SPECULAR_EXP], light_exp);
+	glUniform3fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_EYEVEC], 1, gCamera->getOrigin().mV);
+	glUniform2fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_WAVE_DIR1], 1, d1.mV);
+	glUniform2fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_WAVE_DIR2], 1, d2.mV);
+	glUniform3fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_LIGHT_DIR], 1, light_dir.mV);
 
 	LLColor4 water_color;
 	LLVector3 camera_up = gCamera->getUpAxis();
@@ -588,12 +586,12 @@ void LLDrawPoolWater::shade()
 	if (gCamera->cameraUnderWater())
 	{
 		water_color.setVec(1.f, 1.f, 1.f, 0.4f);
-		glUniform1fARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_REFSCALE], 0.25f);
+		glUniform1fARB(gWaterProgram.mUniform[LLShaderMgr::WATER_REFSCALE], 0.25f);
 	}
 	else
 	{
 		water_color.setVec(1.f, 1.f, 1.f, 0.5f*(1.f + up_dot));
-		glUniform1fARB(gPipeline.mWaterProgram.mUniform[LLPipeline::GLSL_WATER_REFSCALE], 0.01f);
+		glUniform1fARB(gWaterProgram.mUniform[LLShaderMgr::WATER_REFSCALE], 0.01f);
 	}
 	if (water_color.mV[3] > 0.9f)
 	{
@@ -620,10 +618,10 @@ void LLDrawPoolWater::shade()
 		}
 	}
 	
-	gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB);
-	gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_WATER_SCREENTEX);
-	gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_BUMP_MAP);
-	gPipeline.mWaterProgram.disableTexture(LLPipeline::GLSL_DIFFUSE_MAP);
+	gWaterProgram.disableTexture(LLShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB);
+	gWaterProgram.disableTexture(LLShaderMgr::WATER_SCREENTEX);
+	gWaterProgram.disableTexture(LLShaderMgr::BUMP_MAP);
+	gWaterProgram.disableTexture(LLShaderMgr::DIFFUSE_MAP);
 
 	glActiveTextureARB(GL_TEXTURE0_ARB);
 	glEnable(GL_TEXTURE_2D);
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 280abcd541..b3e68e24df 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -231,8 +231,6 @@ void LLFace::setDrawable(LLDrawable *drawable)
 
 void LLFace::setSize(const S32 num_vertices, const S32 num_indices)
 {
-	LLMemType mt1(LLMemType::MTYPE_DRAWABLE);
-	
 	mGeomCount    = num_vertices;
 	mIndicesCount = num_indices;
 }
@@ -950,17 +948,17 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
 		}
 		else
 		{
-			if (mode & LLViewerTextureAnim::TRANSLATE)
+			//if (mode & LLViewerTextureAnim::TRANSLATE)
 			{
 				os = ot = 0.f;
 			}
-			if (mode & LLViewerTextureAnim::ROTATE)
+			//if (mode & LLViewerTextureAnim::ROTATE)
 			{
 				r = 0.f;
 				cos_ang = 1.f;
 				sin_ang = 0.f;
 			}
-			if (mode & LLViewerTextureAnim::SCALE)
+			//if (mode & LLViewerTextureAnim::SCALE)
 			{
 				ms = mt = 1.f;
 			}
diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp
index 3c296615f6..22617a7fcc 100644
--- a/indra/newview/llfloateranimpreview.cpp
+++ b/indra/newview/llfloateranimpreview.cpp
@@ -390,7 +390,7 @@ BOOL LLFloaterAnimPreview::handleMouseDown(S32 x, S32 y, MASK mask)
 	if (mPreviewRect.pointInRect(x, y))
 	{
 		bringToFront( x, y );
-		gViewerWindow->setMouseCapture(this, onMouseCaptureLost);
+		gViewerWindow->setMouseCapture(this);
 		gViewerWindow->hideCursor();
 		mLastMouseX = x;
 		mLastMouseY = y;
@@ -405,7 +405,7 @@ BOOL LLFloaterAnimPreview::handleMouseDown(S32 x, S32 y, MASK mask)
 //-----------------------------------------------------------------------------
 BOOL LLFloaterAnimPreview::handleMouseUp(S32 x, S32 y, MASK mask)
 {
-	gViewerWindow->setMouseCapture(FALSE, NULL);
+	gViewerWindow->setMouseCapture(FALSE);
 	gViewerWindow->showCursor();
 	return LLFloater::handleMouseUp(x, y, mask);
 }
@@ -417,7 +417,7 @@ BOOL LLFloaterAnimPreview::handleHover(S32 x, S32 y, MASK mask)
 {
 	MASK local_mask = mask & ~MASK_ALT;
 
-	if (mAnimPreview && gViewerWindow->hasMouseCapture(this))
+	if (mAnimPreview && hasMouseCapture())
 	{
 		if (local_mask == MASK_PAN)
 		{
@@ -479,7 +479,7 @@ BOOL LLFloaterAnimPreview::handleScrollWheel(S32 x, S32 y, S32 clicks)
 //-----------------------------------------------------------------------------
 // onMouseCaptureLost()
 //-----------------------------------------------------------------------------
-void LLFloaterAnimPreview::onMouseCaptureLost(LLMouseHandler* handler)
+void LLFloaterAnimPreview::onMouseCaptureLost()
 {
 	gViewerWindow->showCursor();
 }
diff --git a/indra/newview/llfloateranimpreview.h b/indra/newview/llfloateranimpreview.h
index 40ec96f73d..858d586274 100644
--- a/indra/newview/llfloateranimpreview.h
+++ b/indra/newview/llfloateranimpreview.h
@@ -56,10 +56,10 @@ public:
 	BOOL handleMouseUp(S32 x, S32 y, MASK mask);
 	BOOL handleHover(S32 x, S32 y, MASK mask);
 	BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); 
+	void onMouseCaptureLost();
 
 	void refresh();
 
-	static void onMouseCaptureLost(LLMouseHandler*);
 	static void	onBtnPlay(void*);
 	static void	onBtnStop(void*);
 	static void setUploadAmount(S32 amount) { sUploadAmount = amount; }
diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp
index de9432ee73..559b29379c 100644
--- a/indra/newview/llfloateravatarpicker.cpp
+++ b/indra/newview/llfloateravatarpicker.cpp
@@ -24,7 +24,7 @@
 const S32 MIN_WIDTH = 200;
 const S32 MIN_HEIGHT = 340;
 const LLRect FLOATER_RECT(0, 380, 240, 0);
-const char FLOATER_TITLE[] = "Choose Person";
+const char FLOATER_TITLE[] = "Choose Resident";
 
 // static
 LLFloaterAvatarPicker* LLFloaterAvatarPicker::sInstance = NULL;
@@ -89,9 +89,7 @@ BOOL LLFloaterAvatarPicker::postBuild()
 
 	if (mListNames)
 	{
-		LLScrollListItem* row = new LLScrollListItem( TRUE, NULL, LLUUID::null );
-		row->addColumn("No results", LLFontGL::sSansSerif);
-		mListNames->addItem(row);
+		mListNames->addSimpleElement("No results");
 	}
 
 	mInventoryPanel = (LLInventoryPanel*)this->getCtrlByNameAndType("Inventory Panel", WIDGET_TYPE_INVENTORY_PANEL);
@@ -237,10 +235,7 @@ void LLFloaterAvatarPicker::find()
 	if (mListNames)
 	{
 		mListNames->deleteAllItems();	
-	
-		LLScrollListItem* row = new LLScrollListItem( TRUE, NULL, LLUUID::null );
-		row->addColumn("Searching...", LLFontGL::sSansSerif);
-		mListNames->addItem(row);
+		mListNames->addSimpleElement("Searching...");
 	}
 	
 	childSetEnabled("Select", FALSE);
@@ -305,23 +300,20 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void*
 			msg->getStringFast(_PREHASH_Data,_PREHASH_FirstName, DB_FIRST_NAME_BUF_SIZE, first_name, i);
 			msg->getStringFast(_PREHASH_Data,_PREHASH_LastName,	DB_LAST_NAME_BUF_SIZE, last_name, i);
 		
-			LLScrollListItem* row = new LLScrollListItem( TRUE, NULL, avatar_id );
-
+			LLString avatar_name;
 			if (avatar_id.isNull())
 			{
 				self->childSetTextArg("NotFound", "[TEXT]", self->childGetText("Edit"));
-				LLString msg = self->childGetValue("NotFound").asString();
-				row->addColumn(msg, LLFontGL::sSansSerif);
+				avatar_name = self->childGetValue("NotFound").asString();
 				self->mListNames->setEnabled(FALSE);
 			}
 			else
 			{
-				LLString buffer = LLString(first_name) + " " + last_name;
-				row->addColumn(buffer, LLFontGL::sSansSerif);
+				avatar_name = LLString(first_name) + " " + last_name;
 				self->mListNames->setEnabled(TRUE);
 				found_one = TRUE;
 			}
-			self->mListNames->addItem(row);	
+			self->mListNames->addSimpleElement(avatar_name);
 		}
 	
 		if (found_one)
diff --git a/indra/newview/llfloaterbump.cpp b/indra/newview/llfloaterbump.cpp
index 969124a81c..68f002f9d9 100644
--- a/indra/newview/llfloaterbump.cpp
+++ b/indra/newview/llfloaterbump.cpp
@@ -63,9 +63,10 @@ void LLFloaterBump::show(void *contents)
 	if (gMeanCollisionList.isEmpty())
 	{
 		LLString none_detected = sInstance->childGetText("none_detected");
-		LLScrollListItem *item = new LLScrollListItem();
-		item->addColumn(none_detected, LLFontGL::sSansSerifBold);
-		list->addItem(item);		
+		LLSD row;
+		row["columns"][0]["value"] = none_detected;
+		row["columns"][0]["font-style"] = "BOLD";
+		list->addElement(row);
 	}
 	else
 	{
@@ -132,7 +133,9 @@ void LLFloaterBump::add(LLScrollListCtrl* list, LLMeanCollisionData* mcd)
 	text.setArg("[FIRST]", mcd->mFirstName);
 	text.setArg("[LAST]", mcd->mLastName);
 
-	LLScrollListItem *item = new LLScrollListItem(TRUE, NULL, mcd->mPerp);
-	item->addColumn(text, LLFontGL::sSansSerifBold);
-	list->addItem(item);
+	LLSD row;
+	row["id"] = mcd->mPerp;
+	row["columns"][0]["value"] = text;
+	row["columns"][0]["font-style"] = "BOLD";
+	list->addElement(row);
 }
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index 03a94aed63..1ee8cd62ab 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -1261,14 +1261,12 @@ void LLFloaterBuyLandUI::refreshUI()
 			
 		}
 
-		//remove_contribution not in XML - ?!
 		childSetValue("remove_contribution", LLSD(groupContributionEnough));
 		childSetEnabled("remove_contribution", groupContributionEnough);
 		bool showRemoveContribution = mParcelIsGroupLand
 							&& (mParcelGroupContribution > 0);
-		childSetText("remove_contribution",
-			llformat("Remove %d square meters of contribution from group",
-				minContribution));
+		childSetLabelArg("remove_contribution", "[AMOUNT]",
+							llformat("%d", minContribution));
 		childSetVisible("remove_contribution", showRemoveContribution);
 
 		childShow("step_3");
diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp
index 144833a3f5..8af0dd410f 100644
--- a/indra/newview/llfloatercolorpicker.cpp
+++ b/indra/newview/llfloatercolorpicker.cpp
@@ -554,11 +554,10 @@ void LLFloaterColorPicker::onColorSelect( const LLTextureEntry& te, void *data )
 	}
 }
 
-void LLFloaterColorPicker::onMouseCaptureLost(LLMouseHandler *old_captor)
+void LLFloaterColorPicker::onMouseCaptureLost()
 {
-	LLFloaterColorPicker* self = (LLFloaterColorPicker*)old_captor;
-	self->setMouseDownInHueRegion(FALSE);
-	self->setMouseDownInLumRegion(FALSE);
+	setMouseDownInHueRegion(FALSE);
+	setMouseDownInLumRegion(FALSE);
 }
 
 //////////////////////////////////////////////////////////////////////////////
@@ -942,7 +941,7 @@ handleMouseDown ( S32 x, S32 y, MASK mask )
 
 		if ( rgbAreaRect.pointInRect ( x, y ) )
 		{
-			gViewerWindow->setMouseCapture(this, onMouseCaptureLost);
+			gViewerWindow->setMouseCapture(this);
 			// mouse button down
 			setMouseDownInHueRegion ( TRUE );
 
@@ -961,7 +960,7 @@ handleMouseDown ( S32 x, S32 y, MASK mask )
 
 		if ( lumAreaRect.pointInRect ( x, y ) )
 		{
-			gViewerWindow->setMouseCapture(this, onMouseCaptureLost);
+			gViewerWindow->setMouseCapture(this);
 			// mouse button down
 			setMouseDownInLumRegion ( TRUE );
 
@@ -1174,9 +1173,9 @@ handleMouseUp ( S32 x, S32 y, MASK mask )
 	// mouse button not down in color swatch anymore
 	mMouseDownInSwatch = false;
 
-	if (gViewerWindow->hasMouseCapture(this))
+	if (hasMouseCapture())
 	{
-		gViewerWindow->setMouseCapture(NULL, NULL);
+		gViewerWindow->setMouseCapture(NULL);
 	}
 
 	// dispatch to base class for the rest of things
diff --git a/indra/newview/llfloatercolorpicker.h b/indra/newview/llfloatercolorpicker.h
index aa406c0dec..7660aa8c2d 100644
--- a/indra/newview/llfloatercolorpicker.h
+++ b/indra/newview/llfloatercolorpicker.h
@@ -36,6 +36,7 @@ class LLFloaterColorPicker
 		virtual BOOL handleMouseDown ( S32 x, S32 y, MASK mask );
 		virtual BOOL handleMouseUp ( S32 x, S32 y, MASK mask );
 		virtual BOOL handleHover ( S32 x, S32 y, MASK mask );
+		virtual void onMouseCaptureLost();
 		virtual void onClose(bool app_quitting);
 
 		// implicit methods
@@ -94,7 +95,6 @@ class LLFloaterColorPicker
 		F32	 hueToRgb ( F32 val1In, F32 val2In, F32 valHUeIn );
 
 		void setActive(BOOL active);
-		static void	onMouseCaptureLost(LLMouseHandler* old_captor);
 
 	protected:
 		// callbacks
diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp
index 3b7a868472..6065fc92c9 100644
--- a/indra/newview/llfloatergodtools.cpp
+++ b/indra/newview/llfloatergodtools.cpp
@@ -1325,11 +1325,10 @@ void LLPanelRequestTools::refresh()
 	list->operateOnAll(LLCtrlListInterface::OP_DELETE);
 	list->addSimpleElement(SELECTION);
 	list->addSimpleElement(AGENT_REGION);
-	LLViewerRegion* regionp;
-	for(regionp = gWorldp->mActiveRegionList.getFirstData();
-		regionp != NULL;
-		regionp = gWorldp->mActiveRegionList.getNextData())
+	for (LLWorld::region_list_t::iterator iter = gWorldp->mActiveRegionList.begin();
+		 iter != gWorldp->mActiveRegionList.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		LLString name = regionp->getName();
 		if (!name.empty())
 		{
@@ -1387,11 +1386,10 @@ void LLPanelRequestTools::onClickRequest(void* data)
 	else
 	{
 		// find region by name
-		LLViewerRegion* regionp;
-		for(regionp = gWorldp->mActiveRegionList.getFirstData();
-			regionp != NULL;
-			regionp = gWorldp->mActiveRegionList.getNextData())
+		for (LLWorld::region_list_t::iterator iter = gWorldp->mActiveRegionList.begin();
+			 iter != gWorldp->mActiveRegionList.end(); ++iter)
 		{
+			LLViewerRegion* regionp = *iter;
 			if(dest == regionp->getName())
 			{
 				// found it
diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp
index 2e77bbcfbd..f10abc4466 100644
--- a/indra/newview/llfloaterimagepreview.cpp
+++ b/indra/newview/llfloaterimagepreview.cpp
@@ -356,7 +356,7 @@ BOOL LLFloaterImagePreview::handleMouseDown(S32 x, S32 y, MASK mask)
 	if (mPreviewRect.pointInRect(x, y))
 	{
 		bringToFront( x, y );
-		gViewerWindow->setMouseCapture(this, onMouseCaptureLost);
+		gViewerWindow->setMouseCapture(this);
 		gViewerWindow->hideCursor();
 		mLastMouseX = x;
 		mLastMouseY = y;
@@ -371,7 +371,7 @@ BOOL LLFloaterImagePreview::handleMouseDown(S32 x, S32 y, MASK mask)
 //-----------------------------------------------------------------------------
 BOOL LLFloaterImagePreview::handleMouseUp(S32 x, S32 y, MASK mask)
 {
-	gViewerWindow->setMouseCapture(FALSE, NULL);
+	gViewerWindow->setMouseCapture(FALSE);
 	gViewerWindow->showCursor();
 	return LLFloater::handleMouseUp(x, y, mask);
 }
@@ -383,7 +383,7 @@ BOOL LLFloaterImagePreview::handleHover(S32 x, S32 y, MASK mask)
 {
 	MASK local_mask = mask & ~MASK_ALT;
 
-	if (mAvatarPreview && gViewerWindow->hasMouseCapture(this))
+	if (mAvatarPreview && hasMouseCapture())
 	{
 		if (local_mask == MASK_PAN)
 		{
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 77ebe88a09..45570f6aa2 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -392,8 +392,8 @@ BOOL LLPanelLandGeneral::postBuild()
 	mBtnDeedToGroup->setClickedCallback(onClickDeed, this);
 
 	
-	mCheckContributeWithDeed = LLUICtrlFactory::getCheckBoxByName(this, "check contib");
-	childSetCommitCallback("check contib", onCommitAny, this);
+	mCheckContributeWithDeed = LLUICtrlFactory::getCheckBoxByName(this, "check contrib");
+	childSetCommitCallback("check contrib", onCommitAny, this);
 
 	
 	
@@ -1865,7 +1865,7 @@ void LLPanelLandObjects::onClickReturnOtherObjects(void* userdata)
 }
 
 // static
-void LLPanelLandObjects::onLostFocus(LLLineEditor *caller, void* user_data)
+void LLPanelLandObjects::onLostFocus(LLUICtrl *caller, void* user_data)
 {
 	LLPanelLandObjects	*lop = (LLPanelLandObjects *)user_data;
 	LLParcel* parcel = lop->mParcel->getParcel();
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index b1aad89d7d..cfd009c335 100644
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -234,7 +234,7 @@ public:
 	static void onDoubleClickOwner(void*);	
 
 	static void onCommitList(LLUICtrl* ctrl, void* data);
-	static void onLostFocus(LLLineEditor* caller, void* user_data);
+	static void onLostFocus(LLUICtrl* caller, void* user_data);
 	
 	static void processParcelObjectOwnersReply(LLMessageSystem *msg, void **);
 	
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index ac77b3c3f0..92e005c0bb 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -504,7 +504,7 @@ void LLSnapshotLivePreview::onIdle( void* snapshot_preview )
 								 previewp->mSnapshotDelayTimer.hasExpired());
 
 	// don't take snapshots while ALT-zoom active
-	if (gFocusMgr.getMouseCapture() == gToolCamera)
+	if (gToolCamera->hasMouseCapture())
 	{
 		previewp->mSnapshotActive = FALSE;
 	}
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 63b1734642..0529507c35 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -928,7 +928,7 @@ void LLFloaterTools::setObjectType( void* data )
 	LLPCode pcode = *(LLPCode*) data;
 	LLToolPlacer::setObjectType( pcode );
 	gSavedSettings.setBOOL("CreateToolCopySelection", FALSE);
-	gViewerWindow->setMouseCapture(NULL, NULL);
+	gViewerWindow->setMouseCapture(NULL);
 }
 
 // static
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index e9fa4cc1dd..31668b6d80 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -71,7 +71,7 @@ void copy_selected_item(void* user_data);
 void open_selected_items(void* user_data);
 void properties_selected_items(void* user_data);
 void paste_items(void* user_data);
-void top_view_lost( LLView* handler );	
+void renamer_focus_lost( LLUICtrl* handler, void* user_data );
 
 ///----------------------------------------------------------------------------
 /// Class LLFolderViewItem
@@ -588,7 +588,7 @@ BOOL LLFolderViewItem::handleMouseDown( S32 x, S32 y, MASK mask )
 {
 	// No handler needed for focus lost since this class has no
 	// state that depends on it.
-	gViewerWindow->setMouseCapture( this, NULL );
+	gViewerWindow->setMouseCapture( this );
 
 	if (!mIsSelected)
 	{
@@ -623,7 +623,7 @@ BOOL LLFolderViewItem::handleMouseDown( S32 x, S32 y, MASK mask )
 
 BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask )
 {
-	if( gViewerWindow->hasMouseCapture( this ) && isMovable() )
+	if( hasMouseCapture() && isMovable() )
 	{
 		S32 screen_x;
 		S32 screen_y;
@@ -723,10 +723,10 @@ BOOL LLFolderViewItem::handleMouseUp( S32 x, S32 y, MASK mask )
 	
 	mSelectPending = FALSE;
 
-	if( gViewerWindow->hasMouseCapture( this ) )
+	if( hasMouseCapture() )
 	{
 		getRoot()->setShowSelectionContext(FALSE);
-		gViewerWindow->setMouseCapture( NULL, NULL );
+		gViewerWindow->setMouseCapture( NULL );
 	}
 	return TRUE;
 }
@@ -1226,7 +1226,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
 	}
 
 	// when applying a filter, matching folders get their contents downloaded first
-	if (getRoot()->isFilterActive() && getFiltered(filter.getMinRequiredGeneration()) && !gInventory.isCategoryComplete(mListener->getUUID()))
+	if (filter.isNotDefault() && getFiltered(filter.getMinRequiredGeneration()) && !gInventory.isCategoryComplete(mListener->getUUID()))
 	{
 		gInventory.startBackgroundFetch(mListener->getUUID());
 	}
@@ -2596,9 +2596,9 @@ LLFolderView::~LLFolderView( void )
 
 	LLView::deleteViewByHandle(mPopupMenuHandle);
 
-	if(gViewerWindow->hasTopView(mRenamer))
+	if(gViewerWindow->hasTopCtrl(mRenamer))
 	{
-		gViewerWindow->setTopView(NULL, NULL);
+		gViewerWindow->setTopCtrl(NULL);
 	}
 
 	mAutoOpenItems.removeAllNodes();
@@ -3175,7 +3175,7 @@ void LLFolderView::finishRenamingItem( void )
 	mRenamer->setFocus( FALSE );
 	mRenamer->setVisible( FALSE );
 	mRenamer->setCommitOnFocusLost( TRUE );
-	gViewerWindow->setTopView( NULL, NULL );
+	gViewerWindow->setTopCtrl( NULL );
 
 	if( mRenameItem )
 	{
@@ -3193,7 +3193,7 @@ void LLFolderView::revertRenamingItem( void )
 	mRenamer->setFocus( FALSE );
 	mRenamer->setVisible( FALSE );
 	mRenamer->setCommitOnFocusLost( TRUE );
-	gViewerWindow->setTopView( NULL, NULL );
+	gViewerWindow->setTopCtrl( NULL );
 
 	if( mRenameItem )
 	{
@@ -3591,7 +3591,8 @@ void LLFolderView::startRenamingSelectedItem( void )
 		mRenamer->setVisible( TRUE );
 		// set focus will fail unless item is visible
 		mRenamer->setFocus( TRUE );
-		gViewerWindow->setTopView( mRenamer, top_view_lost );
+		mRenamer->setFocusLostCallback(renamer_focus_lost);
+		gViewerWindow->setTopCtrl( mRenamer );
 	}
 }
 
@@ -3920,6 +3921,7 @@ void LLFolderView::onFocusLost( )
 	{
 		gEditMenuHandler = NULL;
 	}
+	LLUICtrl::onFocusLost();
 }
 
 BOOL LLFolderView::search(LLFolderViewItem* first_item, const LLString &search_string, BOOL backward)
@@ -4077,9 +4079,9 @@ BOOL LLFolderView::handleScrollWheel(S32 x, S32 y, S32 clicks)
 
 void LLFolderView::deleteAllChildren()
 {
-	if(gViewerWindow->hasTopView(mRenamer))
+	if(gViewerWindow->hasTopCtrl(mRenamer))
 	{
-		gViewerWindow->setTopView(NULL, NULL);
+		gViewerWindow->setTopCtrl(NULL);
 	}
 	LLView::deleteViewByHandle(mPopupMenuHandle);
 	mPopupMenuHandle = LLViewHandle::sDeadHandle;
@@ -4219,7 +4221,7 @@ void LLFolderView::idle(void* user_data)
 
 	self->mFilter.clearModified();
 	BOOL filter_modified_and_active = self->mCompletedFilterGeneration < self->mFilter.getCurrentGeneration() && 
-										self->mFilter.isActive();
+										self->mFilter.isNotDefault();
 	self->mNeedsAutoSelect = filter_modified_and_active &&
 							!(gFocusMgr.childHasKeyboardFocus(self) || gFocusMgr.getMouseCapture());
 	
@@ -4288,6 +4290,12 @@ void LLFolderView::dumpSelectionInformation()
 
 bool sort_item_name(LLFolderViewItem* a, LLFolderViewItem* b)
 {
+	// Sort 'system' / unmovable folders to the top.
+	if (a->isMovable() != b->isMovable())
+	{
+		return b->isMovable();
+	}
+
 	S32 compare = LLString::compareDict(a->getLabel(), b->getLabel());
 	if (0 == compare)
 	{
@@ -4303,6 +4311,12 @@ bool sort_item_name(LLFolderViewItem* a, LLFolderViewItem* b)
 // of inventory items.
 bool sort_item_date(LLFolderViewItem* a, LLFolderViewItem* b)
 {
+	// Sort 'system' / unmovable folders to the top.
+	if (a->isMovable() != b->isMovable())
+	{
+		return b->isMovable();
+	}
+
 	U32 first_create = a->getCreationDate();
 	U32 second_create = b->getCreationDate();
 	if (first_create == second_create)
@@ -4315,9 +4329,12 @@ bool sort_item_date(LLFolderViewItem* a, LLFolderViewItem* b)
 	}
 }
 
-void top_view_lost( LLView* view )
+void renamer_focus_lost( LLUICtrl* ctrl, void* userdata)
 {
-	if( view ) view->setVisible( FALSE );
+	if( ctrl ) 
+	{
+		ctrl->setVisible( FALSE );
+	}
 }
 
 void delete_selected_item(void* user_data)
@@ -4453,7 +4470,7 @@ std::string::size_type LLInventoryFilter::getStringMatchOffset() const
 }
 
 // has user modified default filter params?
-BOOL LLInventoryFilter::isActive()
+BOOL LLInventoryFilter::isNotDefault()
 {
 	return mFilterOps.mFilterTypes != mDefaultFilterOps.mFilterTypes 
 		|| mFilterSubString.size() 
@@ -4463,6 +4480,16 @@ BOOL LLInventoryFilter::isActive()
 		|| mFilterOps.mHoursAgo != mDefaultFilterOps.mHoursAgo;
 }
 
+BOOL LLInventoryFilter::isActive()
+{
+	return mFilterOps.mFilterTypes != 0xffffffff 
+		|| mFilterSubString.size() 
+		|| mFilterOps.mPermissions != PERM_NONE 
+		|| mFilterOps.mMinDate != 0 
+		|| mFilterOps.mMaxDate != U32_MAX
+		|| mFilterOps.mHoursAgo != 0;
+}
+
 BOOL LLInventoryFilter::isModified()
 {
 	return mModified;
@@ -4672,7 +4699,7 @@ void LLInventoryFilter::setModified(EFilterBehavior behavior)
 		mFilterBehavior = FILTER_RESTART;
 	}
 
-	if (isActive())
+	if (isNotDefault())
 	{
 		// if not keeping current filter results, update last valid as well
 		switch(mFilterBehavior)
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index 84dcddedbb..76784f1ac9 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -191,6 +191,7 @@ public:
 	BOOL check(LLFolderViewItem* item);
 	std::string::size_type getStringMatchOffset() const;
 	BOOL isActive();
+	BOOL isNotDefault();
 	BOOL isModified();
 	BOOL isModifiedAndClear();
 	BOOL isSinceLogoff();
@@ -678,7 +679,7 @@ public:
 	PermissionMask getFilterPermissions() const { return mFilter.getFilterPermissions(); }
 	LLInventoryFilter::EFolderShow getShowFolderState() { return mFilter.getShowFolderState(); }
 	U32 getSortOrder() const;
-	BOOL isFilterActive() { return mFilter.isActive(); }
+	BOOL isFilterModified() { return mFilter.isNotDefault(); }
 	BOOL getAllowMultiSelect() { return mAllowMultiSelect; }
 
 	// Close all folders in the view
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index 83c08ec602..9ab9a3f6bb 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -570,7 +570,7 @@ void LLFloaterIMPanel::onInputEditorFocusReceived( LLUICtrl* caller, void* userd
 }
 
 // static
-void LLFloaterIMPanel::onInputEditorFocusLost(LLLineEditor* caller, void* userdata)
+void LLFloaterIMPanel::onInputEditorFocusLost(LLUICtrl* caller, void* userdata)
 {
 	LLFloaterIMPanel* self = (LLFloaterIMPanel*) userdata;
 	self->setTyping(FALSE);
diff --git a/indra/newview/llimpanel.h b/indra/newview/llimpanel.h
index d54ac794b7..21a0cbcd41 100644
--- a/indra/newview/llimpanel.h
+++ b/indra/newview/llimpanel.h
@@ -59,7 +59,7 @@ public:
 						   LLString& tooltip_msg);
 
 	static void		onInputEditorFocusReceived( LLUICtrl* caller, void* userdata );
-	static void		onInputEditorFocusLost(LLLineEditor* caller, void* userdata);
+	static void		onInputEditorFocusLost(LLUICtrl* caller, void* userdata);
 	static void		onInputEditorKeystroke(LLLineEditor* caller, void* userdata);
 	static void		onTabClick( void* userdata );
 
diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp
index a9b5e6e124..ce6c85d3fd 100644
--- a/indra/newview/lljoystickbutton.cpp
+++ b/indra/newview/lljoystickbutton.cpp
@@ -115,7 +115,7 @@ BOOL LLJoystick::handleMouseUp(S32 x, S32 y, MASK mask)
 {
 	// llinfos << "joystick mouse up " << x << ", " << y << llendl;
 
-	if( gViewerWindow->hasMouseCapture( this ) )
+	if( hasMouseCapture() )
 	{
 		mLastMouse.set(x, y);
 		mHeldDown = FALSE;
@@ -128,7 +128,7 @@ BOOL LLJoystick::handleMouseUp(S32 x, S32 y, MASK mask)
 
 BOOL LLJoystick::handleHover(S32 x, S32 y, MASK mask)
 {
-	if( gViewerWindow->hasMouseCapture( this ) )
+	if( hasMouseCapture() )
 	{
 		mLastMouse.set(x, y);
 	}
@@ -153,7 +153,9 @@ void LLJoystick::onHeldDown(void *userdata)
 {
 	LLJoystick *self = (LLJoystick *)userdata;
 
-	llassert( gViewerWindow->hasMouseCapture( self ) );
+	// somebody removed this function without checking the
+	// build. Removed 2007-03-26.
+	//llassert( gViewerWindow->hasMouseCapture( self ) );
 
 	self->mHeldDown = TRUE;
 	self->onHeldDown();
diff --git a/indra/newview/llnameeditor.cpp b/indra/newview/llnameeditor.cpp
index ade4cf3473..923cd99d21 100644
--- a/indra/newview/llnameeditor.cpp
+++ b/indra/newview/llnameeditor.cpp
@@ -30,7 +30,7 @@ LLNameEditor::LLNameEditor(const std::string& name, const LLRect& rect,
 		S32 max_text_length,
 		void (*commit_callback)(LLUICtrl* caller, void* user_data),
 		void (*keystroke_callback)(LLLineEditor* caller, void* user_data),
-		void (*focus_lost_callback)(LLLineEditor* caller, void* user_data),
+		void (*focus_lost_callback)(LLUICtrl* caller, void* user_data),
 		void* userdata,
 		LLLinePrevalidateFunc prevalidate_func,
 		LLViewBorder::EBevel border_bevel,
diff --git a/indra/newview/llnameeditor.h b/indra/newview/llnameeditor.h
index b5e811fba4..b6ea2e7728 100644
--- a/indra/newview/llnameeditor.h
+++ b/indra/newview/llnameeditor.h
@@ -30,7 +30,7 @@ public:
 		S32 max_text_length = 254,
 		void (*commit_callback)(LLUICtrl* caller, void* user_data) = NULL,
 		void (*keystroke_callback)(LLLineEditor* caller, void* user_data) = NULL,
-		void (*focus_lost_callback)(LLLineEditor* caller, void* user_data) = NULL,
+		void (*focus_lost_callback)(LLUICtrl* caller, void* user_data) = NULL,
 		void* userdata = NULL,
 		LLLinePrevalidateFunc prevalidate_func = NULL,
 		LLViewBorder::EBevel border_bevel = LLViewBorder::BEVEL_IN,
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index ddf88c94df..eabb9e0b23 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -158,6 +158,13 @@ BOOL LLNameListCtrl::addNameItem(LLScrollListItem* item, EAddPosition pos)
 
 	addItem(item, pos);
 
+	// this column is resizable
+	LLScrollListColumn* columnp = getColumn(mNameColumnIndex);
+	if (columnp && columnp->mHeader)
+	{
+		columnp->mHeader->setHasResizableElement(TRUE);
+	}
+
 	return result;
 }
 
@@ -178,6 +185,15 @@ LLScrollListItem* LLNameListCtrl::addElement(const LLSD& value, EAddPosition pos
 	LLScrollListCell* cell = (LLScrollListCell*)item->getColumn(mNameColumnIndex);
 	((LLScrollListText*)cell)->setText( fullname );
 
+	updateMaxContentWidth(item);
+
+	// this column is resizable
+	LLScrollListColumn* columnp = getColumn(mNameColumnIndex);
+	if (columnp && columnp->mHeader)
+	{
+		columnp->mHeader->setHasResizableElement(TRUE);
+	}
+
 	return item;
 }
 
@@ -222,6 +238,7 @@ void LLNameListCtrl::refresh(const LLUUID& id, const char* first,
 			cell = (LLScrollListCell*)item->getColumn(mNameColumnIndex);
 
 			((LLScrollListText*)cell)->setText( fullname );
+			updateMaxContentWidth(item);
 		}
 	}
 }
@@ -299,13 +316,6 @@ LLView* LLNameListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto
 		node->getAttributeS32("heading_height", heading_height);
 		name_list->setHeadingHeight(heading_height);
 	}
-	if (node->hasAttribute("heading_font"))
-	{
-		LLString heading_font("");
-		node->getAttributeString("heading_font", heading_font);
-		LLFontGL* gl_font = LLFontGL::fontFromName(heading_font.c_str());
-		name_list->setHeadingFont(gl_font);
-	}
 	name_list->setCollapseEmptyColumns(collapse_empty_columns);
 
 	BOOL allow_calling_card_drop = FALSE;
@@ -344,8 +354,12 @@ LLView* LLNameListCtrl::fromXML(LLXMLNodePtr node, LLView *parent, LLUICtrlFacto
 				columns[index]["width"] = columnwidth;
 			}
 
+			LLFontGL::HAlign h_align = LLFontGL::LEFT;
+			h_align = LLView::selectFontHAlign(child);
+
 			columns[index]["name"] = columnname;
 			columns[index]["label"] = labelname;
+			columns[index]["halign"] = (S32)h_align;
 			index++;
 		}
 	}
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index b03996d460..1050070f81 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -255,12 +255,10 @@ void LLNetMap::draw()
 		// figure out where agent is
 		S32 region_width = llround(gWorldPointer->getRegionWidthInMeters());
 
-		LLViewerRegion *regionp;
-
-		for (regionp = gWorldPointer->mActiveRegionList.getFirstData();
-			regionp;
-			regionp = gWorldPointer->mActiveRegionList.getNextData())
+		for (LLWorld::region_list_t::iterator iter = gWorldp->mActiveRegionList.begin();
+			 iter != gWorldp->mActiveRegionList.end(); ++iter)
 		{
+			LLViewerRegion* regionp = *iter;
 			// Find x and y position relative to camera's center.
 			LLVector3 origin_agent = regionp->getOriginAgent();
 			LLVector3 rel_region_pos = origin_agent - gAgent.getCameraPositionAgent();
@@ -374,10 +372,10 @@ void LLNetMap::draw()
 		LLVector3 pos_map;
 
 		// Draw avatars
-		for (regionp = gWorldPointer->mActiveRegionList.getFirstData();
-			regionp;
-			regionp = gWorldPointer->mActiveRegionList.getNextData())
+		for (LLWorld::region_list_t::iterator iter = gWorldp->mActiveRegionList.begin();
+			 iter != gWorldp->mActiveRegionList.end(); ++iter)
 		{
+			LLViewerRegion* regionp = *iter;
 			const LLVector3d& origin_global = regionp->getOriginGlobal();
 
 			S32 count = regionp->mMapAvatars.count();
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index ce9f6b18b2..05bd59593d 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -59,7 +59,7 @@
 #include "llvieweruictrlfactory.h"
 
 // Statics
-LLLinkedList<LLPanelAvatar> LLPanelAvatar::sAllPanels;
+std::list<LLPanelAvatar*> LLPanelAvatar::sAllPanels;
 BOOL LLPanelAvatar::sAllowFirstLife = FALSE;
 
 //-----------------------------------------------------------------------------
@@ -1220,7 +1220,7 @@ LLPanelAvatar::LLPanelAvatar(
 	mDisableRate(FALSE)
 {
 
-	sAllPanels.addData(this);
+	sAllPanels.push_back(this);
 
 	LLCallbackMap::map_t factory_map;
 
@@ -1272,7 +1272,7 @@ BOOL LLPanelAvatar::postBuild(void)
 
 LLPanelAvatar::~LLPanelAvatar()
 {
-	sAllPanels.removeData(this);
+	sAllPanels.remove(this);
 }
 
 
@@ -1503,7 +1503,6 @@ void LLPanelAvatar::resetGroupList()
 	if (mPanelSecondLife && group_list)
 	{
 		group_list->deleteAllItems();
-		LLScrollListItem* item;
 
 		S32 count = gAgent.mGroups.count();
 		LLUUID id;
@@ -1525,9 +1524,12 @@ void LLPanelAvatar::resetGroupList()
 			*/
 
 			group_string += group_data.mName;
-			item = new LLScrollListItem(TRUE, NULL, id);
-			item->addColumn(group_string, LLFontGL::sSansSerifSmall, 0, LLFontGL::NORMAL);
-			group_list->addItem(item);
+
+			LLSD row;
+			row["columns"][0]["value"] = group_string;
+			row["columns"][0]["font"] = "SANSSERIF_SMALL";
+			row["columns"][0]["width"] = 0;
+			group_list->addElement(row);
 		}
 		group_list->sortByColumn(0, TRUE);
 	}
@@ -1728,8 +1730,6 @@ void LLPanelAvatar::sendAvatarNotesUpdate()
 // static
 void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**)
 {
-	LLPanelAvatar* self = NULL;
-
 	LLUUID	agent_id;	// your id
 	LLUUID	avatar_id;	// target of this panel
 	LLUUID	image_id;
@@ -1753,8 +1753,9 @@ void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**)
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AvatarID, avatar_id );
 
-	for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData())
+	for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
 	{
+		LLPanelAvatar* self = *iter;
 		if (self->mAvatarID != avatar_id)
 		{
 			continue;
@@ -1876,8 +1877,6 @@ void LLPanelAvatar::processAvatarPropertiesReply(LLMessageSystem *msg, void**)
 // static
 void LLPanelAvatar::processAvatarInterestsReply(LLMessageSystem *msg, void**)
 {
-	LLPanelAvatar* self = NULL;
-
 	LLUUID	agent_id;	// your id
 	LLUUID	avatar_id;	// target of this panel
 
@@ -1892,8 +1891,9 @@ void LLPanelAvatar::processAvatarInterestsReply(LLMessageSystem *msg, void**)
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AvatarID, avatar_id );
 
-	for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData())
+	for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
 	{
+		LLPanelAvatar* self = *iter;
 		if (self->mAvatarID != avatar_id)
 		{
 			continue;
@@ -1921,15 +1921,15 @@ void LLPanelAvatar::processAvatarGroupsReply(LLMessageSystem *msg, void**)
 	LLUUID	group_id;
 	char	group_name[DB_GROUP_NAME_BUF_SIZE];		/*Flawfinder: ignore*/
 	LLUUID	group_insignia_id;
-	const LLFontGL* FONT = LLFontGL::sSansSerifSmall;
 
 	llinfos << "groups packet size " << msg->getReceiveSize() << llendl;
 
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AvatarID, avatar_id );
 
-	for (LLPanelAvatar* self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData())
+	for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
 	{
+		LLPanelAvatar* self = *iter;
 		if (self->mAvatarID != avatar_id)
 		{
 			continue;
@@ -1977,9 +1977,15 @@ void LLPanelAvatar::processAvatarGroupsReply(LLMessageSystem *msg, void**)
 						group_list->deleteSingleItem(index);
 					}
 				}
-				LLScrollListItem *group_item = new LLScrollListItem(TRUE, NULL, group_id);
-				group_item->addColumn(group_string, FONT);
-				if(group_list) group_list->addItem(group_item);
+
+				LLSD row;
+				row["id"] = group_id;
+				row["columns"][0]["value"] = group_string;
+				row["columns"][0]["font"] = "SANSSERIF_SMALL";
+				if (group_list)
+				{
+					group_list->addElement(row);
+				}
 			}
 		}
 		if(group_list) group_list->sortByColumn(0, TRUE);
@@ -2107,10 +2113,9 @@ void LLPanelAvatar::processAvatarStatisticsReply(LLMessageSystem *msg, void**)
 	msg->getUUIDFast(_PREHASH_AvatarData, _PREHASH_AvatarID, avatar_id);
 
 	// look up all panels which have this avatar
-	LLPanelAvatar *self = NULL;
-
-	for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData())
+	for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
 	{
+		LLPanelAvatar* self = *iter;
 		if (self->mAvatarID != avatar_id)
 		{
 			continue;
@@ -2126,8 +2131,6 @@ void LLPanelAvatar::processAvatarStatisticsReply(LLMessageSystem *msg, void**)
 			ratings_list->deleteAllItems();
 		}
 		// build the item list
-		LLFontGL *font = LLFontGL::sSansSerifSmall;
-
 		S32 items = msg->getNumberOfBlocksFast(_PREHASH_StatisticsData);
 		for (S32 i = 0; i < items; i++)
 		{
@@ -2141,18 +2144,22 @@ void LLPanelAvatar::processAvatarStatisticsReply(LLMessageSystem *msg, void**)
 			msg->getS32(	"StatisticsData", "Positive", positive, i);
 			msg->getS32(	"StatisticsData", "Negative", negative, i);
 
-			LLScrollListItem *item = NULL;
-
 			const S32	TEXT_WIDTH = 75;
 
-			item = new LLScrollListItem();
-			item->addColumn( name, font, TEXT_WIDTH );
-
-			snprintf( value_string, sizeof(value_string),  "+%d", positive);			/* Flawfinder: ignore */
-			item->addColumn( value_string, font, 50 );
-
-			item->addColumn("", font);	// extra column to force striped appearance
-			if(ratings_list) ratings_list->addItem( item );
+			LLSD row;
+			row["columns"][0]["value"] = name;
+			row["columns"][0]["font"] = "SANSSERIF_SMALL";
+			row["columns"][0]["width"] = TEXT_WIDTH;
+			row["columns"][1]["value"] = value_string;
+			row["columns"][1]["font"] = "SANSSERIF_SMALL";
+			row["columns"][1]["width"] = 50;
+			row["columns"][2]["value"] = "";
+			row["columns"][2]["font"] = "SANSSERIF_SMALL";
+
+			if(ratings_list) 
+			{
+				ratings_list->addElement( row );
+			}
 		}
 	}
 }
@@ -2168,10 +2175,9 @@ void LLPanelAvatar::processAvatarNotesReply(LLMessageSystem *msg, void**)
 	msg->getUUID("Data", "TargetID", target_id);
 
 	// look up all panels which have this avatar
-	LLPanelAvatar *self = NULL;
-
-	for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData())
+	for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
 	{
+		LLPanelAvatar* self = *iter;
 		if (self->mAvatarID != target_id)
 		{
 			continue;
@@ -2187,7 +2193,6 @@ void LLPanelAvatar::processAvatarNotesReply(LLMessageSystem *msg, void**)
 
 void LLPanelAvatar::processAvatarClassifiedReply(LLMessageSystem *msg, void** userdata)
 {
-	LLPanelAvatar *self = NULL;
 	LLUUID agent_id;
 	LLUUID target_id;
 
@@ -2195,8 +2200,9 @@ void LLPanelAvatar::processAvatarClassifiedReply(LLMessageSystem *msg, void** us
 	msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_TargetID, target_id);
 
 	// look up all panels which have this avatar target
-	for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData())
+	for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
 	{
+		LLPanelAvatar* self = *iter;
 		if (self->mAvatarID != target_id)
 		{
 			continue;
@@ -2208,7 +2214,6 @@ void LLPanelAvatar::processAvatarClassifiedReply(LLMessageSystem *msg, void** us
 
 void LLPanelAvatar::processAvatarPicksReply(LLMessageSystem *msg, void** userdata)
 {
-	LLPanelAvatar *self = NULL;
 	LLUUID agent_id;
 	LLUUID target_id;
 
@@ -2216,8 +2221,9 @@ void LLPanelAvatar::processAvatarPicksReply(LLMessageSystem *msg, void** userdat
 	msg->getUUID("AgentData", "TargetID", target_id);
 
 	// look up all panels which have this avatar target
-	for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData())
+	for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
 	{
+		LLPanelAvatar* self = *iter;
 		if (self->mAvatarID != target_id)
 		{
 			continue;
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index 9b1f6e23e1..be6feebc30 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -339,7 +339,8 @@ protected:
 	BOOL						mAllowEdit;
 	BOOL						mDisableRate;
 
-	static LLLinkedList<LLPanelAvatar> sAllPanels;
+	typedef std::list<LLPanelAvatar*> panel_list_t;
+	static panel_list_t sAllPanels;
 };
 
 // helper funcs
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index f1aed81df1..5c5e0479d4 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -72,7 +72,7 @@ public:
 static LLDispatchClassifiedClickThrough sClassifiedClickThrough;
 
 //static
-LLLinkedList<LLPanelClassified> LLPanelClassified::sAllPanels;
+std::list<LLPanelClassified*> LLPanelClassified::sAllPanels;
 
 LLPanelClassified::LLPanelClassified(BOOL in_finder)
 :	LLPanel("Classified Panel"),
@@ -99,7 +99,7 @@ LLPanelClassified::LLPanelClassified(BOOL in_finder)
     mSetBtn(NULL),
 	mClickThroughText(NULL)
 {
-    sAllPanels.addData(this);
+    sAllPanels.push_back(this);
 
 	std::string classified_def_file;
 	if (mInFinder)
@@ -119,7 +119,7 @@ LLPanelClassified::LLPanelClassified(BOOL in_finder)
 
 LLPanelClassified::~LLPanelClassified()
 {
-    sAllPanels.removeData(this);
+    sAllPanels.remove(this);
 }
 
 
@@ -300,9 +300,9 @@ void LLPanelClassified::setClickThrough(const LLUUID& classified_id,
 										S32 map,
 										S32 profile)
 {
-    LLPanelClassified *self = NULL;
-    for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData())
-    {
+	for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
+	{
+		LLPanelClassified* self = *iter;
 		// For top picks, must match pick id
 		if (self->mClassifiedID != classified_id)
 		{
@@ -483,9 +483,9 @@ void LLPanelClassified::processClassifiedInfoReply(LLMessageSystem *msg, void **
 	msg->getS32("Data", "PriceForListing", price_for_listing);
 
     // Look up the panel to fill in
-    LLPanelClassified *self = NULL;
-    for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData())
-    {
+	for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
+	{
+		LLPanelClassified* self = *iter;
 		// For top picks, must match pick id
 		if (self->mClassifiedID != classified_id)
 		{
diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h
index 6d5be1df09..c959c0f82f 100644
--- a/indra/newview/llpanelclassified.h
+++ b/indra/newview/llpanelclassified.h
@@ -123,7 +123,8 @@ protected:
 	LLTextBox*		mClickThroughText;
 
 	LLRect		mSnapshotSize;
-    static LLLinkedList<LLPanelClassified> sAllPanels;
+	typedef std::list<LLPanelClassified*> panel_list_t;
+	static panel_list_t sAllPanels;
 };
 
 
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index 56c97d0689..9d40357544 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -683,12 +683,14 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
 		}
 		else
 		{
-			LLScrollListItem* row = new LLScrollListItem( TRUE, NULL, LLUUID::null );
 			std::stringstream pending;
 			pending << "Retrieving member list (" << gdatap->mMembers.size() << "\\" << gdatap->mMemberCount  << ")";
-			row->addColumn(pending.str(), LLFontGL::sSansSerif);
+
+			LLSD row;
+			row["columns"][0]["value"] = pending.str();
+
 			mListVisibleMembers->setEnabled(FALSE);
-			mListVisibleMembers->addItem(row);
+			mListVisibleMembers->addElement(row);
 		}
 	}
 }
diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp
index 231551a756..12ac66e9fb 100644
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -99,11 +99,11 @@ void LLPanelGroupInvite::impl::addUsers(const std::vector<std::string>& names,
 		}
 
 		//add the name to the names list
-		const BOOL enabled = TRUE;
-		LLScrollListItem* row = new LLScrollListItem(
-										enabled, NULL, id);
-		row->addColumn(name.c_str(), LLFontGL::sSansSerif);
-		mInvitees->addItem(row);
+		LLSD row;
+		row["id"] = id;
+		row["columns"][0]["value"] = name;
+
+		mInvitees->addElement(row);
 	}
 }
 
diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp
index c60a69eb21..a05f7c54c6 100644
--- a/indra/newview/llpanelpick.cpp
+++ b/indra/newview/llpanelpick.cpp
@@ -36,7 +36,7 @@
 #include "llviewerwindow.h"
 
 //static
-LLLinkedList<LLPanelPick> LLPanelPick::sAllPanels;
+std::list<LLPanelPick*> LLPanelPick::sAllPanels;
 
 LLPanelPick::LLPanelPick(BOOL top_pick)
 :	LLPanel("Top Picks Panel"),
@@ -59,7 +59,7 @@ LLPanelPick::LLPanelPick(BOOL top_pick)
     mEnabledCheck(NULL),
     mSetBtn(NULL)
 {
-    sAllPanels.addData(this);
+    sAllPanels.push_back(this);
 
 	std::string pick_def_file;
 	if (top_pick)
@@ -75,7 +75,7 @@ LLPanelPick::LLPanelPick(BOOL top_pick)
 
 LLPanelPick::~LLPanelPick()
 {
-    sAllPanels.removeData(this);
+    sAllPanels.remove(this);
 }
 
 
@@ -315,9 +315,9 @@ void LLPanelPick::processPickInfoReply(LLMessageSystem *msg, void **)
 	msg->getBOOL("Data", "Enabled", enabled);
 
     // Look up the panel to fill in
-    LLPanelPick *self = NULL;
-    for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData())
-    {
+	for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
+	{
+		LLPanelPick* self = *iter;
 		// For top picks, must match pick id
 		if (self->mPickID != pick_id)
 		{
diff --git a/indra/newview/llpanelpick.h b/indra/newview/llpanelpick.h
index bdc7ef1f3e..a347133be6 100644
--- a/indra/newview/llpanelpick.h
+++ b/indra/newview/llpanelpick.h
@@ -93,7 +93,8 @@ protected:
     LLCheckBoxCtrl* mEnabledCheck;
     LLButton*    mSetBtn;
 
-    static LLLinkedList<LLPanelPick> sAllPanels;
+    typedef std::list<LLPanelPick*> panel_list_t;
+	static panel_list_t sAllPanels;
 };
 
 #endif // LL_LLPANELPICK_H
diff --git a/indra/newview/llpanelplace.cpp b/indra/newview/llpanelplace.cpp
index 905cc61560..d9c29fccdf 100644
--- a/indra/newview/llpanelplace.cpp
+++ b/indra/newview/llpanelplace.cpp
@@ -32,7 +32,7 @@
 #include "llweb.h"
 
 //static
-LLLinkedList<LLPanelPlace> LLPanelPlace::sAllPanels;
+std::list<LLPanelPlace*> LLPanelPlace::sAllPanels;
 
 LLPanelPlace::LLPanelPlace()
 :	LLPanel("Places Panel"),
@@ -40,13 +40,13 @@ LLPanelPlace::LLPanelPlace()
 	mPosGlobal(),
 	mAuctionID(0)
 {
-	sAllPanels.addData(this);
+	sAllPanels.push_back(this);
 }
 
 
 LLPanelPlace::~LLPanelPlace()
 {
-	sAllPanels.removeData(this);
+	sAllPanels.remove(this);
 }
 
 
@@ -139,10 +139,9 @@ void LLPanelPlace::processParcelInfoReply(LLMessageSystem *msg, void **)
 	msg->getUUID("Data", "ParcelID", parcel_id);
 
 	// look up all panels which have this avatar
-	LLPanelPlace *self = NULL;
-
-	for (self = sAllPanels.getFirstData(); self; self = sAllPanels.getNextData())
+	for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
 	{
+		LLPanelPlace* self = *iter;
 		if (self->mParcelID != parcel_id)
 		{
 			continue;
diff --git a/indra/newview/llpanelplace.h b/indra/newview/llpanelplace.h
index b45aef3e87..49dc518cc7 100644
--- a/indra/newview/llpanelplace.h
+++ b/indra/newview/llpanelplace.h
@@ -64,7 +64,8 @@ protected:
 	//LLButton*	mLandmarkBtn;
 	LLButton*	mAuctionBtn;
 
-	static LLLinkedList<LLPanelPlace> sAllPanels;
+	typedef std::list<LLPanelPlace*> panel_list_t;
+	static panel_list_t sAllPanels;
 };
 
 #endif // LL_LLPANELPLACE_H
diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp
index 91df61ca91..52ce263e59 100644
--- a/indra/newview/llpreview.cpp
+++ b/indra/newview/llpreview.cpp
@@ -309,7 +309,7 @@ BOOL LLPreview::handleMouseDown(S32 x, S32 y, MASK mask)
 		// No handler needed for focus lost since this class has no
 		// state that depends on it.
 		bringToFront(x, y);
-		gFocusMgr.setMouseCapture(this, NULL);
+		gFocusMgr.setMouseCapture(this);
 		S32 screen_x;
 		S32 screen_y;
 		localPointToScreen(x, y, &screen_x, &screen_y );
@@ -321,9 +321,9 @@ BOOL LLPreview::handleMouseDown(S32 x, S32 y, MASK mask)
 
 BOOL LLPreview::handleMouseUp(S32 x, S32 y, MASK mask)
 {
-	if(gFocusMgr.getMouseCapture() == this)
+	if(hasMouseCapture())
 	{
-		gFocusMgr.setMouseCapture(NULL, NULL);
+		gFocusMgr.setMouseCapture(NULL);
 		return TRUE;
 	}
 	return LLFloater::handleMouseUp(x, y, mask);
@@ -331,7 +331,7 @@ BOOL LLPreview::handleMouseUp(S32 x, S32 y, MASK mask)
 
 BOOL LLPreview::handleHover(S32 x, S32 y, MASK mask)
 {
-	if(gFocusMgr.getMouseCapture() == this)
+	if(hasMouseCapture())
 	{
 		S32 screen_x;
 		S32 screen_y;
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index 6a6b07425f..39e32c31f5 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -1023,11 +1023,11 @@ void LLPreviewGesture::loadUIFromGesture(LLMultiGesture* gesture)
 		if (!new_step) continue;
 
 		// Create an enabled item with this step
-		LLScrollListItem* item = new LLScrollListItem(TRUE, new_step);
-		item->addColumn(new_step->getLabel(), LLFontGL::sSansSerifSmall);
-
-		// Add item to bottom of list
-		mStepList->addItem(item, ADD_BOTTOM);
+		LLSD row;
+		row["columns"][0]["value"] = new_step->getLabel();
+		row["columns"][0]["font"] = "SANSSERIF_SMALL";
+		LLScrollListItem* item = mStepList->addElement(row);
+		item->setUserdata(new_step);
 	}
 }
 
@@ -1572,12 +1572,11 @@ LLScrollListItem* LLPreviewGesture::addStep(const std::string& library_text)
 	}
 
 	// Create an enabled item with this step
-	LLScrollListItem* step_item = new LLScrollListItem(TRUE, step);
-	std::string label = step->getLabel();
-	step_item->addColumn(label, LLFontGL::sSansSerifSmall);
-
-	// Add item to bottom of list
-	mStepList->addItem(step_item, ADD_BOTTOM);
+	LLSD row;
+	row["columns"][0]["value"] = step->getLabel();
+	row["columns"][0]["font"] = "SANSSERIF_SMALL";
+	LLScrollListItem* step_item = mStepList->addElement(row);
+	step_item->setUserdata(step);
 
 	// And move selection to the list on the right
 	mLibraryList->deselectAllItems();
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 51ca007d75..97b4a982d2 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -859,15 +859,14 @@ void LLPreviewLSL::callbackLSLCompileFailed(const LLSD& compile_errors)
 {
 	llinfos << "Compile failed!" << llendl;
 
-	const LLFontGL* err_font = gResMgr->getRes(LLFONT_OCRA);
-	LLScrollListItem* item = NULL;
 	for(LLSD::array_const_iterator line = compile_errors.beginArray();
 		line < compile_errors.endArray();
 		line++)
 	{
-		item = new LLScrollListItem();
-		item->addColumn(line->asString(), err_font);
-		mScriptEd->mErrorList->addItem(item);
+		LLSD row;
+		row["columns"][0]["value"] = line->asString();
+		row["columns"][0]["font"] = "OCRA";
+		mScriptEd->mErrorList->addElement(row);
 	}
 	mScriptEd->selectFirstError();
 	closeIfNeeded();
@@ -992,9 +991,11 @@ void LLPreviewLSL::saveIfNeeded()
 	if(!fp)
 	{
 		llwarns << "Unable to write to " << filename << llendl;
-		LLScrollListItem* item = new LLScrollListItem();
-		item->addColumn("Error writing to local file. Is your hard drive full?", LLFontGL::sSansSerifSmall);
-		mScriptEd->mErrorList->addItem(item);
+
+		LLSD row;
+		row["columns"][0]["value"] = "Error writing to local file. Is your hard drive full?";
+		row["columns"][0]["font"] = "SANSSERIF_SMALL";
+		mScriptEd->mErrorList->addElement(row);
 		return;
 	}
 
@@ -1049,8 +1050,6 @@ void LLPreviewLSL::uploadAssetLegacy(const std::string& filename,
 	std::string dst_filename = llformat("%s.lso", filepath.c_str());
 	std::string err_filename = llformat("%s.out", filepath.c_str());
 
-	LLScrollListItem* item = NULL;
-	const LLFontGL* err_font = gResMgr->getRes(LLFONT_OCRA);
 	if(!lscript_compile(filename.c_str(),
 						dst_filename.c_str(),
 						err_filename.c_str(),
@@ -1082,9 +1081,11 @@ void LLPreviewLSL::uploadAssetLegacy(const std::string& filename,
 				{
 					line.assign(buffer);
 					LLString::stripNonprintable(line);
-					item = new LLScrollListItem();
-					item->addColumn(line, err_font);
-					mScriptEd->mErrorList->addItem(item);
+
+					LLSD row;
+					row["columns"][0]["value"] = line;
+					row["columns"][0]["font"] = "OCRA";
+					mScriptEd->mErrorList->addElement(row);
 				}
 			}
 			fclose(fp);
@@ -1176,9 +1177,10 @@ void LLPreviewLSL::onSaveBytecodeComplete(const LLUUID& asset_uuid, void* user_d
 	{
 		if (self)
 		{
-			LLScrollListItem* item = new LLScrollListItem();
-			item->addColumn("Compile successful!", LLFontGL::sSansSerifSmall);
-			self->mScriptEd->mErrorList->addItem(item);
+			LLSD row;
+			row["columns"][0]["value"] = "Compile successful!";
+			row["columns"][0]["font"] = "SANSSERIF_SMALL";
+			self->mScriptEd->mErrorList->addElement(row);
 
 			// Find our window and close it if requested.
 			self->getWindow()->decBusyCount();
@@ -1399,15 +1401,14 @@ void LLLiveLSLEditor::callbackLSLCompileSucceeded(const LLUUID& task_id,
 void LLLiveLSLEditor::callbackLSLCompileFailed(const LLSD& compile_errors)
 {
 	lldebugs << "Compile failed!" << llendl;
-	const LLFontGL* err_font = gResMgr->getRes(LLFONT_OCRA);
-	LLScrollListItem* item = NULL;
 	for(LLSD::array_const_iterator line = compile_errors.beginArray();
 		line < compile_errors.endArray();
 		line++)
 	{
-		item = new LLScrollListItem();
-		item->addColumn(line->asString(), err_font);
-		mScriptEd->mErrorList->addItem(item);
+		LLSD row;
+		row["columns"][0]["value"] = line->asString();
+		row["columns"][0]["font"] = "OCRA";
+		mScriptEd->mErrorList->addElement(row);
 	}
 	mScriptEd->selectFirstError();
 	closeIfNeeded();
@@ -1769,9 +1770,11 @@ void LLLiveLSLEditor::saveIfNeeded()
 	if(!fp)
 	{
 		llwarns << "Unable to write to " << filename << llendl;
-		LLScrollListItem* item = new LLScrollListItem();
-		item->addColumn("Error writing to local file. Is your hard drive full?", LLFontGL::sSansSerifSmall);
-		mScriptEd->mErrorList->addItem(item);
+
+		LLSD row;
+		row["columns"][0]["value"] = "Error writing to local file. Is your hard drive full?";
+		row["columns"][0]["font"] = "SANSSERIF_SMALL";
+		mScriptEd->mErrorList->addElement(row);
 		return;
 	}
 	LLString utf8text = mScriptEd->mEditor->getText();
@@ -1829,8 +1832,6 @@ void LLLiveLSLEditor::uploadAssetLegacy(const std::string& filename,
 	std::string dst_filename = llformat("%s.lso", filepath.c_str());
 	std::string err_filename = llformat("%s.out", filepath.c_str());
 
-	LLScrollListItem* item = NULL;
-	const LLFontGL* err_font = gResMgr->getRes(LLFONT_OCRA);
 	FILE *fp;
 	if(!lscript_compile(filename.c_str(),
 						dst_filename.c_str(),
@@ -1859,9 +1860,11 @@ void LLLiveLSLEditor::uploadAssetLegacy(const std::string& filename,
 				{
 					line.assign(buffer);
 					LLString::stripNonprintable(line);
-					item = new LLScrollListItem();
-					item->addColumn(line, err_font);
-					mScriptEd->mErrorList->addItem(item);
+				
+					LLSD row;
+					row["columns"][0]["value"] = line;
+					row["columns"][0]["font"] = "OCRA";
+					mScriptEd->mErrorList->addElement(row);
 				}
 			}
 			fclose(fp);
diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp
index 1172bd8cf0..3bfe913ab4 100644
--- a/indra/newview/llprogressview.cpp
+++ b/indra/newview/llprogressview.cpp
@@ -42,7 +42,7 @@ const S32 ANIMATION_FRAMES = 1; //13;
 
 // XUI:translate
 LLProgressView::LLProgressView(const std::string& name, const LLRect &rect) 
-: LLView(name, rect, TRUE)
+: LLPanel(name, rect, FALSE)
 {
 	mPercentDone = 0.f;
 	mDrawBackground = TRUE;
@@ -119,7 +119,7 @@ void LLProgressView::setVisible(BOOL visible)
 	}
 	else if (!getVisible() && visible)
 	{
-		gFocusMgr.setTopView(this, NULL);
+		gFocusMgr.setTopCtrl(this);
 		mFadeTimer.stop();
 		mProgressTimer.start();
 		LLView::setVisible(visible);
@@ -183,7 +183,7 @@ void LLProgressView::draw()
 		LLView::draw();
 		if (mFadeTimer.getElapsedTimeF32() > FADE_IN_TIME)
 		{
-			gFocusMgr.removeTopViewWithoutCallback(this);
+			gFocusMgr.removeTopCtrlWithoutCallback(this);
 			LLView::setVisible(FALSE);
 			gStartImageGL = NULL;
 		}
diff --git a/indra/newview/llprogressview.h b/indra/newview/llprogressview.h
index 474a431b09..455256a665 100644
--- a/indra/newview/llprogressview.h
+++ b/indra/newview/llprogressview.h
@@ -9,13 +9,13 @@
 #ifndef LL_LLPROGRESSVIEW_H
 #define LL_LLPROGRESSVIEW_H
 
-#include "llview.h"
+#include "llpanel.h"
 #include "llframetimer.h"
 
 class LLImageRaw;
 class LLButton;
 
-class LLProgressView : public LLView
+class LLProgressView : public LLPanel
 {
 public:
 	LLProgressView(const std::string& name, const LLRect& rect);
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index c14b4461d6..a38bfc3600 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -133,8 +133,8 @@ struct LLDeRezInfo
 
 LLObjectSelection* get_null_object_selection()
 {
-	static LLObjectSelectionHandle null_ptr(new LLObjectSelection());
-	return (LLObjectSelection*)null_ptr;
+	static LLObjectSelection null_selection;
+	return &null_selection;;
 }
 
 
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 98b4c4ef42..d8d9f1c5d6 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -140,11 +140,6 @@ void LLSpatialGroup::clearDrawMap()
 	mDrawMap.clear();
 }
 
-BOOL LLSpatialGroup::safeToDelete()
-{
-	return gQuit || !isState(IN_QUEUE | ACTIVE_OCCLUSION | RESHADOW_QUEUE);
-}
-
 class LLRelightPainter : public LLSpatialGroup::OctreeTraveler
 {
 public:
@@ -330,7 +325,6 @@ BOOL LLSpatialGroup::updateInGroup(LLDrawable *drawablep, BOOL immediate)
 		unbound();
 		setState(OBJECT_DIRTY);
 		setState(GEOM_DIRTY);
-		gPipeline.markRebuild(this);
 		validate_drawable(drawablep);
 		return TRUE;
 	}
@@ -351,13 +345,15 @@ BOOL LLSpatialGroup::addObject(LLDrawable *drawablep, BOOL add_all, BOOL from_oc
 		drawablep->setSpatialGroup(this, 0);
 		validate_drawable(drawablep);
 		setState(OBJECT_DIRTY | GEOM_DIRTY);
-		gPipeline.markRebuild(this);
 		mLastAddTime = gFrameTimeSeconds;
 		if (drawablep->isSpatialBridge())
 		{
 			mBridgeList.push_back((LLSpatialBridge*) drawablep);
 		}
-		setState(IMAGE_DIRTY);
+		if (drawablep->getRadius() > 1.f)
+		{
+			setState(IMAGE_DIRTY);
+		}
 	}
 
 	return TRUE;
@@ -560,7 +556,6 @@ BOOL LLSpatialGroup::removeObject(LLDrawable *drawablep, BOOL from_octree)
 	{
 		drawablep->setSpatialGroup(NULL, -1);
 		setState(GEOM_DIRTY);
-		gPipeline.markRebuild(this);
 		if (drawablep->isSpatialBridge())
 		{
 			for (bridge_list_t::iterator i = mBridgeList.begin(); i != mBridgeList.end(); ++i)
@@ -589,7 +584,6 @@ void LLSpatialGroup::shift(const LLVector3 &offset)
 	mObjectExtents[0] += offset;
 	mObjectExtents[1] += offset;
 
-	gPipeline.markRebuild(this);
 	setState(GEOM_DIRTY | MATRIX_DIRTY | OCCLUSION_DIRTY);
 }
 
@@ -1610,66 +1604,6 @@ BOOL earlyFail(LLCamera* camera, LLSpatialGroup* group)
 	return TRUE;
 }
 
-void LLSpatialPartition::processGeometry(LLCamera* camera)
-{
-	if (!mRenderByGroup || mBufferUsage == GL_STREAM_DRAW_ARB)
-	{
-		return;
-	}
-
-	U32 process_count = 8;
-
-	LLSpatialGroup* root = (LLSpatialGroup*) mOctree->getListener(0);
-	if (mUpdateQueue.empty())
-	{
-		root->setState(LLSpatialGroup::IN_GEOMETRY_QUEUE);
-		mUpdateQueue.push(root);
-	}
-
-	while (process_count > 0 && !mUpdateQueue.empty())
-	{
-		process_count--;
-		LLPointer<LLSpatialGroup> group = mUpdateQueue.front();
-		mUpdateQueue.pop();
-	
-		group->clearState(LLSpatialGroup::IN_GEOMETRY_QUEUE);
-
-		if (group->isDead())
-		{
-			continue;
-		}
-
-		//push children onto queue
-		for (U32 i = 0; i < group->mOctreeNode->getChildCount(); i++)
-		{
-			LLSpatialGroup* child = (LLSpatialGroup*) group->mOctreeNode->getChild(i)->getListener(0);
-
-			if (!child->isState(LLSpatialGroup::IN_GEOMETRY_QUEUE))
-			{
-				child->setState(LLSpatialGroup::IN_GEOMETRY_QUEUE);
-				mUpdateQueue.push(child);
-			}
-		}
-
-		if (!group->isDead() && !group->isVisible())
-		{
-			if (!group->isState(LLSpatialGroup::OBJECT_DIRTY) && 
-				group->mBufferUsage != GL_STREAM_DRAW_ARB)
-			{
-				group->updateDistance(*camera);
-				for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
-				{
-					LLDrawable* drawablep = *i;
-					if (!drawablep->isDead())
-					{
-						drawablep->updateDistance(*camera);
-					}
-				}
-			}
-		}
-	}
-}
-
 void LLSpatialPartition::markReimage(LLSpatialGroup* group)
 {
 	if (mImageEnabled && group->isState(LLSpatialGroup::IMAGE_DIRTY))
@@ -1731,7 +1665,6 @@ void LLSpatialPartition::processImagery(LLCamera* camera)
 			gPipeline.blurReflectionMap(gPipeline.mCubeBuffer, cube_map, res);
 			group->mReflectionMap = cube_map;
 			group->setState(LLSpatialGroup::GEOM_DIRTY);
-			gPipeline.markRebuild(group);
 		}
 
 		group->clearState(LLSpatialGroup::IMAGE_DIRTY);
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index 6a795d4c6c..c65f4063bf 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -134,9 +134,8 @@ public:
 		SKIP_FRUSTUM_CHECK		= 0x00040000,
 		OCCLUSION_DIRTY			= 0x00080000,
 		BELOW_WATER				= 0x00100000,
-		IN_GEOMETRY_QUEUE		= 0x00200000,
-		IN_IMAGE_QUEUE		= 0x00400000,
-		IMAGE_DIRTY				= 0x00800000,
+		IN_IMAGE_QUEUE			= 0x00200000,
+		IMAGE_DIRTY				= 0x00400000,
 	} eSpatialState;
 
 	typedef enum
@@ -147,7 +146,6 @@ public:
 	} eSetStateMode;
 
 	LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part);
-	BOOL safeToDelete();
 	virtual ~LLSpatialGroup();
 
 	BOOL isDead()							{ return isState(DEAD); }
@@ -265,7 +263,6 @@ public:
 	S32 cull(LLCamera &camera, std::vector<LLDrawable *>* results = NULL, BOOL for_select = FALSE); // Cull on arbitrary frustum
 	BOOL checkOcclusion(LLSpatialGroup* group, LLCamera* camera);
 	void markReimage(LLSpatialGroup* group);
-	void processGeometry(LLCamera* camera);
 	void processImagery(LLCamera* camera);
 	void processOcclusion(LLCamera* camera);
 	void buildOcclusion();
@@ -293,9 +290,6 @@ protected:
 	typedef std::queue<LLPointer<LLSpatialGroup> > spatial_group_queue_t;
 	spatial_group_queue_t mOcclusionQueue;
 
-	//things that need a terse update
-	spatial_group_queue_t mUpdateQueue;
-
 	//things that need an image update
 	spatial_group_queue_t mImageQueue;
 
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 92f39f265e..f315869437 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -214,7 +214,7 @@ void callback_choose_gender(S32 option, void* userdata);
 void init_start_screen(S32 location_id);
 void release_start_screen();
 void process_connect_to_userserver(LLMessageSystem* msg, void**);
-
+void reset_login();
 
 //
 // exported functionality
@@ -854,7 +854,7 @@ BOOL idle_startup()
 					args["[HOST_NAME]"] = host_name;
 
 					gViewerWindow->alertXml("UnableToConnect", args, login_alert_done );
-					gStartupState = STATE_LOGIN_SHOW;
+					reset_login();
 					return FALSE;
 				}
 				break;
@@ -891,7 +891,7 @@ BOOL idle_startup()
 				login_alert_status, NULL);
 
 			// Back up to login screen
-			gStartupState = STATE_LOGIN_SHOW;
+			reset_login();
 			gViewerStats->incStat(LLViewerStats::ST_LOGIN_TIMEOUT_COUNT);
 		}
 		ms_sleep(1);
@@ -907,7 +907,7 @@ BOOL idle_startup()
 
 			gViewerWindow->alertXml("PleaseSelectServer", args, login_alert_done );
 
-			gStartupState = STATE_LOGIN_SHOW;
+			reset_login();
 			return FALSE;
 		}
 
@@ -1055,7 +1055,7 @@ BOOL idle_startup()
 					NULL);
 
 				// Back up to login screen
-				gStartupState = STATE_LOGIN_SHOW;
+				reset_login();
 				gViewerStats->incStat(LLViewerStats::ST_LOGIN_TIMEOUT_COUNT);
 			}
 			else
@@ -1601,7 +1601,7 @@ BOOL idle_startup()
 				LLStringBase<char>::format_map_t args;
 				args["[ERROR_MESSAGE]"] = emsg.str();
 				gViewerWindow->alertXml("ErrorMessage", args, login_alert_done);
-				gStartupState = STATE_LOGIN_SHOW;
+				reset_login();
 				gAutoLogin = FALSE;
 				show_connect_box = TRUE;
 			}
@@ -1618,7 +1618,7 @@ BOOL idle_startup()
 			LLStringBase<char>::format_map_t args;
 			args["[ERROR_MESSAGE]"] = emsg.str();
 			gViewerWindow->alertXml("ErrorMessage", args, login_alert_done);
-			gStartupState = STATE_LOGIN_SHOW;
+			reset_login();
 			gAutoLogin = FALSE;
 			show_connect_box = TRUE;
 		}
@@ -2767,7 +2767,7 @@ void on_userserver_name_resolved( BOOL success, const LLString& host_name, U32 i
 		LLStringBase<char>::format_map_t args;
 		args["[HOST_NAME]"] = host_name;
 		gViewerWindow->alertXml("SetByHostFail", args, login_alert_done );
-		gStartupState = STATE_LOGIN_SHOW;
+		reset_login();
 	}
 }
 
@@ -2869,7 +2869,7 @@ void update_dialog_callback(S32 option, void *userdata)
 		{
 			app_force_quit();
 			// Bump them back to the login screen.
-			//gStartupState = STATE_LOGIN_SHOW;
+			//reset_login();
 		}
 		else
 		{
@@ -2997,7 +2997,7 @@ void use_circuit_callback(void**, S32 result)
 			llinfos << "Backing up to login screen!" << llendl;
 			gViewerWindow->alertXml("LoginPacketNeverReceived",
 				login_alert_status, NULL);
-			gStartupState = STATE_LOGIN_SHOW;
+			reset_login();
 		}
 		else
 		{
@@ -3918,4 +3918,9 @@ bool LLStartUp::canGoFullscreen()
 	return gStartupState >= STATE_WORLD_INIT;
 }
 
+void reset_login()
+{
+	gStartupState = STATE_LOGIN_SHOW;
 
+	// do cleanup here of in-world UI?
+}
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 39feb40109..c732394b4e 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -802,7 +802,7 @@ void LLFloaterTexturePicker::onSearchEdit(const LLString& search_string, void* u
 	else if (picker->mInventoryPanel->getFilterSubString().empty())
 	{
 		// first letter in search term, save existing folder open state
-		if (!picker->mInventoryPanel->getRootFolder()->isFilterActive())
+		if (!picker->mInventoryPanel->getRootFolder()->isFilterModified())
 		{
 			picker->mSavedFolderState.setApply(FALSE);
 			picker->mInventoryPanel->getRootFolder()->applyFunctorRecursively(picker->mSavedFolderState);
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index a9f660a0f5..e8dc281c6f 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -379,10 +379,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
 {
 	calcWorkPriority();
 	mType = host.isOk() ? LLImageBase::TYPE_AVATAR_BAKE : LLImageBase::TYPE_NORMAL;
-	if (host == LLHost::invalid)
-	{
-		mHost = gAgent.getRegionHost();
-	}
+// 	llinfos << "Create: " << mID << " mHost:" << host << " Discard=" << discard << llendl;
 	if (!mFetcher->mDebugPause)
 	{
 		U32 work_priority = mWorkPriority | LLWorkerThread::PRIORITY_HIGH;
@@ -393,6 +390,10 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
 
 LLTextureFetchWorker::~LLTextureFetchWorker()
 {
+// 	llinfos << "Destroy: " << mID
+// 			<< " Decoded=" << mDecodedDiscard
+// 			<< " Requested=" << mRequestedDiscard
+// 			<< " Desired=" << mDesiredDiscard << llendl;
 	llassert_always(!haveWork());
 	lockWorkData();
 	if (mCacheReadHandle != LLTextureCache::nullHandle())
@@ -423,6 +424,7 @@ void LLTextureFetchWorker::clearPackets()
 
 U32 LLTextureFetchWorker::calcWorkPriority()
 {
+// 	llassert_always(mImagePriority >= 0 && mImagePriority <= LLViewerImage::maxDecodePriority());
 	F32 priority_scale = (F32)LLWorkerThread::PRIORITY_LOWBITS / LLViewerImage::maxDecodePriority();
 	mWorkPriority = (U32)(mImagePriority * priority_scale);
 	return mWorkPriority;
@@ -455,8 +457,9 @@ void LLTextureFetchWorker::setDesiredDiscard(S32 discard, S32 size)
 		mDesiredSize = size;
 		prioritize = true;
 	}
-	if (prioritize && mState == INIT)
+	if ((prioritize && mState == INIT) || mState == DONE)
 	{
+		mState = INIT;
 		U32 work_priority = mWorkPriority | LLWorkerThread::PRIORITY_HIGH;
 		setPriority(work_priority);
 	}
@@ -464,8 +467,9 @@ void LLTextureFetchWorker::setDesiredDiscard(S32 discard, S32 size)
 
 void LLTextureFetchWorker::setImagePriority(F32 priority)
 {
+// 	llassert_always(priority >= 0 && priority <= LLViewerImage::maxDecodePriority());
 	F32 delta = fabs(priority - mImagePriority);
-	if (delta > (mImagePriority * .05f)) // 5%
+	if (delta > (mImagePriority * .05f) || mState == DONE)
 	{
 		mImagePriority = priority;
 		calcWorkPriority();
@@ -530,7 +534,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
 		mBuffer = NULL;
 		mBufferSize = 0;
 		mHaveAllData = FALSE;
-		clearPackets();
+		clearPackets(); // TODO: Shouldn't be necessary
 		mCacheReadHandle = LLTextureCache::nullHandle();
 		mCacheWriteHandle = LLTextureCache::nullHandle();
 		mURL.clear();
@@ -893,7 +897,11 @@ bool LLTextureFetchWorker::doWork(S32 param)
 			setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
 			return false;
 		}
-		return true;
+		else
+		{
+			setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
+			return true;
+		}
 	}
 	
 	return false;
@@ -956,18 +964,14 @@ bool LLTextureFetchWorker::deleteOK()
 		}
 	}
 
-	const F32 MAX_IDLE_TIME = 5.f;
-	if ((mFetchTimer.getElapsedTimeF32() < MAX_IDLE_TIME))
-	{
-		delete_ok = false;
-	}
-	else if ((haveWork() &&
-			  // not ok to delete from these states
-			  ((mState >= LOAD_FROM_HTTP_GET_URL && mState <= LOAD_FROM_HTTP_GET_DATA) ||
-			   (mState >= WRITE_TO_CACHE && mState <= WAIT_ON_WRITE))))
+	if ((haveWork() &&
+		 // not ok to delete from these states
+		 ((mState >= LOAD_FROM_HTTP_GET_URL && mState <= LOAD_FROM_HTTP_GET_DATA) ||
+		  (mState >= WRITE_TO_CACHE && mState <= WAIT_ON_WRITE))))
 	{
 		delete_ok = false;
 	}
+	
 	return delete_ok;
 }
 
@@ -1246,20 +1250,24 @@ LLTextureFetch::~LLTextureFetch()
 bool LLTextureFetch::createRequest(const LLUUID& id, const LLHost& host, F32 priority,
 								   S32 w, S32 h, S32 c, S32 discard, bool needs_aux)
 {
+	if (mDebugPause)
+	{
+		return false;
+	}
+	
 	LLTextureFetchWorker* worker = NULL;
 	LLMutexLock lock(&mQueueMutex);
 	map_t::iterator iter = mRequestMap.find(id);
 	if (iter != mRequestMap.end())
 	{
 		worker = iter->second;
-		LLHost host2 = host;
-		if (host2 == LLHost::invalid) host2 = gAgent.getRegionHost();	
-		if (worker->mHost != host2)
+		if (worker->mHost != host)
 		{
-// 			llwarns << "LLTextureFetch::createRequest " << id << " called with multiple hosts: "
-//					<< host << " != " << host2 << llendl;
+			llwarns << "LLTextureFetch::createRequest " << id << " called with multiple hosts: "
+					<< host << " != " << worker->mHost << llendl;
 			removeRequest(worker, true);
 			worker = NULL;
+			return false;
 		}
 	}
 	// If the requester knows the dimentions of the image,
@@ -1284,6 +1292,11 @@ bool LLTextureFetch::createRequest(const LLUUID& id, const LLHost& host, F32 pri
 		worker->setImagePriority(priority);
 		worker->setDesiredDiscard(discard, desired_size);
 		worker->unlockWorkData();
+		if (!worker->haveWork())
+		{
+			worker->mState = LLTextureFetchWorker::INIT;
+			worker->addWork(0, LLWorkerThread::PRIORITY_HIGH | worker->mWorkPriority);
+		}
 	}
 	else
 	{
@@ -1317,7 +1330,11 @@ void LLTextureFetch::addToNetworkQueue(LLTextureFetchWorker* worker)
 		// i.e. a delete has not been requested
 		mNetworkQueue.insert(worker->mID);
 	}
-	mCancelQueue[worker->mHost].erase(worker->mID);
+	for (cancel_queue_t::iterator iter1 = mCancelQueue.begin();
+		 iter1 != mCancelQueue.end(); ++iter1)
+	{
+		iter1->second.erase(worker->mID);
+	}
 }
 
 // call lockQueue() first!
@@ -1368,6 +1385,7 @@ bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level,
 			// Should only happen if we set mDebugPause...
 			if (!mDebugPause)
 			{
+// 				llwarns << "Adding work for inactive worker: " << id << llendl;
 				worker->addWork(0, LLWorkerThread::PRIORITY_HIGH | worker->mWorkPriority);
 			}
 		}
@@ -1451,9 +1469,15 @@ void LLTextureFetch::sendRequestListToSimulators()
 	typedef std::set<LLTextureFetchWorker*,LLTextureFetchWorker::Compare> request_list_t;
 	typedef std::map< LLHost, request_list_t > work_request_map_t;
 	work_request_map_t requests;
-	for (queue_t::iterator iter = mNetworkQueue.begin(); iter != mNetworkQueue.end(); ++iter)
+	for (queue_t::iterator iter = mNetworkQueue.begin(); iter != mNetworkQueue.end(); )
 	{
-		LLTextureFetchWorker* req = getWorker(*iter);
+		queue_t::iterator curiter = iter++;
+		LLTextureFetchWorker* req = getWorker(*curiter);
+		if (!req)
+		{
+			mNetworkQueue.erase(curiter);
+			continue; // paranoia
+		}
 		if (req->mID == mDebugID)
 		{
 			mDebugCount++; // for setting breakpoints
@@ -1492,7 +1516,11 @@ void LLTextureFetch::sendRequestListToSimulators()
 		bool use_http = http_url.empty() ? false : true;
 		LLHost host = iter1->first;
 		// invalid host = use agent host
-		if (host != gAgent.getRegionHost())
+		if (host == LLHost::invalid)
+		{
+			host = gAgent.getRegionHost();
+		}
+		else
 		{
 			use_http = false;
 		}
@@ -1521,8 +1549,7 @@ void LLTextureFetch::sendRequestListToSimulators()
 				gMessageSystem->addS8Fast(_PREHASH_DiscardLevel, (S8)req->mSimRequestedDiscard);
 				gMessageSystem->addF32Fast(_PREHASH_DownloadPriority, req->mImagePriority);
 				gMessageSystem->addU32Fast(_PREHASH_Packet, packet);
-				U8 type = host.isOk() ? LLImageBase::TYPE_AVATAR_BAKE : LLImageBase::TYPE_NORMAL;
-				gMessageSystem->addU8Fast(_PREHASH_Type, type);
+				gMessageSystem->addU8Fast(_PREHASH_Type, req->mType);
 // 				llinfos << "IMAGE REQUEST: " << req->mID << " Discard: " << req->mDesiredDiscard
 // 						<< " Packet: " << packet << " Priority: " << req->mImagePriority << llendl;
 
@@ -1555,6 +1582,10 @@ void LLTextureFetch::sendRequestListToSimulators()
 			 iter1 != mCancelQueue.end(); ++iter1)
 		{
 			LLHost host = iter1->first;
+			if (host == LLHost::invalid)
+			{
+				host = gAgent.getRegionHost();
+			}
 			S32 request_count = 0;
 			for (queue_t::iterator iter2 = iter1->second.begin();
 				 iter2 != iter1->second.end(); ++iter2)
@@ -1624,12 +1655,11 @@ bool LLTextureFetchWorker::insertPacket(S32 index, U8* data, S32 size)
 	return true;
 }
 
-bool LLTextureFetch::receiveImageHeader(const LLHost& host_in, const LLUUID& id, U8 codec, U16 packets, U32 totalbytes,
+bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8 codec, U16 packets, U32 totalbytes,
 										U16 data_size, U8* data)
 {
 	LLMutexLock lock(&mQueueMutex);
 	LLTextureFetchWorker* worker = getWorker(id);
-	LLHost host = (host_in == LLHost::invalid) ? gAgent.getRegionHost() : host_in;
 	bool res = true;
 
 	++mPacketCount;
@@ -1639,17 +1669,12 @@ bool LLTextureFetch::receiveImageHeader(const LLHost& host_in, const LLUUID& id,
 // 		llwarns << "Received header for non active worker: " << id << llendl;
 		res = false;
 	}
-	else if (host != worker->mHost)
-	{
-// 		llwarns << "Received header from wrong host for: " << id << llendl;
-		res = false;
-	}
 	else if (worker->mState != LLTextureFetchWorker::LOAD_FROM_NETWORK ||
 			 worker->mSentRequest != LLTextureFetchWorker::SENT_SIM)
 	{
- 		llwarns << "receiveImageHeader for worker: " << id
-				<< " in state: " << LLTextureFetchWorker::sStateDescs[worker->mState]
-				<< " sent: " << worker->mSentRequest << llendl;
+// 		llwarns << "receiveImageHeader for worker: " << id
+// 				<< " in state: " << LLTextureFetchWorker::sStateDescs[worker->mState]
+// 				<< " sent: " << worker->mSentRequest << llendl;
 		res = false;
 	}
 	else if (worker->mLastPacket != -1)
@@ -1685,11 +1710,10 @@ bool LLTextureFetch::receiveImageHeader(const LLHost& host_in, const LLUUID& id,
 	return res;
 }
 
-bool LLTextureFetch::receiveImagePacket(const LLHost& host_in, const LLUUID& id, U16 packet_num, U16 data_size, U8* data)
+bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U16 packet_num, U16 data_size, U8* data)
 {
 	LLMutexLock lock(&mQueueMutex);
 	LLTextureFetchWorker* worker = getWorker(id);
-	LLHost host = (host_in == LLHost::invalid) ? gAgent.getRegionHost() : host_in;
 	bool res = true;
 
 	++mPacketCount;
@@ -1699,11 +1723,6 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host_in, const LLUUID& id,
 // 		llwarns << "Received packet " << packet_num << " for non active worker: " << id << llendl;
 		res = false;
 	}
-	else if (host != worker->mHost)
-	{
-// 		llwarns << "Received packet from wrong host for: " << id << llendl;
-		res = false;
-	}
 	else if (worker->mLastPacket == -1)
 	{
 // 		llwarns << "Received packet " << packet_num << " before header for: " << id << llendl;
@@ -1735,6 +1754,8 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host_in, const LLUUID& id,
 	{
 // 		llwarns << "receiveImagePacket " << packet_num << "/" << worker->mLastPacket << " for worker: " << id
 // 			<< " in state: " << LLTextureFetchWorker::sStateDescs[worker->mState] << llendl;
+		removeFromNetworkQueue(worker); // failsafe
+		mCancelQueue[host].insert(id);
 	}
 	
 	worker->unlockWorkData();
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index b75e379755..683f8b56cf 100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -129,21 +129,18 @@ void LLTextureBar::draw()
 	}
 	else if (mHilite)
 	{
-		S32 idx = llclamp(mHilite,1,4);
-		if (idx==1) color = LLColor4::yellow;
-		else color = LLColor4::orange;
-	}
-	else if (mImagep->getBoostLevel())
-	{
-		color = LLColor4::magenta;
+		S32 idx = llclamp(mHilite,1,3);
+		if (idx==1) color = LLColor4::orange;
+		else if (idx==2) color = LLColor4::yellow;
+		else color = LLColor4::pink2;
 	}
 	else if (mImagep->mDontDiscard)
 	{
-		color = LLColor4::pink2;
+		color = LLColor4::green4;
 	}
-	else if (!mImagep->getUseMipMaps())
+	else if (mImagep->getBoostLevel())
 	{
-		color = LLColor4::green4;
+		color = LLColor4::magenta;
 	}
 	else if (mImagep->getDecodePriority() == 0.0f)
 	{
@@ -577,6 +574,9 @@ void LLTextureView::draw()
 		{
 			LLPointer<LLViewerImage> imagep = *iter++;
 
+			S32 cur_discard = imagep->getDiscardLevel();
+			S32 desired_discard = imagep->mDesiredDiscardLevel;
+			
 			if (mPrintList)
 			{
 				llinfos << imagep->getID()
@@ -585,7 +585,7 @@ void LLTextureView::draw()
 						<< "\t" << imagep->getDecodePriority()
 						<< "\t" << imagep->getWidth()
 						<< "\t" << imagep->getHeight()
-						<< "\t" << imagep->getDiscardLevel()
+						<< "\t" << cur_discard
 						<< llendl;
 			}
 		
@@ -614,7 +614,7 @@ void LLTextureView::draw()
 			
 			if (sDebugImages.find(imagep) != sDebugImages.end())
 			{
-				pri += 3*HIGH_PRIORITY;
+				pri += 4*HIGH_PRIORITY;
 			}
 
 			if (!mOrderFetch)
@@ -629,14 +629,14 @@ void LLTextureView::draw()
 				{
 					if (imagep == objectp->getTEImage(te))
 					{
-						pri += 2*HIGH_PRIORITY;
+						pri += 3*HIGH_PRIORITY;
 						break;
 					}
 				}
 			}
 #endif
 #if 1
-			if (pri < HIGH_PRIORITY)
+			if (pri < HIGH_PRIORITY && (cur_discard< 0 || desired_discard < cur_discard))
 			{
 				LLViewerObject *objectp = gHoverView->getLastHoverObject();
 				if (objectp)
@@ -653,15 +653,6 @@ void LLTextureView::draw()
 				}
 			}
 #endif
-#if 0
-			if (pri < HIGH_PRIORITY)
-			{
-				if (imagep->mBoostPriority)
-				{
-					pri += 4*HIGH_PRIORITY;
-				}
-			}
-#endif
 #if 1
 			if (pri > 0.f && pri < HIGH_PRIORITY)
 			{
diff --git a/indra/newview/lltool.cpp b/indra/newview/lltool.cpp
index 1053e4a569..b31a70e917 100644
--- a/indra/newview/lltool.cpp
+++ b/indra/newview/lltool.cpp
@@ -34,7 +34,7 @@ LLTool::LLTool( const LLString& name, LLToolComposite* composite ) :
 
 LLTool::~LLTool()
 {
-	if( gFocusMgr.getMouseCapture() == this )
+	if( hasMouseCapture() )
 	{
 		llwarns << "Tool deleted holding mouse capture.  Mouse capture removed." << llendl;
 		gFocusMgr.removeMouseCaptureWithoutCallback( this );
@@ -113,12 +113,12 @@ void LLTool::setMouseCapture( BOOL b )
 {
 	if( b )
 	{
-		gViewerWindow->setMouseCapture(mComposite ? mComposite : this, &LLTool::onMouseCaptureLost );
+		gViewerWindow->setMouseCapture(mComposite ? mComposite : this );
 	}
 	else
 	if( hasMouseCapture() )
 	{
-		gViewerWindow->setMouseCapture( NULL, NULL );
+		gViewerWindow->setMouseCapture( NULL );
 	}
 }
 
@@ -128,7 +128,7 @@ void LLTool::draw()
 
 BOOL LLTool::hasMouseCapture()
 {
-	return gViewerWindow->hasMouseCapture(mComposite ? mComposite : this);
+	return gFocusMgr.getMouseCapture() == (mComposite ? mComposite : this);
 }
 
 BOOL LLTool::handleKey(KEY key, MASK mask)
@@ -144,17 +144,3 @@ LLTool* LLTool::getOverrideTool(MASK mask)
 	}
 	return NULL;
 }
-
-// static
-void	LLTool::onMouseCaptureLost( LLMouseHandler* old_captor )
-{
-	LLTool* self = (LLTool*) old_captor;
-	if( self->mComposite )
-	{
-		self->mComposite->onMouseCaptureLost();
-	}
-	else
-	{
-		self->onMouseCaptureLost();
-	}
-}
diff --git a/indra/newview/lltool.h b/indra/newview/lltool.h
index d67a0d7d24..0cdeae6bd9 100644
--- a/indra/newview/lltool.h
+++ b/indra/newview/lltool.h
@@ -72,7 +72,6 @@ public:
 	// Note: NOT virtual.  Subclasses should call this version.
 	void					setMouseCapture(BOOL b);
 	BOOL					hasMouseCapture();
-	static void				onMouseCaptureLost(LLMouseHandler* old_captor);
 	virtual void			onMouseCaptureLost() {}  // override this one as needed.
 
 protected:
diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp
index 5d803b4c52..a1c51cfe44 100644
--- a/indra/newview/lltoolcomp.cpp
+++ b/indra/newview/lltoolcomp.cpp
@@ -736,6 +736,11 @@ BOOL LLToolCompGun::handleMouseUp(S32 x, S32 y, MASK mask)
 
 void LLToolCompGun::onMouseCaptureLost()
 {
+	if (mComposite)
+	{
+		mComposite->onMouseCaptureLost();
+		return;
+	}
 	mCur->onMouseCaptureLost();
 
 	// JC - I don't know if this is necessary.  Maybe we could lose capture
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 1eb27f9165..b4aee4e2e1 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -859,7 +859,7 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
 
 	BOOL handled = FALSE;
 
-	LLView* top_view = gViewerWindow->getTopView();
+	LLView* top_view = gViewerWindow->getTopCtrl();
 	LLViewerInventoryItem* item;
 	LLViewerInventoryCategory* cat;
 
@@ -2308,7 +2308,7 @@ EAcceptance LLToolDragAndDrop::dad3dTextureObject(
 	}
 	if(!obj->permModify())
 	{
-		return  ACCEPT_NO_LOCKED;
+		return ACCEPT_NO_LOCKED;
 	}
 	//If texture !copyable don't texture or you'll never get it back.
 	if(!item->getPermissions().allowCopyBy(gAgent.getID()))
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 68d9ddbd54..f9511f72a5 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -44,6 +44,7 @@ LLToolPie *gToolPie = NULL;
 
 LLViewerObject* LLToolPie::sClickActionObject = NULL;
 LLHandle<LLObjectSelection> LLToolPie::sLeftClickSelection = NULL;
+U8 LLToolPie::sClickAction = 0;
 
 extern void handle_buy(void*);
 
@@ -145,17 +146,17 @@ BOOL LLToolPie::pickAndShowMenu(S32 x, S32 y, MASK mask, BOOL always_show)
 	// If it's a left-click, and we have a special action, do it.
 	if (useClickAction(always_show, mask, object, parent))
 	{
-		U8 click_action = 0;
+		sClickAction = 0;
 		if (object && object->getClickAction()) 
 		{
-			click_action = object->getClickAction();
+			sClickAction = object->getClickAction();
 		}
 		else if (parent && parent->getClickAction()) 
 		{
-			click_action = parent->getClickAction();
+			sClickAction = parent->getClickAction();
 		}
 
-		switch(click_action)
+		switch(sClickAction)
 		{
 		case CLICK_ACTION_TOUCH:
 		default:
@@ -168,8 +169,9 @@ BOOL LLToolPie::pickAndShowMenu(S32 x, S32 y, MASK mask, BOOL always_show)
 			if (object && object->flagTakesMoney()
 				|| parent && parent->flagTakesMoney())
 			{
-				sClickActionObject = parent;
-				sLeftClickSelection = LLToolSelect::handleObjectSelection(parent, MASK_NONE, FALSE, TRUE);
+				// pay event goes to object actually clicked on
+				sClickActionObject = object;
+				sLeftClickSelection = LLToolSelect::handleObjectSelection(object, MASK_NONE, FALSE, TRUE);
 				return TRUE;
 			}
 			break;
@@ -398,13 +400,12 @@ void LLToolPie::selectionPropertiesReceived()
 
 	if (!sLeftClickSelection->isEmpty())
 	{
-		LLViewerObject* root = sLeftClickSelection->getFirstRootObject();
+		LLViewerObject* selected_object = sLeftClickSelection->getPrimaryObject();
 		// since we don't currently have a way to lock a selection, it could have changed
 		// after we initially clicked on the object
-		if (root == sClickActionObject)
+		if (selected_object == sClickActionObject)
 		{
-			U8 action = root->getClickAction();
-			switch (action)
+			switch (sClickAction)
 			{
 			case CLICK_ACTION_BUY:
 				handle_buy(NULL);
@@ -422,6 +423,7 @@ void LLToolPie::selectionPropertiesReceived()
 	}
 	sLeftClickSelection = NULL;
 	sClickActionObject = NULL;
+	sClickAction = 0;
 }
 
 BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h
index 2ae125c76e..6c3a200dbc 100644
--- a/indra/newview/lltoolpie.h
+++ b/indra/newview/lltoolpie.h
@@ -54,6 +54,7 @@ protected:
 	LLUUID				mHitObjectID;
 	BOOL				mMouseOutsideSlop;				// for this drag, has mouse moved outside slop region
 	static LLViewerObject* sClickActionObject;
+	static U8				sClickAction;
 	static LLHandle<LLObjectSelection> sLeftClickSelection;
 };
 
diff --git a/indra/newview/lluploaddialog.cpp b/indra/newview/lluploaddialog.cpp
index 9bcc123eb5..f8c54fd6c7 100644
--- a/indra/newview/lluploaddialog.cpp
+++ b/indra/newview/lluploaddialog.cpp
@@ -62,7 +62,7 @@ LLUploadDialog::LLUploadDialog( const std::string& msg)
 	setMessage(msg);
 
 	// The dialog view is a root view
-	gViewerWindow->setTopView( this, NULL );
+	gViewerWindow->setTopCtrl( this );
 }
 
 void LLUploadDialog::setMessage( const std::string& msg)
diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp
index 512ddc8565..123dcc8eb4 100644
--- a/indra/newview/llviewerjointmesh.cpp
+++ b/indra/newview/llviewerjointmesh.cpp
@@ -34,6 +34,7 @@
 #include "llvoavatar.h"
 #include "llsky.h"
 #include "pipeline.h"
+#include "llglslshader.h"
 
 #if !LL_DARWIN && !LL_LINUX
 extern PFNGLWEIGHTPOINTERARBPROC glWeightPointerARB;
@@ -479,7 +480,7 @@ void LLViewerJointMesh::uploadJointMatrices()
 				//cgGLSetParameterArray4f(gPipeline.mAvatarMatrix, offset, 1, vector);
 			}
 		}
-		glUniform4fvARB(gPipeline.mAvatarMatrixParam, 45, mat);
+		glUniform4fvARB(gAvatarMatrixParam, 45, mat);
 	}
 }
 
@@ -554,14 +555,14 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass)
 		{
 			glColor4f(0,0,0,1);
 			
-			if (gPipeline.mMaterialIndex > 0)
+			if (gMaterialIndex > 0)
 			{
-				glVertexAttrib4fvARB(gPipeline.mMaterialIndex, mColor.mV);
+				glVertexAttrib4fvARB(gMaterialIndex, mColor.mV);
 			}
 			
-			if (mShiny && gPipeline.mSpecularIndex > 0)
+			if (mShiny && gSpecularIndex > 0)
 			{
-				glVertexAttrib4fARB(gPipeline.mSpecularIndex, 1,1,1,1);
+				glVertexAttrib4fARB(gSpecularIndex, 1,1,1,1);
 			}
 		}
 		else
@@ -888,7 +889,7 @@ void LLViewerJointMesh::updateGeometry()
 	if (mValid && mMesh && mFace &&
 		mMesh->hasWeights() &&
 		mFace->mVertexBuffer.notNull() &&
-		gPipeline.getVertexShaderLevel(LLPipeline::SHADER_AVATAR) == 0)
+		LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR) == 0)
 	{
 		uploadJointMatrices();
 		LLStrider<LLVector3> o_vertices;
diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp
new file mode 100644
index 0000000000..ae51726b5e
--- /dev/null
+++ b/indra/newview/llviewerjoystick.cpp
@@ -0,0 +1,252 @@
+/** 
+ * @file llviewerjoystick.cpp
+ * @brief Joystick functionality.
+ *
+ * Copyright (c) 2002-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llviewercontrol.h"
+#include "llviewerwindow.h"
+#include "llviewercamera.h"
+#include "llviewerjoystick.h"
+#include "viewer.h"
+#include "llkeyboard.h"
+
+static LLQuaternion sFlycamRotation;
+static LLVector3 sFlycamPosition;
+static F32		sFlycamZoom;
+
+BOOL  LLViewerJoystick::sOverrideCamera = FALSE;
+
+void LLViewerJoystick::updateCamera(BOOL reset)
+{
+	static F32 last_delta[] = {0,0,0,0,0,0,0};
+	static F32 delta[] = { 0,0,0,0,0,0,0 };
+
+	LLWindow* window = gViewerWindow->getWindow();
+
+	F32 time = gFrameIntervalSeconds;
+
+	S32 axis[] = 
+	{
+		gSavedSettings.getS32("FlycamAxis0"),
+		gSavedSettings.getS32("FlycamAxis1"),
+		gSavedSettings.getS32("FlycamAxis2"),
+		gSavedSettings.getS32("FlycamAxis3"),
+		gSavedSettings.getS32("FlycamAxis4"),
+		gSavedSettings.getS32("FlycamAxis5"),
+		gSavedSettings.getS32("FlycamAxis6")
+	};
+
+	F32 axis_scale[] =
+	{
+		gSavedSettings.getF32("FlycamAxisScale0"),
+		gSavedSettings.getF32("FlycamAxisScale1"),
+		gSavedSettings.getF32("FlycamAxisScale2"),
+		gSavedSettings.getF32("FlycamAxisScale3"),
+		gSavedSettings.getF32("FlycamAxisScale4"),
+		gSavedSettings.getF32("FlycamAxisScale5"),
+		gSavedSettings.getF32("FlycamAxisScale6")
+	};
+
+	F32 dead_zone[] =
+	{
+		gSavedSettings.getF32("FlycamAxisDeadZone0"),
+		gSavedSettings.getF32("FlycamAxisDeadZone1"),
+		gSavedSettings.getF32("FlycamAxisDeadZone2"),
+		gSavedSettings.getF32("FlycamAxisDeadZone3"),
+		gSavedSettings.getF32("FlycamAxisDeadZone4"),
+		gSavedSettings.getF32("FlycamAxisDeadZone5"),
+		gSavedSettings.getF32("FlycamAxisDeadZone6")
+	};
+
+	if (reset)
+	{
+		sFlycamPosition = gCamera->getOrigin();
+		sFlycamRotation = gCamera->getQuaternion();
+		sFlycamZoom = gCamera->getView();
+
+		for (U32 i = 0; i < 7; i++)
+		{
+			last_delta[i] = -window->getJoystickAxis(axis[i]);
+			delta[i] = 0.f;
+		}
+		return;
+	}
+
+	F32 cur_delta[7];
+	F32 feather = gSavedSettings.getF32("FlycamFeathering");
+	BOOL absolute = gSavedSettings.getBOOL("FlycamAbsolute");
+
+	for (U32 i = 0; i < 7; i++)
+	{
+		cur_delta[i] = -window->getJoystickAxis(axis[i]);	
+		F32 tmp = cur_delta[i];
+		if (absolute)
+		{
+			cur_delta[i] = cur_delta[i] - last_delta[i];
+		}
+		last_delta[i] = tmp;
+
+		if (cur_delta[i] > 0)
+		{
+			cur_delta[i] = llmax(cur_delta[i]-dead_zone[i], 0.f);
+		}
+		else
+		{
+			cur_delta[i] = llmin(cur_delta[i]+dead_zone[i], 0.f);
+		}
+		cur_delta[i] *= axis_scale[i];
+		
+		if (!absolute)
+		{
+			cur_delta[i] *= time;
+		}
+
+		delta[i] = delta[i] + (cur_delta[i]-delta[i])*time*feather;
+	}
+	
+	sFlycamPosition += LLVector3(delta) * sFlycamRotation;
+
+	LLMatrix3 rot_mat(delta[3],
+					  delta[4],
+					  delta[5]);
+	
+	sFlycamRotation = LLQuaternion(rot_mat)*sFlycamRotation;
+
+	if (gSavedSettings.getBOOL("FlycamAutoLeveling"))
+	{
+		LLMatrix3 level(sFlycamRotation);
+
+		LLVector3 x = LLVector3(level.mMatrix[0]);
+		LLVector3 y = LLVector3(level.mMatrix[1]);
+		LLVector3 z = LLVector3(level.mMatrix[2]);
+
+		y.mV[2] = 0.f;
+		y.normVec();
+
+		level.setRows(x,y,z);
+		level.orthogonalize();
+				
+		LLQuaternion quat = LLQuaternion(level);
+		sFlycamRotation = nlerp(llmin(feather*time,1.f), sFlycamRotation, quat);
+	}
+
+	if (gSavedSettings.getBOOL("FlycamZoomDirect"))
+	{
+		sFlycamZoom = last_delta[6]*axis_scale[6]+dead_zone[6];
+	}
+	else
+	{
+		sFlycamZoom += delta[6];
+	}
+
+	LLMatrix3 mat(sFlycamRotation);
+
+	gCamera->setView(sFlycamZoom);
+	gCamera->setOrigin(sFlycamPosition);
+	gCamera->mXAxis = LLVector3(mat.mMatrix[0]);
+	gCamera->mYAxis = LLVector3(mat.mMatrix[1]);
+	gCamera->mZAxis = LLVector3(mat.mMatrix[2]);
+}
+
+
+void LLViewerJoystick::scanJoystick()
+{
+	if (!sOverrideCamera)
+	{
+		static U32 joystick_state = 0;
+		static U32 button_state = 0;
+
+		F32 xval = gViewerWindow->getWindow()->getJoystickAxis(0);
+		F32 yval = gViewerWindow->getWindow()->getJoystickAxis(1);
+
+		if (xval <= -0.5f)
+		{
+			if (!(joystick_state & 0x1))
+			{
+				gKeyboard->handleTranslatedKeyDown(KEY_PAD_LEFT, 0);
+				joystick_state |= 0x1;
+			}
+		}
+		else 
+		{
+			if (joystick_state & 0x1)
+			{
+				gKeyboard->handleTranslatedKeyUp(KEY_PAD_LEFT, 0);
+				joystick_state &= ~0x1;
+			}
+		}
+		if (xval >= 0.5f)
+		{
+			if (!(joystick_state & 0x2))
+			{
+				gKeyboard->handleTranslatedKeyDown(KEY_PAD_RIGHT, 0);
+				joystick_state |= 0x2;
+			}
+		}
+		else 
+		{
+			if (joystick_state & 0x2)
+			{
+				gKeyboard->handleTranslatedKeyUp(KEY_PAD_RIGHT, 0);
+				joystick_state &= ~0x2;
+			}
+		}
+		if (yval <= -0.5f)
+		{
+			if (!(joystick_state & 0x4))
+			{
+				gKeyboard->handleTranslatedKeyDown(KEY_PAD_UP, 0);
+				joystick_state |= 0x4;
+			}
+		}
+		else 
+		{
+			if (joystick_state & 0x4)
+			{
+				gKeyboard->handleTranslatedKeyUp(KEY_PAD_UP, 0);
+				joystick_state &= ~0x4;
+			}
+		}
+		if (yval >=  0.5f)
+		{
+			if (!(joystick_state & 0x8))
+			{
+				gKeyboard->handleTranslatedKeyDown(KEY_PAD_DOWN, 0);
+				joystick_state |= 0x8;
+			}
+		}
+		else 
+		{
+			if (joystick_state & 0x8)
+			{
+				gKeyboard->handleTranslatedKeyUp(KEY_PAD_DOWN, 0);
+				joystick_state &= ~0x8;
+			}
+		}
+
+		for( int i = 0; i < 15; i++ )
+		{
+			if ( gViewerWindow->getWindow()->getJoystickButton(i) & 0x80 )
+			{
+				if (!(button_state & (1<<i)))
+				{
+					gKeyboard->handleTranslatedKeyDown(KEY_BUTTON1+i, 0);
+					button_state |= (1<<i);
+				}
+			}
+			else
+			{
+				if (button_state & (1<<i))
+				{
+					gKeyboard->handleTranslatedKeyUp(KEY_BUTTON1+i, 0);
+					button_state &= ~(1<<i);
+				}
+			}
+		}
+	}
+}
+
diff --git a/indra/newview/llviewerjoystick.h b/indra/newview/llviewerjoystick.h
new file mode 100644
index 0000000000..bc2186c992
--- /dev/null
+++ b/indra/newview/llviewerjoystick.h
@@ -0,0 +1,20 @@
+/** 
+ * @file llviewerjoystick.h
+ * @brief Viewer joystick functionality.
+ *
+ * Copyright (c) 2001-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#ifndef LL_LLVIEWERJOYSTICK_H
+#define LL_LLVIEWERJOYSTICK_H
+
+class LLViewerJoystick
+{
+public:
+	static BOOL sOverrideCamera;
+	static void scanJoystick();
+	static void updateCamera(BOOL reset = FALSE);
+};
+
+#endif
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 9a43729195..89665171c9 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -174,6 +174,7 @@
 #include "pipeline.h"
 #include "viewer.h"
 #include "roles_constants.h"
+#include "llviewerjoystick.h"
 
 #include "lltexlayer.h"
 
@@ -994,6 +995,10 @@ void init_debug_ui_menu(LLMenuGL* menu)
 	menu->append(new LLMenuItemToggleGL("Debug Keys", &LLView::sDebugKeys));
 	menu->append(new LLMenuItemToggleGL("Debug WindowProc", &gDebugWindowProc));
 	menu->append(new LLMenuItemToggleGL("Debug Text Editor Tips", &gDebugTextEditorTips));
+	menu->appendSeparator();
+	menu->append(new LLMenuItemCheckGL("Show Time", menu_toggle_control, NULL, menu_check_control, (void*)"DebugShowTime"));
+	menu->append(new LLMenuItemCheckGL("Show Render Info", menu_toggle_control, NULL, menu_check_control, (void*)"DebugShowRenderInfo"));
+	
 	menu->createJumpKeys();
 }
 
@@ -3145,6 +3150,11 @@ void reset_view_final( BOOL proceed, void* )
 
 	gAgent.changeCameraToDefault();
 	
+	if (LLViewerJoystick::sOverrideCamera)
+	{
+		handle_toggle_flycam(NULL);
+	}
+
 	gAgent.resetView(!gFloaterTools->getVisible());
 	gFloaterTools->close();
 	
@@ -6331,14 +6341,15 @@ void handle_dump_followcam(void*)
 
 BOOL check_flycam(void*)
 {
-	return LLPipeline::sOverrideAgentCamera;
+	return LLViewerJoystick::sOverrideCamera;
 }
 
 void handle_toggle_flycam(void*)
 {
-	LLPipeline::sOverrideAgentCamera = !LLPipeline::sOverrideAgentCamera;
-	if (LLPipeline::sOverrideAgentCamera)
+	LLViewerJoystick::sOverrideCamera = !LLViewerJoystick::sOverrideCamera;
+	if (LLViewerJoystick::sOverrideCamera)
 	{
+		LLViewerJoystick::updateCamera(TRUE);
 		LLFloaterJoystick::show(NULL);
 	}
 }
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index ed13f6dbe9..55256a6f23 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -3884,7 +3884,16 @@ void process_alert_core(const char* buffer, BOOL modal)
 	}
 
 	// Translate system messages here.
-	if (buffer[0] == '/')
+	const char ALERT_PREFIX[] = "ALERT: ";
+	const size_t ALERT_PREFIX_LEN = sizeof(ALERT_PREFIX) - 1;
+	if (!strncmp(buffer, ALERT_PREFIX, ALERT_PREFIX_LEN))
+	{
+		// Allow the server to spawn a named alert so that server alerts can be
+		// translated out of English. JC
+		std::string alert_name(buffer + ALERT_PREFIX_LEN);
+		LLAlertDialog::showXml(alert_name);
+	}
+	else if (buffer[0] == '/')
 	{
 		// System message is important, show in upper-right box not tip
 		LLString text(buffer+1);
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index ee29876274..c3f2b2d2f6 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -2568,6 +2568,6 @@ bool LLParcelSelection::hasOthersSelected() const
 
 LLParcelSelection* get_null_parcel_selection()
 {
-	static LLParcelSelectionHandle null_ptr = new LLParcelSelection();
-	return null_ptr;
+	static LLParcelSelection null_selection;
+	return &null_selection;
 }
diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp
index a6895aff2f..bf09c54100 100644
--- a/indra/newview/llviewerpartsim.cpp
+++ b/indra/newview/llviewerpartsim.cpp
@@ -461,7 +461,7 @@ LLViewerPartGroup *LLViewerPartSim::put(LLViewerPart* part)
 	const F32 MAX_MAG = 1000000.f*1000000.f; // 1 million
 	if (part->mPosAgent.magVecSquared() > MAX_MAG || !part->mPosAgent.isFinite())
 	{
-#if !LL_RELEASE_FOR_DOWNLOAD
+#if 0 && !LL_RELEASE_FOR_DOWNLOAD
 		llwarns << "LLViewerPartSim::put Part out of range!" << llendl;
 		llwarns << part->mPosAgent << llendl;
 #endif
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 262c7d8ed7..3bc529a9e3 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -422,7 +422,6 @@ LLVector3 LLViewerRegion::getCenterAgent() const
 	return gAgent.getPosAgentFromGlobal(mCenterGlobal);
 }
 
-
 void LLViewerRegion::setRegionNameAndZone(const char* name_and_zone)
 {
 	LLString name_zone(name_and_zone);
@@ -705,21 +704,6 @@ F32 LLViewerRegion::getCompositionXY(const S32 x, const S32 y) const
 	return getComposition()->getValueScaled((F32)x, (F32)y);
 }
 
-
-// ---------------- Friends ----------------
-
-std::ostream& operator<<(std::ostream &s, const LLViewerRegion &region)
-{
-	s << "{ ";
-	s << region.mHost;
-	s << " mOriginGlobal = " << region.getOriginGlobal()<< "\n";
-	s << "}";
-	return s;
-}
-
-
-// ---------------- Protected Member Functions ----------------
-
 void LLViewerRegion::calculateCenterGlobal() 
 {
 	mCenterGlobal = mOriginGlobal;
@@ -735,7 +719,24 @@ void LLViewerRegion::calculateCenterGlobal()
 	}
 }
 
+void LLViewerRegion::calculateCameraDistance()
+{
+	mCameraDistanceSquared = (F32)(gAgent.getCameraPositionGlobal() - getCenterGlobal()).magVecSquared();
+}
+
+// ---------------- Friends ----------------
 
+std::ostream& operator<<(std::ostream &s, const LLViewerRegion &region)
+{
+	s << "{ ";
+	s << region.mHost;
+	s << " mOriginGlobal = " << region.getOriginGlobal()<< "\n";
+	s << "}";
+	return s;
+}
+
+
+// ---------------- Protected Member Functions ----------------
 
 void LLViewerRegion::updateNetStats()
 {
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 1dc1b3af20..05c37fe08f 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -208,9 +208,19 @@ public:
 	void unpackRegionHandshake();
 
 	void calculateCenterGlobal();
+	void calculateCameraDistance();
 
 	friend std::ostream& operator<<(std::ostream &s, const LLViewerRegion &region);
 
+public:
+	struct CompareDistance
+	{
+		bool operator()(const LLViewerRegion* const& lhs, const LLViewerRegion* const& rhs)
+		{
+			return lhs->mCameraDistanceSquared < rhs->mCameraDistanceSquared; 
+		}
+	};
+	
 protected:
 	void disconnectAllNeighbors();
 	void initStats();
@@ -265,13 +275,15 @@ protected:
 	U32		mPingDelay;
 	F32		mDeltaTime;				// Time since last measurement of lastPackets, Bits, etc
 
+	// Misc
 	LLVLComposition *mCompositionp;		// Composition layer for the surface
 
 	U32		mRegionFlags;			// includes damage flags
 	U8		mSimAccess;
 	F32 	mBillableFactor;
 	U32		mMaxTasks;				// max prim count
-
+	F32		mCameraDistanceSquared;	// updated once per frame
+	
 	// Maps local ids to cache entries.
 	// Regions can have order 10,000 objects, so assume
 	// a structure of size 2^14 = 16,000
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index f9e74f31e6..4ebfef3a9b 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -584,7 +584,7 @@ BOOL LLViewerTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)
 			{
 				mDragItem = item_at_pos;
 				mDragItemSaved = LLEmbeddedItems::getEmbeddedItemSaved(wc);
-				gFocusMgr.setMouseCapture( this, NULL );
+				gFocusMgr.setMouseCapture( this );
 				mMouseDownX = x;
 				mMouseDownY = y;
 				S32 screen_x;
@@ -646,7 +646,7 @@ BOOL LLViewerTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)
 				setCursorAtLocalPos( x, y, TRUE );
 				startSelection();
 			}
-			gFocusMgr.setMouseCapture( this, &LLTextEditor::onMouseCaptureLost );
+			gFocusMgr.setMouseCapture( this );
 		}
 
 		handled = TRUE;
@@ -676,7 +676,7 @@ BOOL LLViewerTextEditor::handleHover(S32 x, S32 y, MASK mask)
 	}
 	if( getVisible() )
 	{
-		if(gFocusMgr.getMouseCapture() == this )
+		if(hasMouseCapture() )
 		{
 			if( mIsSelecting ) 
 			{
@@ -829,7 +829,7 @@ BOOL LLViewerTextEditor::handleMouseUp(S32 x, S32 y, MASK mask)
 	// Delay cursor flashing
 	mKeystrokeTimer.reset();
 
-	if( gFocusMgr.getMouseCapture() == this  )
+	if( hasMouseCapture()  )
 	{
 		if (mDragItem)
 		{
@@ -842,7 +842,7 @@ BOOL LLViewerTextEditor::handleMouseUp(S32 x, S32 y, MASK mask)
 			}
 		}
 		mDragItem = NULL;
-		gFocusMgr.setMouseCapture( NULL, NULL );
+		gFocusMgr.setMouseCapture( NULL );
 		handled = TRUE;
 	}
 
diff --git a/indra/newview/llviewertextureanim.cpp b/indra/newview/llviewertextureanim.cpp
index b40320ad2d..67b0901162 100644
--- a/indra/newview/llviewertextureanim.cpp
+++ b/indra/newview/llviewertextureanim.cpp
@@ -17,6 +17,9 @@ LLViewerTextureAnim::LLViewerTextureAnim() : LLTextureAnim()
 {
 	mLastFrame = -1.f;	// Force an update initially
 	mLastTime = 0.f;
+	mOffS = mOffT = 0;
+	mScaleS = mScaleT = 1;
+	mRot = 0;
 }
 
 LLViewerTextureAnim::~LLViewerTextureAnim()
@@ -148,13 +151,13 @@ S32 LLViewerTextureAnim::animateTextures(F32 &off_s, F32 &off_t,
 		if (mMode & ROTATE)
 		{
 			result |= ROTATE;
-			rot = frame_counter;
+			mRot = rot = frame_counter;
 		}
 		else if (mMode & SCALE)
 		{
 			result |= SCALE;
-			scale_s = frame_counter;
-			scale_t = frame_counter;
+			mScaleS = scale_s = frame_counter;
+			mScaleT = scale_t = frame_counter;
 		}
 		else
 		{
@@ -168,22 +171,22 @@ S32 LLViewerTextureAnim::animateTextures(F32 &off_s, F32 &off_t,
 				&&(mSizeY))
 			{
 				result |= SCALE;
-				scale_s = 1.f/mSizeX;
-				scale_t = 1.f/mSizeY;
+				mScaleS = scale_s = 1.f/mSizeX;
+				mScaleT = scale_t = 1.f/mSizeY;
 				x_frame = fmod(frame_counter, mSizeX);
 				y_frame = (S32)(frame_counter / mSizeX);
 				x_pos = x_frame * scale_s;
 				y_pos = y_frame * scale_t;
-				off_s = (-0.5f + 0.5f*scale_s)+ x_pos;
-				off_t = (0.5f - 0.5f*scale_t) - y_pos;
+				mOffS = off_s = (-0.5f + 0.5f*scale_s)+ x_pos;
+				mOffT = off_t = (0.5f - 0.5f*scale_t) - y_pos;
 			}
 			else
 			{
-				scale_s = 1.f;
-				scale_t = 1.f;
+				mScaleS = scale_s = 1.f;
+				mScaleT = scale_t = 1.f;
 				x_pos = frame_counter * scale_s;
-				off_s = (-0.5f + 0.5f*scale_s)+ x_pos;
-				off_t = 0.f;
+				mOffS = off_s = (-0.5f + 0.5f*scale_s)+ x_pos;
+				mOffT = off_t = 0.f;
 			}
 		}
 	}
diff --git a/indra/newview/llviewertextureanim.h b/indra/newview/llviewertextureanim.h
index c7e75c565c..a5488be4eb 100644
--- a/indra/newview/llviewertextureanim.h
+++ b/indra/newview/llviewertextureanim.h
@@ -25,6 +25,13 @@ public:
 	{
 		TRANSLATE = 0x01 // Result code JUST for animateTextures
 	};
+
+	F32 mOffS;
+	F32 mOffT;
+	F32 mScaleS;
+	F32 mScaleT;
+	F32 mRot;
+
 protected:
 	LLFrameTimer mTimer;
 	F64 mLastTime;
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 41f937efd5..732568f652 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -43,7 +43,6 @@
 #include "llxfermanager.h"
 #include "message.h"
 #include "object_flags.h"
-#include "text_out.h"
 #include "lltimer.h"
 #include "timing.h"
 #include "llviewermenu.h"
@@ -334,7 +333,216 @@ void LLViewerWindow::printFeedback()
 }
 #endif //SABINRIG
 
+////////////////////////////////////////////////////////////////////////////
+//
+// LLDebugText
+//
+
+class LLDebugText
+{
+private:
+	struct Line
+	{
+		Line(const std::string& in_text, S32 in_x, S32 in_y) : text(in_text), x(in_x), y(in_y) {}
+		std::string text;
+		S32 x,y;
+	};
+
+	LLViewerWindow *mWindow;
+	
+	typedef std::vector<Line> line_list_t;
+	line_list_t mLineList;
+	LLColor4 mTextColor;
+	
+public:
+	LLDebugText(LLViewerWindow* window) : mWindow(window) {}
+	
+	void addText(S32 x, S32 y, const std::string &text) 
+	{
+		mLineList.push_back(Line(text, x, y));
+	}
+
+	void update()
+	{
+		std::string wind_vel_text;
+		std::string wind_vector_text;
+		std::string rwind_vel_text;
+		std::string rwind_vector_text;
+		std::string audio_text;
+
+		// Draw the statistics in a light gray
+		// and in a thin font
+		mTextColor = LLColor4( 0.86f, 0.86f, 0.86f, 1.f );
+
+		// Draw stuff growing up from right lower corner of screen
+		U32 xpos = mWindow->getWindowWidth() - 350;
+		U32 ypos = 64;
+		const U32 y_inc = 20;
+
+		if (gSavedSettings.getBOOL("DebugShowTime"))
+		{
+			const U32 y_inc2 = 15;
+			for (std::map<S32,LLFrameTimer>::reverse_iterator iter = gDebugTimers.rbegin();
+				 iter != gDebugTimers.rend(); ++iter)
+			{
+				S32 idx = iter->first;
+				LLFrameTimer& timer = iter->second;
+				F32 time = timer.getElapsedTimeF32();
+				S32 hours = (S32)(time / (60*60));
+				S32 mins = (S32)((time - hours*(60*60)) / 60);
+				S32 secs = (S32)((time - hours*(60*60) - mins*60));
+				addText(xpos, ypos, llformat(" Debug %d: %d:%02d:%02d", idx, hours,mins,secs)); ypos += y_inc2;
+			}
+			
+			F32 time = gFrameTimeSeconds;
+			S32 hours = (S32)(time / (60*60));
+			S32 mins = (S32)((time - hours*(60*60)) / 60);
+			S32 secs = (S32)((time - hours*(60*60) - mins*60));
+			addText(xpos, ypos, llformat("Time: %d:%02d:%02d", hours,mins,secs)); ypos += y_inc;
+		}
+		
+		if (gDisplayCameraPos)
+		{
+			std::string camera_view_text;
+			std::string camera_center_text;
+			std::string agent_view_text;
+			std::string agent_left_text;
+			std::string agent_center_text;
+			std::string agent_root_center_text;
+
+			LLVector3d tvector; // Temporary vector to hold data for printing.
+
+			// Update camera center, camera view, wind info every other frame
+			tvector = gAgent.getPositionGlobal();
+			agent_center_text = llformat("AgentCenter  %f %f %f",
+										 (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ]));
+
+			if (gAgent.getAvatarObject())
+			{
+				tvector = gAgent.getPosGlobalFromAgent(gAgent.getAvatarObject()->mRoot.getWorldPosition());
+				agent_root_center_text = llformat("AgentRootCenter %f %f %f",
+												  (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ]));
+			}
+			else
+			{
+				agent_root_center_text = "---";
+			}
+
+
+			tvector = LLVector4(gAgent.getFrameAgent().getAtAxis());
+			agent_view_text = llformat("AgentAtAxis  %f %f %f",
+									   (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ]));
+
+			tvector = LLVector4(gAgent.getFrameAgent().getLeftAxis());
+			agent_left_text = llformat("AgentLeftAxis  %f %f %f",
+									   (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ]));
+
+			tvector = gAgent.getCameraPositionGlobal();
+			camera_center_text = llformat("CameraCenter %f %f %f",
+										  (F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ]));
+
+			tvector = LLVector4(gCamera->getAtAxis());
+			camera_view_text = llformat("CameraAtAxis    %f %f %f",
+										(F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ]));
+		
+			addText(xpos, ypos, agent_center_text);  ypos += y_inc;
+			addText(xpos, ypos, agent_root_center_text);  ypos += y_inc;
+			addText(xpos, ypos, agent_view_text);  ypos += y_inc;
+			addText(xpos, ypos, agent_left_text);  ypos += y_inc;
+			addText(xpos, ypos, camera_center_text);  ypos += y_inc;
+			addText(xpos, ypos, camera_view_text);  ypos += y_inc;
+		}
+
+		if (gDisplayWindInfo)
+		{
+			wind_vel_text = llformat("Wind velocity %.2f m/s", gWindVec.magVec());
+			wind_vector_text = llformat("Wind vector   %.2f %.2f %.2f", gWindVec.mV[0], gWindVec.mV[1], gWindVec.mV[2]);
+			rwind_vel_text = llformat("RWind vel %.2f m/s", gRelativeWindVec.magVec());
+			rwind_vector_text = llformat("RWind vec   %.2f %.2f %.2f", gRelativeWindVec.mV[0], gRelativeWindVec.mV[1], gRelativeWindVec.mV[2]);
+
+			addText(xpos, ypos, wind_vel_text);  ypos += y_inc;
+			addText(xpos, ypos, wind_vector_text);  ypos += y_inc;
+			addText(xpos, ypos, rwind_vel_text);  ypos += y_inc;
+			addText(xpos, ypos, rwind_vector_text);  ypos += y_inc;
+		}
+		if (gDisplayWindInfo)
+		{
+			if (gAudiop)
+			{
+				audio_text= llformat("Audio for wind: %d", gAudiop->isWindEnabled());
+			}
+			addText(xpos, ypos, audio_text);  ypos += y_inc;
+		}
+		if (gDisplayFOV)
+		{
+			addText(xpos, ypos, llformat("FOV: %2.1f deg", RAD_TO_DEG * gCamera->getView()));
+			ypos += y_inc;
+		}
+		if (gSavedSettings.getBOOL("DebugShowRenderInfo"))
+		{
+			if (gPipeline.getUseVertexShaders() == 0)
+			{
+				addText(xpos, ypos, "Shaders Disabled");
+				ypos += y_inc;
+			}
+			addText(xpos, ypos, llformat("%d MB Vertex Data", LLVertexBuffer::sAllocatedBytes/(1024*1024)));
+			ypos += y_inc;
+
+			addText(xpos, ypos, llformat("%d Pending Lock", LLVertexBuffer::sLockedList.size()));
+			ypos += y_inc;
+
+			addText(xpos, ypos, llformat("%d Vertex Buffers", LLVertexBuffer::sGLCount));
+			ypos += y_inc;
+		}
 
+		if (LLPipeline::getRenderParticleBeacons(NULL))
+		{
+			addText(xpos, ypos, "Viewing particle beacons (blue)");
+			ypos += y_inc;
+		}
+		if (LLPipeline::toggleRenderTypeControlNegated((void*)LLPipeline::RENDER_TYPE_PARTICLES))
+		{
+			addText(xpos, ypos, "Hiding particles");
+			ypos += y_inc;
+		}
+		if (LLPipeline::getRenderPhysicalBeacons(NULL))
+		{
+			addText(xpos, ypos, "Viewing physical object beacons (green)");
+			ypos += y_inc;
+		}
+		if (LLPipeline::getRenderScriptedBeacons(NULL))
+		{
+			addText(xpos, ypos, "Viewing scripted object beacons (red)");
+			ypos += y_inc;
+		}
+		if (LLPipeline::getRenderSoundBeacons(NULL))
+		{
+			addText(xpos, ypos, "Viewing sound beacons (yellow)");
+			ypos += y_inc;
+		}
+	}
+
+	void draw()
+	{
+		for (line_list_t::iterator iter = mLineList.begin();
+			 iter != mLineList.end(); ++iter)
+		{
+			const Line& line = *iter;
+			LLFontGL::sMonospace->renderUTF8(line.text, 0, (F32)line.x, (F32)line.y, mTextColor,
+											 LLFontGL::LEFT, LLFontGL::TOP,
+											 LLFontGL::NORMAL, S32_MAX, S32_MAX, NULL, FALSE);
+		}
+		mLineList.clear();
+	}
+
+};
+
+void LLViewerWindow::updateDebugText()
+{
+	mDebugText->update();
+}
+
+////////////////////////////////////////////////////////////////////////////
 //
 // LLViewerWindow
 //
@@ -401,12 +609,23 @@ BOOL LLViewerWindow::handleMouseDown(LLWindow *window,  LLCoordGL pos, MASK mask
 	}
 
 	// Topmost view gets a chance before the hierarchy
-	LLView* top_view = gFocusMgr.getTopView();
-	if (top_view)
+	LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
+	if (top_ctrl)
 	{
 		S32 local_x, local_y;
-		top_view->screenPointToLocal( x, y, &local_x, &local_y );
-		if (top_view->pointInView(local_x, local_y) && top_view->handleMouseDown(local_x, local_y, mask)) return TRUE;
+		top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
+		if (top_ctrl->pointInView(local_x, local_y))
+		{
+			if(top_ctrl->handleMouseDown(local_x, local_y, mask)) 
+			{
+				return TRUE;
+			}
+		}
+		else if (top_ctrl->hasFocus())
+		{
+			// always defocus top view if we click off of it
+			top_ctrl->setFocus(FALSE);
+		}
 	}
 
 	// Give the UI views a chance to process the click
@@ -479,12 +698,25 @@ BOOL LLViewerWindow::handleDoubleClick(LLWindow *window,  LLCoordGL pos, MASK ma
 	}
 
 	// Check for hit on UI.
-	LLView* top_view = gFocusMgr.getTopView();
-	if (top_view)
+	LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
+	if (top_ctrl)
 	{
 		S32 local_x, local_y;
-		top_view->screenPointToLocal( x, y, &local_x, &local_y );
-		if (top_view->pointInView(local_x, local_y) && top_view->handleDoubleClick(local_x, local_y, mask)) return TRUE;
+		top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
+		if (top_ctrl->pointInView(local_x, local_y))
+		{
+			if(top_ctrl->handleDoubleClick(local_x, local_y, mask))
+			{
+				return TRUE;
+			}
+		}
+		else
+		{
+			if (top_ctrl->hasFocus())
+			{
+				top_ctrl->setFocus(FALSE);
+			}
+		}
 	}
 
 	if (mRootView->handleDoubleClick(x, y, mask)) 
@@ -574,12 +806,12 @@ BOOL LLViewerWindow::handleMouseUp(LLWindow *window,  LLCoordGL pos, MASK mask)
 		return mouse_captor->handleMouseUp(local_x, local_y, mask);
 	}
 
-	LLView* top_view = gFocusMgr.getTopView();
-	if (top_view)
+	LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
+	if (top_ctrl)
 	{
 		S32 local_x, local_y;
-		top_view->screenPointToLocal( x, y, &local_x, &local_y );
-		handled = top_view->pointInView(local_x, local_y) && top_view->handleMouseUp(local_x, local_y, mask);
+		top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
+		handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleMouseUp(local_x, local_y, mask);
 	}
 
 	if( !handled )
@@ -670,12 +902,25 @@ BOOL LLViewerWindow::handleRightMouseDown(LLWindow *window,  LLCoordGL pos, MASK
 		return mouse_captor->handleRightMouseDown(local_x, local_y, mask);
 	}
 
-	LLView* top_view = gFocusMgr.getTopView();
-	if (top_view)
+	LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
+	if (top_ctrl)
 	{
 		S32 local_x, local_y;
-		top_view->screenPointToLocal( x, y, &local_x, &local_y );
-		if (top_view->pointInView(local_x, local_y) && top_view->handleRightMouseDown(local_x, local_y, mask)) return TRUE;
+		top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
+		if (top_ctrl->pointInView(local_x, local_y))
+		{
+			if(top_ctrl->handleRightMouseDown(local_x, local_y, mask)) 
+			{
+				return TRUE;
+			}
+		}
+		else
+		{
+			if (top_ctrl->hasFocus())
+			{
+				top_ctrl->setFocus(FALSE);
+			}
+		}
 	}
 
 	if( mRootView->handleRightMouseDown(x, y, mask) )
@@ -773,12 +1018,12 @@ BOOL LLViewerWindow::handleRightMouseUp(LLWindow *window,  LLCoordGL pos, MASK m
 		return mouse_captor->handleRightMouseUp(local_x, local_y, mask);
 	}
 
-	LLView* top_view = gFocusMgr.getTopView();
-	if (top_view)
+	LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
+	if (top_ctrl)
 	{
 		S32 local_x, local_y;
-		top_view->screenPointToLocal( x, y, &local_x, &local_y );
-		handled = top_view->pointInView(local_x, local_y) && top_view->handleRightMouseUp(local_x, local_y, mask);
+		top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
+		handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleRightMouseUp(local_x, local_y, mask);
 	}
 
 	if( !handled )
@@ -912,7 +1157,7 @@ void LLViewerWindow::handleFocusLost(LLWindow *window)
 	{
 		gToolMgr->onAppFocusLost();
 	}
-	gFocusMgr.setMouseCapture( NULL, NULL );
+	gFocusMgr.setMouseCapture( NULL );
 
 	if (gMenuBarView)
 	{
@@ -1284,6 +1529,8 @@ LLViewerWindow::LLViewerWindow(
 
 	// sync the keyboard's setting with the saved setting
 	gSavedSettings.getControl("NumpadControl")->firePropertyChanged();
+
+	mDebugText = new LLDebugText(this);
 }
 
 void LLViewerWindow::initGLDefaults()
@@ -1632,6 +1879,8 @@ void LLViewerWindow::initWorldUI()
 
 LLViewerWindow::~LLViewerWindow()
 {
+	delete mDebugText;
+	
 	gSavedSettings.setS32("FloaterViewBottom", gFloaterView->getRect().mBottom);
 
 	// Cleanup global views
@@ -1845,6 +2094,10 @@ void LLViewerWindow::reshape(S32 width, S32 height)
 	}
 }
 
+void LLViewerWindow::drawDebugText()
+{
+	mDebugText->draw();
+}
 
 void LLViewerWindow::draw()
 {
@@ -1916,7 +2169,7 @@ void LLViewerWindow::draw()
 
 		{
 			LLGLSTexture gls_texture;
-			show_text_gl();
+			drawDebugText();
 		}
 		
 		if (gToolMgr)
@@ -1928,7 +2181,7 @@ void LLViewerWindow::draw()
 		if( gAgent.cameraMouselook() )
 		{
 			drawMouselookInstructions();
-				stop_glerror();
+			stop_glerror();
 		}
 
 		// Draw all nested UI views.
@@ -1936,16 +2189,16 @@ void LLViewerWindow::draw()
 		mRootView->draw();
 
 		// Draw optional on-top-of-everyone view
-		LLView* top_view = gFocusMgr.getTopView();
-		if (top_view && top_view->getVisible())
+		LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
+		if (top_ctrl && top_ctrl->getVisible())
 		{
 			S32 screen_x, screen_y;
-			top_view->localPointToScreen(0, 0, &screen_x, &screen_y);
+			top_ctrl->localPointToScreen(0, 0, &screen_x, &screen_y);
 
 			glMatrixMode(GL_MODELVIEW);
 			LLUI::pushMatrix();
 			LLUI::translate( (F32) screen_x, (F32) screen_y, 0.f);
-			top_view->draw();	
+			top_ctrl->draw();	
 			LLUI::popMatrix();
 		}
 
@@ -2065,7 +2318,7 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
 		// cursor modes, etc, and re-enable.
 		//if (gFocusMgr.getMouseCapture())
 		//{
-		//	gFocusMgr.setMouseCapture(NULL, NULL);
+		//	gFocusMgr.setMouseCapture(NULL);
 		//	return TRUE;
 		//}
 	}
@@ -2131,10 +2384,10 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
 
 	// Topmost view gets a chance before the hierarchy
 	// *FIX: get rid of this?
-	LLView* top_view = gFocusMgr.getTopView();
-	if (top_view)
+	LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
+	if (top_ctrl)
 	{
-		if( top_view->handleKey( key, mask, TRUE ) )
+		if( top_ctrl->handleKey( key, mask, TRUE ) )
 		{
 			return TRUE;
 		}
@@ -2207,8 +2460,8 @@ BOOL LLViewerWindow::handleUnicodeChar(llwchar uni_char, MASK mask)
 		}
 
 		// Topmost view gets a chance before the hierarchy
-		LLView* top_view = gFocusMgr.getTopView();
-		if (top_view && top_view->handleUnicodeChar( uni_char, FALSE ) )
+		LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
+		if (top_ctrl && top_ctrl->handleUnicodeChar( uni_char, FALSE ) )
 		{
 			return TRUE;
 		}
@@ -2244,13 +2497,13 @@ void LLViewerWindow::handleScrollWheel(S32 clicks)
 		return;
 	}
 
-	LLView* top_view = gFocusMgr.getTopView();
-	if (top_view)
+	LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
+	if (top_ctrl)
 	{
 		S32 local_x;
 		S32 local_y;
-		top_view->screenPointToLocal( mCurrentMousePoint.mX, mCurrentMousePoint.mY, &local_x, &local_y );
-		if (top_view->handleScrollWheel(local_x, local_y, clicks)) return;
+		top_ctrl->screenPointToLocal( mCurrentMousePoint.mX, mCurrentMousePoint.mY, &local_x, &local_y );
+		if (top_ctrl->handleScrollWheel(local_x, local_y, clicks)) return;
 	}
 
 	if (mRootView->handleScrollWheel(mCurrentMousePoint.mX, mCurrentMousePoint.mY, clicks) )
@@ -2396,8 +2649,8 @@ BOOL LLViewerWindow::handlePerFrameHover()
 
 	BOOL handled = FALSE;
 
-	BOOL handled_by_top_view = FALSE;
-	LLView* top_view = gFocusMgr.getTopView();
+	BOOL handled_by_top_ctrl = FALSE;
+	LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
 
 	LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
 	if( mouse_captor )
@@ -2419,12 +2672,12 @@ BOOL LLViewerWindow::handlePerFrameHover()
 	}
 	else
 	{
-		if (top_view)
+		if (top_ctrl)
 		{
 			S32 local_x, local_y;
-			top_view->screenPointToLocal( x, y, &local_x, &local_y );
-			handled = top_view->pointInView(local_x, local_y) && top_view->handleHover(local_x, local_y, mask);
-			handled_by_top_view = TRUE;
+			top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
+			handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleHover(local_x, local_y, mask);
+			handled_by_top_ctrl = TRUE;
 		}
 
 		if ( !handled )
@@ -2511,11 +2764,11 @@ BOOL LLViewerWindow::handlePerFrameHover()
 			mouse_captor->screenPointToLocal( x, y, &local_x, &local_y );
 			tool_tip_handled = mouse_captor->handleToolTip( local_x, local_y, tool_tip_msg, &screen_sticky_rect );
 		}
-		else if (handled_by_top_view)
+		else if (handled_by_top_ctrl)
 		{
 			S32 local_x, local_y;
-			top_view->screenPointToLocal( x, y, &local_x, &local_y );
-			tool_tip_handled = top_view->handleToolTip( local_x, local_y, tool_tip_msg, &screen_sticky_rect );
+			top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
+			tool_tip_handled = top_ctrl->handleToolTip( local_x, local_y, tool_tip_msg, &screen_sticky_rect );
 		}
 		else
 		{
@@ -4155,9 +4408,9 @@ BOOL LLViewerWindow::childHasKeyboardFocus(const LLView* parent) const
 	return gFocusMgr.childHasKeyboardFocus( parent );
 }
 
-void LLViewerWindow::setMouseCapture(LLMouseHandler* new_captor,void (*on_capture_lost)(LLMouseHandler* old_captor))
+void LLViewerWindow::setMouseCapture(LLMouseHandler* new_captor)
 {
-	gFocusMgr.setMouseCapture( new_captor, on_capture_lost );
+	gFocusMgr.setMouseCapture( new_captor );
 }
 
 LLMouseHandler* LLViewerWindow::getMouseCaptor() const
@@ -4165,11 +4418,6 @@ LLMouseHandler* LLViewerWindow::getMouseCaptor() const
 	return gFocusMgr.getMouseCapture();
 }
 
-BOOL LLViewerWindow::hasMouseCapture(const LLMouseHandler* possible_captor) const
-{
-	return possible_captor == gFocusMgr.getMouseCapture();
-}
-
 S32	LLViewerWindow::getWindowHeight()	const 	
 { 
 	return mVirtualWindowRect.getHeight(); 
@@ -4190,19 +4438,19 @@ S32	LLViewerWindow::getWindowDisplayWidth() const
 	return mWindowRect.getWidth(); 
 }
 
-LLView* LLViewerWindow::getTopView() const
+LLUICtrl* LLViewerWindow::getTopCtrl() const
 {
-	return gFocusMgr.getTopView();
+	return gFocusMgr.getTopCtrl();
 }
 
-BOOL LLViewerWindow::hasTopView(LLView* view) const
+BOOL LLViewerWindow::hasTopCtrl(LLView* view) const
 {
-	return view == gFocusMgr.getTopView();
+	return view == gFocusMgr.getTopCtrl();
 }
 
-void LLViewerWindow::setTopView(LLView* new_top,void (*on_top_lost)(LLView* old_top))
+void LLViewerWindow::setTopCtrl(LLUICtrl* new_top)
 {
-	gFocusMgr.setTopView( new_top, on_top_lost );
+	gFocusMgr.setTopCtrl( new_top );
 }
 
 void LLViewerWindow::setupViewport(S32 x_offset, S32 y_offset)
@@ -4810,6 +5058,8 @@ LLAlertDialog* LLViewerWindow::alertXmlEditText(const std::string& xml_filename,
 	return alert;
 }
 
+////////////////////////////////////////////////////////////////////////////
+
 LLBottomPanel::LLBottomPanel(const LLString &name, const LLRect &rect) : 
 	LLPanel(name, rect, FALSE),
 	mIndicator(NULL)
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 5b56bbae06..8f3642ffd3 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -107,8 +107,8 @@ public:
 	BOOL			getLeftMouseDown()	const	{ return mLeftMouseDown; }
 	BOOL			getRightMouseDown()	const	{ return mRightMouseDown; }
 
-	LLView*			getTopView() const;
-	BOOL			hasTopView(LLView* view) const;
+	LLUICtrl*		getTopCtrl() const;
+	BOOL			hasTopCtrl(LLView* view) const;
 
 	void			setupViewport(S32 x_offset = 0, S32 y_offset = 0);
 	void			setup3DRender();
@@ -160,17 +160,18 @@ public:
 	BOOL			hasKeyboardFocus( const LLUICtrl* possible_focus ) const;
 	BOOL			childHasKeyboardFocus( const LLView* parent ) const;
 	
-	void			setMouseCapture(LLMouseHandler* new_captor,void (*on_capture_lost)(LLMouseHandler* old_captor));	// new_captor = NULL to release the mouse.
-	BOOL			hasMouseCapture(const LLMouseHandler* possible_captor ) const;
+	void			setMouseCapture(LLMouseHandler* new_captor);	// new_captor = NULL to release the mouse.
 	LLMouseHandler*	getMouseCaptor() const;
 
-	void			setTopView(LLView* new_top, void (*on_top_lost)(LLView* old_top)); // set new_top = NULL to release top_view.
+	void			setTopCtrl(LLUICtrl* new_top); // set new_top = NULL to release top_view.
 
 	void			reshape(S32 width, S32 height);
 	void			sendShapeToSim();
 
 	void			draw();
 //	void			drawSelectedObjects();
+	void			updateDebugText();
+	void			drawDebugText();
 
 	static void		loadUserImage(void **cb_data, const LLUUID &uuid);
 
@@ -188,7 +189,7 @@ public:
 
 	BOOL			saveSnapshot(const LLString&  filename, S32 image_width, S32 image_height, BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR);
 	BOOL			rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, BOOL keep_window_aspect = TRUE, 
-		BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR );
+								BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR );
 	BOOL		    saveImageNumbered(LLImageRaw *raw, const LLString& extension = "");
 
 	void			playSnapshotAnimAndSound();
@@ -259,7 +260,7 @@ private:
 	void			stopGL(BOOL save_state = TRUE);
 	void			restoreGL(const LLString& progress_message = LLString::null);
 	void			initFonts(F32 zoom_factor = 1.f);
-
+	
 	void			analyzeHit(
 						S32				x,				// input
 						S32				y_from_bot,		// input
@@ -272,6 +273,7 @@ private:
 						F32*			hit_u_coord,	// output
 						F32*			hit_v_coord);	// output
 
+	
 public:
 	LLWindow*		mWindow;						// graphical window object
 
@@ -314,13 +316,16 @@ protected:
 
 	LLString		mOverlayTitle;		// Used for special titles such as "Second Life - Special E3 2003 Beta"
 
+	BOOL			mIgnoreActivate;
+	U8*				mPickBuffer;
+
+	class LLDebugText* mDebugText; // Internal class for debug text
+
+protected:
 	static char		sSnapshotBaseName[LL_MAX_PATH];		/* Flawfinder: ignore */
 	static char		sSnapshotDir[LL_MAX_PATH];		/* Flawfinder: ignore */
 
 	static char		sMovieBaseName[LL_MAX_PATH];		/* Flawfinder: ignore */
-
-	BOOL			mIgnoreActivate;
-	U8*				mPickBuffer;
 };	
 
 class LLBottomPanel : public LLPanel
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 5db295874c..f0e797b6e9 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -90,6 +90,7 @@
 #include "llwearablelist.h"
 #include "llworld.h"
 #include "pipeline.h"
+#include "llglslshader.h"
 #include "viewer.h"
 #include "lscript_byteformat.h"
 
@@ -2556,7 +2557,7 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
 	}
 
 	// update wind effect
-	if ((gPipeline.getVertexShaderLevel(LLPipeline::SHADER_AVATAR) >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH))
+	if ((LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR) >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH))
 	{
 		F32 hover_strength = 0.f;
 		F32 time_delta = mRippleTimer.getElapsedTimeF32() - mRippleTimeLast;
@@ -3015,38 +3016,30 @@ void LLVOAvatar::updateCharacter(LLAgent &agent)
 
 	// clear debug text
 	mDebugText.clear();
-
 	if (LLVOAvatar::sShowAnimationDebug)
 	{
-		LLString playing_anims;
-		for (LLMotion* motionp = mMotionController.getFirstActiveMotion();
-			motionp;
-			motionp = mMotionController.getNextActiveMotion())
+		for (LLMotionController::motion_list_t::iterator iter = mMotionController.getActiveMotions().begin();
+			 iter != mMotionController.getActiveMotions().end(); ++iter)
+		{
+			LLMotion* motionp = *iter;
+			if (motionp->getMinPixelArea() < getPixelArea())
 			{
-				if (motionp->getMinPixelArea() < getPixelArea())
+				std::string output;
+				if (motionp->getName().empty())
 				{
-					char output[MAX_STRING];	/* Flawfinder: ignore */
-					if (motionp->getName().empty())
-					{
-						snprintf( /* Flawfinder: ignore */
-							output,
-							MAX_STRING,
-							"%s - %d",
-							motionp->getID().asString().c_str(),
-							(U32)motionp->getPriority());
-					}
-					else
-					{
-						snprintf(	/* Flawfinder: ignore */
-							output,
-							MAX_STRING,
-							"%s - %d",
-							motionp->getName().c_str(),
-							(U32)motionp->getPriority());
-					}
-					addDebugText(output);
+					output = llformat("%s - %d",
+									  motionp->getID().asString().c_str(),
+									  (U32)motionp->getPriority());
 				}
+				else
+				{
+					output = llformat("%s - %d",
+									  motionp->getName().c_str(),
+									  (U32)motionp->getPriority());
+				}
+				addDebugText(output);
 			}
+		}
 	}
 
 	if (gNoRender)
@@ -4592,7 +4585,7 @@ S32 LLVOAvatar::getCollisionVolumeID(std::string &name)
 //-----------------------------------------------------------------------------
 // addDebugText()
 //-----------------------------------------------------------------------------
-void LLVOAvatar::addDebugText(const char* text)
+ void LLVOAvatar::addDebugText(const std::string& text)
 {
 	mDebugText.append(1, '\n');
 	mDebugText.append(text);
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 2660e7c90d..3257e921bc 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -368,7 +368,7 @@ public:
 	virtual LLVector3 getVolumePos(S32 joint_index, LLVector3& volume_offset);
 	virtual LLJoint* findCollisionVolume(U32 volume_id);
 	virtual S32 getCollisionVolumeID(std::string &name);
-	virtual void addDebugText(const char* text);
+	virtual void addDebugText(const std::string& text);
 	virtual const LLUUID& getID();
 	virtual LLJoint *getJoint( const std::string &name );
 
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index 987d2ac7cb..94f9f0b21f 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -617,7 +617,6 @@ void LLVOSky::restoreGL()
 
 	calcBrightnessScaleAndColors();
 
-	// Water is currently broken on Mac.
 	if (gSavedSettings.getBOOL("RenderWater") && gGLManager.mHasCubeMap)
 	{
 		LLCubeMap* cube_map = getCubeMap();
@@ -1232,18 +1231,14 @@ BOOL LLVOSky::updateSky()
 							mSkyTex[side].createGLImage(mSkyTex[side].getWhich(FALSE));
 						}
 						next_frame = 0;	
-						//llSkyTex::stepCurrent();
 					}
 
-					if (!gSavedSettings.getBOOL("RenderDynamicReflections"))
+					std::vector<LLPointer<LLImageRaw> > images;
+					for (S32 side = 0; side < 6; side++)
 					{
-						std::vector<LLPointer<LLImageRaw> > images;
-						for (S32 side = 0; side < 6; side++)
-						{
-							images.push_back(mSkyTex[side].getImageRaw(FALSE));
-						}
-						mCubeMap->init(images);
+						images.push_back(mSkyTex[side].getImageRaw(FALSE));
 					}
+					mCubeMap->init(images);
 				}
 			}
 
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index b5b9e06831..a42d447d5f 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -268,7 +268,11 @@ void LLVOVolume::animateTextures()
 			{
 				continue;
 			}
-			if (result & LLViewerTextureAnim::ROTATE)
+			if (!(result & LLViewerTextureAnim::ROTATE))
+			{
+				te->getRotation(&rot);
+			}
+
 			{
 				F32 axis = -1;
 				F32 s,t;	
@@ -293,16 +297,20 @@ void LLVOVolume::animateTextures()
 
 			tex_mat.identity();
 			tex_mat.translate(LLVector3(-0.5f, -0.5f, 0.f));
-			tex_mat.rotate(quat);
-			
-			if (result & LLViewerTextureAnim::SCALE)
+			tex_mat.rotate(quat);				
+
+			if (!(result & LLViewerTextureAnim::SCALE))
+			{
+				te->getScale(&scale_s, &scale_t);
+			}
+	
 			{
 				scale.setVec(scale_s, scale_t, 1.f);
 				LLMatrix4 mat;
 				mat.initAll(scale, LLQuaternion(), LLVector3());
 				tex_mat *= mat;
 			}
-			
+
 			tex_mat.translate(trans);
 		}
 	}
@@ -310,6 +318,35 @@ void LLVOVolume::animateTextures()
 	{
 		if (mTexAnimMode && mTextureAnimp->mRate == 0)
 		{
+			U8 start, count;
+
+			if (mTextureAnimp->mFace == -1)
+			{
+				start = 0;
+				count = getNumTEs();
+			}
+			else
+			{
+				start = (U8) mTextureAnimp->mFace;
+				count = 1;
+			}
+
+			for (S32 i = start; i < start + count; i++)
+			{
+				if (mTexAnimMode & LLViewerTextureAnim::TRANSLATE)
+				{
+					setTEOffset(i, mTextureAnimp->mOffS, mTextureAnimp->mOffT);				
+				}
+				if (mTexAnimMode & LLViewerTextureAnim::SCALE)
+				{
+					setTEScale(i, mTextureAnimp->mScaleS, mTextureAnimp->mScaleT);	
+				}
+				if (mTexAnimMode & LLViewerTextureAnim::ROTATE)
+				{
+					setTERotation(i, mTextureAnimp->mRot);
+				}
+			}
+
 			gPipeline.markTextured(mDrawable);
 			mFaceMappingChanged = TRUE;
 			mTexAnimMode = 0;
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 752d5a38c6..83420f8761 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -11,6 +11,7 @@
 #include "llworld.h"
 
 #include "indra_constants.h"
+#include "llstl.h"
 
 #include "llagent.h"
 #include "llviewercontrol.h"
@@ -90,8 +91,7 @@ LLWorld::LLWorld(const U32 grids_per_region, const F32 meters_per_grid)
 LLWorld::~LLWorld()
 {
 	gObjectList.killAllObjects();
-
-	mRegionList.deleteAllData();
+	for_each(mRegionList.begin(), mRegionList.end(), DeletePointer());
 }
 
 
@@ -151,9 +151,9 @@ LLViewerRegion* LLWorld::addRegion(const U64 &region_handle, const LLHost &host)
 	regionp->mCloudLayer.setWidth((F32)mWidth);
 	regionp->mCloudLayer.setWindPointer(&regionp->mWind);
 
-	mRegionList.addData(regionp);
-	mActiveRegionList.addData(regionp);
-	mCulledRegionList.addData(regionp);
+	mRegionList.push_back(regionp);
+	mActiveRegionList.push_back(regionp);
+	mCulledRegionList.push_back(regionp);
 
 
 	// Find all the adjacent regions, and attach them.
@@ -205,9 +205,10 @@ void LLWorld::removeRegion(const LLHost &host)
 	
 	if (regionp == gAgent.getRegion())
 	{
-		LLViewerRegion *reg;
-		for (reg = mRegionList.getFirstData(); reg; reg = mRegionList.getNextData())
+		for (region_list_t::iterator iter = mRegionList.begin();
+			 iter != mRegionList.end(); ++iter)
 		{
+			LLViewerRegion* reg = *iter;
 			llwarns << "RegionDump: " << reg->getName()
 				<< " " << reg->getHost()
 				<< " " << reg->getOriginGlobal()
@@ -230,42 +231,23 @@ void LLWorld::removeRegion(const LLHost &host)
 	from_region_handle(regionp->getHandle(), &x, &y);
 	llinfos << "Removing region " << x << ":" << y << llendl;
 
-	// This code can probably be blitzed now...
-	if (!mRegionList.removeData(regionp))
-	{
-		for (regionp = mRegionList.getFirstData(); regionp; regionp = mRegionList.getNextData())
-		{
-			llwarns << "RegionDump: " << regionp->getName()
-				<< " " << regionp->getHost()
-				<< " " << regionp->getOriginGlobal()
-				<< llendl;
-		}
-
-		llerrs << "Region list is broken" << llendl;
-	}
-
-	if (!mActiveRegionList.removeData(regionp))
-	{
-		llwarns << "LLWorld.mActiveRegionList is broken." << llendl;
-	}
-	if (!mCulledRegionList.removeData(regionp))
-	{
-		if (!mVisibleRegionList.removeData(regionp))
-		{
-			llwarns << "LLWorld.mCulled/mVisibleRegionList are broken" << llendl;;
-		}
-	}
+	mRegionList.remove(regionp);
+	mActiveRegionList.remove(regionp);
+	mCulledRegionList.remove(regionp);
+	mVisibleRegionList.remove(regionp);
+	
 	delete regionp;
 
 	updateWaterObjects();
 }
 
 
-LLViewerRegion *LLWorld::getRegion(const LLHost &host)
+LLViewerRegion* LLWorld::getRegion(const LLHost &host)
 {
-	LLViewerRegion *regionp;
-	for (regionp = mRegionList.getFirstData(); regionp; regionp = mRegionList.getNextData())
+	for (region_list_t::iterator iter = mRegionList.begin();
+		 iter != mRegionList.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		if (regionp->getHost() == host)
 		{
 			return regionp;
@@ -274,16 +256,17 @@ LLViewerRegion *LLWorld::getRegion(const LLHost &host)
 	return NULL;
 }
 
-LLViewerRegion *LLWorld::getRegionFromPosAgent(const LLVector3 &pos)
+LLViewerRegion* LLWorld::getRegionFromPosAgent(const LLVector3 &pos)
 {
 	return getRegionFromPosGlobal(gAgent.getPosGlobalFromAgent(pos));
 }
 
-LLViewerRegion *LLWorld::getRegionFromPosGlobal(const LLVector3d &pos)
+LLViewerRegion* LLWorld::getRegionFromPosGlobal(const LLVector3d &pos)
 {
-	LLViewerRegion *regionp;
-	for (regionp = mRegionList.getFirstData(); regionp; regionp = mRegionList.getNextData())
+	for (region_list_t::iterator iter = mRegionList.begin();
+		 iter != mRegionList.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		if (regionp->pointInRegionGlobal(pos))
 		{
 			return regionp;
@@ -357,11 +340,12 @@ LLVector3d	LLWorld::clipToVisibleRegions(const LLVector3d &start_pos, const LLVe
 	return regionp->getPosGlobalFromRegion(LLVector3(final_region_pos));
 }
 
-LLViewerRegion *LLWorld::getRegionFromHandle(const U64 &handle)
+LLViewerRegion* LLWorld::getRegionFromHandle(const U64 &handle)
 {
-	LLViewerRegion *regionp;
-	for (regionp = mRegionList.getFirstData(); regionp; regionp = mRegionList.getNextData())
+	for (region_list_t::iterator iter = mRegionList.begin();
+		 iter != mRegionList.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		if (regionp->getHandle() == handle)
 		{
 			return regionp;
@@ -374,9 +358,10 @@ LLViewerRegion *LLWorld::getRegionFromHandle(const U64 &handle)
 void LLWorld::updateAgentOffset(const LLVector3d &offset_global)
 {
 #if 0
-	LLViewerRegion *regionp;
-	for (regionp = mRegionList.getFirstData(); regionp; regionp = mRegionList.getNextData())
+	for (region_list_t::iterator iter = mRegionList.begin();
+		 iter != mRegionList.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		regionp->setAgentOffset(offset_global);
 	}
 #endif
@@ -385,9 +370,10 @@ void LLWorld::updateAgentOffset(const LLVector3d &offset_global)
 
 BOOL LLWorld::positionRegionValidGlobal(const LLVector3d &pos_global)
 {
-	LLViewerRegion *regionp;
-	for (regionp = mRegionList.getFirstData(); regionp; regionp = mRegionList.getNextData())
+	for (region_list_t::iterator iter = mRegionList.begin();
+		 iter != mRegionList.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		if (regionp->pointInRegionGlobal(pos_global))
 		{
 			return TRUE;
@@ -552,32 +538,29 @@ void LLWorld::updateVisibilities()
 
 	gCamera->setFar(mLandFarClip);
 
-	LLViewerRegion *regionp;
-
 	F32 diagonal_squared = F_SQRT2 * F_SQRT2 * mWidth * mWidth;
 	// Go through the culled list and check for visible regions
-	for (regionp = mCulledRegionList.getFirstData();
-		 regionp;
-		 regionp = mCulledRegionList.getNextData())
+	for (region_list_t::iterator iter = mCulledRegionList.begin();
+		 iter != mCulledRegionList.end(); )
 	{
+		region_list_t::iterator curiter = iter++;
+		LLViewerRegion* regionp = *curiter;
 		F32 height = regionp->getLand().getMaxZ() - regionp->getLand().getMinZ();
 		F32 radius = 0.5f*fsqrtf(height * height + diagonal_squared);
 		if (!regionp->getLand().hasZData()
 			|| gCamera->sphereInFrustum(regionp->getCenterAgent(), radius))
 		{
-			mCulledRegionList.removeCurrentData();
-			mVisibleRegionList.addDataAtEnd(regionp);
+			mCulledRegionList.erase(curiter);
+			mVisibleRegionList.push_back(regionp);
 		}
 	}
 	
-	F32 last_dist_squared = 0.0f;
-	F32 dist_squared;
-
-	// Update all of the visible regions and make single bubble-sort pass
-	for (regionp = mVisibleRegionList.getFirstData();
-		 regionp;
-		 regionp = mVisibleRegionList.getNextData())
+	// Update all of the visible regions 
+	for (region_list_t::iterator iter = mVisibleRegionList.begin();
+		 iter != mVisibleRegionList.end(); )
 	{
+		region_list_t::iterator curiter = iter++;
+		LLViewerRegion* regionp = *curiter;
 		if (!regionp->getLand().hasZData())
 		{
 			continue;
@@ -587,44 +570,35 @@ void LLWorld::updateVisibilities()
 		F32 radius = 0.5f*fsqrtf(height * height + diagonal_squared);
 		if (gCamera->sphereInFrustum(regionp->getCenterAgent(), radius))
 		{
+			regionp->calculateCameraDistance();
 			if (!gNoRender)
 			{
 				regionp->getLand().updatePatchVisibilities(gAgent);
 			}
-
-			// sort by distance... closer regions to the front
-			// Note: regions use absolute frame so we use the agent's center
-			dist_squared = (F32)(gAgent.getCameraPositionGlobal() - regionp->getCenterGlobal()).magVecSquared();
-			if (dist_squared < last_dist_squared)
-			{
-				mVisibleRegionList.swapCurrentWithPrevious();
-			}
-			else
-			{
-				last_dist_squared = dist_squared;
-			}
 		}
 		else
 		{
-			mVisibleRegionList.removeCurrentData();
-			mCulledRegionList.addData(regionp);
+			mVisibleRegionList.erase(curiter);
+			mCulledRegionList.push_back(regionp);
 		}
 	}
 
+	// Sort visible regions
+	mVisibleRegionList.sort(LLViewerRegion::CompareDistance());
+	
 	gCamera->setFar(cur_far_clip);
 }
 
 void LLWorld::updateRegions(F32 max_update_time)
 {
-	LLViewerRegion *regionp;
 	LLTimer update_timer;
 	BOOL did_one = FALSE;
 	
 	// Perform idle time updates for the regions (and associated surfaces)
-	for (regionp = mRegionList.getFirstData();
-		 regionp;
-		 regionp = mRegionList.getNextData())
+	for (region_list_t::iterator iter = mRegionList.begin();
+		 iter != mRegionList.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		F32 max_time = max_update_time - update_timer.getElapsedTimeF32();
 		if (did_one && max_time <= 0.f)
 			break;
@@ -645,47 +619,45 @@ void LLWorld::updateClouds(const F32 dt)
 		// don't move clouds in snapshot mode
 		return;
 	}
-	LLViewerRegion *regionp;
-	if (mActiveRegionList.getLength())
+	if (mActiveRegionList.size())
 	{
 		// Update all the cloud puff positions, and timer based stuff
 		// such as death decay
-		for (regionp = mActiveRegionList.getFirstData();
-			 regionp;
-			 regionp = mActiveRegionList.getNextData())
+		for (region_list_t::iterator iter = mActiveRegionList.begin();
+			 iter != mActiveRegionList.end(); ++iter)
 		{
+			LLViewerRegion* regionp = *iter;
 			regionp->mCloudLayer.updatePuffs(dt);
 		}
 
 		// Reshuffle who owns which puffs
-		for (regionp = mActiveRegionList.getFirstData();
-			 regionp;
-			 regionp = mActiveRegionList.getNextData())
+		for (region_list_t::iterator iter = mActiveRegionList.begin();
+			 iter != mActiveRegionList.end(); ++iter)
 		{
+			LLViewerRegion* regionp = *iter;
 			regionp->mCloudLayer.updatePuffOwnership();
 		}
 
 		// Add new puffs
-		for (regionp = mActiveRegionList.getFirstData();
-			 regionp;
-			 regionp = mActiveRegionList.getNextData())
+		for (region_list_t::iterator iter = mActiveRegionList.begin();
+			 iter != mActiveRegionList.end(); ++iter)
 		{
+			LLViewerRegion* regionp = *iter;
 			regionp->mCloudLayer.updatePuffCount();
 		}
 	}
 }
 
-LLCloudGroup *LLWorld::findCloudGroup(const LLCloudPuff &puff)
+LLCloudGroup* LLWorld::findCloudGroup(const LLCloudPuff &puff)
 {
-	LLViewerRegion *regionp;
-	if (mActiveRegionList.getLength())
+	if (mActiveRegionList.size())
 	{
 		// Update all the cloud puff positions, and timer based stuff
 		// such as death decay
-		for (regionp = mActiveRegionList.getFirstData();
-			 regionp;
-			 regionp = mActiveRegionList.getNextData())
+		for (region_list_t::iterator iter = mActiveRegionList.begin();
+			 iter != mActiveRegionList.end(); ++iter)
 		{
+			LLViewerRegion* regionp = *iter;
 			LLCloudGroup *groupp = regionp->mCloudLayer.findCloudGroup(puff);
 			if (groupp)
 			{
@@ -702,11 +674,12 @@ void LLWorld::renderPropertyLines()
 	S32 region_count = 0;
 	S32 vertex_count = 0;
 
-	LLViewerRegion* region;
-	for (region = mVisibleRegionList.getFirstData(); region; region = mVisibleRegionList.getNextData() )
+	for (region_list_t::iterator iter = mVisibleRegionList.begin();
+		 iter != mVisibleRegionList.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		region_count++;
-		vertex_count += region->renderPropertyLines();
+		vertex_count += regionp->renderPropertyLines();
 	}
 }
 
@@ -715,10 +688,11 @@ void LLWorld::updateNetStats()
 {
 	F32 bits = 0.f;
 	U32 packets = 0;
-	LLViewerRegion *regionp;
 
-	for (regionp = mActiveRegionList.getFirstData(); regionp; regionp = mActiveRegionList.getNextData())
+	for (region_list_t::iterator iter = mActiveRegionList.begin();
+		 iter != mActiveRegionList.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		regionp->updateNetStats();
 		bits += regionp->mBitStat.getCurrent();
 		packets += llfloor( regionp->mPacketsStat.getCurrent() );
@@ -753,27 +727,24 @@ void LLWorld::updateNetStats()
 
 void LLWorld::printPacketsLost()
 {
-	LLViewerRegion *regionp;
-
 	llinfos << "Simulators:" << llendl;
 	llinfos << "----------" << llendl;
 
 	LLCircuitData *cdp = NULL;
-	for (regionp = mActiveRegionList.getFirstData();
-			regionp;
-			regionp = mActiveRegionList.getNextData())
+	for (region_list_t::iterator iter = mActiveRegionList.begin();
+		 iter != mActiveRegionList.end(); ++iter)
+	{
+		LLViewerRegion* regionp = *iter;
+		cdp = gMessageSystem->mCircuitInfo.findCircuit(regionp->getHost());
+		if (cdp)
 		{
-			cdp = gMessageSystem->mCircuitInfo.findCircuit(regionp->getHost());
-			if (cdp)
-			{
-				LLVector3d range = regionp->getCenterGlobal() - gAgent.getPositionGlobal();
+			LLVector3d range = regionp->getCenterGlobal() - gAgent.getPositionGlobal();
 				
-				llinfos << regionp->getHost() << ", range: " << range.magVec() << 
-							" packets lost: " << 
-							cdp->getPacketsLost() << llendl;
-			}			
+			llinfos << regionp->getHost() << ", range: " << range.magVec()
+					<< " packets lost: " << cdp->getPacketsLost() << llendl;
 		}
-
+	}
+	
 	llinfos << "UserServer:" << llendl;
 	llinfos << "-----------" << llendl;
 
@@ -786,9 +757,11 @@ void LLWorld::printPacketsLost()
 
 void LLWorld::processCoarseUpdate(LLMessageSystem* msg, void** user_data)
 {
-	LLViewerRegion* region = NULL;
-	region = gWorldp->getRegion(msg->getSender());
-	if( region ) region->updateCoarseLocations(msg);
+	LLViewerRegion* region = gWorldp->getRegion(msg->getSender());
+	if( region )
+	{
+		region->updateCoarseLocations(msg);
+	}
 }
 
 F32 LLWorld::getLandFarClip() const
@@ -809,49 +782,55 @@ void LLWorld::updateWaterObjects()
 	{
 		return;
 	}
-	S32 min_x, min_y, max_x, max_y;
-	U32 region_x, region_y;
-
-	S32 rwidth = llfloor(getRegionWidthInMeters());
-
-	// First, determine the min and max "box" of water objects
-	LLViewerRegion *regionp;
-	regionp = mRegionList.getFirstData();
-
-	if (!regionp)
+	if (mRegionList.empty())
 	{
 		llwarns << "No regions!" << llendl;
 		return;
 	}
 
-	from_region_handle(regionp->getHandle(), &region_x, &region_y);
-	min_x = max_x = region_x;
-	min_y = max_y = region_y;
+	// First, determine the min and max "box" of water objects
+	bool first = true;
+	S32 min_x, min_y, max_x, max_y;
+	U32 region_x, region_y;
 
-	LLVOWater *waterp;
+	S32 rwidth = llfloor(getRegionWidthInMeters());
 
-	for (; regionp; regionp = mRegionList.getNextData())
+	
+	for (region_list_t::iterator iter = mRegionList.begin();
+		 iter != mRegionList.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		from_region_handle(regionp->getHandle(), &region_x, &region_y);
-		min_x = llmin(min_x, (S32)region_x);
-		min_y = llmin(min_y, (S32)region_y);
-		max_x = llmax(max_x, (S32)region_x);
-		max_y = llmax(max_y, (S32)region_y);
-		waterp = regionp->getLand().getWaterObj();
+		if (first)
+		{
+			first = false;
+			min_x = max_x = region_x;
+			min_y = max_y = region_y;
+		}
+		else
+		{
+			min_x = llmin(min_x, (S32)region_x);
+			min_y = llmin(min_y, (S32)region_y);
+			max_x = llmax(max_x, (S32)region_x);
+			max_y = llmax(max_y, (S32)region_y);
+		}
+		LLVOWater* waterp = regionp->getLand().getWaterObj();
 		if (waterp)
 		{
 			gObjectList.updateActive(waterp);
 		}
 	}
 
-	for (waterp = mHoleWaterObjects.getFirstData(); waterp; waterp = mHoleWaterObjects.getNextData())
+	for (std::list<LLVOWater*>::iterator iter = mHoleWaterObjects.begin();
+		 iter != mHoleWaterObjects.end(); ++ iter)
 	{
+		LLVOWater* waterp = *iter;
 		gObjectList.killObject(waterp);
 	}
-	mHoleWaterObjects.removeAllNodes();
+	mHoleWaterObjects.clear();
 
 	// We only want to fill in holes for stuff that's near us, say, within 512m
-	regionp = gAgent.getRegion();
+	LLViewerRegion* regionp = gAgent.getRegion();
 	from_region_handle(regionp->getHandle(), &region_x, &region_y);
 
 	min_x = llmax((S32)region_x - 512, min_x);
@@ -868,14 +847,14 @@ void LLWorld::updateWaterObjects()
 			U64 region_handle = to_region_handle(x, y);
 			if (!getRegionFromHandle(region_handle))
 			{
-				waterp = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_WATER, gAgent.getRegion());
+				LLVOWater* waterp = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_WATER, gAgent.getRegion());
 				waterp->setUseTexture(FALSE);
 				gPipeline.addObject(waterp);
 				waterp->setPositionGlobal(LLVector3d(x + rwidth/2,
 													 y + rwidth/2,
 													 DEFAULT_WATER_HEIGHT));
 				waterp->setScale(LLVector3((F32)rwidth, (F32)rwidth, 0.f));
-				mHoleWaterObjects.addData(waterp);
+				mHoleWaterObjects.push_back(waterp);
 			}
 		}
 	}
@@ -924,7 +903,7 @@ void LLWorld::updateWaterObjects()
 		const S32 water_center_y = center_y + llround((wy + dim[1]) * 0.5f * gDirAxes[dir][1]);
 		
 		
-		waterp = mEdgeWaterObjects[dir];
+		LLVOWater* waterp = mEdgeWaterObjects[dir];
 		if (!waterp || waterp->isDead())
 		{
 			// The edge water objects can be dead because they're attached to the region that the
@@ -952,7 +931,7 @@ void LLWorld::updateWaterObjects()
 	//llinfos << "End water update" << llendl;
 }
 
-LLViewerImage *LLWorld::getDefaultWaterTexture()
+LLViewerImage* LLWorld::getDefaultWaterTexture()
 {
 	return mDefaultWaterTexturep;
 }
@@ -969,10 +948,10 @@ U64 LLWorld::getSpaceTimeUSec() const
 
 void LLWorld::requestCacheMisses()
 {
-	for(LLViewerRegion* regionp = mRegionList.getFirstData();
-		regionp;
-		regionp = mRegionList.getNextData())
+	for (region_list_t::iterator iter = mRegionList.begin();
+		 iter != mRegionList.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		regionp->requestCacheMisses();
 	}
 }
@@ -980,10 +959,10 @@ void LLWorld::requestCacheMisses()
 LLString LLWorld::getInfoString()
 {
 	LLString info_string("World Info:\n");
-	for (LLViewerRegion* regionp = mRegionList.getFirstData();
-		 regionp;
-		 regionp = mRegionList.getNextData())
+	for (region_list_t::iterator iter = mRegionList.begin();
+		 iter != mRegionList.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		info_string += regionp->getInfoString();
 	}
 	return info_string;
@@ -992,10 +971,10 @@ LLString LLWorld::getInfoString()
 void LLWorld::disconnectRegions()
 {
 	LLMessageSystem* msg = gMessageSystem;
-	for(LLViewerRegion* regionp = mRegionList.getFirstData();
-		regionp;
-		regionp = mRegionList.getNextData())
+	for (region_list_t::iterator iter = mRegionList.begin();
+		 iter != mRegionList.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		if (regionp == gAgent.getRegion())
 		{
 			// Skip the main agent
@@ -1075,8 +1054,11 @@ void process_region_handshake(LLMessageSystem* msg, void** user_data)
 void send_agent_pause()
 {
 	// world not initialized yet
-	if (!gWorldp) return;
-
+	if (!gWorldp)
+	{
+		return;
+	}
+	
 	gMessageSystem->newMessageFast(_PREHASH_AgentPause);
 	gMessageSystem->nextBlockFast(_PREHASH_AgentData);
 	gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID);
@@ -1085,11 +1067,10 @@ void send_agent_pause()
 	gAgentPauseSerialNum++;
 	gMessageSystem->addU32Fast(_PREHASH_SerialNum, gAgentPauseSerialNum);
 
-	LLViewerRegion	*regionp;
-	for (regionp = gWorldp->mActiveRegionList.getFirstData();
-			regionp;
-			regionp = gWorldp->mActiveRegionList.getNextData())
+	for (LLWorld::region_list_t::iterator iter = gWorldp->mActiveRegionList.begin();
+		 iter != gWorldp->mActiveRegionList.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		gMessageSystem->sendReliable(regionp->getHost());
 	}
 
@@ -1113,11 +1094,10 @@ void send_agent_resume()
 	gMessageSystem->addU32Fast(_PREHASH_SerialNum, gAgentPauseSerialNum);
 	
 
-	LLViewerRegion	*regionp;
-	for (regionp = gWorldp->mActiveRegionList.getFirstData();
-			regionp;
-			regionp = gWorldp->mActiveRegionList.getNextData())
+	for (LLWorld::region_list_t::iterator iter = gWorldp->mActiveRegionList.begin();
+		 iter != gWorldp->mActiveRegionList.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		gMessageSystem->sendReliable(regionp->getHost());
 	}
 
diff --git a/indra/newview/llworld.h b/indra/newview/llworld.h
index 0d0d1b3211..4c1dc0343e 100644
--- a/indra/newview/llworld.h
+++ b/indra/newview/llworld.h
@@ -10,8 +10,6 @@
 #define LL_LLWORLD_H
 
 #include "llpatchvertexarray.h"
-#include "doublelinkedlist.h"
-#include "linked_lists.h"
 
 #include "llmath.h"
 //#include "vmath.h"
@@ -122,14 +120,17 @@ public:
 	U64 getSpaceTimeUSec() const;
 
 	LLString getInfoString();
+
 public:
-	LLDoubleLinkedList<LLViewerRegion>	mActiveRegionList;
+	typedef std::list<LLViewerRegion*> region_list_t;
+	
+	region_list_t	mActiveRegionList;
 	LLViewerPartSim mPartSim;
 
 private:
-	LLLinkedList<LLViewerRegion>		mRegionList;
-	LLDoubleLinkedList<LLViewerRegion>	mVisibleRegionList;
-	LLDoubleLinkedList<LLViewerRegion>	mCulledRegionList;
+	region_list_t	mRegionList;
+	region_list_t	mVisibleRegionList;
+	region_list_t	mCulledRegionList;
 
 	// Number of points on edge
 	const U32 mWidth;
@@ -156,7 +157,7 @@ private:
 	U32 mMinRegionY;
 	U32 mMaxRegionY;
 
-	LLLinkedList<LLVOWater> mHoleWaterObjects;
+	std::list<LLVOWater*> mHoleWaterObjects;
 	LLPointer<LLVOWater> mEdgeWaterObjects[8];
 
 	LLPointer<LLViewerImage> mDefaultWaterTexturep;
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index fde1411563..9d2fb122e5 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -1770,7 +1770,7 @@ BOOL outside_slop(S32 x, S32 y, S32 start_x, S32 start_y)
 
 BOOL LLWorldMapView::handleMouseDown( S32 x, S32 y, MASK mask )
 {
-	gFocusMgr.setMouseCapture( this, NULL );
+	gFocusMgr.setMouseCapture( this );
 
 	mMouseDownPanX = llround(sPanX);
 	mMouseDownPanY = llround(sPanY);
@@ -1782,7 +1782,7 @@ BOOL LLWorldMapView::handleMouseDown( S32 x, S32 y, MASK mask )
 
 BOOL LLWorldMapView::handleMouseUp( S32 x, S32 y, MASK mask )
 {
-	if (this == gFocusMgr.getMouseCapture())
+	if (hasMouseCapture())
 	{
 		if (mPanning)
 		{
@@ -1809,7 +1809,7 @@ BOOL LLWorldMapView::handleMouseUp( S32 x, S32 y, MASK mask )
 			handleClick(x, y, mask, &hit_type, &id);
 		}
 		gViewerWindow->showCursor();
-		gFocusMgr.setMouseCapture( NULL, NULL );
+		gFocusMgr.setMouseCapture( NULL );
 		return TRUE;
 	}
 	return FALSE;
@@ -1855,7 +1855,7 @@ void LLWorldMapView::updateVisibleBlocks()
 
 BOOL LLWorldMapView::handleHover( S32 x, S32 y, MASK mask )
 {
-	if (this == gFocusMgr.getMouseCapture())
+	if (hasMouseCapture())
 	{
 		if (mPanning || outside_slop(x, y, mMouseDownX, mMouseDownY))
 		{
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 6b7f60457d..52ceb481d9 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -71,6 +71,8 @@
 #include "viewer.h"
 #include "llcubemap.h"
 #include "lldebugmessagebox.h"
+#include "llglslshader.h"
+#include "llviewerjoystick.h"
 
 #ifdef _DEBUG
 // Debug indices is disabled for now for debug performance - djs 4/24/02
@@ -110,84 +112,6 @@ S32		gTrivialAccepts = 0;
 
 BOOL	gRenderForSelect = FALSE;
 
-//glsl parameter tables
-const char* LLPipeline::sReservedAttribs[] =
-{
-	"materialColor",
-	"specularColor",
-	"binormal"
-};
-
-U32 LLPipeline::sReservedAttribCount = LLPipeline::GLSL_END_RESERVED_ATTRIBS;
-
-const char* LLPipeline::sAvatarAttribs[] = 
-{
-	"weight",
-	"clothing",
-	"gWindDir",
-	"gSinWaveParams",
-	"gGravity"
-};
-
-U32 LLPipeline::sAvatarAttribCount =  sizeof(LLPipeline::sAvatarAttribs)/sizeof(char*);
-
-const char* LLPipeline::sAvatarUniforms[] = 
-{
-	"matrixPalette"
-};
-
-U32 LLPipeline::sAvatarUniformCount = 1;
-
-const char* LLPipeline::sReservedUniforms[] =
-{
-	"diffuseMap",
-	"specularMap",
-	"bumpMap",
-	"environmentMap",
-	"scatterMap"
-};
-
-U32 LLPipeline::sReservedUniformCount = LLPipeline::GLSL_END_RESERVED_UNIFORMS;
-
-const char* LLPipeline::sTerrainUniforms[] =
-{
-	"detail0",
-	"detail1",
-	"alphaRamp"
-};
-
-U32 LLPipeline::sTerrainUniformCount = sizeof(LLPipeline::sTerrainUniforms)/sizeof(char*);
-
-const char* LLPipeline::sGlowUniforms[] =
-{
-	"delta"
-};
-
-U32 LLPipeline::sGlowUniformCount = sizeof(LLPipeline::sGlowUniforms)/sizeof(char*);
-
-const char* LLPipeline::sShinyUniforms[] = 
-{
-	"origin"
-};
-
-U32 LLPipeline::sShinyUniformCount = sizeof(LLPipeline::sShinyUniforms)/sizeof(char*);
-
-const char* LLPipeline::sWaterUniforms[] =
-{
-	"screenTex",
-	"eyeVec",
-	"time",
-	"d1",
-	"d2",
-	"lightDir",
-	"specular",
-	"lightExp",
-	"fbScale",
-	"refScale"
-};
-
-U32 LLPipeline::sWaterUniformCount =  sizeof(LLPipeline::sWaterUniforms)/sizeof(char*);
-
 //----------------------------------------
 
 void stamp(F32 x, F32 y, F32 xs, F32 ys)
@@ -227,7 +151,6 @@ BOOL	LLPipeline::sUseOcclusion = FALSE;
 BOOL	LLPipeline::sSkipUpdate = FALSE;
 BOOL	LLPipeline::sDynamicReflections = FALSE;
 BOOL	LLPipeline::sRenderGlow = FALSE;
-BOOL	LLPipeline::sOverrideAgentCamera = FALSE;
 
 LLPipeline::LLPipeline() :
 	mScreenTex(0),
@@ -298,14 +221,7 @@ void LLPipeline::init()
 	// Enable features
 	stop_glerror();
 		
-	setShaders();
-}
-
-void LLPipeline::LLScatterShader::init(GLhandleARB shader, int map_stage)
-{
-	glUseProgramObjectARB(shader);
-	glUniform1iARB(glGetUniformLocationARB(shader, "scatterMap"), map_stage);
-	glUseProgramObjectARB(0);
+	LLShaderMgr::setShaders();
 }
 
 LLPipeline::~LLPipeline()
@@ -381,7 +297,6 @@ void LLPipeline::cleanup()
 	}
 	mObjectPartition.clear();
 
-	mGroupQ.clear();
 	mVisibleList.clear();
 	mVisibleGroups.clear();
 	mDrawableGroups.clear();
@@ -400,7 +315,6 @@ void LLPipeline::destroyGL()
 	stop_glerror();
 	unloadShaders();
 	mHighlightFaces.clear();
-	mGroupQ.clear();
 	mVisibleList.clear();
 	mVisibleGroups.clear();
 	mDrawableGroups.clear();
@@ -428,896 +342,70 @@ void LLPipeline::releaseGLBuffers()
 		mGlowBuffer = 0;
 	}
 
-	if (mScreenTex)
-	{
-		glDeleteTextures(1, &mScreenTex);
-		mScreenTex = 0;
-	}
-
-	if (mCubeBuffer)
-	{
-		delete mCubeBuffer;
-		mCubeBuffer = NULL;
-	}
-
-	if (mCubeFrameBuffer)
-	{
-		glDeleteFramebuffersEXT(1, &mCubeFrameBuffer);
-		glDeleteRenderbuffersEXT(1, &mCubeDepth);
-		mCubeDepth = mCubeFrameBuffer = 0;
-	}
-
-	if (mFramebuffer[0])
-	{
-		glDeleteFramebuffersEXT(2, mFramebuffer);
-		mFramebuffer[0] = mFramebuffer[1] = 0;
-	}
-}
-
-void LLPipeline::restoreGL() 
-{
-	resetVertexBuffers();
-
-	if (mVertexShadersEnabled)
-	{
-		setShaders();
-	}
-	
-	for (U32 i = 0; i < mObjectPartition.size()-1; i++)
-	{
-		if (mObjectPartition[i])
-		{
-			mObjectPartition[i]->restoreGL();
-		}
-	}
-}
-
-//============================================================================
-// Load Shader
-
-static LLString get_object_log(GLhandleARB ret)
-{
-	LLString res;
-	
-	//get log length
-	GLint length;
-	glGetObjectParameterivARB(ret, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);
-	if (length > 0)
-	{
-		//the log could be any size, so allocate appropriately
-		GLcharARB* log = new GLcharARB[length];
-		glGetInfoLogARB(ret, length, &length, log);
-		res = LLString(log);
-		delete[] log;
-	}
-	return res;
-}
-
-void LLPipeline::dumpObjectLog(GLhandleARB ret, BOOL warns) 
-{
-	LLString log = get_object_log(ret);
-	if (warns)
-	{
-		llwarns << log << llendl;
-	}
-	else
-	{
-		llinfos << log << llendl;
-	}
-}
-
-GLhandleARB LLPipeline::loadShader(const LLString& filename, S32 cls, GLenum type)
-{
-	GLenum error;
-	error = glGetError();
-	if (error != GL_NO_ERROR)
-	{
-		llwarns << "GL ERROR entering loadShader(): " << error << llendl;
-	}
-	
-	llinfos << "Loading shader file: " << filename << llendl;
-
-	if (filename.empty()) 
-	{
-		return 0;
-	}
-
-
-	//read in from file
-	FILE* file = NULL;
-
-	S32 try_gpu_class = mVertexShaderLevel[cls];
-	S32 gpu_class;
-
-	//find the most relevant file
-	for (gpu_class = try_gpu_class; gpu_class > 0; gpu_class--)
-	{	//search from the current gpu class down to class 1 to find the most relevant shader
-		std::stringstream fname;
-		fname << gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "shaders/class");
-		fname << gpu_class << "/" << filename;
-		
-// 		llinfos << "Looking in " << fname.str().c_str() << llendl;
-		file = fopen(fname.str().c_str(), "r");		/* Flawfinder: ignore */
-		if (file)
-		{
-			break; // done
-		}
-	}
-	
-	if (file == NULL)
-	{
-		llinfos << "GLSL Shader file not found: " << filename << llendl;
-		return 0;
-	}
-
-	//we can't have any lines longer than 1024 characters 
-	//or any shaders longer than 1024 lines... deal - DaveP
-	GLcharARB buff[1024];
-	GLcharARB* text[1024];
-	GLuint count = 0;
-
-	//copy file into memory
-	while(fgets(buff, 1024, file) != NULL) 
-	{
-		text[count++] = strdup(buff);
-    }
-	fclose(file);
-
-	//create shader object
-	GLhandleARB ret = glCreateShaderObjectARB(type);
-	error = glGetError();
-	if (error != GL_NO_ERROR)
-	{
-		llwarns << "GL ERROR in glCreateShaderObjectARB: " << error << llendl;
-	}
-	else
-	{
-		//load source
-		glShaderSourceARB(ret, count, (const GLcharARB**) text, NULL);
-		error = glGetError();
-		if (error != GL_NO_ERROR)
-		{
-			llwarns << "GL ERROR in glShaderSourceARB: " << error << llendl;
-		}
-		else
-		{
-			//compile source
-			glCompileShaderARB(ret);
-			error = glGetError();
-			if (error != GL_NO_ERROR)
-			{
-				llwarns << "GL ERROR in glCompileShaderARB: " << error << llendl;
-			}
-		}
-	}
-	//free memory
-	for (GLuint i = 0; i < count; i++)
-	{
-		free(text[i]);
-	}
-	if (error == GL_NO_ERROR)
-	{
-		//check for errors
-		GLint success = GL_TRUE;
-		glGetObjectParameterivARB(ret, GL_OBJECT_COMPILE_STATUS_ARB, &success);
-		error = glGetError();
-		if (error != GL_NO_ERROR || success == GL_FALSE) 
-		{
-			//an error occured, print log
-			llwarns << "GLSL Compilation Error: (" << error << ") in " << filename << llendl;
-			dumpObjectLog(ret);
-			ret = 0;
-		}
-	}
-	else
-	{
-		ret = 0;
-	}
-	stop_glerror();
-
-	//successfully loaded, save results
-#if 1 // 1.9.1
-	if (ret)
-	{
-		mVertexShaderLevel[cls] = try_gpu_class;
-	}
-	else
-	{
-		if (mVertexShaderLevel[cls] > 1)
-		{
-			mVertexShaderLevel[cls] = mVertexShaderLevel[cls] - 1;
-			ret = loadShader(filename,cls,type);
-			if (ret && mMaxVertexShaderLevel[cls] > mVertexShaderLevel[cls])
-			{
-				mMaxVertexShaderLevel[cls] = mVertexShaderLevel[cls];
-			}
-		}
-	}
-#else
-	if (ret)
-	{
-		S32 max = -1;
-		/*if (try_gpu_class == mMaxVertexShaderLevel[cls])
-		{
-			max = gpu_class;
-		}*/
-		saveVertexShaderLevel(cls,try_gpu_class,max);
-	}
-	else
-	{
-		if (mVertexShaderLevel[cls] > 1)
-		{
-			mVertexShaderLevel[cls] = mVertexShaderLevel[cls] - 1;
-			ret = loadShader(f,cls,type);
-			if (ret && mMaxVertexShaderLevel[cls] > mVertexShaderLevel[cls])
-			{
-				saveVertexShaderLevel(cls, mVertexShaderLevel[cls], mVertexShaderLevel[cls]);
-			}
-		}
-	}
-#endif
-	return ret;
-}
-
-BOOL LLPipeline::linkProgramObject(GLhandleARB obj, BOOL suppress_errors) 
-{
-	//check for errors
-	glLinkProgramARB(obj);
-	GLint success = GL_TRUE;
-	glGetObjectParameterivARB(obj, GL_OBJECT_LINK_STATUS_ARB, &success);
-	if (!suppress_errors && success == GL_FALSE) 
-	{
-		//an error occured, print log
-		llwarns << "GLSL Linker Error:" << llendl;
-	}
-
-	LLString log = get_object_log(obj);
-	LLString::toLower(log);
-	if (log.find("software") != LLString::npos)
-	{
-		llwarns << "GLSL Linker: Running in Software:" << llendl;
-		success = GL_FALSE;
-		suppress_errors = FALSE;
-	}
-	if (!suppress_errors)
-	{
-        dumpObjectLog(obj, !success);
-	}
-
-	return success;
-}
-
-BOOL LLPipeline::validateProgramObject(GLhandleARB obj)
-{
-	//check program validity against current GL
-	glValidateProgramARB(obj);
-	GLint success = GL_TRUE;
-	glGetObjectParameterivARB(obj, GL_OBJECT_VALIDATE_STATUS_ARB, &success);
-	if (success == GL_FALSE)
-	{
-		llwarns << "GLSL program not valid: " << llendl;
-		dumpObjectLog(obj);
-	}
-	else
-	{
-		dumpObjectLog(obj, FALSE);
-	}
-
-	return success;
-}
-
-//============================================================================
-// Shader Management
-
-void LLPipeline::setShaders()
-{
-	if (gGLManager.mHasFramebufferObject)
-	{
-		sDynamicReflections = gSavedSettings.getBOOL("RenderDynamicReflections");
-		sRenderGlow = gSavedSettings.getBOOL("RenderGlow");
-	}
-	else
-	{
-		sDynamicReflections = sRenderGlow = FALSE;
-	}
-	
-	//hack to reset buffers that change behavior with shaders
-	resetVertexBuffers();
-
-	if (gViewerWindow)
-	{
-		gViewerWindow->setCursor(UI_CURSOR_WAIT);
-	}
-
-	// Lighting
-	setLightingDetail(-1);
-
-	// Shaders
-	for (S32 i=0; i<SHADER_COUNT; i++)
-	{
-		mVertexShaderLevel[i] = 0;
-		mMaxVertexShaderLevel[i] = 0;
-	}
-	if (canUseVertexShaders())
-	{
-		S32 light_class = 2;
-		S32 env_class = 2;
-		S32 obj_class = 0;
-
-		if (getLightingDetail() == 0)
-		{
-			light_class = 1;
-		}
-		// Load lighting shaders
-		mVertexShaderLevel[SHADER_LIGHTING] = light_class;
-		mMaxVertexShaderLevel[SHADER_LIGHTING] = light_class;
-		mVertexShaderLevel[SHADER_ENVIRONMENT] = env_class;
-		mMaxVertexShaderLevel[SHADER_ENVIRONMENT] = env_class;
-		mVertexShaderLevel[SHADER_OBJECT] = obj_class;
-		mMaxVertexShaderLevel[SHADER_OBJECT] = obj_class;
-
-		BOOL loaded = loadShadersLighting();
-
-		if (loaded)
-		{
-			mVertexShadersEnabled = TRUE;
-			mVertexShadersLoaded = 1;
-
-			// Load all shaders to set max levels
-			loadShadersEnvironment();
-			loadShadersObject();
-			// Load max avatar shaders to set the max level
-			mVertexShaderLevel[SHADER_AVATAR] = 3;
-			mMaxVertexShaderLevel[SHADER_AVATAR] = 3;
-			loadShadersAvatar();
-
-			// Load shaders to correct levels
-			if (!gSavedSettings.getBOOL("RenderRippleWater"))
-			{
-				mVertexShaderLevel[SHADER_ENVIRONMENT] = 0;
-				loadShadersEnvironment(); // unloads
-			}
-
-#if LL_DARWIN // force avatar shaders off for mac
-			mVertexShaderLevel[SHADER_AVATAR] = 0;
-			mMaxVertexShaderLevel[SHADER_AVATAR] = 0;
-#else
-			if (gSavedSettings.getBOOL("RenderAvatarVP"))
-			{
-				S32 avatar = gSavedSettings.getS32("RenderAvatarMode");
-				S32 avatar_class = 1 + avatar;
-				// Set the actual level
-				mVertexShaderLevel[SHADER_AVATAR] = avatar_class;
-				loadShadersAvatar();
-				if (mVertexShaderLevel[SHADER_AVATAR] != avatar_class)
-				{
-					if (mVertexShaderLevel[SHADER_AVATAR] == 0)
-					{
-						gSavedSettings.setBOOL("RenderAvatarVP", FALSE);
-					}
-					avatar = llmax(mVertexShaderLevel[SHADER_AVATAR]-1,0);
-					gSavedSettings.setS32("RenderAvatarMode", avatar);
-				}
-			}
-			else
-			{
-				mVertexShaderLevel[SHADER_AVATAR] = 0;
-				gSavedSettings.setS32("RenderAvatarMode", 0);
-				loadShadersAvatar(); // unloads
-			}
-#endif
-		}
-		else
-		{
-			mVertexShadersEnabled = FALSE;
-			mVertexShadersLoaded = 0;
-		}
-	}
-	if (gViewerWindow)
-	{
-		gViewerWindow->setCursor(UI_CURSOR_ARROW);
-	}
-}
-
-BOOL LLPipeline::canUseVertexShaders()
-{
-	if (!gGLManager.mHasVertexShader ||
-		!gGLManager.mHasFragmentShader ||
-		!gFeatureManagerp->isFeatureAvailable("VertexShaderEnable") ||
-		mVertexShadersLoaded == -1)
-	{
-		return FALSE;
-	}
-	else
-	{
-		return TRUE;
-	}
-}
-
-void LLPipeline::unloadShaders()
-{
-	mObjectSimpleProgram.unload();
-	mObjectShinyProgram.unload();
-	mObjectBumpProgram.unload();
-	mObjectAlphaProgram.unload();
-	mWaterProgram.unload();
-	mTerrainProgram.unload();
-	mGlowProgram.unload();
-	mGroundProgram.unload();
-	mAvatarProgram.unload();
-	mAvatarEyeballProgram.unload();
-	mAvatarPickProgram.unload();
-	mHighlightProgram.unload();
-
-	mVertexShaderLevel[SHADER_LIGHTING] = 0;
-	mVertexShaderLevel[SHADER_OBJECT] = 0;
-	mVertexShaderLevel[SHADER_AVATAR] = 0;
-	mVertexShaderLevel[SHADER_ENVIRONMENT] = 0;
-	mVertexShaderLevel[SHADER_INTERFACE] = 0;
-
-	mLightVertex = mLightFragment = mScatterVertex = mScatterFragment = 0;
-	mVertexShadersLoaded = 0;
-}
-
-#if 0 // 1.9.2
-// Any time shader options change
-BOOL LLPipeline::loadShaders()
-{
-	unloadShaders();
-
-	if (!canUseVertexShaders())
-	{
-		return FALSE;
-	}
-
-	S32 light_class = mMaxVertexShaderLevel[SHADER_LIGHTING];
-	if (getLightingDetail() == 0)
-	{
-		light_class = 1; // Use minimum lighting shader
-	}
-	else if (getLightingDetail() == 1)
-	{
-		light_class = 2; // Use medium lighting shader
-	}
-	mVertexShaderLevel[SHADER_LIGHTING] = light_class;
-	//mVertexShaderLevel[SHADER_OBJECT] = llmin(mMaxVertexShaderLevel[SHADER_OBJECT], gSavedSettings.getS32("VertexShaderLevelObject"));
-	mVertexShaderLevel[SHADER_OBJECT] = 0;
-	mVertexShaderLevel[SHADER_AVATAR] = llmin(mMaxVertexShaderLevel[SHADER_AVATAR], gSavedSettings.getS32("VertexShaderLevelAvatar"));
-	mVertexShaderLevel[SHADER_ENVIRONMENT] = llmin(mMaxVertexShaderLevel[SHADER_ENVIRONMENT], gSavedSettings.getS32("VertexShaderLevelEnvironment"));
-	mVertexShaderLevel[SHADER_INTERFACE] = mMaxVertexShaderLevel[SHADER_INTERFACE];
-	
-	BOOL loaded = loadShadersLighting();
-	if (loaded)
-	{
-		loadShadersEnvironment(); // Must load this before object/avatar for scatter
-		loadShadersObject();
-		loadShadersAvatar();
-		loadShadersInterface();
-		mVertexShadersLoaded = 1;
-	}
-	else
-	{
-		unloadShaders();
-		mVertexShadersEnabled = FALSE;
-		mVertexShadersLoaded = 0; //-1; // -1 = failed
-		setLightingDetail(-1);
-	}
-	
-	return loaded;
-}
-#endif
-
-BOOL LLPipeline::loadShadersLighting()
-{
-	// Load light dependency shaders first
-	// All of these have to load for any shaders to function
-	
-    std::string lightvertex = "lighting/lightV.glsl";
-	//get default light function implementation
-	mLightVertex = loadShader(lightvertex, SHADER_LIGHTING, GL_VERTEX_SHADER_ARB);
-	if( !mLightVertex )
-	{
-		llwarns << "Failed to load " << lightvertex << llendl;
-		return FALSE;
-	}
-	
-	std::string lightfragment = "lighting/lightF.glsl";
-	mLightFragment = loadShader(lightfragment, SHADER_LIGHTING, GL_FRAGMENT_SHADER_ARB);
-	if ( !mLightFragment )
-	{
-		llwarns << "Failed to load " << lightfragment << llendl;
-		return FALSE;
-	}
-
-	// NOTE: Scatter shaders use the ENVIRONMENT detail level
-	
-	std::string scattervertex = "environment/scatterV.glsl";
-	mScatterVertex = loadShader(scattervertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB);
-	if ( !mScatterVertex )
-	{
-		llwarns << "Failed to load " << scattervertex << llendl;
-		return FALSE;
-	}
-
-	std::string scatterfragment = "environment/scatterF.glsl";
-	mScatterFragment = loadShader(scatterfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB);
-	if ( !mScatterFragment )
-	{
-		llwarns << "Failed to load " << scatterfragment << llendl;
-		return FALSE;
-	}
-	
-	return TRUE;
-}
-
-BOOL LLPipeline::loadShadersEnvironment()
-{
-	GLhandleARB baseObjects[] = 
-	{
-		mLightFragment,
-		mLightVertex,
-		mScatterFragment,
-		mScatterVertex
-	};
-	S32 baseCount = 4;
-
-	BOOL success = TRUE;
-
-	if (mVertexShaderLevel[SHADER_ENVIRONMENT] == 0)
-	{
-		mWaterProgram.unload();
-		mGroundProgram.unload();
-		mTerrainProgram.unload();
-		mGlowProgram.unload();
-		return FALSE;
-	}
-	
-	if (success)
-	{
-		//load water vertex shader
-		std::string waterfragment = "environment/waterF.glsl";
-		std::string watervertex = "environment/waterV.glsl";
-		mWaterProgram.mProgramObject = glCreateProgramObjectARB();
-		mWaterProgram.attachObjects(baseObjects, baseCount);
-		mWaterProgram.attachObject(loadShader(watervertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB));
-		mWaterProgram.attachObject(loadShader(waterfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB));
-
-		success = mWaterProgram.mapAttributes();	
-		if (success)
-		{
-			success = mWaterProgram.mapUniforms(sWaterUniforms, sWaterUniformCount);
-		}
-		if (!success)
-		{
-			llwarns << "Failed to load " << watervertex << llendl;
-		}
-	}
-	if (success)
-	{
-		//load ground vertex shader
-		std::string groundvertex = "environment/groundV.glsl";
-		std::string groundfragment = "environment/groundF.glsl";
-		mGroundProgram.mProgramObject = glCreateProgramObjectARB();
-		mGroundProgram.attachObjects(baseObjects, baseCount);
-		mGroundProgram.attachObject(loadShader(groundvertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB));
-		mGroundProgram.attachObject(loadShader(groundfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB));
-	
-		success = mGroundProgram.mapAttributes();
-		if (success)
-		{
-			success = mGroundProgram.mapUniforms();
-		}
-		if (!success)
-		{
-			llwarns << "Failed to load " << groundvertex << llendl;
-		}
-	}
-
-	if (success)
-	{
-		//load terrain vertex shader
-		std::string terrainvertex = "environment/terrainV.glsl";
-		std::string terrainfragment = "environment/terrainF.glsl";
-		mTerrainProgram.mProgramObject = glCreateProgramObjectARB();
-		mTerrainProgram.attachObjects(baseObjects, baseCount);
-		mTerrainProgram.attachObject(loadShader(terrainvertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB));
-		mTerrainProgram.attachObject(loadShader(terrainfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB));
-		success = mTerrainProgram.mapAttributes();
-		if (success)
-		{
-			success = mTerrainProgram.mapUniforms(sTerrainUniforms, sTerrainUniformCount);
-		}
-		if (!success)
-		{
-			llwarns << "Failed to load " << terrainvertex << llendl;
-		}
-	}
-
-	if (success)
-	{
-		//load glow shader
-		std::string glowvertex = "environment/glowV.glsl";
-		std::string glowfragment = "environment/glowF.glsl";
-		mGlowProgram.mProgramObject = glCreateProgramObjectARB();
-		mGlowProgram.attachObjects(baseObjects, baseCount);
-		mGlowProgram.attachObject(loadShader(glowvertex, SHADER_ENVIRONMENT, GL_VERTEX_SHADER_ARB));
-		mGlowProgram.attachObject(loadShader(glowfragment, SHADER_ENVIRONMENT, GL_FRAGMENT_SHADER_ARB));
-		success = mGlowProgram.mapAttributes();
-		if (success)
-		{
-			success = mGlowProgram.mapUniforms(sGlowUniforms, sGlowUniformCount);
-		}
-		if (!success)
-		{
-			llwarns << "Failed to load " << glowvertex << llendl;
-		}
-	}
-
-	if( !success )
-	{
-		mVertexShaderLevel[SHADER_ENVIRONMENT] = 0;
-		mMaxVertexShaderLevel[SHADER_ENVIRONMENT] = 0;
-		return FALSE;
-	}
-	
-	if (gWorldPointer)
-	{
-		gWorldPointer->updateWaterObjects();
-	}
-	
-	return TRUE;
-}
-
-BOOL LLPipeline::loadShadersObject()
-{
-	GLhandleARB baseObjects[] = 
-	{
-		mLightFragment,
-		mLightVertex,
-		mScatterFragment,
-		mScatterVertex
-	};
-	S32 baseCount = 4;
-
-	BOOL success = TRUE;
-
-	if (mVertexShaderLevel[SHADER_OBJECT] == 0)
-	{
-		mObjectShinyProgram.unload();
-		mObjectSimpleProgram.unload();
-		mObjectBumpProgram.unload();
-		mObjectAlphaProgram.unload();
-		return FALSE;
-	}
-
-#if 0
-	if (success)
-	{
-		//load object (volume/tree) vertex shader
-		std::string simplevertex = "objects/simpleV.glsl";
-		std::string simplefragment = "objects/simpleF.glsl";
-		mObjectSimpleProgram.mProgramObject = glCreateProgramObjectARB();
-		mObjectSimpleProgram.attachObjects(baseObjects, baseCount);
-		mObjectSimpleProgram.attachObject(loadShader(simplevertex, SHADER_OBJECT, GL_VERTEX_SHADER_ARB));
-		mObjectSimpleProgram.attachObject(loadShader(simplefragment, SHADER_OBJECT, GL_FRAGMENT_SHADER_ARB));
-		success = mObjectSimpleProgram.mapAttributes();
-		if (success)
-		{
-			success = mObjectSimpleProgram.mapUniforms();
-		}
-		if( !success )
-		{
-			llwarns << "Failed to load " << simplevertex << llendl;
-		}
-	}
-	
-	if (success)
-	{
-		//load object bumpy vertex shader
-		std::string bumpshinyvertex = "objects/bumpshinyV.glsl";
-		std::string bumpshinyfragment = "objects/bumpshinyF.glsl";
-		mObjectBumpProgram.mProgramObject = glCreateProgramObjectARB();
-		mObjectBumpProgram.attachObjects(baseObjects, baseCount);
-		mObjectBumpProgram.attachObject(loadShader(bumpshinyvertex, SHADER_OBJECT, GL_VERTEX_SHADER_ARB));
-		mObjectBumpProgram.attachObject(loadShader(bumpshinyfragment, SHADER_OBJECT, GL_FRAGMENT_SHADER_ARB));
-		success = mObjectBumpProgram.mapAttributes();
-		if (success)
-		{
-			success = mObjectBumpProgram.mapUniforms();
-		}
-		if( !success )
-		{
-			llwarns << "Failed to load " << bumpshinyvertex << llendl;
-		}
-	}
-
-	if (success)
-	{
-		//load object alpha vertex shader
-		std::string alphavertex = "objects/alphaV.glsl";
-		std::string alphafragment = "objects/alphaF.glsl";
-		mObjectAlphaProgram.mProgramObject = glCreateProgramObjectARB();
-		mObjectAlphaProgram.attachObjects(baseObjects, baseCount);
-		mObjectAlphaProgram.attachObject(loadShader(alphavertex, SHADER_OBJECT, GL_VERTEX_SHADER_ARB));
-		mObjectAlphaProgram.attachObject(loadShader(alphafragment, SHADER_OBJECT, GL_FRAGMENT_SHADER_ARB));
-
-		success = mObjectAlphaProgram.mapAttributes();
-		if (success)
-		{
-			success = mObjectAlphaProgram.mapUniforms();
-		}
-		if( !success )
-		{
-			llwarns << "Failed to load " << alphavertex << llendl;
-		}
-	}
-#endif
-
-	if (success)
-	{
-		//load shiny vertex shader
-		std::string shinyvertex = "objects/shinyV.glsl";
-		std::string shinyfragment = "objects/shinyF.glsl";
-		mObjectShinyProgram.mProgramObject = glCreateProgramObjectARB();
-		mObjectShinyProgram.attachObjects(baseObjects, baseCount);
-		mObjectShinyProgram.attachObject(loadShader(shinyvertex, SHADER_OBJECT, GL_VERTEX_SHADER_ARB));
-		mObjectShinyProgram.attachObject(loadShader(shinyfragment, SHADER_OBJECT, GL_FRAGMENT_SHADER_ARB));
-
-		success = mObjectShinyProgram.mapAttributes();
-		if (success)
-		{
-			success = mObjectShinyProgram.mapUniforms(LLPipeline::sShinyUniforms, LLPipeline::sShinyUniformCount);
-		}
-		if( !success )
-		{
-			llwarns << "Failed to load " << shinyvertex << llendl;
-		}
-	}
-
-	if( !success )
-	{
-		mVertexShaderLevel[SHADER_OBJECT] = 0;
-		mMaxVertexShaderLevel[SHADER_OBJECT] = 0;
-		return FALSE;
-	}
-	
-	return TRUE;
-}
-
-BOOL LLPipeline::loadShadersAvatar()
-{
-	GLhandleARB baseObjects[] = 
-	{
-		mLightFragment,
-		mLightVertex,
-		mScatterFragment,
-		mScatterVertex
-	};
-	S32 baseCount = 4;
-	
-	BOOL success = TRUE;
-
-	if (mVertexShaderLevel[SHADER_AVATAR] == 0)
-	{
-		mAvatarProgram.unload();
-		mAvatarEyeballProgram.unload();
-		mAvatarPickProgram.unload();
-		return FALSE;
-	}
-	
-	if (success)
-	{
-		//load specular (eyeball) vertex program
-		std::string eyeballvertex = "avatar/eyeballV.glsl";
-		std::string eyeballfragment = "avatar/eyeballF.glsl";
-		mAvatarEyeballProgram.mProgramObject = glCreateProgramObjectARB();
-		mAvatarEyeballProgram.attachObjects(baseObjects, baseCount);
-		mAvatarEyeballProgram.attachObject(loadShader(eyeballvertex, SHADER_AVATAR, GL_VERTEX_SHADER_ARB));
-		mAvatarEyeballProgram.attachObject(loadShader(eyeballfragment, SHADER_AVATAR, GL_FRAGMENT_SHADER_ARB));
-		success = mAvatarEyeballProgram.mapAttributes();
-		if (success)
-		{
-			success = mAvatarEyeballProgram.mapUniforms();
-		}
-		if( !success )
-		{
-			llwarns << "Failed to load " << eyeballvertex << llendl;
-		}
-	}
-
-	if (success)
+	if (mScreenTex)
 	{
-		mAvatarSkinVertex = loadShader("avatar/avatarSkinV.glsl", SHADER_AVATAR, GL_VERTEX_SHADER_ARB);
-		//load avatar vertex shader
-		std::string avatarvertex = "avatar/avatarV.glsl";
-		std::string avatarfragment = "avatar/avatarF.glsl";
-		
-		mAvatarProgram.mProgramObject = glCreateProgramObjectARB();
-		mAvatarProgram.attachObjects(baseObjects, baseCount);
-		mAvatarProgram.attachObject(mAvatarSkinVertex);
-		mAvatarProgram.attachObject(loadShader(avatarvertex, SHADER_AVATAR, GL_VERTEX_SHADER_ARB));
-		mAvatarProgram.attachObject(loadShader(avatarfragment, SHADER_AVATAR, GL_FRAGMENT_SHADER_ARB));
-		
-		success = mAvatarProgram.mapAttributes(sAvatarAttribs, sAvatarAttribCount);
-		if (success)
-		{
-			success = mAvatarProgram.mapUniforms(sAvatarUniforms, sAvatarUniformCount);
-		}
-		if( !success )
-		{
-			llwarns << "Failed to load " << avatarvertex << llendl;
-		}
+		glDeleteTextures(1, &mScreenTex);
+		mScreenTex = 0;
 	}
 
-	if (success)
+	if (mCubeBuffer)
 	{
-		//load avatar picking shader
-		std::string pickvertex = "avatar/pickAvatarV.glsl";
-		std::string pickfragment = "avatar/pickAvatarF.glsl";
-		mAvatarPickProgram.mProgramObject = glCreateProgramObjectARB();
-		mAvatarPickProgram.attachObject(loadShader(pickvertex, SHADER_AVATAR, GL_VERTEX_SHADER_ARB));
-		mAvatarPickProgram.attachObject(loadShader(pickfragment, SHADER_AVATAR, GL_FRAGMENT_SHADER_ARB));
-		mAvatarPickProgram.attachObject(mAvatarSkinVertex);
+		delete mCubeBuffer;
+		mCubeBuffer = NULL;
+	}
 
-		success = mAvatarPickProgram.mapAttributes(sAvatarAttribs, sAvatarAttribCount);
-		if (success)
-		{
-			success = mAvatarPickProgram.mapUniforms(sAvatarUniforms, sAvatarUniformCount);
-		}
-		if( !success )
-		{
-			llwarns << "Failed to load " << pickvertex << llendl;
-		}
+	if (mCubeFrameBuffer)
+	{
+		glDeleteFramebuffersEXT(1, &mCubeFrameBuffer);
+		glDeleteRenderbuffersEXT(1, &mCubeDepth);
+		mCubeDepth = mCubeFrameBuffer = 0;
 	}
 
-	if( !success )
+	if (mFramebuffer[0])
 	{
-		mVertexShaderLevel[SHADER_AVATAR] = 0;
-		mMaxVertexShaderLevel[SHADER_AVATAR] = 0;
-		return FALSE;
+		glDeleteFramebuffersEXT(2, mFramebuffer);
+		mFramebuffer[0] = mFramebuffer[1] = 0;
 	}
-	
-	return TRUE;
 }
 
-BOOL LLPipeline::loadShadersInterface()
+void LLPipeline::restoreGL() 
 {
-	BOOL success = TRUE;
+	resetVertexBuffers();
 
-	if (mVertexShaderLevel[SHADER_INTERFACE] == 0)
+	if (mVertexShadersEnabled)
 	{
-		mHighlightProgram.unload();
-		return FALSE;
+		LLShaderMgr::setShaders();
 	}
 	
-	if (success)
-	{
-		//load highlighting shader
-		std::string highlightvertex = "interface/highlightV.glsl";
-		std::string highlightfragment = "interface/highlightF.glsl";
-		mHighlightProgram.mProgramObject = glCreateProgramObjectARB();
-		mHighlightProgram.attachObject(loadShader(highlightvertex, SHADER_INTERFACE, GL_VERTEX_SHADER_ARB));
-		mHighlightProgram.attachObject(loadShader(highlightfragment, SHADER_INTERFACE, GL_FRAGMENT_SHADER_ARB));
-	
-		success = mHighlightProgram.mapAttributes();
-		if (success)
-		{
-			success = mHighlightProgram.mapUniforms();
-		}
-		if( !success )
+	for (U32 i = 0; i < mObjectPartition.size()-1; i++)
+	{
+		if (mObjectPartition[i])
 		{
-			llwarns << "Failed to load " << highlightvertex << llendl;
+			mObjectPartition[i]->restoreGL();
 		}
 	}
+}
+
 
-	if( !success )
+BOOL LLPipeline::canUseVertexShaders()
+{
+	if (!gGLManager.mHasVertexShader ||
+		!gGLManager.mHasFragmentShader ||
+		!gFeatureManagerp->isFeatureAvailable("VertexShaderEnable") ||
+		mVertexShadersLoaded == -1)
 	{
-		mVertexShaderLevel[SHADER_INTERFACE] = 0;
-		mMaxVertexShaderLevel[SHADER_INTERFACE] = 0;
 		return FALSE;
 	}
-	
-	return TRUE;
+	else
+	{
+		return TRUE;
+	}
+}
+
+void LLPipeline::unloadShaders()
+{
+	LLShaderMgr::unloadShaders();
+	mVertexShadersLoaded = 0;
 }
 
 //============================================================================
@@ -1357,7 +445,7 @@ S32 LLPipeline::setLightingDetail(S32 level)
 
 		if (mVertexShadersLoaded == 1)
 		{
-			gPipeline.setShaders();
+			LLShaderMgr::setShaders();
 		}
 	}
 	return mLightingDetail;
@@ -1384,7 +472,6 @@ public:
 					if (mTextures.find(params->mTexture) != mTextures.end())
 					{ 
 						group->setState(LLSpatialGroup::GEOM_DIRTY);
-						gPipeline.markRebuild(group);
 					}
 				}
 			}
@@ -1828,9 +915,6 @@ void LLPipeline::updateCull(LLCamera& camera)
 		}
 	}
 
-	//do a terse update on some off-screen geometry
-	processGeometry(camera);
-	
 	if (gSky.mVOSkyp.notNull() && gSky.mVOSkyp->mDrawable.notNull())
 	{
 		// Hack for sky - always visible.
@@ -2171,11 +1255,6 @@ void LLPipeline::markTextured(LLDrawable *drawablep)
 	}
 }
 
-void LLPipeline::markRebuild(LLSpatialGroup* group)
-{
-	mGroupQ.insert(group);
-}
-
 void LLPipeline::markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags flag, BOOL priority)
 {
 	LLMemType mt(LLMemType::MTYPE_PIPELINE);
@@ -2475,16 +1554,8 @@ void LLPipeline::postSort(LLCamera& camera)
 	}
 
 
-	//rebuild offscreen geometry
 	if (!sSkipUpdate)
 	{
-		for (LLSpatialGroup::sg_set_t::iterator iter = mGroupQ.begin(); iter != mGroupQ.end(); ++iter)
-		{
-			LLSpatialGroup* group = *iter;
-			group->rebuildGeom();
-		}
-		mGroupQ.clear();
-	
 		//rebuild drawable geometry
 		for (LLSpatialGroup::sg_vector_t::iterator i = mDrawableGroups.begin(); i != mDrawableGroups.end(); ++i)
 		{
@@ -2721,10 +1792,10 @@ void LLPipeline::renderHighlights()
 	LLGLEnable color_mat(GL_COLOR_MATERIAL);
 	disableLights();
 
-	if ((mVertexShaderLevel[SHADER_INTERFACE] > 0))
+	if ((LLShaderMgr::sVertexShaderLevel[LLShaderMgr::SHADER_INTERFACE] > 0))
 	{
-		mHighlightProgram.bind();
-		gPipeline.mHighlightProgram.vertexAttrib4f(LLPipeline::GLSL_MATERIAL_COLOR,1,0,0,0.5f);
+		gHighlightProgram.bind();
+		gHighlightProgram.vertexAttrib4f(LLShaderMgr::MATERIAL_COLOR,1,0,0,0.5f);
 	}
 	
 	if (hasRenderDebugFeatureMask(RENDER_DEBUG_FEATURE_SELECTED))
@@ -2763,9 +1834,9 @@ void LLPipeline::renderHighlights()
 	// have touch-handlers.
 	mHighlightFaces.clear();
 
-	if (mVertexShaderLevel[SHADER_INTERFACE] > 0)
+	if (LLShaderMgr::sVertexShaderLevel[LLShaderMgr::SHADER_INTERFACE] > 0)
 	{
-		mHighlightProgram.unbind();
+		gHighlightProgram.unbind();
 	}
 }
 
@@ -2858,7 +1929,7 @@ void LLPipeline::renderGeom(LLCamera& camera)
 	{
 		LLFastTimer t(LLFastTimer::FTM_POOLS);
 		glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);
-		calcNearbyLights();
+		calcNearbyLights(camera);
 		pool_set_t::iterator iter1 = mPools.begin();
 		while ( iter1 != mPools.end() )
 		{
@@ -3001,22 +2072,6 @@ void LLPipeline::renderGeom(LLCamera& camera)
 	}
 }
 
-void LLPipeline::processGeometry(LLCamera& camera)
-{
-	if (sSkipUpdate)
-	{
-		return;
-	}
-
-	for (U32 i = 0; i < mObjectPartition.size(); i++)
-	{
-		if (mObjectPartition[i] && hasRenderType(mObjectPartition[i]->mDrawableType))
-		{
-			mObjectPartition[i]->processGeometry(&camera);
-		}
-	}
-}
-
 void LLPipeline::processOcclusion(LLCamera& camera)
 {
 	//process occlusion (readback)
@@ -3691,7 +2746,7 @@ static F32 calc_light_dist(LLVOVolume* light, const LLVector3& cam_pos, F32 max_
 	return dist;
 }
 
-void LLPipeline::calcNearbyLights()
+void LLPipeline::calcNearbyLights(LLCamera& camera)
 {
 	if (mLightingDetail >= 1)
 	{
@@ -3699,34 +2754,39 @@ void LLPipeline::calcNearbyLights()
 		// begin() == the closest light and rbegin() == the farthest light
 		const S32 MAX_LOCAL_LIGHTS = 6;
 // 		LLVector3 cam_pos = gAgent.getCameraPositionAgent();
-		LLVector3 cam_pos = gAgent.getPositionAgent();
+		LLVector3 cam_pos = LLPipeline::sSkipUpdate || LLViewerJoystick::sOverrideCamera ?
+						camera.getOrigin() : 
+						gAgent.getPositionAgent();
 
 		F32 max_dist = LIGHT_MAX_RADIUS * 4.f; // ignore enitrely lights > 4 * max light rad
 		
 		// UPDATE THE EXISTING NEARBY LIGHTS
-		light_set_t cur_nearby_lights;
-		for (light_set_t::iterator iter = mNearbyLights.begin();
-			 iter != mNearbyLights.end(); iter++)
+		if (!LLPipeline::sSkipUpdate)
 		{
-			const Light* light = &(*iter);
-			LLDrawable* drawable = light->drawable;
-			LLVOVolume* volight = drawable->getVOVolume();
-			if (!volight || !drawable->isState(LLDrawable::LIGHT))
-			{
-				drawable->clearState(LLDrawable::NEARBY_LIGHT);
-				continue;
-			}
-			if (light->fade <= -LIGHT_FADE_TIME)
-			{
-				drawable->clearState(LLDrawable::NEARBY_LIGHT);
-			}
-			else
+			light_set_t cur_nearby_lights;
+			for (light_set_t::iterator iter = mNearbyLights.begin();
+				iter != mNearbyLights.end(); iter++)
 			{
-				F32 dist = calc_light_dist(volight, cam_pos, max_dist);
-				cur_nearby_lights.insert(Light(drawable, dist, light->fade));
+				const Light* light = &(*iter);
+				LLDrawable* drawable = light->drawable;
+				LLVOVolume* volight = drawable->getVOVolume();
+				if (!volight || !drawable->isState(LLDrawable::LIGHT))
+				{
+					drawable->clearState(LLDrawable::NEARBY_LIGHT);
+					continue;
+				}
+				if (light->fade <= -LIGHT_FADE_TIME)
+				{
+					drawable->clearState(LLDrawable::NEARBY_LIGHT);
+				}
+				else
+				{
+					F32 dist = calc_light_dist(volight, cam_pos, max_dist);
+					cur_nearby_lights.insert(Light(drawable, dist, light->fade));
+				}
 			}
+			mNearbyLights = cur_nearby_lights;
 		}
-		mNearbyLights = cur_nearby_lights;
 		
 		// FIND NEW LIGHTS THAT ARE IN RANGE
 		light_set_t new_nearby_lights;
@@ -3861,7 +2921,7 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
 			LLColor4  light_color = light->getLightColor();
 			light_color.mV[3] = 0.0f;
 
-			F32 fade = iter->fade;
+			F32 fade = LLPipeline::sSkipUpdate ? 1.f : iter->fade;
 			if (fade < LIGHT_FADE_TIME)
 			{
 				// fade in/out light
@@ -4407,255 +3467,6 @@ BOOL LLPipeline::getRenderSoundBeacons(void*)
 	return sRenderSoundBeacons;
 }
 
-//===============================
-// LLGLSL Shader implementation
-//===============================
-LLGLSLShader::LLGLSLShader()
-: mProgramObject(0)
-{ }
-
-void LLGLSLShader::unload()
-{
-	stop_glerror();
-	mAttribute.clear();
-	mTexture.clear();
-	mUniform.clear();
-
-	if (mProgramObject)
-	{
-		GLhandleARB obj[1024];
-		GLsizei count;
-
-		glGetAttachedObjectsARB(mProgramObject, 1024, &count, obj);
-		for (GLsizei i = 0; i < count; i++)
-		{
-			glDeleteObjectARB(obj[i]);
-		}
-
-		glDeleteObjectARB(mProgramObject);
-
-		mProgramObject = 0;
-	}
-	
-	//hack to make apple not complain
-	glGetError();
-	
-	stop_glerror();
-}
-
-void LLGLSLShader::attachObject(GLhandleARB object)
-{
-	if (object != 0)
-	{
-		stop_glerror();
-		glAttachObjectARB(mProgramObject, object);
-		stop_glerror();
-	}
-	else
-	{
-		llwarns << "Attempting to attach non existing shader object. " << llendl;
-	}
-}
-
-void LLGLSLShader::attachObjects(GLhandleARB* objects, S32 count)
-{
-	for (S32 i = 0; i < count; i++)
-	{
-		attachObject(objects[i]);
-	}
-}
-
-BOOL LLGLSLShader::mapAttributes(const char** attrib_names, S32 count)
-{
-	//link the program
-	BOOL res = link();
-
-	mAttribute.clear();
-	mAttribute.resize(LLPipeline::sReservedAttribCount + count, -1);
-	
-	if (res)
-	{ //read back channel locations
-
-		//read back reserved channels first
-		for (S32 i = 0; i < (S32) LLPipeline::sReservedAttribCount; i++)
-		{
-			const char* name = LLPipeline::sReservedAttribs[i];
-			S32 index = glGetAttribLocationARB(mProgramObject, name);
-			if (index != -1)
-			{
-				mAttribute[i] = index;
-				llinfos << "Attribute " << name << " assigned to channel " << index << llendl;
-			}
-		}
-
-		for (S32 i = 0; i < count; i++)
-		{
-			const char* name = attrib_names[i];
-			S32 index = glGetAttribLocationARB(mProgramObject, name);
-			if (index != -1)
-			{
-				mAttribute[LLPipeline::sReservedAttribCount + i] = index;
-				llinfos << "Attribute " << name << " assigned to channel " << index << llendl;
-			}
-		}
-
-		return TRUE;
-	}
-	
-	return FALSE;
-}
-
-void LLGLSLShader::mapUniform(GLint index, const char** uniform_names, S32 count)
-{
-	if (index == -1)
-	{
-		return;
-	}
-
-	GLenum type;
-	GLsizei length;
-	GLint size;
-	char name[1024];		/* Flawfinder: ignore */
-	name[0] = 0;
-
-	glGetActiveUniformARB(mProgramObject, index, 1024, &length, &size, &type, name);
-	
-	//find the index of this uniform
-	for (S32 i = 0; i < (S32) LLPipeline::sReservedUniformCount; i++)
-	{
-		if (mUniform[i] == -1 && !strncmp(LLPipeline::sReservedUniforms[i],name, strlen(LLPipeline::sReservedUniforms[i])))		/* Flawfinder: ignore */
-		{
-			//found it
-			S32 location = glGetUniformLocationARB(mProgramObject, name);
-			mUniform[i] = location;
-			llinfos << "Uniform " << name << " is at location " << location << llendl;
-			mTexture[i] = mapUniformTextureChannel(location, type);
-			return;
-		}
-	}
-
-	for (S32 i = 0; i < count; i++)
-	{
-		if (mUniform[i+LLPipeline::sReservedUniformCount] == -1 && 
-			!strncmp(uniform_names[i],name, strlen(uniform_names[i])))		/* Flawfinder: ignore */
-		{
-			//found it
-			S32 location = glGetUniformLocationARB(mProgramObject, name);
-			mUniform[i+LLPipeline::sReservedUniformCount] = location;
-			llinfos << "Uniform " << name << " is at location " << location << " stored in index " << 
-				(i+LLPipeline::sReservedUniformCount) << llendl;
-			mTexture[i+LLPipeline::sReservedUniformCount] = mapUniformTextureChannel(location, type);
-			return;
-		}
-	}
-
-	//llinfos << "Unknown uniform: " << name << llendl;
- }
-
-GLint LLGLSLShader::mapUniformTextureChannel(GLint location, GLenum type)
-{
-	if (type >= GL_SAMPLER_1D_ARB && type <= GL_SAMPLER_2D_RECT_SHADOW_ARB)
-	{	//this here is a texture
-		glUniform1iARB(location, mActiveTextureChannels);
-		llinfos << "Assigned to texture channel " << mActiveTextureChannels << llendl;
-		return mActiveTextureChannels++;
-	}
-	return -1;
-}
-
-BOOL LLGLSLShader::mapUniforms(const char** uniform_names,  S32 count)
-{
-	BOOL res = TRUE;
-	
-	mActiveTextureChannels = 0;
-	mUniform.clear();
-	mTexture.clear();
-
-	//initialize arrays
-	mUniform.resize(count + LLPipeline::sReservedUniformCount, -1);
-	mTexture.resize(count + LLPipeline::sReservedUniformCount, -1);
-	
-	bind();
-
-	//get the number of active uniforms
-	GLint activeCount;
-	glGetObjectParameterivARB(mProgramObject, GL_OBJECT_ACTIVE_UNIFORMS_ARB, &activeCount);
-
-	for (S32 i = 0; i < activeCount; i++)
-	{
-		mapUniform(i, uniform_names, count);
-	}
-	
-	unbind();
-
-	return res;
-}
-
-BOOL LLGLSLShader::link(BOOL suppress_errors)
-{
-	return gPipeline.linkProgramObject(mProgramObject, suppress_errors);
-}
-
-void LLGLSLShader::bind()
-{
-	glUseProgramObjectARB(mProgramObject);
-	if (mAttribute.size() > 0)
-	{
-		gPipeline.mMaterialIndex = mAttribute[0];
-	}
-}
-
-void LLGLSLShader::unbind()
-{
-	for (U32 i = 0; i < mAttribute.size(); ++i)
-	{
-		vertexAttrib4f(i, 0,0,0,1);
-	}
-	glUseProgramObjectARB(0);
-}
-
-S32 LLGLSLShader::enableTexture(S32 uniform, S32 mode)
-{
-	if (uniform < 0 || uniform >= (S32)mTexture.size())
-	{
-		llerrs << "LLGLSLShader::enableTexture: uniform out of range: " << uniform << llendl;
-	}
-	S32 index = mTexture[uniform];
-	if (index != -1)
-	{
-		glActiveTextureARB(GL_TEXTURE0_ARB+index);
-		glEnable(mode);
-	}
-	return index;
-}
-
-S32 LLGLSLShader::disableTexture(S32 uniform, S32 mode)
-{
-	S32 index = mTexture[uniform];
-	if (index != -1)
-	{
-		glActiveTextureARB(GL_TEXTURE0_ARB+index);
-		glDisable(mode);
-	}
-	return index;
-}
-
-void LLGLSLShader::vertexAttrib4f(U32 index, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
-	if (mAttribute[index] > 0)
-	{
-		glVertexAttrib4fARB(mAttribute[index], x, y, z, w);
-	}
-}
-
-void LLGLSLShader::vertexAttrib4fv(U32 index, GLfloat* v)
-{
-	if (mAttribute[index] > 0)
-	{
-		glVertexAttrib4fvARB(mAttribute[index], v);
-	}
-}
-
 LLViewerObject* LLPipeline::pickObject(const LLVector3 &start, const LLVector3 &end, LLVector3 &collision)
 {
 	LLDrawable* drawable = mObjectPartition[PARTITION_VOLUME]->pickDrawable(start, end, collision);
@@ -4847,7 +3658,7 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam,
 	
 	LLVector3 origin = cube_cam.getOrigin();
 
-	gPipeline.calcNearbyLights();
+	gPipeline.calcNearbyLights(cube_cam);
 
 	cube_map->bind();
 	for (S32 i = 0; i < 6; i++)
@@ -4909,7 +3720,7 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam,
 
 	cube_cam.setOrigin(origin);
 	gPipeline.resetDrawOrders();
-	gPipeline.mShinyOrigin.setVec(cube_cam.getOrigin(), cube_cam.getFar()*2.f);
+	gShinyOrigin.setVec(cube_cam.getOrigin(), cube_cam.getFar()*2.f);
 	glMatrixMode(GL_PROJECTION);
 	glPopMatrix();
 	glMatrixMode(GL_MODELVIEW);
@@ -5112,12 +3923,7 @@ void LLPipeline::bindScreenToTexture()
 
 void LLPipeline::renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res, LLVector2 tc1, LLVector2 tc2)
 {
-	mGlowProgram.bind();
-
-	if (!gGLManager.mHasFramebufferObject)
-	{
-		llerrs << "WTF?" << llendl;
-	}
+	gGlowProgram.bind();
 
 	LLGLEnable tex(GL_TEXTURE_2D);
 	LLGLDepthTest depth(GL_FALSE);
@@ -5160,7 +3966,7 @@ void LLPipeline::renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res,
 									i%2==0 ? dest :
 									buffer);
 		
-		glUniform1fARB(mGlowProgram.mUniform[LLPipeline::GLSL_GLOW_DELTA],delta);					
+		glUniform1fARB(gGlowProgram.mUniform[LLShaderMgr::GLOW_DELTA],delta);					
 
 		glBegin(GL_TRIANGLE_STRIP);
 		glTexCoord2f(tc1.mV[0], tc1.mV[1]);
@@ -5182,7 +3988,7 @@ void LLPipeline::renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res,
 	}
 
 	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
-	mGlowProgram.unbind();
+	gGlowProgram.unbind();
 
 	glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
 
@@ -5220,107 +4026,3 @@ void LLPipeline::renderBloom(GLuint source, GLuint dest, GLuint buffer, U32 res,
 	glPopMatrix();
 }
 
-void LLPipeline::updateCamera()
-{
-	LLWindow* window = gViewerWindow->getWindow();
-
-	F32 time = gFrameIntervalSeconds;
-
-	S32 axis[] = 
-	{
-		gSavedSettings.getS32("JoystickAxis0"),
-		gSavedSettings.getS32("JoystickAxis1"),
-		gSavedSettings.getS32("JoystickAxis2"),
-		gSavedSettings.getS32("JoystickAxis3"),
-		gSavedSettings.getS32("JoystickAxis4"),
-		gSavedSettings.getS32("JoystickAxis5")
-	};
-
-	F32 axis_scale[] =
-	{
-		gSavedSettings.getF32("JoystickAxisScale0"),
-		gSavedSettings.getF32("JoystickAxisScale1"),
-		gSavedSettings.getF32("JoystickAxisScale2"),
-		gSavedSettings.getF32("JoystickAxisScale3"),
-		gSavedSettings.getF32("JoystickAxisScale4"),
-		gSavedSettings.getF32("JoystickAxisScale5")
-	};
-
-	F32 dead_zone[] =
-	{
-		gSavedSettings.getF32("JoystickAxisDeadZone0"),
-		gSavedSettings.getF32("JoystickAxisDeadZone1"),
-		gSavedSettings.getF32("JoystickAxisDeadZone2"),
-		gSavedSettings.getF32("JoystickAxisDeadZone3"),
-		gSavedSettings.getF32("JoystickAxisDeadZone4"),
-		gSavedSettings.getF32("JoystickAxisDeadZone5")
-	};
-
-	F32 cur_delta[6];
-	static F32 last_delta[] = {0,0,0,0,0,0};
-	static F32 delta[] = { 0,0,0,0,0,0 };
-
-	F32 feather = gSavedSettings.getF32("FlycamFeathering");
-	BOOL absolute = gSavedSettings.getBOOL("FlycamAbsolute");
-
-	for (U32 i = 0; i < 6; i++)
-	{
-		cur_delta[i] = window->getJoystickAxis(axis[i]);	
-		F32 tmp = cur_delta[i];
-		if (absolute)
-		{
-			cur_delta[i] = cur_delta[i] - last_delta[i];
-		}
-		last_delta[i] = tmp;
-
-		if (cur_delta[i] > 0)
-		{
-			cur_delta[i] = llmax(cur_delta[i]-dead_zone[i], 0.f);
-		}
-		else
-		{
-			cur_delta[i] = llmin(cur_delta[i]+dead_zone[i], 0.f);
-		}
-		cur_delta[i] *= axis_scale[i];
-		
-		if (!absolute)
-		{
-			cur_delta[i] *= time;
-		}
-
-		delta[i] = delta[i] + (cur_delta[i]-delta[i])*time*feather;
-	}
-	
-	mFlyCamPosition += LLVector3(delta) * mFlyCamRotation;
-
-	LLMatrix3 rot_mat(delta[3],
-					  delta[4],
-					  delta[5]);
-	
-	mFlyCamRotation = LLQuaternion(rot_mat)*mFlyCamRotation;
-
-	if (gSavedSettings.getBOOL("FlycamAutoLeveling"))
-	{
-		LLMatrix3 level(mFlyCamRotation);
-
-		LLVector3 x = LLVector3(level.mMatrix[0]);
-		LLVector3 y = LLVector3(level.mMatrix[1]);
-		LLVector3 z = LLVector3(level.mMatrix[2]);
-
-		y.mV[2] = 0.f;
-		y.normVec();
-
-		level.setRows(x,y,z);
-		level.orthogonalize();
-				
-		LLQuaternion quat = LLQuaternion(level);
-		mFlyCamRotation = nlerp(llmin(feather*time,1.f), mFlyCamRotation, quat);
-	}
-
-	LLMatrix3 mat(mFlyCamRotation);
-
-	gCamera->setOrigin(mFlyCamPosition);
-	gCamera->mXAxis = LLVector3(mat.mMatrix[0]);
-	gCamera->mYAxis = LLVector3(mat.mMatrix[1]);
-	gCamera->mZAxis = LLVector3(mat.mMatrix[2]);
-}
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 4d89b65c90..5baf01de51 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -43,41 +43,6 @@ bool LLRayAABB(const LLVector3 &center, const LLVector3 &size, const LLVector3&
 BOOL LLLineSegmentAABB(const LLVector3& start, const LLVector3& end, const LLVector3& center, const LLVector3& size);
 BOOL setup_hud_matrices(BOOL for_select);
 
-class LLGLSLShader
-{
-public:
-	LLGLSLShader();
-
-	void unload();
-	void attachObject(GLhandleARB object);
-	void attachObjects(GLhandleARB* objects = NULL, S32 count = 0);
-	BOOL mapAttributes(const char** attrib_names = NULL, S32 count = 0);
-	BOOL mapUniforms(const char** uniform_names = NULL,  S32 count = 0);
-	void mapUniform(GLint index, const char** uniform_names = NULL,  S32 count = 0);
-	void vertexAttrib4f(U32 index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-	void vertexAttrib4fv(U32 index, GLfloat* v);
-	
-	GLint mapUniformTextureChannel(GLint location, GLenum type);
-	
-
-	//enable/disable texture channel for specified uniform
-	//if given texture uniform is active in the shader, 
-	//the corresponding channel will be active upon return
-	//returns channel texture is enabled in from [0-MAX)
-	S32 enableTexture(S32 uniform, S32 mode = GL_TEXTURE_2D);
-	S32 disableTexture(S32 uniform, S32 mode = GL_TEXTURE_2D); 
-	
-    BOOL link(BOOL suppress_errors = FALSE);
-	void bind();
-	void unbind();
-
-	GLhandleARB mProgramObject;
-	std::vector<GLint> mAttribute;
-	std::vector<GLint> mUniform;
-	std::vector<GLint> mTexture;
-	S32 mActiveTextureChannels;
-};
-
 class LLPipeline
 {
 public:
@@ -125,7 +90,6 @@ public:
 	void        markShift(LLDrawable *drawablep);
 	void        markTextured(LLDrawable *drawablep);
 	void        markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags flag = LLDrawable::REBUILD_ALL, BOOL priority = FALSE);
-	void		markRebuild(LLSpatialGroup* groupp);
 	void        markRelight(LLDrawable *drawablep, const BOOL now = FALSE);
 	
 	//get the object between start and end that's closest to start.  Return the point of collision in collision.
@@ -149,17 +113,7 @@ public:
 	void		setUseVertexShaders(BOOL use_shaders);
 	BOOL		getUseVertexShaders() const { return mVertexShadersEnabled; }
 	BOOL		canUseVertexShaders();
-	BOOL		setVertexShaderLevel(S32 type, S32 level);
-	S32			getVertexShaderLevel(S32 type) const { return mVertexShaderLevel[type]; }
-	S32			getMaxVertexShaderLevel(S32 type) const { return mMaxVertexShaderLevel[type]; }
-
-	void		setShaders();
 	
-	void		dumpObjectLog(GLhandleARB ret, BOOL warns = TRUE);
-	BOOL		linkProgramObject(GLhandleARB obj, BOOL suppress_errors = FALSE);
-	BOOL		validateProgramObject(GLhandleARB obj);
-	GLhandleARB loadShader(const LLString& filename, S32 cls, GLenum type);
-
 	// phases
 	void resetFrameStats();
 
@@ -187,7 +141,6 @@ public:
 	void renderGeom(LLCamera& camera);
 	void renderHighlights();
 	void renderDebug();
-	void processGeometry(LLCamera& camera);
 	void processOcclusion(LLCamera& camera);
 
 	void renderForSelect(std::set<LLViewerObject*>& objects);
@@ -200,7 +153,7 @@ public:
 	S32  getVisibleCount() const { return mVisibleList.size(); }
 	S32  getLightCount() const { return mLights.size(); }
 
-	void calcNearbyLights();
+	void calcNearbyLights(LLCamera& camera);
 	void setupHWLights(LLDrawPool* pool);
 	void setupAvatarLights(BOOL for_edit = FALSE);
 	void enableLights(U32 mask, F32 shadow_factor);
@@ -250,11 +203,6 @@ private:
 	void initShaders(BOOL force);
 	void unloadShaders();
 	BOOL loadShaders();
-	BOOL loadShadersLighting();
-	BOOL loadShadersObject();
-	BOOL loadShadersAvatar();
-	BOOL loadShadersEnvironment();
-	BOOL loadShadersInterface();
 	void saveVertexShaderLevel(S32 type, S32 level, S32 max);
 	void addToQuickLookup( LLDrawPool* new_poolp );
 	void removeFromQuickLookup( LLDrawPool* poolp );
@@ -262,15 +210,7 @@ private:
 	
 public:
 	enum {GPU_CLASS_MAX = 3 };
-	enum EShaderClass
-	{
-		SHADER_LIGHTING,
-		SHADER_OBJECT,
-		SHADER_AVATAR,
-		SHADER_ENVIRONMENT,
-		SHADER_INTERFACE,
-		SHADER_COUNT
-	};
+
 	enum LLRenderTypeMask
 	{
 		// Following are pool types (some are also object types)
@@ -361,7 +301,7 @@ public:
 	LLSpatialPartition* getSpatialPartition(LLViewerObject* vobj);
 	LLSpatialPartition* getSpatialPartition(U32 index);
 
-	void updateCamera();
+	void updateCamera(BOOL reset = FALSE);
 	
 	LLVector3				mFlyCamPosition;
 	LLQuaternion			mFlyCamRotation;
@@ -390,7 +330,6 @@ public:
 	static BOOL				sSkipUpdate; //skip lod updates
 	static BOOL				sDynamicReflections;
 	static BOOL				sRenderGlow;
-	static BOOL				sOverrideAgentCamera;
 
 	//screen texture
 	GLuint					mScreenTex;
@@ -412,140 +351,7 @@ public:
 	//depth buffer object for rendering dynamic cube maps
 	GLuint					mCubeDepth;
 
-	class LLScatterShader
-	{
-	public:
-		static void init(GLhandleARB shader, int map_stage);
-	};
-	
-	//utility shader objects (not shader programs)
-	GLhandleARB				mLightVertex;
-	GLhandleARB				mLightFragment;
-	GLhandleARB				mScatterVertex;
-	GLhandleARB				mScatterFragment;
-	
-	//global (reserved slot) shader parameters
-	static const char* sReservedAttribs[];
-	static U32 sReservedAttribCount;
-
-	typedef enum 
-	{
-		GLSL_MATERIAL_COLOR = 0,
-		GLSL_SPECULAR_COLOR,
-		GLSL_BINORMAL,
-		GLSL_END_RESERVED_ATTRIBS
-	} eGLSLReservedAttribs;
-
-	static const char* sReservedUniforms[];
-	static U32 sReservedUniformCount;
-	
-	typedef enum
-	{
-		GLSL_DIFFUSE_MAP = 0,
-		GLSL_SPECULAR_MAP,
-		GLSL_BUMP_MAP,
-		GLSL_ENVIRONMENT_MAP,
-		GLSL_END_RESERVED_UNIFORMS
-	} eGLSLReservedUniforms;
-
-	static const char* sShinyUniforms[];
-	static U32 sShinyUniformCount;
-
-	typedef enum
-	{
-		GLSL_SHINY_ORIGIN = GLSL_END_RESERVED_UNIFORMS
-	} eShinyUniforms;
-
-	LLVector4				mShinyOrigin;
-
-	//object shaders
-	LLGLSLShader			mObjectSimpleProgram;
-	LLGLSLShader			mObjectAlphaProgram;
-	LLGLSLShader			mObjectBumpProgram;
-	LLGLSLShader			mObjectShinyProgram;
-
-	//water parameters
-	static const char* sWaterUniforms[];
-	static U32 sWaterUniformCount;
-
-	typedef enum
-	{
-		GLSL_WATER_SCREENTEX = GLSL_END_RESERVED_UNIFORMS,
-		GLSL_WATER_EYEVEC,
-		GLSL_WATER_TIME,
-		GLSL_WATER_WAVE_DIR1,
-		GLSL_WATER_WAVE_DIR2,
-		GLSL_WATER_LIGHT_DIR,
-		GLSL_WATER_SPECULAR,
-		GLSL_WATER_SPECULAR_EXP,
-		GLSL_WATER_FBSCALE,
-		GLSL_WATER_REFSCALE
-	} eWaterUniforms;
-		
-
-	//terrain parameters
-	static const char* sTerrainUniforms[];
-	static U32 sTerrainUniformCount;
-
-	typedef enum
-	{
-		GLSL_TERRAIN_DETAIL0 = GLSL_END_RESERVED_UNIFORMS,
-		GLSL_TERRAIN_DETAIL1,
-		GLSL_TERRAIN_ALPHARAMP
-	} eTerrainUniforms;
-
-	//glow parameters
-	static const char* sGlowUniforms[];
-	static U32 sGlowUniformCount;
-
-	typedef enum
-	{
-		GLSL_GLOW_DELTA = GLSL_END_RESERVED_UNIFORMS
-	} eGlowUniforms;
-
-	//environment shaders
-	LLGLSLShader			mTerrainProgram;
-	LLGLSLShader			mGlowProgram;
-	LLGLSLShader			mGroundProgram;
-	LLGLSLShader			mWaterProgram;
-
-	//interface shaders
-	LLGLSLShader			mHighlightProgram;
 	
-	//avatar shader parameter tables
-	static const char* sAvatarAttribs[];
-	static U32 sAvatarAttribCount;
-
-	typedef enum
-	{
-		GLSL_AVATAR_WEIGHT = GLSL_END_RESERVED_ATTRIBS,
-		GLSL_AVATAR_CLOTHING,
-		GLSL_AVATAR_WIND,
-		GLSL_AVATAR_SINWAVE,
-		GLSL_AVATAR_GRAVITY
-	} eAvatarAttribs;
-
-	static const char* sAvatarUniforms[];
-	static U32 sAvatarUniformCount;
-
-	typedef enum
-	{
-		GLSL_AVATAR_MATRIX = GLSL_END_RESERVED_UNIFORMS
-	} eAvatarUniforms;
-
-	//avatar skinning utility shader object
-	GLhandleARB				mAvatarSkinVertex;
-
-	//avatar shader handles
-	LLGLSLShader			mAvatarProgram;
-	LLGLSLShader			mAvatarEyeballProgram;
-	LLGLSLShader			mAvatarPickProgram;
-	
-	//current avatar shader parameter pointer
-	GLint					mAvatarMatrixParam;
-	GLint					mMaterialIndex;
-	GLint					mSpecularIndex;
-
 	LLColor4				mSunDiffuse;
 	LLVector3				mSunDir;
 
@@ -557,13 +363,11 @@ public:
 	LLSpatialGroup::sg_vector_t mDrawableGroups;
 
 	void clearRenderMap();
-	
-protected:
+
 	BOOL					mVertexShadersEnabled;
 	S32						mVertexShadersLoaded; // 0 = no, 1 = yes, -1 = failed
-	S32						mVertexShaderLevel[SHADER_COUNT];
-	S32						mMaxVertexShaderLevel[SHADER_COUNT];
-	
+
+protected:
 	U32						mRenderTypeMask;
 	U32						mRenderFeatureMask;
 	U32						mRenderDebugFeatureMask;
@@ -619,7 +423,6 @@ protected:
 	//
 	LLDrawable::drawable_list_t 	mBuildQ1; // priority
 	LLDrawable::drawable_list_t 	mBuildQ2; // non-priority
-	LLSpatialGroup::sg_set_t		mGroupQ; //spatial groups
 	
 	LLDrawable::drawable_set_t		mActiveQ;
 	
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 2c04a34da8..e9dfa0a382 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -272,9 +272,6 @@ class DarwinManifest(ViewerManifest):
                         if self.prefix(src="", dst="Resources"):
                                 super(DarwinManifest, self).construct()
 
-                                # the trial directory seems to be not used [rdw]
-                                self.path('trial')
-
                                 if self.prefix("cursors_mac"):
                                         self.path("*.tif")
                                         self.end_prefix("cursors_mac")
-- 
cgit v1.2.3