diff --git a/.hgignore b/.hgignore
index 648ea3eabbfd5c7f85e4962cf32a4150f83f4157..6ed2a0c5f71a70dc0f683a12700af8e720f80103 100644
--- a/.hgignore
+++ b/.hgignore
@@ -1,36 +1,36 @@
-syntax: glob
-
-*.pyc
-*~
-.*.swp
-LICENSES
-indra/.distcc
-indra/build-darwin-*
-indra/build-vc[0-9]*
-indra/lib/mono/1.0/*.dll
-indra/lib/mono/indra/*.dll
-indra/lib/mono/indra/*.exe
-indra/lib/mono/indra/*.pdb
-indra/lib/python/eventlet/
-indra/llwindow/glh/glh_linear.h
-indra/newview/app_settings/mozilla
-indra/newview/app_settings/mozilla-runtime-*
-indra/newview/app_settings/mozilla_debug
-indra/newview/app_settings/static_*.db2
-indra/newview/character
-indra/newview/fmod.dll
-indra/newview/mozilla-theme
-indra/newview/mozilla-universal-darwin.tgz
-indra/newview/res-sdl
-indra/newview/skins
-indra/newview/vivox-runtime
-indra/server-linux-*
-indra/test_apps/llmediatest/dependencies/i686-win32
-indra/test_apps/terrain_mule/*.dll
-indra/viewer-linux-*
-indra/web/doc/asset-upload/plugins/lsl_compiler/lslc
-indra/web/doc/asset-upload/plugins/verify-notecard
-indra/web/doc/asset-upload/plugins/verify-texture
-installed.xml
-libraries
-tarfile_tmp
+syntax: glob
+
+*.pyc
+*~
+.*.swp
+LICENSES
+indra/.distcc
+indra/build-darwin-*
+indra/build-vc[0-9]*
+indra/lib/mono/1.0/*.dll
+indra/lib/mono/indra/*.dll
+indra/lib/mono/indra/*.exe
+indra/lib/mono/indra/*.pdb
+indra/lib/python/eventlet/
+indra/llwindow/glh/glh_linear.h
+indra/newview/app_settings/mozilla
+indra/newview/app_settings/mozilla-runtime-*
+indra/newview/app_settings/mozilla_debug
+indra/newview/app_settings/static_*.db2
+indra/newview/character
+indra/newview/fmod.dll
+indra/newview/mozilla-theme
+indra/newview/mozilla-universal-darwin.tgz
+indra/newview/res-sdl
+indra/newview/skins
+indra/newview/vivox-runtime
+indra/server-linux-*
+indra/test_apps/llmediatest/dependencies/i686-win32
+indra/test_apps/terrain_mule/*.dll
+indra/viewer-linux-*
+indra/web/doc/asset-upload/plugins/lsl_compiler/lslc
+indra/web/doc/asset-upload/plugins/verify-notecard
+indra/web/doc/asset-upload/plugins/verify-texture
+installed.xml
+libraries
+tarfile_tmp
diff --git a/indra/lib/python/indra/util/llversion.py b/indra/lib/python/indra/util/llversion.py
index 770b861ddc1604e6dd2d133aa94513560c154455..2718a85f414cb958db30e8035bf21742583a084b 100644
--- a/indra/lib/python/indra/util/llversion.py
+++ b/indra/lib/python/indra/util/llversion.py
@@ -1,7 +1,7 @@
 """@file llversion.py
 @brief Utility for parsing llcommon/llversion${server}.h
        for the version string and channel string
-       Utility that parses svn info for branch and revision
+       Utility that parses hg or svn info for branch and revision
 
 $LicenseInfo:firstyear=2006&license=mit$
 
@@ -79,8 +79,8 @@ def get_svn_status_matching(regular_expression):
     status, output = commands.getstatusoutput('svn info %s' % get_src_root())
     m = regular_expression.search(output)
     if not m:
-        print "Failed to parse svn info output, resultfollows:"
-        print output
+        print >> sys.stderr, "Failed to parse svn info output, result follows:"
+        print >> sys.stderr, output
         raise Exception, "No matching svn status in "+src_root
     return m.group(1)
 
@@ -92,4 +92,35 @@ def get_svn_revision():
     last_rev_re = re.compile('Last Changed Rev: (\d+)')
     return get_svn_status_matching(last_rev_re)
 
-
+def get_hg_repo():
+    status, output = commands.getstatusoutput('hg showconfig paths.default')
+    if status:
+        print >> sys.stderr, output
+        sys.exit(1)
+    if not output:
+        print >> sys.stderr, 'ERROR: cannot find repo we cloned from'
+        sys.exit(1)
+    return output
+
+def get_hg_changeset():
+    # The right thing to do:
+    # status, output = commands.getstatusoutput('hg id -i')
+    # if status:
+    #     print >> sys.stderr, output
+    #    sys.exit(1)
+
+    # The temporary hack:
+    status, output = commands.getstatusoutput('hg parents --template "{rev}"')
+    if status:
+        print >> sys.stderr, output
+        sys.exit(1)
+    lines = output.splitlines()
+    if len(lines) > 1:
+        print >> sys.stderr, 'ERROR: working directory has %d parents' % len(lines)
+    return lines[0]
+
+def using_svn():
+    return os.path.isdir(os.path.join(get_src_root(), '.svn'))
+
+def using_hg():
+    return os.path.isdir(os.path.join(get_src_root(), '.hg'))
diff --git a/indra/llcommon/llversionserver.h b/indra/llcommon/llversionserver.h
index 23e39ceb08f0f02d5848c45f2cf7d0e56d485b2d..e9e21cffb6950315ffa025a605bc63c2a3f399e6 100644
--- a/indra/llcommon/llversionserver.h
+++ b/indra/llcommon/llversionserver.h
@@ -36,7 +36,7 @@
 const S32 LL_VERSION_MAJOR = 1;
 const S32 LL_VERSION_MINOR = 29;
 const S32 LL_VERSION_PATCH = 0;
-const S32 LL_VERSION_BUILD = 0;
+const S32 LL_VERSION_BUILD = 2425;
 
 const char * const LL_CHANNEL = "Second Life Server";
 
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index 45810a101d66b711ba7b4006e7f0342234008133..04cf98ce19c6464a425945fc33d5f9a7544de03c 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -36,7 +36,7 @@
 const S32 LL_VERSION_MAJOR = 2;
 const S32 LL_VERSION_MINOR = 0;
 const S32 LL_VERSION_PATCH = 0;
-const S32 LL_VERSION_BUILD = 0;
+const S32 LL_VERSION_BUILD = 2425;
 
 const char * const LL_CHANNEL = "Second Life 2009";
 
diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp
index a4304596de59a05aed4cebff37404d57a6079edd..a403c44b71f92c9cea4887c796993977bb4b3d6f 100644
--- a/indra/llmessage/llcachename.cpp
+++ b/indra/llmessage/llcachename.cpp
@@ -551,7 +551,7 @@ BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group)
 // This is a little bit kludgy. LLCacheNameCallback is a slot instead of a function pointer.
 //  The reason it is a slot is so that the legacy get() function below can bind an old callback
 //  and pass it as a slot. The reason it isn't a boost::function is so that trackable behavior
-//  deson't get lost. As a result, we have to bind the slot to a signal to call it, even when
+//  doesn't get lost. As a result, we have to bind the slot to a signal to call it, even when
 //  we call it immediately. -Steve
 // NOTE: Even though passing first and last name is a bit of extra overhead, it eliminates the
 //  potential need for any parsing should any code need to handle first and last name independently.
diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings
index 735424c64787ac02ecb5a4944adee4c8aab6efe2..28853ba032ecf9c6080571f3c3b989acf6aa7753 100644
--- a/indra/newview/English.lproj/InfoPlist.strings
+++ b/indra/newview/English.lproj/InfoPlist.strings
@@ -2,6 +2,6 @@
 
 CFBundleName = "Second Life";
 
-CFBundleShortVersionString = "Second Life version 2.0.0.0";
-CFBundleGetInfoString = "Second Life version 2.0.0.0, Copyright 2004-2009 Linden Research, Inc.";
+CFBundleShortVersionString = "Second Life version 2.0.0.2425";
+CFBundleGetInfoString = "Second Life version 2.0.0.2425, Copyright 2004-2009 Linden Research, Inc.";
 
diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist
index 7264044d37c0a3c3bddc7a599cd99d43150fdd06..c0a33feaeca0c4c7e887c09cc39d1a4f689702f1 100644
--- a/indra/newview/Info-SecondLife.plist
+++ b/indra/newview/Info-SecondLife.plist
@@ -32,7 +32,7 @@
 		</dict>
 	</array>
 	<key>CFBundleVersion</key>
-	<string>2.0.0.0</string>
+	<string>2.0.0.2425</string>
 	<key>CSResourcesFileMapped</key>
 	<true/>
 </dict>
diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc
index 87a8bd5787a2e240630222c819a5fcb3511cbfab..a5ee78df2c48ba7b894ad3245ae7afa4a2e85b0b 100644
--- a/indra/newview/res/viewerRes.rc
+++ b/indra/newview/res/viewerRes.rc
@@ -138,8 +138,8 @@ TOOLMEDIAOPEN           CURSOR                  "toolmediaopen.cur"
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,0,0,0
- PRODUCTVERSION 2,0,0,0
+ FILEVERSION 2,0,0,2425
+ PRODUCTVERSION 2,0,0,2425
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -156,12 +156,12 @@ BEGIN
         BEGIN
             VALUE "CompanyName", "Linden Lab"
             VALUE "FileDescription", "Second Life"
-            VALUE "FileVersion", "2.0.0.0"
+            VALUE "FileVersion", "2.0.0.2425"
             VALUE "InternalName", "Second Life"
             VALUE "LegalCopyright", "Copyright © 2001-2008, Linden Research, Inc."
             VALUE "OriginalFilename", "SecondLife.exe"
             VALUE "ProductName", "Second Life"
-            VALUE "ProductVersion", "2.0.0.0"
+            VALUE "ProductVersion", "2.0.0.2425"
         END
     END
     BLOCK "VarFileInfo"
diff --git a/indra/newview/skins/default/xui/da/floater_bulk_perms.xml b/indra/newview/skins/default/xui/da/floater_bulk_perms.xml
new file mode 100644
index 0000000000000000000000000000000000000000..77ae7fe060892097cdce8ca386abb61f6a23bdd5
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_bulk_perms.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floaterbulkperms" title="Masse-ændring af rettigheder på indhold">
+	<text name="applyto">
+		Indholdstyper
+	</text>
+	<check_box label="Animationer" name="check_animation"/>
+	<check_box label="Kropsdele" name="check_bodypart"/>
+	<check_box label="Tøj" name="check_clothing"/>
+	<check_box label="Bevægelser" name="check_gesture"/>
+	<check_box label="Landemærker" name="check_landmark"/>
+	<check_box label="Noter" name="check_notecard"/>
+	<check_box label="Objekter" name="check_object"/>
+	<check_box label="Scripts" name="check_script"/>
+	<check_box label="Lyde" name="check_sound"/>
+	<check_box label="Teksturer" name="check_texture"/>
+	<button label="Vælg alle" label_selected="Alle" name="check_all"/>
+	<button label="Fravælg alle" label_selected="Ingen" name="check_none"/>
+	<text name="newperms">
+		Nye rettigheder
+	</text>
+	<check_box label="Del med gruppe" name="share_with_group"/>
+	<check_box label="Tillad enhver at kopiere" name="everyone_copy"/>
+	<text name="NextOwnerLabel">
+		Næste ejer kan:
+	</text>
+	<check_box label="Redigere" name="next_owner_modify"/>
+	<check_box label="Kopiére" name="next_owner_copy"/>
+	<check_box label="Sælge/Give væk" name="next_owner_transfer"/>
+	<button label="Hjælp" name="help"/>
+	<button label="Gem" name="apply"/>
+	<button label="Luk" name="close"/>
+	<string name="nothing_to_modify_text">
+		Valgte indeholder ikke noget som kan redigeres.
+	</string>
+	<string name="status_text">
+		Sætter rettigheder på [NAME]
+	</string>
+	<string name="start_text">
+		Påbegynder forespørgsel på rettighedsændringer...
+	</string>
+	<string name="done_text">
+		Afsluttet forespørgsel på rettighedsændringer.
+	</string>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_font_test.xml b/indra/newview/skins/default/xui/da/floater_font_test.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7d8ef1b310566220ac5a97ab2387fdf888db5483
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_font_test.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="Font test">
+	<text name="linea">
+		OverrideTest, skal vises her som fonten &apos;Times&apos;. (Fra default/xui/en-us)
+	</text>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_perm_prefs.xml b/indra/newview/skins/default/xui/da/floater_perm_prefs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f4b9b0a664e3e786a9294ce5a9a49ee3f0df4380
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_perm_prefs.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="perm prefs" title="Standard tilladelser ved hentning">
+	<panel label="Tilladelser" name="permissions">
+		<button label="?" label_selected="?" name="help"/>
+		<check_box label="Del med gruppe" name="share_with_group"/>
+		<check_box label="Tillad enhver at kopiere" name="everyone_copy"/>
+		<text name="NextOwnerLabel">
+			Næste ejer kan:
+		</text>
+		<check_box label="Redigere" name="next_owner_modify"/>
+		<check_box label="Kopiére" name="next_owner_copy"/>
+		<check_box label="Sælge/Give væk" name="next_owner_transfer"/>
+	</panel>
+	<button label="OK" label_selected="OK" name="ok"/>
+	<button label="Annullér" label_selected="Annullér" name="cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_statistics.xml b/indra/newview/skins/default/xui/da/floater_statistics.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0443553d5091e5d802171d0891be32c214c28c66
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_statistics.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="stats floater" title="Statistik"/>
diff --git a/indra/newview/skins/default/xui/da/menu_mini_map.xml b/indra/newview/skins/default/xui/da/menu_mini_map.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2a711dc5be1060074d80394d9c6e4cbc0e6f68c0
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_mini_map.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="popup">
+	<menu_item_call label="Zoom tæt" name="Zoom Close"/>
+	<menu_item_call label="Zoom mellem" name="Zoom Medium"/>
+	<menu_item_call label="Zoom langt" name="Zoom Far"/>
+	<menu_item_call label="Stop Tracking" name="Stop Tracking"/>
+	<menu_item_call label="Profil..." name="Profile"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
index d7736832a3594355118fba903bb23adee3426abf..a34b00544819d2fda4d97b48c6375fecc19719ff 100644
--- a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<filter_editor select_on_focus="true"
-               background_image_disabled="TextField_Search_Disabled"
-               background_image_focused="TextField_Search_Active">
-  <clear_filter_button label="" 
-                       image_unselected="Icon_Close_Foreground"
-                       image_selected="Icon_Close_Press" />
-</filter_editor>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<filter_editor select_on_focus="true"
+               background_image_disabled="TextField_Search_Disabled"
+               background_image_focused="TextField_Search_Active">
+  <clear_filter_button label="" 
+                       image_unselected="Icon_Close_Foreground"
+                       image_selected="Icon_Close_Press" />
+</filter_editor>
diff --git a/indra/newview/skins/default/xui/en/widgets/list_view.xml b/indra/newview/skins/default/xui/en/widgets/list_view.xml
index c66aeb57a0da8b7464ea83839d60e3967eac8667..2e976bc7556dafcbbbbf62aacaf4724fce393a60 100644
--- a/indra/newview/skins/default/xui/en/widgets/list_view.xml
+++ b/indra/newview/skins/default/xui/en/widgets/list_view.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<list_view
-  fg_selected_color="ListViewSelectedFgColor"
-  bg_selected_color="ListViewSelectedBgColor"
-  bg_color="ListViewBgColor"
-  />
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<list_view
+  fg_selected_color="ListViewSelectedFgColor"
+  bg_selected_color="ListViewSelectedBgColor"
+  bg_color="ListViewBgColor"
+  />
diff --git a/indra/newview/skins/default/xui/en/widgets/split_button.xml b/indra/newview/skins/default/xui/en/widgets/split_button.xml
index b0367b599b66efc85e912949515e0dc27672f291..c0d3c6d7f6f58cc5347a78a3eea3ae982a1c7911 100644
--- a/indra/newview/skins/default/xui/en/widgets/split_button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/split_button.xml
@@ -1,24 +1,24 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<split_button 
- font="SansSerifSmall"
- arrow_position="left"
- follows="right|top">
-    <split_button.arrow_button 
-     name="Arrow Button"
-     label=""
-     font="SansSerifSmall"
-     scale_image="true"
-     image_selected="camera_presets/camera_presets_arrow.png"
-     image_unselected="camera_presets/camera_presets_arrow.png"
-     image_disabled_selected="camera_presets/camera_presets_arrow.png" 
-     image_disabled="camera_presets/camera_presets_arrow.png"
-     width="10"/>
-    <split_button.items_panel
-     background_visible="true"
-     border="true"
-     bg_alpha_color="1 1 1 1"
-     bg_opaq_color="1 1 1 1"
-     layout="topleft"
-     name="item_buttons"
-    />
-</split_button>
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<split_button 
+ font="SansSerifSmall"
+ arrow_position="left"
+ follows="right|top">
+    <split_button.arrow_button 
+     name="Arrow Button"
+     label=""
+     font="SansSerifSmall"
+     scale_image="true"
+     image_selected="camera_presets/camera_presets_arrow.png"
+     image_unselected="camera_presets/camera_presets_arrow.png"
+     image_disabled_selected="camera_presets/camera_presets_arrow.png" 
+     image_disabled="camera_presets/camera_presets_arrow.png"
+     width="10"/>
+    <split_button.items_panel
+     background_visible="true"
+     border="true"
+     bg_alpha_color="1 1 1 1"
+     bg_opaq_color="1 1 1 1"
+     layout="topleft"
+     name="item_buttons"
+    />
+</split_button>
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 91c091283ab2b05cf442f771ad565338012b7b51..bb48e8e572064cbcc240cdf35797e375aedf47fc 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -408,9 +408,16 @@ def package_finish(self):
         self.run_command('"' + proper_windows_path(NSIS_path) + '" ' + self.dst_path_of(tempfile))
         # self.remove(self.dst_path_of(tempfile))
         # If we're on a build machine, sign the code using our Authenticode certificate. JC
-        sign_py = 'C:\\buildscripts\\code-signing\\sign.py'
+        sign_py = os.path.expandvars("${SIGN}")
+        if not sign_py or sign_py == "${SIGN}":
+            sign_py = 'C:\\buildscripts\\code-signing\\sign.py'
+        else:
+            sign_py = sign_py.replace('\\', '\\\\\\\\')
+        python = os.path.expandvars("${PYTHON}")
+        if not python or python == "${PYTHON}":
+            python = 'python'
         if os.path.exists(sign_py):
-            self.run_command(sign_py + ' ' + self.dst_path_of(installer_file))
+            self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of(installer_file).replace('\\', '\\\\\\\\')))
         else:
             print "Skipping code signing,", sign_py, "does not exist"
         self.created_path(self.dst_path_of(installer_file))
diff --git a/scripts/update_version_files.py b/scripts/update_version_files.py
index 9081941521709e01df401be093179d5a7017f32f..ee1ce69a15bb5d865f3f6c6a4e0a647e15b23b43 100755
--- a/scripts/update_version_files.py
+++ b/scripts/update_version_files.py
@@ -241,23 +241,17 @@ def main():
         if update_server:
             server_version = new_version
     else:
-        # Assume we're updating just the build number
-        cl = '%s info "%s"' % (svn, src_root)
-        status, output = _getstatusoutput(cl)
-        if verbose:
-            print
-            print "svn info output:"
-            print "----------------"
-            print output
-
-        branch_match = svn_branch_re.search(output)
-        revision_match = svn_revision_re.search(output)
-        if not branch_match or not revision_match:
-            print "Failed to execute svn info, output follows:"
-            print output
+
+        if llversion.using_svn():
+            revision = llversion.get_svn_revision()
+            branch = llversion.get_svn_branch()
+        elif llversion.using_hg():
+            revision = llversion.get_hg_changeset()
+            branch = llversion.get_hg_repo()
+        else:
+            print >>sys.stderr, "ERROR: could not determine revision and branch"
             return -1
-        branch = branch_match.group(1)
-        revision = revision_match.group(1)
+        
         if skip_on_branch_re and skip_on_branch_re.match(branch):
             print "Release Candidate Build, leaving version files untouched."
             return 0