diff --git a/include/class.i18n.php b/include/class.i18n.php
index 51cedf9a8eb3d4a9c198cf68ef474c2783ad056f..0ddc78e810d98b22759c3b879d6c90465d5cf39a 100644
--- a/include/class.i18n.php
+++ b/include/class.i18n.php
@@ -295,7 +295,7 @@ class Internationalization {
 
         // User-specific translations
         function _N($msgid, $plural, $count) {
-            return TextDomain::lookup()->getTranslation(LC_MESSAGES, $locale)
+            return TextDomain::lookup()->getTranslation(LC_MESSAGES)
                 ->ngettext($msgid, $plural, $count);
         }
 
diff --git a/include/class.signal.php b/include/class.signal.php
index bb174a9aaf01d657ff83193694a771b9ec0f55aa..a98d4cf63a39979382bd668d857994db0afbeb12 100644
--- a/include/class.signal.php
+++ b/include/class.signal.php
@@ -58,7 +58,7 @@ class Signal {
         if (!isset(self::$subscribers[$signal])) self::$subscribers[$signal] = array();
         // XXX: Ensure $object if set is a class
         if ($object && !is_string($object))
-            trigger_error(sprintf(_S("Invalid object: %s: Expected class"), $class));
+            trigger_error(sprintf(_S("Invalid object: %s: Expected class"), $object));
         elseif ($check && !is_callable($check)) {
             trigger_error(_S("Invalid check function: Must be callable"));
             $check = null;
diff --git a/include/class.translation.php b/include/class.translation.php
index cc33b8a1a73a8b75b058b2733cebc666037950d1..1a050167fd6c791a9b9974d794bc8b5b65d7b2c7 100644
--- a/include/class.translation.php
+++ b/include/class.translation.php
@@ -331,6 +331,7 @@ class gettext_reader {
    * @return string verbatim plural form header field
    */
   function extract_plural_forms_header_from_po_header($header) {
+    $regs = array();
     if (preg_match("/(^|\n)plural-forms: ([^\n]*)\n/i", $header, $regs))
       $expr = $regs[2];
     else
@@ -647,7 +648,7 @@ class TextDomain {
     }
 
     function getTranslation($category=LC_MESSAGES, $locale=false) {
-        $locale = $locale ?: self::setlocale(LC_MESSAGES, 0);
+        $locale = $locale ?: self::setLocale(LC_MESSAGES, 0);
         if (!isset($this->l10n[$locale])) {
             // get the current locale
             $bound_path = @$this->path ?: './';
@@ -668,7 +669,8 @@ class TextDomain {
                     break;
                 }
             }
-            $this->l10n[$locale] = new Translation($input, $charset);
+            // TODO: Handle charset hint from the environment
+            $this->l10n[$locale] = new Translation($input);
         }
         return $this->l10n[$locale];
     }
@@ -724,7 +726,7 @@ class TextDomain {
                 }
                 $locale_names[] = "{$m['lang']}@{$m['modifier']}";
             }
-            if ($country) {
+            if ($m['country']) {
                 $locale_names[] = "{$m['lang']}_{$m['country']}";
             }
             $locale_names[] = $m['lang'];
@@ -744,7 +746,7 @@ class TextDomain {
             else
                 // obey LANG variable, maybe extend to support all of LC_* vars
                 // even if we tried to read locale without setting it first
-                return self::setlocale($category, static::$current_locale);
+                return self::setLocale($category, static::$current_locale);
         } else {
             if (function_exists('setlocale')) {
               $ret = setlocale($category, $locale);
diff --git a/include/client/accesslink.inc.php b/include/client/accesslink.inc.php
index 44c2135af16dd98836c4a96e42fc1c2ec9561b60..30c50d4d63c46f28f72414eddba6aafc4a6cdf36 100644
--- a/include/client/accesslink.inc.php
+++ b/include/client/accesslink.inc.php
@@ -39,7 +39,7 @@ else
     </div>
     <div style="display:table-cell;padding-left: 2em;padding-right:90px;">
 <?php if ($cfg && $cfg->getClientRegistrationMode() !== 'disabled') { ?>
-        <?pho echo __('Have an account with us?'); ?>
+        <?php echo __('Have an account with us?'); ?>
         <a href="login.php"><?php echo __('Sign In'); ?></a> <?php
     if ($cfg->isClientRegistrationEnabled()) { ?>
 <?php echo sprintf(__('or %s register for an account %s to access all your tickets.'),
diff --git a/setup/test/run-tests.php b/setup/test/run-tests.php
index 1b641a8926686bf30b33ffb1b1f3edbc384271db..2cf780068159380012cb28331b1a65c6b8aa0126 100644
--- a/setup/test/run-tests.php
+++ b/setup/test/run-tests.php
@@ -14,6 +14,9 @@ ini_set('include_path', './'.PATH_SEPARATOR.INCLUDE_DIR.PATH_SEPARATOR.PEAR_DIR)
 
 $fails = array();
 
+require_once INCLUDE_DIR . 'class.i18n.php';
+Internationalization::bootstrap();
+
 function show_fails() {
     global $fails, $root;
     if ($fails) {
diff --git a/setup/test/tests/stubs.php b/setup/test/tests/stubs.php
index 9479e274486467ffd000bbe7be06690911faa39e..4cb1e9bcc8113b3dd97987ea69f0b7790bc3e6c5 100644
--- a/setup/test/tests/stubs.php
+++ b/setup/test/tests/stubs.php
@@ -92,6 +92,7 @@ class DateTimeZone {
 
 class Phar {
     static function isValidPharFilename() {}
+    function setStub() {}
 }
 
 class ZipArchive {
diff --git a/testlang.php b/testlang.php
deleted file mode 100644
index 52a36620377e5486efbf86d5b2597f7c7081e022..0000000000000000000000000000000000000000
--- a/testlang.php
+++ /dev/null
@@ -1,126 +0,0 @@
-<?php
-#########################################################
-# Copyright © 2008 Darrin Yeager                        #
-# http://www.dyeager.org/                               #
-# Licensed under BSD license.                           #
-#   http://www.dyeager.org/downloads/license-bsd.txt    #
-#########################################################
-
-function getDefaultLanguage() {
-   if (isset($_SERVER["HTTP_ACCEPT_LANGUAGE"]))
-      return parseDefaultLanguage($_SERVER["HTTP_ACCEPT_LANGUAGE"]);
-   else
-      return parseDefaultLanguage(NULL);
-   }
-
-function parseDefaultLanguage($http_accept, $deflang = "en") {
-   if(isset($http_accept) && strlen($http_accept) > 1)  {
-      # Split possible languages into array
-      $x = explode(",",$http_accept);
-      foreach ($x as $val) {
-         #check for q-value and create associative array. No q-value means 1 by rule
-         if(preg_match("/(.*);q=([0-1]{0,1}\.\d{0,4})/i",$val,$matches))
-            $lang[$matches[1]] = (float)$matches[2];
-         else
-            $lang[$val] = 1.0;
-      }
-
-      #return default language (highest q-value)
-      $qval = 0.0;
-      foreach ($lang as $key => $value) {
-         if ($value > $qval) {
-            $qval = (float)$value;
-            $deflang = $key;
-         }
-      }
-   }
-   return strtolower($deflang);
-}
-$language=getDefaultLanguage();
-echo "Your browser preferred language is: '".$language."'<br>";
-
-//get the first and second part of the language code
-if(strpos($language,'_')!==false)
-{
-	$language=substr($language,0,strpos($language,'_'));
-	$lang_dialect=substr($language,strpos($language,'_'));
-}
-elseif(strpos($language,'-')!==false)
-{
-	$language=substr($language,0,strpos($language,'-'));
-	$lang_dialect=substr($language,strpos($language,'-'));
-}
-if(!isset($lang_dialect))
-{
-	$lang_dialect=$language;
-}
-$tmplangcode=$language.'-'.strtolower($lang_dialect);
-if(!file_exists('include/locale/'.$tmplangcode)||!is_dir('include/locale/'.$tmplangcode))
-{
-	$tmplangcode=$language.'_'.strtolower($lang_dialect);
-	if(!file_exists('include/locale/'.$tmplangcode)||!is_dir('include/locale/'.$tmplangcode))
-	{
-		$tmplangcode=$language.'_'.strtoupper($lang_dialect);
-		if(!file_exists('include/locale/'.$tmplangcode)||!is_dir('include/locale/'.$tmplangcode))
-		{
-			$tmplangcode=$language.'-'.strtoupper($lang_dialect);
-			if(!file_exists('include/locale/'.$tmplangcode)||!is_dir('include/locale/'.$tmplangcode))
-			{
-				if(!file_exists('include/locale/'.$language)||!is_dir('include/locale/'.$language)) //check short langcode
-				{
-					$language='en'; //set as default
-				}
-			}
-			else
-			{
-				$language=$tmplangcode;
-			}
-		}
-		else
-		{
-			$language=$tmplangcode;
-		}
-	}
-	else
-	{
-		$language=$tmplangcode;
-	}
-}
-else
-{
-	$language=$tmplangcode;
-}
-//check if a redirect file is in there
-if(file_exists('include/locale/'.$language.'/redirect'))
-{
-	$f = fopen('include/locale/'.$language.'/redirect','r');
-	if($f!==false)
-	{
-		$line = fgets($f);
-		if(strlen($line)>=2) //safety check
-		{
-			echo "using the redirect file include/locale/".$language."/redirect<br>";
-			$language=$line; //redirect language
-			echo "redirecting to '".$language."'<br>";
-		}
-		fclose($f);
-	}
-}
-
-echo "The following folder will be used to translate your osticket: '".$language."'";
-
-
-$old_error_reporting = error_reporting();
-error_reporting (E_ERROR);
-$f = fopen('include/locale/'.$language.'/LC_MESSAGES/messages.mo', 'r');
-$meta = stream_get_meta_data($f);
-if($meta['mode']==NULL)
-{
-	echo '<br><b>ERROR: The translation file "include/locale/'.$language.'/LC_MESSAGES/messages.mo" isn\'t readable, check permissions.</b><br>';
-}
-else
-{
-	fclose($f);
-}
-error_reporting($old_error_reporting);
-?>
\ No newline at end of file