diff --git a/test/harness/Date_constants.js b/test/harness/Date_constants.js
index e69ecbf6a5d3eeab96e4f98a8ac8abfc45958425..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/test/harness/Date_constants.js
+++ b/test/harness/Date_constants.js
@@ -1,20 +0,0 @@
-// Copyright 2009 the Sputnik authors.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-var HoursPerDay = 24;
-var MinutesPerHour = 60;
-var SecondsPerMinute = 60;
-
-var msPerDay = 86400000;
-var msPerSecond = 1000;
-var msPerMinute = 60000;
-var msPerHour = 3600000;
-
-var date_1899_end = -2208988800001;
-var date_1900_start = -2208988800000;
-var date_1969_end = -1;
-var date_1970_start = 0;
-var date_1999_end = 946684799999;
-var date_2000_start = 946684800000;
-var date_2099_end = 4102444799999;
-var date_2100_start = 4102444800000;
diff --git a/test/harness/Date_library.js b/test/harness/Date_library.js
index 51e15d87dc69ef53ec08ab16cbf84253863d8643..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/test/harness/Date_library.js
+++ b/test/harness/Date_library.js
@@ -1,411 +0,0 @@
-// Copyright 2009 the Sputnik authors.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-//the following values are normally generated by the sputnik.py driver
-var $LocalTZ,
-    $DST_start_month,
-    $DST_start_sunday,
-    $DST_start_hour,
-    $DST_start_minutes,
-    $DST_end_month,
-    $DST_end_sunday,
-    $DST_end_hour,
-    $DST_end_minutes;
-
-(function () {
-    /**
-      * Finds the first date, starting from |start|, where |predicate|
-      * holds.
-      */
-    var findNearestDateBefore = function(start, predicate) {
-        var current = start;
-        var month = 1000 * 60 * 60 * 24 * 30;
-        for (var step = month; step > 0; step = Math.floor(step / 3)) {
-            if (!predicate(current)) {
-                while (!predicate(current))
-                    current = new Date(current.getTime() + step);
-                    current = new Date(current.getTime() - step);
-                }
-        }
-        while (!predicate(current)) {
-            current = new Date(current.getTime() + 1);
-        }
-        return current;
-    }
-
-    var juneDate = new Date(2000, 5, 20, 0, 0, 0, 0);
-    var decemberDate = new Date(2000, 11, 20, 0, 0, 0, 0);
-    var juneOffset = juneDate.getTimezoneOffset();
-    var decemberOffset = decemberDate.getTimezoneOffset();
-    var isSouthernHemisphere = (juneOffset > decemberOffset);
-    var winterTime = isSouthernHemisphere ? juneDate : decemberDate;
-    var summerTime = isSouthernHemisphere ? decemberDate : juneDate;
-    
-    var dstStart = findNearestDateBefore(winterTime, function (date) {
-        return date.getTimezoneOffset() == summerTime.getTimezoneOffset();
-    });
-    $DST_start_month = dstStart.getMonth();
-    $DST_start_sunday = dstStart.getDate() > 15 ? '"last"' : '"first"';
-    $DST_start_hour = dstStart.getHours();
-    $DST_start_minutes = dstStart.getMinutes();
-      
-    var dstEnd = findNearestDateBefore(summerTime, function (date) {
-        return date.getTimezoneOffset() == winterTime.getTimezoneOffset();
-    });
-    $DST_end_month = dstEnd.getMonth();
-    $DST_end_sunday = dstEnd.getDate() > 15 ? '"last"' : '"first"';
-    $DST_end_hour = dstEnd.getHours();
-    $DST_end_minutes = dstEnd.getMinutes();
-    
-    return;
-})();
-
-
-//15.9.1.2 Day Number and Time within Day
-function Day(t) {
-  return Math.floor(t/msPerDay);
-}
-
-function TimeWithinDay(t) {
-  return t%msPerDay;
-}
-
-//15.9.1.3 Year Number
-function DaysInYear(y){
-  if(y%4 != 0) return 365;
-  if(y%4 == 0 && y%100 != 0) return 366;
-  if(y%100 == 0 && y%400 != 0) return 365;
-  if(y%400 == 0) return 366;
-}
-
-function DayFromYear(y) {
-  return (365*(y-1970)
-          + Math.floor((y-1969)/4)
-          - Math.floor((y-1901)/100)
-          + Math.floor((y-1601)/400));
-}
-
-function TimeFromYear(y){
-  return msPerDay*DayFromYear(y);
-}
-
-function YearFromTime(t) {
-  t = Number(t);
-  var sign = ( t < 0 ) ? -1 : 1;
-  var year = ( sign < 0 ) ? 1969 : 1970;
-  
-  for(var time = 0;;year += sign){
-    time = TimeFromYear(year);
-    
-    if(sign > 0 && time > t){
-      year -= sign;
-      break;
-    }
-    else if(sign < 0 && time <= t){
-      break;
-    }
-  };
-  return year;
-}
-  
-function InLeapYear(t){
-  if(DaysInYear(YearFromTime(t)) == 365)
-    return 0;
-  
-  if(DaysInYear(YearFromTime(t)) == 366)
-    return 1;
-}
-
-function DayWithinYear(t) {
-  return Day(t)-DayFromYear(YearFromTime(t));
-}
-
-//15.9.1.4 Month Number
-function MonthFromTime(t){
-  var day = DayWithinYear(t);
-  var leap = InLeapYear(t);
-
-  if((0 <= day) && (day < 31)) return 0;
-  if((31 <= day) && (day < (59+leap))) return 1;
-  if(((59+leap) <= day) && (day < (90+leap))) return 2;
-  if(((90+leap) <= day) && (day < (120+leap))) return 3;
-  if(((120+leap) <= day) && (day < (151+leap))) return 4;
-  if(((151+leap) <= day) && (day < (181+leap))) return 5;
-  if(((181+leap) <= day) && (day < (212+leap))) return 6;
-  if(((212+leap) <= day) && (day < (243+leap))) return 7;
-  if(((243+leap) <= day) && (day < (273+leap))) return 8;
-  if(((273+leap) <= day) && (day < (304+leap))) return 9;
-  if(((304+leap) <= day) && (day < (334+leap))) return 10;
-  if(((334+leap) <= day) && (day < (365+leap))) return 11;
-}
-
-//15.9.1.5 Date Number
-function DateFromTime(t) {
-  var day = DayWithinYear(t);
-  var month = MonthFromTime(t);
-  var leap = InLeapYear(t);
-
-  if(month == 0) return day+1;
-  if(month == 1) return day-30;
-  if(month == 2) return day-58-leap;
-  if(month == 3) return day-89-leap;
-  if(month == 4) return day-119-leap;
-  if(month == 5) return day-150-leap;
-  if(month == 6) return day-180-leap;
-  if(month == 7) return day-211-leap;
-  if(month == 8) return day-242-leap;
-  if(month == 9) return day-272-leap;
-  if(month == 10) return day-303-leap;
-  if(month == 11) return day-333-leap;
-}
-
-//15.9.1.6 Week Day
-function WeekDay(t) {
-  var weekday = (Day(t)+4)%7;
-  return (weekday < 0 ? 7+weekday : weekday);
-}
-
-//15.9.1.9 Daylight Saving Time Adjustment
-$LocalTZ = (new Date()).getTimezoneOffset() / -60;
-if (DaylightSavingTA((new Date()).valueOf()) !== 0) {
-   $LocalTZ -= 1;
-}
-var LocalTZA = $LocalTZ*msPerHour;
-
-function DaysInMonth(m, leap) {
-  m = m%12;
-  
-  //April, June, Sept, Nov
-  if(m == 3 || m == 5 || m == 8 || m == 10 ) {
-    return 30;
-  }
-
-  //Jan, March, May, July, Aug, Oct, Dec
-  if(m == 0 || m == 2 || m == 4 || m == 6 || m == 7 || m == 9 || m == 11){
-    return 31;
-  }
-
-  //Feb
-  return 28+leap;
-}
-
-function GetSundayInMonth(t, m, count){
-    var year = YearFromTime(t);
-    
-    if (count==='"first"') {
-        for (var d=1; d <= DaysInMonth(m, InLeapYear(t)); d++) {
-            tempDate = new Date(year, m, d);
-            if (tempDate.getDay()===0) {
-                return tempDate.valueOf();
-            }         
-        }
-    } else if(count==='"last"') {
-        for (var d=DaysInMonth(m, InLeapYear(t)); d>0; d--) {
-            tempDate = new Date(year, m, d);
-            if (tempDate.getDay()===0) {
-                return tempDate.valueOf();
-            }
-        }
-    }
-    throw new Error("Unsupported 'count' arg:" + count);
-}
-/*
-function GetSundayInMonth(t, m, count){
-  var year = YearFromTime(t);
-  var leap = InLeapYear(t);
-  var day = 0;
-  
-  if(m >= 1) day += DaysInMonth(0, leap);
-  if(m >= 2) day += DaysInMonth(1, leap);
-  if(m >= 3) day += DaysInMonth(2, leap);
-  if(m >= 4) day += DaysInMonth(3, leap);
-  if(m >= 5) day += DaysInMonth(4, leap);
-  if(m >= 6) day += DaysInMonth(5, leap);
-  if(m >= 7) day += DaysInMonth(6, leap);
-  if(m >= 8) day += DaysInMonth(7, leap);
-  if(m >= 9) day += DaysInMonth(8, leap);
-  if(m >= 10) day += DaysInMonth(9, leap);
-  if(m >= 11) day += DaysInMonth(10, leap);
-  
-  var month_start = TimeFromYear(year)+day*msPerDay;
-  var sunday = 0;
-  
-  if(count === "last"){
-    for(var last_sunday = month_start+DaysInMonth(m, leap)*msPerDay; 
-      WeekDay(last_sunday)>0;
-      last_sunday -= msPerDay
-    ){};
-    sunday = last_sunday;
-  }
-  else {
-    for(var first_sunday = month_start; 
-      WeekDay(first_sunday)>0;
-      first_sunday += msPerDay
-    ){};
-    sunday = first_sunday+7*msPerDay*(count-1);
-  }
-  
-  return sunday;
-}*/
-
-function DaylightSavingTA(t) {
-//  t = t-LocalTZA;
-
-  var DST_start = GetSundayInMonth(t, $DST_start_month, $DST_start_sunday) +
-                  $DST_start_hour*msPerHour + 
-                  $DST_start_minutes*msPerMinute;
-                  
-  var k = new Date(DST_start);
-  
-  var DST_end   = GetSundayInMonth(t, $DST_end_month, $DST_end_sunday) +
-                  $DST_end_hour*msPerHour +
-                  $DST_end_minutes*msPerMinute;
-
-  if ( t >= DST_start && t < DST_end ) {
-    return msPerHour;
-  } else {
-    return 0;
-  }
-}
-
-//15.9.1.9 Local Time
-function LocalTime(t){
-  return t+LocalTZA+DaylightSavingTA(t);
-}
-
-function UTC(t) {
-  return t-LocalTZA-DaylightSavingTA(t-LocalTZA);
-}
-
-//15.9.1.10 Hours, Minutes, Second, and Milliseconds
-function HourFromTime(t){
-  return Math.floor(t/msPerHour)%HoursPerDay;
-}
-
-function MinFromTime(t){
-  return Math.floor(t/msPerMinute)%MinutesPerHour;
-}
-
-function SecFromTime(t){
-  return Math.floor(t/msPerSecond)%SecondsPerMinute;
-}
-
-function msFromTime(t){
-  return t%msPerSecond;
-}
-
-//15.9.1.11 MakeTime (hour, min, sec, ms)
-function MakeTime(hour, min, sec, ms){
-  if ( !isFinite(hour) || !isFinite(min) || !isFinite(sec) || !isFinite(ms)) {
-    return Number.NaN;
-  }
-
-  hour = ToInteger(hour);
-  min  = ToInteger(min);
-  sec  = ToInteger(sec);
-  ms   = ToInteger(ms);
-
-  return ((hour*msPerHour) + (min*msPerMinute) + (sec*msPerSecond) + ms);
-}
-
-//15.9.1.12 MakeDay (year, month, date)
-function MakeDay(year, month, date) {
-  if ( !isFinite(year) || !isFinite(month) || !isFinite(date)) {
-    return Number.NaN;
-  }
-
-  year = ToInteger(year);
-  month = ToInteger(month);
-  date = ToInteger(date );
-
-  var result5 = year + Math.floor(month/12);
-  var result6 = month%12;
-
-  var sign = ( year < 1970 ) ? -1 : 1;
-  var t =    ( year < 1970 ) ? 1 :  0;
-  var y =    ( year < 1970 ) ? 1969 : 1970;
-
-  if( sign == -1 ){
-    for ( y = 1969; y >= year; y += sign ) {
-      t += sign * DaysInYear(y)*msPerDay;
-    }
-  } else {
-    for ( y = 1970 ; y < year; y += sign ) {
-      t += sign * DaysInYear(y)*msPerDay;
-    }
-  }
-
-  var leap = 0;
-  for ( var m = 0; m < month; m++ ) {
-    //if year is changed, than we need to recalculate leep
-    leap = InLeapYear(t);
-    t += DaysInMonth(m, leap)*msPerDay;
-  }
-
-  if ( YearFromTime(t) != result5 ) {
-    return Number.NaN;
-  }
-  if ( MonthFromTime(t) != result6 ) {
-    return Number.NaN;
-  }
-  if ( DateFromTime(t) != 1 ) {
-    return Number.NaN;
-  }
-
-  return Day(t)+date-1;
-}
-
-//15.9.1.13 MakeDate (day, time)
-function MakeDate( day, time ) {
-  if(!isFinite(day) || !isFinite(time)) {
-    return Number.NaN;
-  }
-  
-  return day*msPerDay+time;
-}
-
-//15.9.1.14 TimeClip (time)
-function TimeClip(time) {
-  if(!isFinite(time) || Math.abs(time) > 8.64e15){
-    return Number.NaN;
-  }
-
-  return ToInteger(time);
-}
-
-//Test Functions
-function ConstructDate(year, month, date, hours, minutes, seconds, ms){
-  /*
-   * 1. Call ToNumber(year)
-   * 2. Call ToNumber(month)
-   * 3. If date is supplied use ToNumber(date); else use 1
-   * 4. If hours is supplied use ToNumber(hours); else use 0
-   * 5. If minutes is supplied use ToNumber(minutes); else use 0
-   * 6. If seconds is supplied use ToNumber(seconds); else use 0
-   * 7. If ms is supplied use ToNumber(ms); else use 0
-   * 8. If Result(1) is not NaN and 0 <= ToInteger(Result(1)) <= 99, Result(8) is
-   * 1900+ToInteger(Result(1)); otherwise, Result(8) is Result(1)
-   * 9. Compute MakeDay(Result(8), Result(2), Result(3))
-   * 10. Compute MakeTime(Result(4), Result(5), Result(6), Result(7))
-   * 11. Compute MakeDate(Result(9), Result(10))
-   * 12. Set the [[Value]] property of the newly constructed object to TimeClip(UTC(Result(11)))
-   */
-  var r1 = Number(year);
-  var r2 = Number(month);
-  var r3 = ((date && arguments.length > 2) ? Number(date) : 1);
-  var r4 = ((hours && arguments.length > 3) ? Number(hours) : 0);   
-  var r5 = ((minutes && arguments.length > 4) ? Number(minutes) : 0);   
-  var r6 = ((seconds && arguments.length > 5) ? Number(seconds) : 0);   
-  var r7 = ((ms && arguments.length > 6) ? Number(ms) : 0);
-  
-  var r8 = r1;
-  
-  if(!isNaN(r1) && (0 <= ToInteger(r1)) && (ToInteger(r1) <= 99))
-    r8 = 1900+r1;
-  
-  var r9 = MakeDay(r8, r2, r3);
-  var r10 = MakeTime(r4, r5, r6, r7);
-  var r11 = MakeDate(r9, r10);
-  
-  return TimeClip(UTC(r11));
-}
\ No newline at end of file
diff --git a/test/harness/cth.js b/test/harness/cth.js
new file mode 100644
index 0000000000000000000000000000000000000000..de7eb49ca0f5963b071f47ef77ca5d9a88c5f283
--- /dev/null
+++ b/test/harness/cth.js
@@ -0,0 +1,29 @@
+/// Copyright (c) 2011 Microsoft Corporation 
+/// 
+/// Redistribution and use in source and binary forms, with or without modification, are permitted provided
+/// that the following conditions are met: 
+///    * Redistributions of source code must retain the above copyright notice, this list of conditions and
+///      the following disclaimer. 
+///    * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and 
+///      the following disclaimer in the documentation and/or other materials provided with the distribution.  
+///    * Neither the name of Microsoft nor the names of its contributors may be used to
+///      endorse or promote products derived from this software without specific prior written permission.
+/// 
+/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
+/// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+/// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+/// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+/// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+/// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+/// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+/// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+
+function testRun(id, path, description, codeString, result, error) {
+  if (result!=="pass") {
+      throw new Error("Test '" + path + "'failed: " + error);
+  }
+}
+
+function testFinished() {
+    //no-op
+}
\ No newline at end of file
diff --git a/test/harness/ed.js b/test/harness/ed.js
index 8d6f444086e0a4ff2a66d6627b7a41dee9c16c6f..e2a27c6a3cd34a37a159075114cbcc6a8e07f5c7 100644
--- a/test/harness/ed.js
+++ b/test/harness/ed.js
@@ -19,9 +19,10 @@
 /// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 
 //Error Detector
-
-window.onerror = function(errorMsg, url, lineNumber) {
-    window.iframeError = errorMsg;
+if (this.window!==undefined) {  //for console support
+    window.onerror = function(errorMsg, url, lineNumber) {
+        window.iframeError = errorMsg;
+    }
 }
 
 //This doesn't work with early errors in current versions of Opera
diff --git a/test/harness/gs.js b/test/harness/gs.js
index 1356a4ff671dad168060b9299073a1f2433ca5a4..aac5186bf785c42d1b8827cf56adfc15bdcbd179 100644
--- a/test/harness/gs.js
+++ b/test/harness/gs.js
@@ -22,18 +22,18 @@
 
 //An exception is expected
 if (testDescrip.negative !== undefined) {
-    //TODO - come up with a generic way of catching the error type from window.onerror
+    //TODO - come up with a generic way of catching the error type from this.onerror
     testDescrip.negative = testDescrip.negative === "NotEarlyError" ?
                 testDescrip.negative : (testDescrip.negative === "^((?!NotEarlyError).)*$" ? 
                 testDescrip.negative : ".");
-    if (window.iframeError === undefined) { //no exception was thrown
+    if (this.iframeError === undefined) { //no exception was thrown
         testRun(testDescrip.id, testDescrip.path, testDescrip.description, testDescrip.code,
                 'fail', 
                 Error('No exception was thrown; expected an error "message" property matching the regular expression "' + testDescrip.negative + '".'));
-    } else if (!(new RegExp(testDescrip.negative, "i").test(window.iframeError))) {  //wrong type of exception thrown
+    } else if (!(new RegExp(testDescrip.negative, "i").test(this.iframeError))) {  //wrong type of exception thrown
         testRun(testDescrip.id, testDescrip.path, testDescrip.description, testDescrip.code,
                 'fail', 
-                Error('Expected an exception with a "message" property matching the regular expression "' + testDescrip.negative +'" to be thrown; actual was "' + window.iframeError + '".'));
+                Error('Expected an exception with a "message" property matching the regular expression "' + testDescrip.negative +'" to be thrown; actual was "' + this.iframeError + '".'));
     } else {
         testRun(testDescrip.id, testDescrip.path, testDescrip.description, testDescrip.code,
                 'pass', undefined);
@@ -41,10 +41,10 @@ if (testDescrip.negative !== undefined) {
 }
 
 //Exception was not expected to be thrown
-else if (window.iframeError !== undefined) {  
+else if (this.iframeError !== undefined) {  
     testRun(testDescrip.id, testDescrip.path, testDescrip.description, testDescrip.code,
             'fail', 
-            Error('Unexpected exception, "' + window.iframeError + '" was thrown.'));
+            Error('Unexpected exception, "' + this.iframeError + '" was thrown.'));
 } 
 
 else {
diff --git a/test/harness/sputnikLib.js b/test/harness/sputnikLib.js
deleted file mode 100644
index 42d314efbb79e9916f659dd2d9e26dc708eaaf34..0000000000000000000000000000000000000000
--- a/test/harness/sputnikLib.js
+++ /dev/null
@@ -1,548 +0,0 @@
-
-// Copyright 2009 the Sputnik authors.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-function Test262Error(message) {
-  if (message) this.message = message;
-}
-
-Test262Error.prototype.toString = function () {
-  return "Test262 Error: " + this.message;
-};
-
-function testFailed(message) {
-  throw new Test262Error(message);
-}
-
-
-function testPrint(message) {
-
-}
-
-
-//adaptors for Test262 framework
-function $PRINT(message) {
-
-}
-
-function $INCLUDE(message) { }
-function $ERROR(message) {
-        testFailed(message);
-    }
-
-function $FAIL(message) {
-        testFailed(message);
-    }
-
-
-
-//Sputnik library definitions
-//Ultimately these should be namespaced some how and only made
-//available to tests that explicitly include them.
-//For now, we just define the globally
-
-//math_precision.js
-// Copyright 2009 the Sputnik authors.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-function getPrecision(num)
-{
-	//TODO: Create a table of prec's,
-	//      because using Math for testing Math isn't that correct.
-
-	log2num = Math.log(Math.abs(num))/Math.LN2;
-	pernum = Math.ceil(log2num);
-	return(2 * Math.pow(2, -52 + pernum));
-	//return(0);
-}
-
-
-//math_isequal.js
-// Copyright 2009 the Sputnik authors.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-var prec;
-function isEqual(num1, num2)
-{
-	if ((num1 === Infinity)&&(num2 === Infinity))
-	{
-		return(true);
-	}
-	if ((num1 === -Infinity)&&(num2 === -Infinity))
-	{
-		return(true);
-	}
-	prec = getPrecision(Math.min(Math.abs(num1), Math.abs(num2)));
-	return(Math.abs(num1 - num2) <= prec);
-	//return(num1 === num2);
-}
-
-//numeric_conversion.js
-// Copyright 2009 the Sputnik authors.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-function ToInteger(p) {
-  x = Number(p);
-
-  if(isNaN(x)){
-    return +0;
-  }
-
-  if((x === +0)
-  || (x === -0)
-  || (x === Number.POSITIVE_INFINITY)
-  || (x === Number.NEGATIVE_INFINITY)){
-     return x;
-  }
-
-  var sign = ( x < 0 ) ? -1 : 1;
-
-  return (sign*Math.floor(Math.abs(x)));
-}
-
-//Date_constants.js
-// Copyright 2009 the Sputnik authors.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-var HoursPerDay = 24;
-var MinutesPerHour = 60;
-var SecondsPerMinute = 60;
-
-var msPerDay = 86400000;
-var msPerSecond = 1000;
-var msPerMinute = 60000;
-var msPerHour = 3600000;
-
-var date_1899_end = -2208988800001;
-var date_1900_start = -2208988800000;
-var date_1969_end = -1;
-var date_1970_start = 0;
-var date_1999_end = 946684799999;
-var date_2000_start = 946684800000;
-var date_2099_end = 4102444799999;
-var date_2100_start = 4102444800000;
-
-//the following values are normally generated by the sputnik.py driver
-// for now, we'll just use 0 for everything
-var $LocalTZ = 0;
-var $DST_start_month = 0;
-var $DST_start_sunday = 0;
-var $DST_start_hour = 0;
-var $DST_start_minutes = 0;
-var $DST_end_month = 0;
-var $DST_end_sunday = 0;
-var $DST_end_hour = 0;
-var $DST_end_minutes = 0;
-
-
-//Date.library.js
-// Copyright 2009 the Sputnik authors.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-//15.9.1.2 Day Number and Time within Day
-function Day(t) {
-  return Math.floor(t/msPerDay);
-}
-
-function TimeWithinDay(t) {
-  return t%msPerDay;
-}
-
-//15.9.1.3 Year Number
-function DaysInYear(y){
-  if(y%4 != 0) return 365;
-  if(y%4 == 0 && y%100 != 0) return 366;
-  if(y%100 == 0 && y%400 != 0) return 365;
-  if(y%400 == 0) return 366;
-}
-
-function DayFromYear(y) {
-  return (365*(y-1970)
-          + Math.floor((y-1969)/4)
-          - Math.floor((y-1901)/100)
-          + Math.floor((y-1601)/400));
-}
-
-function TimeFromYear(y){
-  return msPerDay*DayFromYear(y);
-}
-
-function YearFromTime(t) {
-  t = Number(t);
-  var sign = ( t < 0 ) ? -1 : 1;
-  var year = ( sign < 0 ) ? 1969 : 1970;
-
-  for(var time = 0;;year += sign){
-    time = TimeFromYear(year);
-
-    if(sign > 0 && time > t){
-      year -= sign;
-      break;
-    }
-    else if(sign < 0 && time <= t){
-      break;
-    }
-  };
-  return year;
-}
-
-function InLeapYear(t){
-  if(DaysInYear(YearFromTime(t)) == 365)
-    return 0;
-
-  if(DaysInYear(YearFromTime(t)) == 366)
-    return 1;
-}
-
-function DayWithinYear(t) {
-  return Day(t)-DayFromYear(YearFromTime(t));
-}
-
-//15.9.1.4 Month Number
-function MonthFromTime(t){
-  var day = DayWithinYear(t);
-  var leap = InLeapYear(t);
-
-  if((0 <= day) && (day < 31)) return 0;
-  if((31 <= day) && (day < (59+leap))) return 1;
-  if(((59+leap) <= day) && (day < (90+leap))) return 2;
-  if(((90+leap) <= day) && (day < (120+leap))) return 3;
-  if(((120+leap) <= day) && (day < (151+leap))) return 4;
-  if(((151+leap) <= day) && (day < (181+leap))) return 5;
-  if(((181+leap) <= day) && (day < (212+leap))) return 6;
-  if(((212+leap) <= day) && (day < (243+leap))) return 7;
-  if(((243+leap) <= day) && (day < (273+leap))) return 8;
-  if(((273+leap) <= day) && (day < (304+leap))) return 9;
-  if(((304+leap) <= day) && (day < (334+leap))) return 10;
-  if(((334+leap) <= day) && (day < (365+leap))) return 11;
-}
-
-//15.9.1.5 Date Number
-function DateFromTime(t) {
-  var day = DayWithinYear(t);
-  var month = MonthFromTime(t);
-  var leap = InLeapYear(t);
-
-  if(month == 0) return day+1;
-  if(month == 1) return day-30;
-  if(month == 2) return day-58-leap;
-  if(month == 3) return day-89-leap;
-  if(month == 4) return day-119-leap;
-  if(month == 5) return day-150-leap;
-  if(month == 6) return day-180-leap;
-  if(month == 7) return day-211-leap;
-  if(month == 8) return day-242-leap;
-  if(month == 9) return day-272-leap;
-  if(month == 10) return day-303-leap;
-  if(month == 11) return day-333-leap;
-}
-
-//15.9.1.6 Week Day
-function WeekDay(t) {
-  var weekday = (Day(t)+4)%7;
-  return (weekday < 0 ? 7+weekday : weekday);
-}
-
-//15.9.1.9 Daylight Saving Time Adjustment
-var LocalTZA = $LocalTZ*msPerHour;
-
-function DaysInMonth(m, leap) {
-  m = m%12;
-
-  //April, June, Sept, Nov
-  if(m == 3 || m == 5 || m == 8 || m == 10 ) {
-    return 30;
-  }
-
-  //Jan, March, May, July, Aug, Oct, Dec
-  if(m == 0 || m == 2 || m == 4 || m == 6 || m == 7 || m == 9 || m == 11){
-    return 31;
-  }
-
-  //Feb
-  return 28+leap;
-}
-
-function GetSundayInMonth(t, m, count){
-  var year = YearFromTime(t);
-  var leap = InLeapYear(t);
-  var day = 0;
-
-  if(m >= 1) day += DaysInMonth(0, leap);
-  if(m >= 2) day += DaysInMonth(1, leap);
-  if(m >= 3) day += DaysInMonth(2, leap);
-  if(m >= 4) day += DaysInMonth(3, leap);
-  if(m >= 5) day += DaysInMonth(4, leap);
-  if(m >= 6) day += DaysInMonth(5, leap);
-  if(m >= 7) day += DaysInMonth(6, leap);
-  if(m >= 8) day += DaysInMonth(7, leap);
-  if(m >= 9) day += DaysInMonth(8, leap);
-  if(m >= 10) day += DaysInMonth(9, leap);
-  if(m >= 11) day += DaysInMonth(10, leap);
-
-  var month_start = TimeFromYear(year)+day*msPerDay;
-  var sunday = 0;
-
-  if(count === "last"){
-    for(var last_sunday = month_start+DaysInMonth(m, leap)*msPerDay;
-      WeekDay(last_sunday)>0;
-      last_sunday -= msPerDay
-    ){};
-    sunday = last_sunday;
-  }
-  else {
-    for(var first_sunday = month_start;
-      WeekDay(first_sunday)>0;
-      first_sunday += msPerDay
-    ){};
-    sunday = first_sunday+7*msPerDay*(count-1);
-  }
-
-  return sunday;
-}
-
-function DaylightSavingTA(t) {
-  t = t-LocalTZA;
-
-  var DST_start = GetSundayInMonth(t, $DST_start_month, $DST_start_sunday)
-                  +$DST_start_hour*msPerHour
-                  +$DST_start_minutes*msPerMinute;
-
-  var k = new Date(DST_start);
-
-  var DST_end   = GetSundayInMonth(t, $DST_end_month, $DST_end_sunday)
-                  +$DST_end_hour*msPerHour
-                  +$DST_end_minutes*msPerMinute;
-
-  if ( t >= DST_start && t < DST_end ) {
-    return msPerHour;
-  } else {
-    return 0;
-  }
-}
-
-//15.9.1.9 Local Time
-function LocalTime(t){
-  return t+LocalTZA+DaylightSavingTA(t);
-}
-
-function UTC(t) {
-  return t-LocalTZA-DaylightSavingTA(t-LocalTZA);
-}
-
-//15.9.1.10 Hours, Minutes, Second, and Milliseconds
-function HourFromTime(t){
-  return Math.floor(t/msPerHour)%HoursPerDay;
-}
-
-function MinFromTime(t){
-  return Math.floor(t/msPerMinute)%MinutesPerHour;
-}
-
-function SecFromTime(t){
-  return Math.floor(t/msPerSecond)%SecondsPerMinute;
-}
-
-function msFromTime(t){
-  return t%msPerSecond;
-}
-
-//15.9.1.11 MakeTime (hour, min, sec, ms)
-function MakeTime(hour, min, sec, ms){
-  if ( !isFinite(hour) || !isFinite(min) || !isFinite(sec) || !isFinite(ms)) {
-    return Number.NaN;
-  }
-
-  hour = ToInteger(hour);
-  min  = ToInteger(min);
-  sec  = ToInteger(sec);
-  ms   = ToInteger(ms);
-
-  return ((hour*msPerHour) + (min*msPerMinute) + (sec*msPerSecond) + ms);
-}
-
-//15.9.1.12 MakeDay (year, month, date)
-function MakeDay(year, month, date) {
-  if ( !isFinite(year) || !isFinite(month) || !isFinite(date)) {
-    return Number.NaN;
-  }
-
-  year = ToInteger(year);
-  month = ToInteger(month);
-  date = ToInteger(date );
-
-  var result5 = year + Math.floor(month/12);
-  var result6 = month%12;
-
-  var sign = ( year < 1970 ) ? -1 : 1;
-  var t =    ( year < 1970 ) ? 1 :  0;
-  var y =    ( year < 1970 ) ? 1969 : 1970;
-
-  if( sign == -1 ){
-    for ( y = 1969; y >= year; y += sign ) {
-      t += sign * DaysInYear(y)*msPerDay;
-    }
-  } else {
-    for ( y = 1970 ; y < year; y += sign ) {
-      t += sign * DaysInYear(y)*msPerDay;
-    }
-  }
-
-  var leap = 0;
-  for ( var m = 0; m < month; m++ ) {
-    //if year is changed, than we need to recalculate leep
-    leap = InLeapYear(t);
-    t += DaysInMonth(m, leap)*msPerDay;
-  }
-
-  if ( YearFromTime(t) != result5 ) {
-    return Number.NaN;
-  }
-  if ( MonthFromTime(t) != result6 ) {
-    return Number.NaN;
-  }
-  if ( DateFromTime(t) != 1 ) {
-    return Number.NaN;
-  }
-
-  return Day(t)+date-1;
-}
-
-//15.9.1.13 MakeDate (day, time)
-function MakeDate( day, time ) {
-  if(!isFinite(day) || !isFinite(time)) {
-    return Number.NaN;
-  }
-
-  return day*msPerDay+time;
-}
-
-//15.9.1.14 TimeClip (time)
-function TimeClip(time) {
-  if(!isFinite(time) || Math.abs(time) > 8.64e15){
-    return Number.NaN;
-  }
-
-  return ToInteger(time);
-}
-
-//Test Functions
-function ConstructDate(year, month, date, hours, minutes, seconds, ms){
-  /*
-   * 1. Call ToNumber(year)
-   * 2. Call ToNumber(month)
-   * 3. If date is supplied use ToNumber(date); else use 1
-   * 4. If hours is supplied use ToNumber(hours); else use 0
-   * 5. If minutes is supplied use ToNumber(minutes); else use 0
-   * 6. If seconds is supplied use ToNumber(seconds); else use 0
-   * 7. If ms is supplied use ToNumber(ms); else use 0
-   * 8. If Result(1) is not NaN and 0 <= ToInteger(Result(1)) <= 99,
-   *    Result(8) is 1900+ToInteger(Result(1));
-   *    otherwise, Result(8) is Result(1)
-   * 9. Compute MakeDay(Result(8), Result(2), Result(3))
-   * 10. Compute MakeTime(Result(4), Result(5), Result(6), Result(7))
-   * 11. Compute MakeDate(Result(9), Result(10))
-   * 12. Set the [[Value]] property of the newly constructed object to
-   *     TimeClip(UTC(Result(11)))
-   */
-  var r1 = Number(year);
-  var r2 = Number(month);
-  var r3 = ((date && arguments.length > 2) ? Number(date) : 1);
-  var r4 = ((hours && arguments.length > 3) ? Number(hours) : 0);
-  var r5 = ((minutes && arguments.length > 4) ? Number(minutes) : 0);
-  var r6 = ((seconds && arguments.length > 5) ? Number(seconds) : 0);
-  var r7 = ((ms && arguments.length > 6) ? Number(ms) : 0);
-
-  var r8 = r1;
-
-  if(!isNaN(r1) && (0 <= ToInteger(r1)) && (ToInteger(r1) <= 99))
-    r8 = 1900+r1;
-
-  var r9 = MakeDay(r8, r2, r3);
-  var r10 = MakeTime(r4, r5, r6, r7);
-  var r11 = MakeDate(r9, r10);
-
-  return TimeClip(UTC(r11));
-}
-
-
-
-/**** Python code for initialize the above constants
-// We may want to replicate the following in JavaScript.
-// However, using JS date operations to generate parameters that are then used to
-// test those some date operations seems unsound.  However, it isn't clear if there
-//is a good interoperable alternative.
-
-# Copyright 2009 the Sputnik authors.  All rights reserved.
-# This code is governed by the BSD license found in the LICENSE file.
-
-def GetDaylightSavingsTimes():
-  # Is the given floating-point time in DST?
-  def IsDst(t):
-    return time.localtime(t)[-1]
-  # Binary search to find an interval between the two times no greater than
-  # delta where DST switches, returning the midpoint.
-  def FindBetween(start, end, delta):
-    while end - start > delta:
-      middle = (end + start) / 2
-      if IsDst(middle) == IsDst(start):
-        start = middle
-      else:
-        end = middle
-    return (start + end) / 2
-  now = time.time()
-  one_month = (30 * 24 * 60 * 60)
-  # First find a date with different daylight savings.  To avoid corner cases
-  # we try four months before and after today.
-  after = now + 4 * one_month
-  before = now - 4 * one_month
-  if IsDst(now) == IsDst(before) and IsDst(now) == IsDst(after):
-    logger.warning("Was unable to determine DST info.")
-    return None
-  # Determine when the change occurs between now and the date we just found
-  # in a different DST.
-  if IsDst(now) != IsDst(before):
-    first = FindBetween(before, now, 1)
-  else:
-    first = FindBetween(now, after, 1)
-  # Determine when the change occurs between three and nine months from the
-  # first.
-  second = FindBetween(first + 3 * one_month, first + 9 * one_month, 1)
-  # Find out which switch is into and which if out of DST
-  if IsDst(first - 1) and not IsDst(first + 1):
-    start = second
-    end = first
-  else:
-    start = first
-    end = second
-  return (start, end)
-
-
-def GetDaylightSavingsAttribs():
-  times = GetDaylightSavingsTimes()
-  if not times:
-    return None
-  (start, end) = times
-  def DstMonth(t):
-    return time.localtime(t)[1] - 1
-  def DstHour(t):
-    return time.localtime(t - 1)[3] + 1
-  def DstSunday(t):
-    if time.localtime(t)[2] > 15:
-      return "'last'"
-    else:
-      return "'first'"
-  def DstMinutes(t):
-    return (time.localtime(t - 1)[4] + 1) % 60
-  attribs = { }
-  attribs['start_month'] = DstMonth(start)
-  attribs['end_month'] = DstMonth(end)
-  attribs['start_sunday'] = DstSunday(start)
-  attribs['end_sunday'] = DstSunday(end)
-  attribs['start_hour'] = DstHour(start)
-  attribs['end_hour'] = DstHour(end)
-  attribs['start_minutes'] = DstMinutes(start)
-  attribs['end_minutes'] = DstMinutes(end)
-  return attribs
-
-*********/
\ No newline at end of file
diff --git a/test/harness/sta.js b/test/harness/sta.js
index 5e828c680985730acfe63cfb74927c843cb34ea7..c25198cb5f5345659514451a5717e389ca28cdda 100644
--- a/test/harness/sta.js
+++ b/test/harness/sta.js
@@ -284,6 +284,624 @@ var NotEarlyErrorString = "NotEarlyError";
 var EarlyErrorRePat = "^((?!" + NotEarlyErrorString + ").)*$";
 var NotEarlyError = new Error(NotEarlyErrorString);
 
+//-----------------------------------------------------------------------------
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+function Test262Error(message) {
+    if (message) this.message = message;
+}
+
+Test262Error.prototype.toString = function () {
+    return "Test262 Error: " + this.message;
+};
+
+function testFailed(message) {
+    throw new Test262Error(message);
+}
+
+
+function testPrint(message) {
+
+}
+
+
+//adaptors for Test262 framework
+function $PRINT(message) {
+
+}
+
+function $INCLUDE(message) { }
+function $ERROR(message) {
+    testFailed(message);
+}
+
+function $FAIL(message) {
+    testFailed(message);
+}
+
+
+
+//Sputnik library definitions
+//Ultimately these should be namespaced some how and only made
+//available to tests that explicitly include them.
+//For now, we just define the globally
+
+//math_precision.js
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+function getPrecision(num) {
+    //TODO: Create a table of prec's,
+    //      because using Math for testing Math isn't that correct.
+
+    log2num = Math.log(Math.abs(num)) / Math.LN2;
+    pernum = Math.ceil(log2num);
+    return (2 * Math.pow(2, -52 + pernum));
+    //return(0);
+}
+
+
+//math_isequal.js
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+var prec;
+function isEqual(num1, num2) {
+    if ((num1 === Infinity) && (num2 === Infinity)) {
+        return (true);
+    }
+    if ((num1 === -Infinity) && (num2 === -Infinity)) {
+        return (true);
+    }
+    prec = getPrecision(Math.min(Math.abs(num1), Math.abs(num2)));
+    return (Math.abs(num1 - num2) <= prec);
+    //return(num1 === num2);
+}
+
+//numeric_conversion.js
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+function ToInteger(p) {
+    x = Number(p);
+
+    if (isNaN(x)) {
+        return +0;
+    }
+
+    if ((x === +0)
+  || (x === -0)
+  || (x === Number.POSITIVE_INFINITY)
+  || (x === Number.NEGATIVE_INFINITY)) {
+        return x;
+    }
+
+    var sign = (x < 0) ? -1 : 1;
+
+    return (sign * Math.floor(Math.abs(x)));
+}
+
+//Date_constants.js
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+var HoursPerDay = 24;
+var MinutesPerHour = 60;
+var SecondsPerMinute = 60;
+
+var msPerDay = 86400000;
+var msPerSecond = 1000;
+var msPerMinute = 60000;
+var msPerHour = 3600000;
+
+var date_1899_end = -2208988800001;
+var date_1900_start = -2208988800000;
+var date_1969_end = -1;
+var date_1970_start = 0;
+var date_1999_end = 946684799999;
+var date_2000_start = 946684800000;
+var date_2099_end = 4102444799999;
+var date_2100_start = 4102444800000;
+
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+//the following values are normally generated by the sputnik.py driver
+var $LocalTZ,
+    $DST_start_month,
+    $DST_start_sunday,
+    $DST_start_hour,
+    $DST_start_minutes,
+    $DST_end_month,
+    $DST_end_sunday,
+    $DST_end_hour,
+    $DST_end_minutes;
+
+(function () {
+    /**
+      * Finds the first date, starting from |start|, where |predicate|
+      * holds.
+      */
+    var findNearestDateBefore = function(start, predicate) {
+        var current = start;
+        var month = 1000 * 60 * 60 * 24 * 30;
+        for (var step = month; step > 0; step = Math.floor(step / 3)) {
+            if (!predicate(current)) {
+                while (!predicate(current))
+                    current = new Date(current.getTime() + step);
+                    current = new Date(current.getTime() - step);
+                }
+        }
+        while (!predicate(current)) {
+            current = new Date(current.getTime() + 1);
+        }
+        return current;
+    }
+
+    var juneDate = new Date(2000, 5, 20, 0, 0, 0, 0);
+    var decemberDate = new Date(2000, 11, 20, 0, 0, 0, 0);
+    var juneOffset = juneDate.getTimezoneOffset();
+    var decemberOffset = decemberDate.getTimezoneOffset();
+    var isSouthernHemisphere = (juneOffset > decemberOffset);
+    var winterTime = isSouthernHemisphere ? juneDate : decemberDate;
+    var summerTime = isSouthernHemisphere ? decemberDate : juneDate;
+    
+    var dstStart = findNearestDateBefore(winterTime, function (date) {
+        return date.getTimezoneOffset() == summerTime.getTimezoneOffset();
+    });
+    $DST_start_month = dstStart.getMonth();
+    $DST_start_sunday = dstStart.getDate() > 15 ? '"last"' : '"first"';
+    $DST_start_hour = dstStart.getHours();
+    $DST_start_minutes = dstStart.getMinutes();
+      
+    var dstEnd = findNearestDateBefore(summerTime, function (date) {
+        return date.getTimezoneOffset() == winterTime.getTimezoneOffset();
+    });
+    $DST_end_month = dstEnd.getMonth();
+    $DST_end_sunday = dstEnd.getDate() > 15 ? '"last"' : '"first"';
+    $DST_end_hour = dstEnd.getHours();
+    $DST_end_minutes = dstEnd.getMinutes();
+    
+    return;
+})();
+
+
+//Date.library.js
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+//15.9.1.2 Day Number and Time within Day
+function Day(t) {
+  return Math.floor(t/msPerDay);
+}
+
+function TimeWithinDay(t) {
+  return t%msPerDay;
+}
+
+//15.9.1.3 Year Number
+function DaysInYear(y){
+  if(y%4 != 0) return 365;
+  if(y%4 == 0 && y%100 != 0) return 366;
+  if(y%100 == 0 && y%400 != 0) return 365;
+  if(y%400 == 0) return 366;
+}
+
+function DayFromYear(y) {
+  return (365*(y-1970)
+          + Math.floor((y-1969)/4)
+          - Math.floor((y-1901)/100)
+          + Math.floor((y-1601)/400));
+}
+
+function TimeFromYear(y){
+  return msPerDay*DayFromYear(y);
+}
+
+function YearFromTime(t) {
+  t = Number(t);
+  var sign = ( t < 0 ) ? -1 : 1;
+  var year = ( sign < 0 ) ? 1969 : 1970;
+  
+  for(var time = 0;;year += sign){
+    time = TimeFromYear(year);
+    
+    if(sign > 0 && time > t){
+      year -= sign;
+      break;
+    }
+    else if(sign < 0 && time <= t){
+      break;
+    }
+  };
+  return year;
+}
+  
+function InLeapYear(t){
+  if(DaysInYear(YearFromTime(t)) == 365)
+    return 0;
+  
+  if(DaysInYear(YearFromTime(t)) == 366)
+    return 1;
+}
+
+function DayWithinYear(t) {
+  return Day(t)-DayFromYear(YearFromTime(t));
+}
+
+//15.9.1.4 Month Number
+function MonthFromTime(t){
+  var day = DayWithinYear(t);
+  var leap = InLeapYear(t);
+
+  if((0 <= day) && (day < 31)) return 0;
+  if((31 <= day) && (day < (59+leap))) return 1;
+  if(((59+leap) <= day) && (day < (90+leap))) return 2;
+  if(((90+leap) <= day) && (day < (120+leap))) return 3;
+  if(((120+leap) <= day) && (day < (151+leap))) return 4;
+  if(((151+leap) <= day) && (day < (181+leap))) return 5;
+  if(((181+leap) <= day) && (day < (212+leap))) return 6;
+  if(((212+leap) <= day) && (day < (243+leap))) return 7;
+  if(((243+leap) <= day) && (day < (273+leap))) return 8;
+  if(((273+leap) <= day) && (day < (304+leap))) return 9;
+  if(((304+leap) <= day) && (day < (334+leap))) return 10;
+  if(((334+leap) <= day) && (day < (365+leap))) return 11;
+}
+
+//15.9.1.5 Date Number
+function DateFromTime(t) {
+  var day = DayWithinYear(t);
+  var month = MonthFromTime(t);
+  var leap = InLeapYear(t);
+
+  if(month == 0) return day+1;
+  if(month == 1) return day-30;
+  if(month == 2) return day-58-leap;
+  if(month == 3) return day-89-leap;
+  if(month == 4) return day-119-leap;
+  if(month == 5) return day-150-leap;
+  if(month == 6) return day-180-leap;
+  if(month == 7) return day-211-leap;
+  if(month == 8) return day-242-leap;
+  if(month == 9) return day-272-leap;
+  if(month == 10) return day-303-leap;
+  if(month == 11) return day-333-leap;
+}
+
+//15.9.1.6 Week Day
+function WeekDay(t) {
+  var weekday = (Day(t)+4)%7;
+  return (weekday < 0 ? 7+weekday : weekday);
+}
+
+//15.9.1.9 Daylight Saving Time Adjustment
+$LocalTZ = (new Date()).getTimezoneOffset() / -60;
+if (DaylightSavingTA((new Date()).valueOf()) !== 0) {
+   $LocalTZ -= 1;
+}
+var LocalTZA = $LocalTZ*msPerHour;
+
+function DaysInMonth(m, leap) {
+  m = m%12;
+  
+  //April, June, Sept, Nov
+  if(m == 3 || m == 5 || m == 8 || m == 10 ) {
+    return 30;
+  }
+
+  //Jan, March, May, July, Aug, Oct, Dec
+  if(m == 0 || m == 2 || m == 4 || m == 6 || m == 7 || m == 9 || m == 11){
+    return 31;
+  }
+
+  //Feb
+  return 28+leap;
+}
+
+function GetSundayInMonth(t, m, count){
+    var year = YearFromTime(t);
+    
+    if (count==='"first"') {
+        for (var d=1; d <= DaysInMonth(m, InLeapYear(t)); d++) {
+            tempDate = new Date(year, m, d);
+            if (tempDate.getDay()===0) {
+                return tempDate.valueOf();
+            }         
+        }
+    } else if(count==='"last"') {
+        for (var d=DaysInMonth(m, InLeapYear(t)); d>0; d--) {
+            tempDate = new Date(year, m, d);
+            if (tempDate.getDay()===0) {
+                return tempDate.valueOf();
+            }
+        }
+    }
+    throw new Error("Unsupported 'count' arg:" + count);
+}
+/*
+function GetSundayInMonth(t, m, count){
+  var year = YearFromTime(t);
+  var leap = InLeapYear(t);
+  var day = 0;
+  
+  if(m >= 1) day += DaysInMonth(0, leap);
+  if(m >= 2) day += DaysInMonth(1, leap);
+  if(m >= 3) day += DaysInMonth(2, leap);
+  if(m >= 4) day += DaysInMonth(3, leap);
+  if(m >= 5) day += DaysInMonth(4, leap);
+  if(m >= 6) day += DaysInMonth(5, leap);
+  if(m >= 7) day += DaysInMonth(6, leap);
+  if(m >= 8) day += DaysInMonth(7, leap);
+  if(m >= 9) day += DaysInMonth(8, leap);
+  if(m >= 10) day += DaysInMonth(9, leap);
+  if(m >= 11) day += DaysInMonth(10, leap);
+  
+  var month_start = TimeFromYear(year)+day*msPerDay;
+  var sunday = 0;
+  
+  if(count === "last"){
+    for(var last_sunday = month_start+DaysInMonth(m, leap)*msPerDay; 
+      WeekDay(last_sunday)>0;
+      last_sunday -= msPerDay
+    ){};
+    sunday = last_sunday;
+  }
+  else {
+    for(var first_sunday = month_start; 
+      WeekDay(first_sunday)>0;
+      first_sunday += msPerDay
+    ){};
+    sunday = first_sunday+7*msPerDay*(count-1);
+  }
+  
+  return sunday;
+}*/
+
+function DaylightSavingTA(t) {
+//  t = t-LocalTZA;
+
+  var DST_start = GetSundayInMonth(t, $DST_start_month, $DST_start_sunday) +
+                  $DST_start_hour*msPerHour + 
+                  $DST_start_minutes*msPerMinute;
+                  
+  var k = new Date(DST_start);
+  
+  var DST_end   = GetSundayInMonth(t, $DST_end_month, $DST_end_sunday) +
+                  $DST_end_hour*msPerHour +
+                  $DST_end_minutes*msPerMinute;
+
+  if ( t >= DST_start && t < DST_end ) {
+    return msPerHour;
+  } else {
+    return 0;
+  }
+}
+
+//15.9.1.9 Local Time
+function LocalTime(t){
+  return t+LocalTZA+DaylightSavingTA(t);
+}
+
+function UTC(t) {
+  return t-LocalTZA-DaylightSavingTA(t-LocalTZA);
+}
+
+//15.9.1.10 Hours, Minutes, Second, and Milliseconds
+function HourFromTime(t){
+  return Math.floor(t/msPerHour)%HoursPerDay;
+}
+
+function MinFromTime(t){
+  return Math.floor(t/msPerMinute)%MinutesPerHour;
+}
+
+function SecFromTime(t){
+  return Math.floor(t/msPerSecond)%SecondsPerMinute;
+}
+
+function msFromTime(t){
+  return t%msPerSecond;
+}
+
+//15.9.1.11 MakeTime (hour, min, sec, ms)
+function MakeTime(hour, min, sec, ms){
+  if ( !isFinite(hour) || !isFinite(min) || !isFinite(sec) || !isFinite(ms)) {
+    return Number.NaN;
+  }
+
+  hour = ToInteger(hour);
+  min  = ToInteger(min);
+  sec  = ToInteger(sec);
+  ms   = ToInteger(ms);
+
+  return ((hour*msPerHour) + (min*msPerMinute) + (sec*msPerSecond) + ms);
+}
+
+//15.9.1.12 MakeDay (year, month, date)
+function MakeDay(year, month, date) {
+  if ( !isFinite(year) || !isFinite(month) || !isFinite(date)) {
+    return Number.NaN;
+  }
+
+  year = ToInteger(year);
+  month = ToInteger(month);
+  date = ToInteger(date );
+
+  var result5 = year + Math.floor(month/12);
+  var result6 = month%12;
+
+  var sign = ( year < 1970 ) ? -1 : 1;
+  var t =    ( year < 1970 ) ? 1 :  0;
+  var y =    ( year < 1970 ) ? 1969 : 1970;
+
+  if( sign == -1 ){
+    for ( y = 1969; y >= year; y += sign ) {
+      t += sign * DaysInYear(y)*msPerDay;
+    }
+  } else {
+    for ( y = 1970 ; y < year; y += sign ) {
+      t += sign * DaysInYear(y)*msPerDay;
+    }
+  }
+
+  var leap = 0;
+  for ( var m = 0; m < month; m++ ) {
+    //if year is changed, than we need to recalculate leep
+    leap = InLeapYear(t);
+    t += DaysInMonth(m, leap)*msPerDay;
+  }
+
+  if ( YearFromTime(t) != result5 ) {
+    return Number.NaN;
+  }
+  if ( MonthFromTime(t) != result6 ) {
+    return Number.NaN;
+  }
+  if ( DateFromTime(t) != 1 ) {
+    return Number.NaN;
+  }
+
+  return Day(t)+date-1;
+}
+
+//15.9.1.13 MakeDate (day, time)
+function MakeDate( day, time ) {
+  if(!isFinite(day) || !isFinite(time)) {
+    return Number.NaN;
+  }
+  
+  return day*msPerDay+time;
+}
+
+//15.9.1.14 TimeClip (time)
+function TimeClip(time) {
+  if(!isFinite(time) || Math.abs(time) > 8.64e15){
+    return Number.NaN;
+  }
+
+  return ToInteger(time);
+}
+
+//Test Functions
+function ConstructDate(year, month, date, hours, minutes, seconds, ms){
+  /*
+   * 1. Call ToNumber(year)
+   * 2. Call ToNumber(month)
+   * 3. If date is supplied use ToNumber(date); else use 1
+   * 4. If hours is supplied use ToNumber(hours); else use 0
+   * 5. If minutes is supplied use ToNumber(minutes); else use 0
+   * 6. If seconds is supplied use ToNumber(seconds); else use 0
+   * 7. If ms is supplied use ToNumber(ms); else use 0
+   * 8. If Result(1) is not NaN and 0 <= ToInteger(Result(1)) <= 99, Result(8) is
+   * 1900+ToInteger(Result(1)); otherwise, Result(8) is Result(1)
+   * 9. Compute MakeDay(Result(8), Result(2), Result(3))
+   * 10. Compute MakeTime(Result(4), Result(5), Result(6), Result(7))
+   * 11. Compute MakeDate(Result(9), Result(10))
+   * 12. Set the [[Value]] property of the newly constructed object to TimeClip(UTC(Result(11)))
+   */
+  var r1 = Number(year);
+  var r2 = Number(month);
+  var r3 = ((date && arguments.length > 2) ? Number(date) : 1);
+  var r4 = ((hours && arguments.length > 3) ? Number(hours) : 0);   
+  var r5 = ((minutes && arguments.length > 4) ? Number(minutes) : 0);   
+  var r6 = ((seconds && arguments.length > 5) ? Number(seconds) : 0);   
+  var r7 = ((ms && arguments.length > 6) ? Number(ms) : 0);
+  
+  var r8 = r1;
+  
+  if(!isNaN(r1) && (0 <= ToInteger(r1)) && (ToInteger(r1) <= 99))
+    r8 = 1900+r1;
+  
+  var r9 = MakeDay(r8, r2, r3);
+  var r10 = MakeTime(r4, r5, r6, r7);
+  var r11 = MakeDate(r9, r10);
+  
+  return TimeClip(UTC(r11));
+}
+
+
+
+/**** Python code for initialize the above constants
+// We may want to replicate the following in JavaScript.
+// However, using JS date operations to generate parameters that are then used to
+// test those some date operations seems unsound.  However, it isn't clear if there
+//is a good interoperable alternative.
+
+# Copyright 2009 the Sputnik authors.  All rights reserved.
+# This code is governed by the BSD license found in the LICENSE file.
+
+def GetDaylightSavingsTimes():
+# Is the given floating-point time in DST?
+def IsDst(t):
+return time.localtime(t)[-1]
+# Binary search to find an interval between the two times no greater than
+# delta where DST switches, returning the midpoint.
+def FindBetween(start, end, delta):
+while end - start > delta:
+middle = (end + start) / 2
+if IsDst(middle) == IsDst(start):
+start = middle
+else:
+end = middle
+return (start + end) / 2
+now = time.time()
+one_month = (30 * 24 * 60 * 60)
+# First find a date with different daylight savings.  To avoid corner cases
+# we try four months before and after today.
+after = now + 4 * one_month
+before = now - 4 * one_month
+if IsDst(now) == IsDst(before) and IsDst(now) == IsDst(after):
+logger.warning("Was unable to determine DST info.")
+return None
+# Determine when the change occurs between now and the date we just found
+# in a different DST.
+if IsDst(now) != IsDst(before):
+first = FindBetween(before, now, 1)
+else:
+first = FindBetween(now, after, 1)
+# Determine when the change occurs between three and nine months from the
+# first.
+second = FindBetween(first + 3 * one_month, first + 9 * one_month, 1)
+# Find out which switch is into and which if out of DST
+if IsDst(first - 1) and not IsDst(first + 1):
+start = second
+end = first
+else:
+start = first
+end = second
+return (start, end)
+
+
+def GetDaylightSavingsAttribs():
+times = GetDaylightSavingsTimes()
+if not times:
+return None
+(start, end) = times
+def DstMonth(t):
+return time.localtime(t)[1] - 1
+def DstHour(t):
+return time.localtime(t - 1)[3] + 1
+def DstSunday(t):
+if time.localtime(t)[2] > 15:
+return "'last'"
+else:
+return "'first'"
+def DstMinutes(t):
+return (time.localtime(t - 1)[4] + 1) % 60
+attribs = { }
+attribs['start_month'] = DstMonth(start)
+attribs['end_month'] = DstMonth(end)
+attribs['start_sunday'] = DstSunday(start)
+attribs['end_sunday'] = DstSunday(end)
+attribs['start_hour'] = DstHour(start)
+attribs['end_hour'] = DstHour(end)
+attribs['start_minutes'] = DstMinutes(start)
+attribs['end_minutes'] = DstMinutes(end)
+return attribs
+
+*********/
+
 //--Test case registration-----------------------------------------------------
 function runTestCase(testcase) {
     if (testcase() !== true) {
diff --git a/test/harness/sth.js b/test/harness/sth.js
index f60ce575894733495a2408a88e8ae38ced6e6d7f..8d2658d868934172fbccb86f2bbda6403600ee25 100644
--- a/test/harness/sth.js
+++ b/test/harness/sth.js
@@ -127,11 +127,6 @@ function BrowserRunner() {
         //TODO: these should be moved to sta.js
         var includes = code.match(/\$INCLUDE\(([^\)]+)\)/g), // find all of the $INCLUDE statements
             include;
-        iwin.Test262Error = Test262Error;
-        iwin.$ERROR = $ERROR;
-        iwin.$FAIL = $FAIL;
-        iwin.$PRINT = function () { };
-        iwin.$INCLUDE = function () { };
 
         if (includes !== null) {
             // We have some includes, so loop through each include and
diff --git a/tools/packaging/packager.py b/tools/packaging/packager.py
index a7c11e1a9ec0afc3dc2ea7a7c6f38b38e1435272..8479951870cf55320983fbe4c570bd366ce09bf7 100644
--- a/tools/packaging/packager.py
+++ b/tools/packaging/packager.py
@@ -47,6 +47,8 @@ __parser.add_argument('version', action='store',
                     help='Version of the test suite.')
 __parser.add_argument('--type', action='store', default='test262',
                     help='Type of test case runner to generate.')
+__parser.add_argument('--console', action='store_true', default=False,
+                    help='Type of test case runner to generate.')
 ARGS = __parser.parse_args()
 
 if not os.path.exists(EXCLUDED_FILENAME):
@@ -92,6 +94,21 @@ if not hasattr(ARGS, "version"):
     sys.exit(1)
 
 #--Helpers--------------------------------------------------------------------#
+def createDepDirs(dirName):
+    #base case
+    if dirName==os.path.dirname(dirName):
+        if not os.path.exists(dirName):
+            os.mkdir(dirName)
+    else:
+        if not os.path.exists(dirName):
+            createDepDirs(os.path.dirname(dirName))
+            os.mkdir(dirName)
+
+def test262PathToConsoleFile(path):
+    stuff = os.path.join(TEST262_CONSOLE_CASES_DIR, path.replace("/", os.path.sep))
+    createDepDirs(os.path.dirname(stuff))
+    return stuff
+    
 def getJSCount(dirName):
     '''
     Returns the total number of *.js files (recursively) under a given 
@@ -210,9 +227,7 @@ for chapter in TEST_SUITE_SECTIONS:
             if EXCLUDE_LIST.count(testName)==0:
                 # dictionary for each test
                 testDict = {}
-                #TODO
-                #testDict["id"] = testName
-                testDict["path"] = testPath.replace("/ietestcenter", "").replace("/sputnik_converted", "")
+                testDict["path"] = testPath
                 
                 tempFile = open(test, "r")
                 scriptCode = tempFile.readlines()
@@ -233,10 +248,10 @@ for chapter in TEST_SUITE_SECTIONS:
                 if scriptCodeContent=="":
                     print "WARNING (" + test + "): unable to strip comments/license header/etc."
                     scriptCodeContent = "".join(scriptCode)
-                scriptCodeContent = base64.b64encode(scriptCodeContent)
+                scriptCodeContentB64 = base64.b64encode(scriptCodeContent)
 
                 #add the test encoded code node to our test dictionary
-                testDict["code"] = scriptCodeContent 
+                testDict["code"] = scriptCodeContentB64 
                 #now close the dictionary for the test
 
                 #now get the metadata added.
@@ -248,6 +263,12 @@ for chapter in TEST_SUITE_SECTIONS:
 
                 #this adds the test to our tests array
                 tests.append(testDict)
+                
+                if ARGS.console:
+                    with open(test262PathToConsoleFile(testDict["path"]), "w") as fConsole:
+                        fConsole.write(scriptCodeContent)
+                    with open(test262PathToConsoleFile(testDict["path"][:-3] + "_metadata.js"), "w") as fConsoleMeta:
+                        fConsoleMeta.write("testDescrip = " + str(testDict))
                 testCount += 1
             else:
                 print "Excluded:", testName
@@ -295,13 +316,19 @@ print ""
 print "Deploying test harness files to 'TEST262_WEB_HARNESS_DIR'..."
 if TEST262_HARNESS_DIR!=TEST262_WEB_HARNESS_DIR:
     for filename in [x for x in os.listdir(TEST262_HARNESS_DIR) if x.endswith(".js")]:
-        toFilename = os.path.join(TEST262_WEB_HARNESS_DIR, filename)
-        fileExists = os.path.exists(toFilename)
-        if fileExists:
-            SC_HELPER.edit(toFilename)
-        shutil.copy(os.path.join(TEST262_HARNESS_DIR, filename),
-                    toFilename)
-        if not fileExists:
-            SC_HELPER.add(toFilename)
+        toFilenameList = [ os.path.join(TEST262_WEB_HARNESS_DIR, filename)]
+        if ARGS.console:
+            toFilenameList.append(os.path.join(TEST262_CONSOLE_HARNESS_DIR, filename))
+        
+        for toFilename in toFilenameList:
+            if not os.path.exists(os.path.dirname(toFilename)):
+                os.mkdir(os.path.dirname(toFilename))
+            fileExists = os.path.exists(toFilename)
+            if fileExists:
+                SC_HELPER.edit(toFilename)
+            shutil.copy(os.path.join(TEST262_HARNESS_DIR, filename),
+                        toFilename)
+            if not fileExists:
+                SC_HELPER.add(toFilename)
 
 print "Done."
diff --git a/tools/packaging/packagerConfig.py b/tools/packaging/packagerConfig.py
index f13d8f42b723a2f08d4037c52934d406dae6a48f..1d0af2b9f807bb0d29a7f1d7e67385dd071461a0 100644
--- a/tools/packaging/packagerConfig.py
+++ b/tools/packaging/packagerConfig.py
@@ -28,6 +28,7 @@ import re
 MAX_CASES_PER_JSON = 1000
 
 WEBSITE_SHORT_NAME = "website"
+CONSOLE_SHORT_NAME = "console"
 
 #Path to the root of the Hg repository (relative to this file's location)
 TEST262_ROOT = os.path.join(os.path.dirname(os.path.realpath(__file__)), "..", "..")
@@ -42,9 +43,11 @@ TEST262_HARNESS_DIR = os.path.join(TEST262_ROOT, "test", "harness")
 
 #Directory full of website test cases (ported over from TEST262_CASES_DIR)
 TEST262_WEB_CASES_DIR = os.path.join(TEST262_ROOT, WEBSITE_SHORT_NAME, "json")
+TEST262_CONSOLE_CASES_DIR = os.path.join(TEST262_ROOT, CONSOLE_SHORT_NAME)
 
 #Directory containing the website's test harness (ported over from TEST262_HARNESS_DIR)
 TEST262_WEB_HARNESS_DIR = os.path.join(TEST262_ROOT, WEBSITE_SHORT_NAME, "harness")
+TEST262_CONSOLE_HARNESS_DIR = os.path.join(TEST262_ROOT, CONSOLE_SHORT_NAME, "harness")
 
 #Path to the ported test case files on the actual website as opposed to the Hg layout
 WEBSITE_CASES_PATH = "json/"
diff --git a/tools/packaging/templates/runner.test262.html b/tools/packaging/templates/runner.test262.html
index 47331606f06df60df65ae2926042d0a17187b33a..1c17ca39c54e440b09d4ff3b79113637070b4a19 100644
--- a/tools/packaging/templates/runner.test262.html
+++ b/tools/packaging/templates/runner.test262.html
@@ -13,7 +13,6 @@
 <script type="text/javascript" src="harness/jqueryprogressbar.js"></script>
 <script type="text/javascript" src="harness/helper.js"></script>
 <script type="text/javascript" src="harness/jquery.base64.js"></script>
-<script type="text/javascript" src="harness/sputnikLib.js"></script>
 <script language="javascript" type="text/javascript">
     //To support all the browsers
     $(window).resize(ResizeLoadIndicator);
diff --git a/website/default.html b/website/default.html
index 5391c529989f3c8136aaf78183e726ce44d12128..a7357f7edef62ea9fd9fdc73a089fb5cdfb5f137 100644
--- a/website/default.html
+++ b/website/default.html
@@ -13,7 +13,6 @@
 <script type="text/javascript" src="harness/jqueryprogressbar.js"></script>
 <script type="text/javascript" src="harness/helper.js"></script>
 <script type="text/javascript" src="harness/jquery.base64.js"></script>
-<script type="text/javascript" src="harness/sputnikLib.js"></script>
 <script language="javascript" type="text/javascript">
     //To support all the browsers
     $(window).resize(ResizeLoadIndicator);
diff --git a/website/harness/Date_constants.js b/website/harness/Date_constants.js
index e69ecbf6a5d3eeab96e4f98a8ac8abfc45958425..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/website/harness/Date_constants.js
+++ b/website/harness/Date_constants.js
@@ -1,20 +0,0 @@
-// Copyright 2009 the Sputnik authors.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-var HoursPerDay = 24;
-var MinutesPerHour = 60;
-var SecondsPerMinute = 60;
-
-var msPerDay = 86400000;
-var msPerSecond = 1000;
-var msPerMinute = 60000;
-var msPerHour = 3600000;
-
-var date_1899_end = -2208988800001;
-var date_1900_start = -2208988800000;
-var date_1969_end = -1;
-var date_1970_start = 0;
-var date_1999_end = 946684799999;
-var date_2000_start = 946684800000;
-var date_2099_end = 4102444799999;
-var date_2100_start = 4102444800000;
diff --git a/website/harness/Date_library.js b/website/harness/Date_library.js
index 51e15d87dc69ef53ec08ab16cbf84253863d8643..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/website/harness/Date_library.js
+++ b/website/harness/Date_library.js
@@ -1,411 +0,0 @@
-// Copyright 2009 the Sputnik authors.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-//the following values are normally generated by the sputnik.py driver
-var $LocalTZ,
-    $DST_start_month,
-    $DST_start_sunday,
-    $DST_start_hour,
-    $DST_start_minutes,
-    $DST_end_month,
-    $DST_end_sunday,
-    $DST_end_hour,
-    $DST_end_minutes;
-
-(function () {
-    /**
-      * Finds the first date, starting from |start|, where |predicate|
-      * holds.
-      */
-    var findNearestDateBefore = function(start, predicate) {
-        var current = start;
-        var month = 1000 * 60 * 60 * 24 * 30;
-        for (var step = month; step > 0; step = Math.floor(step / 3)) {
-            if (!predicate(current)) {
-                while (!predicate(current))
-                    current = new Date(current.getTime() + step);
-                    current = new Date(current.getTime() - step);
-                }
-        }
-        while (!predicate(current)) {
-            current = new Date(current.getTime() + 1);
-        }
-        return current;
-    }
-
-    var juneDate = new Date(2000, 5, 20, 0, 0, 0, 0);
-    var decemberDate = new Date(2000, 11, 20, 0, 0, 0, 0);
-    var juneOffset = juneDate.getTimezoneOffset();
-    var decemberOffset = decemberDate.getTimezoneOffset();
-    var isSouthernHemisphere = (juneOffset > decemberOffset);
-    var winterTime = isSouthernHemisphere ? juneDate : decemberDate;
-    var summerTime = isSouthernHemisphere ? decemberDate : juneDate;
-    
-    var dstStart = findNearestDateBefore(winterTime, function (date) {
-        return date.getTimezoneOffset() == summerTime.getTimezoneOffset();
-    });
-    $DST_start_month = dstStart.getMonth();
-    $DST_start_sunday = dstStart.getDate() > 15 ? '"last"' : '"first"';
-    $DST_start_hour = dstStart.getHours();
-    $DST_start_minutes = dstStart.getMinutes();
-      
-    var dstEnd = findNearestDateBefore(summerTime, function (date) {
-        return date.getTimezoneOffset() == winterTime.getTimezoneOffset();
-    });
-    $DST_end_month = dstEnd.getMonth();
-    $DST_end_sunday = dstEnd.getDate() > 15 ? '"last"' : '"first"';
-    $DST_end_hour = dstEnd.getHours();
-    $DST_end_minutes = dstEnd.getMinutes();
-    
-    return;
-})();
-
-
-//15.9.1.2 Day Number and Time within Day
-function Day(t) {
-  return Math.floor(t/msPerDay);
-}
-
-function TimeWithinDay(t) {
-  return t%msPerDay;
-}
-
-//15.9.1.3 Year Number
-function DaysInYear(y){
-  if(y%4 != 0) return 365;
-  if(y%4 == 0 && y%100 != 0) return 366;
-  if(y%100 == 0 && y%400 != 0) return 365;
-  if(y%400 == 0) return 366;
-}
-
-function DayFromYear(y) {
-  return (365*(y-1970)
-          + Math.floor((y-1969)/4)
-          - Math.floor((y-1901)/100)
-          + Math.floor((y-1601)/400));
-}
-
-function TimeFromYear(y){
-  return msPerDay*DayFromYear(y);
-}
-
-function YearFromTime(t) {
-  t = Number(t);
-  var sign = ( t < 0 ) ? -1 : 1;
-  var year = ( sign < 0 ) ? 1969 : 1970;
-  
-  for(var time = 0;;year += sign){
-    time = TimeFromYear(year);
-    
-    if(sign > 0 && time > t){
-      year -= sign;
-      break;
-    }
-    else if(sign < 0 && time <= t){
-      break;
-    }
-  };
-  return year;
-}
-  
-function InLeapYear(t){
-  if(DaysInYear(YearFromTime(t)) == 365)
-    return 0;
-  
-  if(DaysInYear(YearFromTime(t)) == 366)
-    return 1;
-}
-
-function DayWithinYear(t) {
-  return Day(t)-DayFromYear(YearFromTime(t));
-}
-
-//15.9.1.4 Month Number
-function MonthFromTime(t){
-  var day = DayWithinYear(t);
-  var leap = InLeapYear(t);
-
-  if((0 <= day) && (day < 31)) return 0;
-  if((31 <= day) && (day < (59+leap))) return 1;
-  if(((59+leap) <= day) && (day < (90+leap))) return 2;
-  if(((90+leap) <= day) && (day < (120+leap))) return 3;
-  if(((120+leap) <= day) && (day < (151+leap))) return 4;
-  if(((151+leap) <= day) && (day < (181+leap))) return 5;
-  if(((181+leap) <= day) && (day < (212+leap))) return 6;
-  if(((212+leap) <= day) && (day < (243+leap))) return 7;
-  if(((243+leap) <= day) && (day < (273+leap))) return 8;
-  if(((273+leap) <= day) && (day < (304+leap))) return 9;
-  if(((304+leap) <= day) && (day < (334+leap))) return 10;
-  if(((334+leap) <= day) && (day < (365+leap))) return 11;
-}
-
-//15.9.1.5 Date Number
-function DateFromTime(t) {
-  var day = DayWithinYear(t);
-  var month = MonthFromTime(t);
-  var leap = InLeapYear(t);
-
-  if(month == 0) return day+1;
-  if(month == 1) return day-30;
-  if(month == 2) return day-58-leap;
-  if(month == 3) return day-89-leap;
-  if(month == 4) return day-119-leap;
-  if(month == 5) return day-150-leap;
-  if(month == 6) return day-180-leap;
-  if(month == 7) return day-211-leap;
-  if(month == 8) return day-242-leap;
-  if(month == 9) return day-272-leap;
-  if(month == 10) return day-303-leap;
-  if(month == 11) return day-333-leap;
-}
-
-//15.9.1.6 Week Day
-function WeekDay(t) {
-  var weekday = (Day(t)+4)%7;
-  return (weekday < 0 ? 7+weekday : weekday);
-}
-
-//15.9.1.9 Daylight Saving Time Adjustment
-$LocalTZ = (new Date()).getTimezoneOffset() / -60;
-if (DaylightSavingTA((new Date()).valueOf()) !== 0) {
-   $LocalTZ -= 1;
-}
-var LocalTZA = $LocalTZ*msPerHour;
-
-function DaysInMonth(m, leap) {
-  m = m%12;
-  
-  //April, June, Sept, Nov
-  if(m == 3 || m == 5 || m == 8 || m == 10 ) {
-    return 30;
-  }
-
-  //Jan, March, May, July, Aug, Oct, Dec
-  if(m == 0 || m == 2 || m == 4 || m == 6 || m == 7 || m == 9 || m == 11){
-    return 31;
-  }
-
-  //Feb
-  return 28+leap;
-}
-
-function GetSundayInMonth(t, m, count){
-    var year = YearFromTime(t);
-    
-    if (count==='"first"') {
-        for (var d=1; d <= DaysInMonth(m, InLeapYear(t)); d++) {
-            tempDate = new Date(year, m, d);
-            if (tempDate.getDay()===0) {
-                return tempDate.valueOf();
-            }         
-        }
-    } else if(count==='"last"') {
-        for (var d=DaysInMonth(m, InLeapYear(t)); d>0; d--) {
-            tempDate = new Date(year, m, d);
-            if (tempDate.getDay()===0) {
-                return tempDate.valueOf();
-            }
-        }
-    }
-    throw new Error("Unsupported 'count' arg:" + count);
-}
-/*
-function GetSundayInMonth(t, m, count){
-  var year = YearFromTime(t);
-  var leap = InLeapYear(t);
-  var day = 0;
-  
-  if(m >= 1) day += DaysInMonth(0, leap);
-  if(m >= 2) day += DaysInMonth(1, leap);
-  if(m >= 3) day += DaysInMonth(2, leap);
-  if(m >= 4) day += DaysInMonth(3, leap);
-  if(m >= 5) day += DaysInMonth(4, leap);
-  if(m >= 6) day += DaysInMonth(5, leap);
-  if(m >= 7) day += DaysInMonth(6, leap);
-  if(m >= 8) day += DaysInMonth(7, leap);
-  if(m >= 9) day += DaysInMonth(8, leap);
-  if(m >= 10) day += DaysInMonth(9, leap);
-  if(m >= 11) day += DaysInMonth(10, leap);
-  
-  var month_start = TimeFromYear(year)+day*msPerDay;
-  var sunday = 0;
-  
-  if(count === "last"){
-    for(var last_sunday = month_start+DaysInMonth(m, leap)*msPerDay; 
-      WeekDay(last_sunday)>0;
-      last_sunday -= msPerDay
-    ){};
-    sunday = last_sunday;
-  }
-  else {
-    for(var first_sunday = month_start; 
-      WeekDay(first_sunday)>0;
-      first_sunday += msPerDay
-    ){};
-    sunday = first_sunday+7*msPerDay*(count-1);
-  }
-  
-  return sunday;
-}*/
-
-function DaylightSavingTA(t) {
-//  t = t-LocalTZA;
-
-  var DST_start = GetSundayInMonth(t, $DST_start_month, $DST_start_sunday) +
-                  $DST_start_hour*msPerHour + 
-                  $DST_start_minutes*msPerMinute;
-                  
-  var k = new Date(DST_start);
-  
-  var DST_end   = GetSundayInMonth(t, $DST_end_month, $DST_end_sunday) +
-                  $DST_end_hour*msPerHour +
-                  $DST_end_minutes*msPerMinute;
-
-  if ( t >= DST_start && t < DST_end ) {
-    return msPerHour;
-  } else {
-    return 0;
-  }
-}
-
-//15.9.1.9 Local Time
-function LocalTime(t){
-  return t+LocalTZA+DaylightSavingTA(t);
-}
-
-function UTC(t) {
-  return t-LocalTZA-DaylightSavingTA(t-LocalTZA);
-}
-
-//15.9.1.10 Hours, Minutes, Second, and Milliseconds
-function HourFromTime(t){
-  return Math.floor(t/msPerHour)%HoursPerDay;
-}
-
-function MinFromTime(t){
-  return Math.floor(t/msPerMinute)%MinutesPerHour;
-}
-
-function SecFromTime(t){
-  return Math.floor(t/msPerSecond)%SecondsPerMinute;
-}
-
-function msFromTime(t){
-  return t%msPerSecond;
-}
-
-//15.9.1.11 MakeTime (hour, min, sec, ms)
-function MakeTime(hour, min, sec, ms){
-  if ( !isFinite(hour) || !isFinite(min) || !isFinite(sec) || !isFinite(ms)) {
-    return Number.NaN;
-  }
-
-  hour = ToInteger(hour);
-  min  = ToInteger(min);
-  sec  = ToInteger(sec);
-  ms   = ToInteger(ms);
-
-  return ((hour*msPerHour) + (min*msPerMinute) + (sec*msPerSecond) + ms);
-}
-
-//15.9.1.12 MakeDay (year, month, date)
-function MakeDay(year, month, date) {
-  if ( !isFinite(year) || !isFinite(month) || !isFinite(date)) {
-    return Number.NaN;
-  }
-
-  year = ToInteger(year);
-  month = ToInteger(month);
-  date = ToInteger(date );
-
-  var result5 = year + Math.floor(month/12);
-  var result6 = month%12;
-
-  var sign = ( year < 1970 ) ? -1 : 1;
-  var t =    ( year < 1970 ) ? 1 :  0;
-  var y =    ( year < 1970 ) ? 1969 : 1970;
-
-  if( sign == -1 ){
-    for ( y = 1969; y >= year; y += sign ) {
-      t += sign * DaysInYear(y)*msPerDay;
-    }
-  } else {
-    for ( y = 1970 ; y < year; y += sign ) {
-      t += sign * DaysInYear(y)*msPerDay;
-    }
-  }
-
-  var leap = 0;
-  for ( var m = 0; m < month; m++ ) {
-    //if year is changed, than we need to recalculate leep
-    leap = InLeapYear(t);
-    t += DaysInMonth(m, leap)*msPerDay;
-  }
-
-  if ( YearFromTime(t) != result5 ) {
-    return Number.NaN;
-  }
-  if ( MonthFromTime(t) != result6 ) {
-    return Number.NaN;
-  }
-  if ( DateFromTime(t) != 1 ) {
-    return Number.NaN;
-  }
-
-  return Day(t)+date-1;
-}
-
-//15.9.1.13 MakeDate (day, time)
-function MakeDate( day, time ) {
-  if(!isFinite(day) || !isFinite(time)) {
-    return Number.NaN;
-  }
-  
-  return day*msPerDay+time;
-}
-
-//15.9.1.14 TimeClip (time)
-function TimeClip(time) {
-  if(!isFinite(time) || Math.abs(time) > 8.64e15){
-    return Number.NaN;
-  }
-
-  return ToInteger(time);
-}
-
-//Test Functions
-function ConstructDate(year, month, date, hours, minutes, seconds, ms){
-  /*
-   * 1. Call ToNumber(year)
-   * 2. Call ToNumber(month)
-   * 3. If date is supplied use ToNumber(date); else use 1
-   * 4. If hours is supplied use ToNumber(hours); else use 0
-   * 5. If minutes is supplied use ToNumber(minutes); else use 0
-   * 6. If seconds is supplied use ToNumber(seconds); else use 0
-   * 7. If ms is supplied use ToNumber(ms); else use 0
-   * 8. If Result(1) is not NaN and 0 <= ToInteger(Result(1)) <= 99, Result(8) is
-   * 1900+ToInteger(Result(1)); otherwise, Result(8) is Result(1)
-   * 9. Compute MakeDay(Result(8), Result(2), Result(3))
-   * 10. Compute MakeTime(Result(4), Result(5), Result(6), Result(7))
-   * 11. Compute MakeDate(Result(9), Result(10))
-   * 12. Set the [[Value]] property of the newly constructed object to TimeClip(UTC(Result(11)))
-   */
-  var r1 = Number(year);
-  var r2 = Number(month);
-  var r3 = ((date && arguments.length > 2) ? Number(date) : 1);
-  var r4 = ((hours && arguments.length > 3) ? Number(hours) : 0);   
-  var r5 = ((minutes && arguments.length > 4) ? Number(minutes) : 0);   
-  var r6 = ((seconds && arguments.length > 5) ? Number(seconds) : 0);   
-  var r7 = ((ms && arguments.length > 6) ? Number(ms) : 0);
-  
-  var r8 = r1;
-  
-  if(!isNaN(r1) && (0 <= ToInteger(r1)) && (ToInteger(r1) <= 99))
-    r8 = 1900+r1;
-  
-  var r9 = MakeDay(r8, r2, r3);
-  var r10 = MakeTime(r4, r5, r6, r7);
-  var r11 = MakeDate(r9, r10);
-  
-  return TimeClip(UTC(r11));
-}
\ No newline at end of file
diff --git a/website/harness/cth.js b/website/harness/cth.js
new file mode 100644
index 0000000000000000000000000000000000000000..de7eb49ca0f5963b071f47ef77ca5d9a88c5f283
--- /dev/null
+++ b/website/harness/cth.js
@@ -0,0 +1,29 @@
+/// Copyright (c) 2011 Microsoft Corporation 
+/// 
+/// Redistribution and use in source and binary forms, with or without modification, are permitted provided
+/// that the following conditions are met: 
+///    * Redistributions of source code must retain the above copyright notice, this list of conditions and
+///      the following disclaimer. 
+///    * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and 
+///      the following disclaimer in the documentation and/or other materials provided with the distribution.  
+///    * Neither the name of Microsoft nor the names of its contributors may be used to
+///      endorse or promote products derived from this software without specific prior written permission.
+/// 
+/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
+/// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+/// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+/// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+/// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+/// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+/// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+/// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+
+function testRun(id, path, description, codeString, result, error) {
+  if (result!=="pass") {
+      throw new Error("Test '" + path + "'failed: " + error);
+  }
+}
+
+function testFinished() {
+    //no-op
+}
\ No newline at end of file
diff --git a/website/harness/ed.js b/website/harness/ed.js
index 8d6f444086e0a4ff2a66d6627b7a41dee9c16c6f..e2a27c6a3cd34a37a159075114cbcc6a8e07f5c7 100644
--- a/website/harness/ed.js
+++ b/website/harness/ed.js
@@ -19,9 +19,10 @@
 /// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 
 //Error Detector
-
-window.onerror = function(errorMsg, url, lineNumber) {
-    window.iframeError = errorMsg;
+if (this.window!==undefined) {  //for console support
+    window.onerror = function(errorMsg, url, lineNumber) {
+        window.iframeError = errorMsg;
+    }
 }
 
 //This doesn't work with early errors in current versions of Opera
diff --git a/website/harness/gs.js b/website/harness/gs.js
index 1356a4ff671dad168060b9299073a1f2433ca5a4..aac5186bf785c42d1b8827cf56adfc15bdcbd179 100644
--- a/website/harness/gs.js
+++ b/website/harness/gs.js
@@ -22,18 +22,18 @@
 
 //An exception is expected
 if (testDescrip.negative !== undefined) {
-    //TODO - come up with a generic way of catching the error type from window.onerror
+    //TODO - come up with a generic way of catching the error type from this.onerror
     testDescrip.negative = testDescrip.negative === "NotEarlyError" ?
                 testDescrip.negative : (testDescrip.negative === "^((?!NotEarlyError).)*$" ? 
                 testDescrip.negative : ".");
-    if (window.iframeError === undefined) { //no exception was thrown
+    if (this.iframeError === undefined) { //no exception was thrown
         testRun(testDescrip.id, testDescrip.path, testDescrip.description, testDescrip.code,
                 'fail', 
                 Error('No exception was thrown; expected an error "message" property matching the regular expression "' + testDescrip.negative + '".'));
-    } else if (!(new RegExp(testDescrip.negative, "i").test(window.iframeError))) {  //wrong type of exception thrown
+    } else if (!(new RegExp(testDescrip.negative, "i").test(this.iframeError))) {  //wrong type of exception thrown
         testRun(testDescrip.id, testDescrip.path, testDescrip.description, testDescrip.code,
                 'fail', 
-                Error('Expected an exception with a "message" property matching the regular expression "' + testDescrip.negative +'" to be thrown; actual was "' + window.iframeError + '".'));
+                Error('Expected an exception with a "message" property matching the regular expression "' + testDescrip.negative +'" to be thrown; actual was "' + this.iframeError + '".'));
     } else {
         testRun(testDescrip.id, testDescrip.path, testDescrip.description, testDescrip.code,
                 'pass', undefined);
@@ -41,10 +41,10 @@ if (testDescrip.negative !== undefined) {
 }
 
 //Exception was not expected to be thrown
-else if (window.iframeError !== undefined) {  
+else if (this.iframeError !== undefined) {  
     testRun(testDescrip.id, testDescrip.path, testDescrip.description, testDescrip.code,
             'fail', 
-            Error('Unexpected exception, "' + window.iframeError + '" was thrown.'));
+            Error('Unexpected exception, "' + this.iframeError + '" was thrown.'));
 } 
 
 else {
diff --git a/website/harness/sputnikLib.js b/website/harness/sputnikLib.js
deleted file mode 100644
index 42d314efbb79e9916f659dd2d9e26dc708eaaf34..0000000000000000000000000000000000000000
--- a/website/harness/sputnikLib.js
+++ /dev/null
@@ -1,548 +0,0 @@
-
-// Copyright 2009 the Sputnik authors.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-function Test262Error(message) {
-  if (message) this.message = message;
-}
-
-Test262Error.prototype.toString = function () {
-  return "Test262 Error: " + this.message;
-};
-
-function testFailed(message) {
-  throw new Test262Error(message);
-}
-
-
-function testPrint(message) {
-
-}
-
-
-//adaptors for Test262 framework
-function $PRINT(message) {
-
-}
-
-function $INCLUDE(message) { }
-function $ERROR(message) {
-        testFailed(message);
-    }
-
-function $FAIL(message) {
-        testFailed(message);
-    }
-
-
-
-//Sputnik library definitions
-//Ultimately these should be namespaced some how and only made
-//available to tests that explicitly include them.
-//For now, we just define the globally
-
-//math_precision.js
-// Copyright 2009 the Sputnik authors.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-function getPrecision(num)
-{
-	//TODO: Create a table of prec's,
-	//      because using Math for testing Math isn't that correct.
-
-	log2num = Math.log(Math.abs(num))/Math.LN2;
-	pernum = Math.ceil(log2num);
-	return(2 * Math.pow(2, -52 + pernum));
-	//return(0);
-}
-
-
-//math_isequal.js
-// Copyright 2009 the Sputnik authors.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-var prec;
-function isEqual(num1, num2)
-{
-	if ((num1 === Infinity)&&(num2 === Infinity))
-	{
-		return(true);
-	}
-	if ((num1 === -Infinity)&&(num2 === -Infinity))
-	{
-		return(true);
-	}
-	prec = getPrecision(Math.min(Math.abs(num1), Math.abs(num2)));
-	return(Math.abs(num1 - num2) <= prec);
-	//return(num1 === num2);
-}
-
-//numeric_conversion.js
-// Copyright 2009 the Sputnik authors.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-function ToInteger(p) {
-  x = Number(p);
-
-  if(isNaN(x)){
-    return +0;
-  }
-
-  if((x === +0)
-  || (x === -0)
-  || (x === Number.POSITIVE_INFINITY)
-  || (x === Number.NEGATIVE_INFINITY)){
-     return x;
-  }
-
-  var sign = ( x < 0 ) ? -1 : 1;
-
-  return (sign*Math.floor(Math.abs(x)));
-}
-
-//Date_constants.js
-// Copyright 2009 the Sputnik authors.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-var HoursPerDay = 24;
-var MinutesPerHour = 60;
-var SecondsPerMinute = 60;
-
-var msPerDay = 86400000;
-var msPerSecond = 1000;
-var msPerMinute = 60000;
-var msPerHour = 3600000;
-
-var date_1899_end = -2208988800001;
-var date_1900_start = -2208988800000;
-var date_1969_end = -1;
-var date_1970_start = 0;
-var date_1999_end = 946684799999;
-var date_2000_start = 946684800000;
-var date_2099_end = 4102444799999;
-var date_2100_start = 4102444800000;
-
-//the following values are normally generated by the sputnik.py driver
-// for now, we'll just use 0 for everything
-var $LocalTZ = 0;
-var $DST_start_month = 0;
-var $DST_start_sunday = 0;
-var $DST_start_hour = 0;
-var $DST_start_minutes = 0;
-var $DST_end_month = 0;
-var $DST_end_sunday = 0;
-var $DST_end_hour = 0;
-var $DST_end_minutes = 0;
-
-
-//Date.library.js
-// Copyright 2009 the Sputnik authors.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-//15.9.1.2 Day Number and Time within Day
-function Day(t) {
-  return Math.floor(t/msPerDay);
-}
-
-function TimeWithinDay(t) {
-  return t%msPerDay;
-}
-
-//15.9.1.3 Year Number
-function DaysInYear(y){
-  if(y%4 != 0) return 365;
-  if(y%4 == 0 && y%100 != 0) return 366;
-  if(y%100 == 0 && y%400 != 0) return 365;
-  if(y%400 == 0) return 366;
-}
-
-function DayFromYear(y) {
-  return (365*(y-1970)
-          + Math.floor((y-1969)/4)
-          - Math.floor((y-1901)/100)
-          + Math.floor((y-1601)/400));
-}
-
-function TimeFromYear(y){
-  return msPerDay*DayFromYear(y);
-}
-
-function YearFromTime(t) {
-  t = Number(t);
-  var sign = ( t < 0 ) ? -1 : 1;
-  var year = ( sign < 0 ) ? 1969 : 1970;
-
-  for(var time = 0;;year += sign){
-    time = TimeFromYear(year);
-
-    if(sign > 0 && time > t){
-      year -= sign;
-      break;
-    }
-    else if(sign < 0 && time <= t){
-      break;
-    }
-  };
-  return year;
-}
-
-function InLeapYear(t){
-  if(DaysInYear(YearFromTime(t)) == 365)
-    return 0;
-
-  if(DaysInYear(YearFromTime(t)) == 366)
-    return 1;
-}
-
-function DayWithinYear(t) {
-  return Day(t)-DayFromYear(YearFromTime(t));
-}
-
-//15.9.1.4 Month Number
-function MonthFromTime(t){
-  var day = DayWithinYear(t);
-  var leap = InLeapYear(t);
-
-  if((0 <= day) && (day < 31)) return 0;
-  if((31 <= day) && (day < (59+leap))) return 1;
-  if(((59+leap) <= day) && (day < (90+leap))) return 2;
-  if(((90+leap) <= day) && (day < (120+leap))) return 3;
-  if(((120+leap) <= day) && (day < (151+leap))) return 4;
-  if(((151+leap) <= day) && (day < (181+leap))) return 5;
-  if(((181+leap) <= day) && (day < (212+leap))) return 6;
-  if(((212+leap) <= day) && (day < (243+leap))) return 7;
-  if(((243+leap) <= day) && (day < (273+leap))) return 8;
-  if(((273+leap) <= day) && (day < (304+leap))) return 9;
-  if(((304+leap) <= day) && (day < (334+leap))) return 10;
-  if(((334+leap) <= day) && (day < (365+leap))) return 11;
-}
-
-//15.9.1.5 Date Number
-function DateFromTime(t) {
-  var day = DayWithinYear(t);
-  var month = MonthFromTime(t);
-  var leap = InLeapYear(t);
-
-  if(month == 0) return day+1;
-  if(month == 1) return day-30;
-  if(month == 2) return day-58-leap;
-  if(month == 3) return day-89-leap;
-  if(month == 4) return day-119-leap;
-  if(month == 5) return day-150-leap;
-  if(month == 6) return day-180-leap;
-  if(month == 7) return day-211-leap;
-  if(month == 8) return day-242-leap;
-  if(month == 9) return day-272-leap;
-  if(month == 10) return day-303-leap;
-  if(month == 11) return day-333-leap;
-}
-
-//15.9.1.6 Week Day
-function WeekDay(t) {
-  var weekday = (Day(t)+4)%7;
-  return (weekday < 0 ? 7+weekday : weekday);
-}
-
-//15.9.1.9 Daylight Saving Time Adjustment
-var LocalTZA = $LocalTZ*msPerHour;
-
-function DaysInMonth(m, leap) {
-  m = m%12;
-
-  //April, June, Sept, Nov
-  if(m == 3 || m == 5 || m == 8 || m == 10 ) {
-    return 30;
-  }
-
-  //Jan, March, May, July, Aug, Oct, Dec
-  if(m == 0 || m == 2 || m == 4 || m == 6 || m == 7 || m == 9 || m == 11){
-    return 31;
-  }
-
-  //Feb
-  return 28+leap;
-}
-
-function GetSundayInMonth(t, m, count){
-  var year = YearFromTime(t);
-  var leap = InLeapYear(t);
-  var day = 0;
-
-  if(m >= 1) day += DaysInMonth(0, leap);
-  if(m >= 2) day += DaysInMonth(1, leap);
-  if(m >= 3) day += DaysInMonth(2, leap);
-  if(m >= 4) day += DaysInMonth(3, leap);
-  if(m >= 5) day += DaysInMonth(4, leap);
-  if(m >= 6) day += DaysInMonth(5, leap);
-  if(m >= 7) day += DaysInMonth(6, leap);
-  if(m >= 8) day += DaysInMonth(7, leap);
-  if(m >= 9) day += DaysInMonth(8, leap);
-  if(m >= 10) day += DaysInMonth(9, leap);
-  if(m >= 11) day += DaysInMonth(10, leap);
-
-  var month_start = TimeFromYear(year)+day*msPerDay;
-  var sunday = 0;
-
-  if(count === "last"){
-    for(var last_sunday = month_start+DaysInMonth(m, leap)*msPerDay;
-      WeekDay(last_sunday)>0;
-      last_sunday -= msPerDay
-    ){};
-    sunday = last_sunday;
-  }
-  else {
-    for(var first_sunday = month_start;
-      WeekDay(first_sunday)>0;
-      first_sunday += msPerDay
-    ){};
-    sunday = first_sunday+7*msPerDay*(count-1);
-  }
-
-  return sunday;
-}
-
-function DaylightSavingTA(t) {
-  t = t-LocalTZA;
-
-  var DST_start = GetSundayInMonth(t, $DST_start_month, $DST_start_sunday)
-                  +$DST_start_hour*msPerHour
-                  +$DST_start_minutes*msPerMinute;
-
-  var k = new Date(DST_start);
-
-  var DST_end   = GetSundayInMonth(t, $DST_end_month, $DST_end_sunday)
-                  +$DST_end_hour*msPerHour
-                  +$DST_end_minutes*msPerMinute;
-
-  if ( t >= DST_start && t < DST_end ) {
-    return msPerHour;
-  } else {
-    return 0;
-  }
-}
-
-//15.9.1.9 Local Time
-function LocalTime(t){
-  return t+LocalTZA+DaylightSavingTA(t);
-}
-
-function UTC(t) {
-  return t-LocalTZA-DaylightSavingTA(t-LocalTZA);
-}
-
-//15.9.1.10 Hours, Minutes, Second, and Milliseconds
-function HourFromTime(t){
-  return Math.floor(t/msPerHour)%HoursPerDay;
-}
-
-function MinFromTime(t){
-  return Math.floor(t/msPerMinute)%MinutesPerHour;
-}
-
-function SecFromTime(t){
-  return Math.floor(t/msPerSecond)%SecondsPerMinute;
-}
-
-function msFromTime(t){
-  return t%msPerSecond;
-}
-
-//15.9.1.11 MakeTime (hour, min, sec, ms)
-function MakeTime(hour, min, sec, ms){
-  if ( !isFinite(hour) || !isFinite(min) || !isFinite(sec) || !isFinite(ms)) {
-    return Number.NaN;
-  }
-
-  hour = ToInteger(hour);
-  min  = ToInteger(min);
-  sec  = ToInteger(sec);
-  ms   = ToInteger(ms);
-
-  return ((hour*msPerHour) + (min*msPerMinute) + (sec*msPerSecond) + ms);
-}
-
-//15.9.1.12 MakeDay (year, month, date)
-function MakeDay(year, month, date) {
-  if ( !isFinite(year) || !isFinite(month) || !isFinite(date)) {
-    return Number.NaN;
-  }
-
-  year = ToInteger(year);
-  month = ToInteger(month);
-  date = ToInteger(date );
-
-  var result5 = year + Math.floor(month/12);
-  var result6 = month%12;
-
-  var sign = ( year < 1970 ) ? -1 : 1;
-  var t =    ( year < 1970 ) ? 1 :  0;
-  var y =    ( year < 1970 ) ? 1969 : 1970;
-
-  if( sign == -1 ){
-    for ( y = 1969; y >= year; y += sign ) {
-      t += sign * DaysInYear(y)*msPerDay;
-    }
-  } else {
-    for ( y = 1970 ; y < year; y += sign ) {
-      t += sign * DaysInYear(y)*msPerDay;
-    }
-  }
-
-  var leap = 0;
-  for ( var m = 0; m < month; m++ ) {
-    //if year is changed, than we need to recalculate leep
-    leap = InLeapYear(t);
-    t += DaysInMonth(m, leap)*msPerDay;
-  }
-
-  if ( YearFromTime(t) != result5 ) {
-    return Number.NaN;
-  }
-  if ( MonthFromTime(t) != result6 ) {
-    return Number.NaN;
-  }
-  if ( DateFromTime(t) != 1 ) {
-    return Number.NaN;
-  }
-
-  return Day(t)+date-1;
-}
-
-//15.9.1.13 MakeDate (day, time)
-function MakeDate( day, time ) {
-  if(!isFinite(day) || !isFinite(time)) {
-    return Number.NaN;
-  }
-
-  return day*msPerDay+time;
-}
-
-//15.9.1.14 TimeClip (time)
-function TimeClip(time) {
-  if(!isFinite(time) || Math.abs(time) > 8.64e15){
-    return Number.NaN;
-  }
-
-  return ToInteger(time);
-}
-
-//Test Functions
-function ConstructDate(year, month, date, hours, minutes, seconds, ms){
-  /*
-   * 1. Call ToNumber(year)
-   * 2. Call ToNumber(month)
-   * 3. If date is supplied use ToNumber(date); else use 1
-   * 4. If hours is supplied use ToNumber(hours); else use 0
-   * 5. If minutes is supplied use ToNumber(minutes); else use 0
-   * 6. If seconds is supplied use ToNumber(seconds); else use 0
-   * 7. If ms is supplied use ToNumber(ms); else use 0
-   * 8. If Result(1) is not NaN and 0 <= ToInteger(Result(1)) <= 99,
-   *    Result(8) is 1900+ToInteger(Result(1));
-   *    otherwise, Result(8) is Result(1)
-   * 9. Compute MakeDay(Result(8), Result(2), Result(3))
-   * 10. Compute MakeTime(Result(4), Result(5), Result(6), Result(7))
-   * 11. Compute MakeDate(Result(9), Result(10))
-   * 12. Set the [[Value]] property of the newly constructed object to
-   *     TimeClip(UTC(Result(11)))
-   */
-  var r1 = Number(year);
-  var r2 = Number(month);
-  var r3 = ((date && arguments.length > 2) ? Number(date) : 1);
-  var r4 = ((hours && arguments.length > 3) ? Number(hours) : 0);
-  var r5 = ((minutes && arguments.length > 4) ? Number(minutes) : 0);
-  var r6 = ((seconds && arguments.length > 5) ? Number(seconds) : 0);
-  var r7 = ((ms && arguments.length > 6) ? Number(ms) : 0);
-
-  var r8 = r1;
-
-  if(!isNaN(r1) && (0 <= ToInteger(r1)) && (ToInteger(r1) <= 99))
-    r8 = 1900+r1;
-
-  var r9 = MakeDay(r8, r2, r3);
-  var r10 = MakeTime(r4, r5, r6, r7);
-  var r11 = MakeDate(r9, r10);
-
-  return TimeClip(UTC(r11));
-}
-
-
-
-/**** Python code for initialize the above constants
-// We may want to replicate the following in JavaScript.
-// However, using JS date operations to generate parameters that are then used to
-// test those some date operations seems unsound.  However, it isn't clear if there
-//is a good interoperable alternative.
-
-# Copyright 2009 the Sputnik authors.  All rights reserved.
-# This code is governed by the BSD license found in the LICENSE file.
-
-def GetDaylightSavingsTimes():
-  # Is the given floating-point time in DST?
-  def IsDst(t):
-    return time.localtime(t)[-1]
-  # Binary search to find an interval between the two times no greater than
-  # delta where DST switches, returning the midpoint.
-  def FindBetween(start, end, delta):
-    while end - start > delta:
-      middle = (end + start) / 2
-      if IsDst(middle) == IsDst(start):
-        start = middle
-      else:
-        end = middle
-    return (start + end) / 2
-  now = time.time()
-  one_month = (30 * 24 * 60 * 60)
-  # First find a date with different daylight savings.  To avoid corner cases
-  # we try four months before and after today.
-  after = now + 4 * one_month
-  before = now - 4 * one_month
-  if IsDst(now) == IsDst(before) and IsDst(now) == IsDst(after):
-    logger.warning("Was unable to determine DST info.")
-    return None
-  # Determine when the change occurs between now and the date we just found
-  # in a different DST.
-  if IsDst(now) != IsDst(before):
-    first = FindBetween(before, now, 1)
-  else:
-    first = FindBetween(now, after, 1)
-  # Determine when the change occurs between three and nine months from the
-  # first.
-  second = FindBetween(first + 3 * one_month, first + 9 * one_month, 1)
-  # Find out which switch is into and which if out of DST
-  if IsDst(first - 1) and not IsDst(first + 1):
-    start = second
-    end = first
-  else:
-    start = first
-    end = second
-  return (start, end)
-
-
-def GetDaylightSavingsAttribs():
-  times = GetDaylightSavingsTimes()
-  if not times:
-    return None
-  (start, end) = times
-  def DstMonth(t):
-    return time.localtime(t)[1] - 1
-  def DstHour(t):
-    return time.localtime(t - 1)[3] + 1
-  def DstSunday(t):
-    if time.localtime(t)[2] > 15:
-      return "'last'"
-    else:
-      return "'first'"
-  def DstMinutes(t):
-    return (time.localtime(t - 1)[4] + 1) % 60
-  attribs = { }
-  attribs['start_month'] = DstMonth(start)
-  attribs['end_month'] = DstMonth(end)
-  attribs['start_sunday'] = DstSunday(start)
-  attribs['end_sunday'] = DstSunday(end)
-  attribs['start_hour'] = DstHour(start)
-  attribs['end_hour'] = DstHour(end)
-  attribs['start_minutes'] = DstMinutes(start)
-  attribs['end_minutes'] = DstMinutes(end)
-  return attribs
-
-*********/
\ No newline at end of file
diff --git a/website/harness/sta.js b/website/harness/sta.js
index 5e828c680985730acfe63cfb74927c843cb34ea7..c25198cb5f5345659514451a5717e389ca28cdda 100644
--- a/website/harness/sta.js
+++ b/website/harness/sta.js
@@ -284,6 +284,624 @@ var NotEarlyErrorString = "NotEarlyError";
 var EarlyErrorRePat = "^((?!" + NotEarlyErrorString + ").)*$";
 var NotEarlyError = new Error(NotEarlyErrorString);
 
+//-----------------------------------------------------------------------------
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+function Test262Error(message) {
+    if (message) this.message = message;
+}
+
+Test262Error.prototype.toString = function () {
+    return "Test262 Error: " + this.message;
+};
+
+function testFailed(message) {
+    throw new Test262Error(message);
+}
+
+
+function testPrint(message) {
+
+}
+
+
+//adaptors for Test262 framework
+function $PRINT(message) {
+
+}
+
+function $INCLUDE(message) { }
+function $ERROR(message) {
+    testFailed(message);
+}
+
+function $FAIL(message) {
+    testFailed(message);
+}
+
+
+
+//Sputnik library definitions
+//Ultimately these should be namespaced some how and only made
+//available to tests that explicitly include them.
+//For now, we just define the globally
+
+//math_precision.js
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+function getPrecision(num) {
+    //TODO: Create a table of prec's,
+    //      because using Math for testing Math isn't that correct.
+
+    log2num = Math.log(Math.abs(num)) / Math.LN2;
+    pernum = Math.ceil(log2num);
+    return (2 * Math.pow(2, -52 + pernum));
+    //return(0);
+}
+
+
+//math_isequal.js
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+var prec;
+function isEqual(num1, num2) {
+    if ((num1 === Infinity) && (num2 === Infinity)) {
+        return (true);
+    }
+    if ((num1 === -Infinity) && (num2 === -Infinity)) {
+        return (true);
+    }
+    prec = getPrecision(Math.min(Math.abs(num1), Math.abs(num2)));
+    return (Math.abs(num1 - num2) <= prec);
+    //return(num1 === num2);
+}
+
+//numeric_conversion.js
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+function ToInteger(p) {
+    x = Number(p);
+
+    if (isNaN(x)) {
+        return +0;
+    }
+
+    if ((x === +0)
+  || (x === -0)
+  || (x === Number.POSITIVE_INFINITY)
+  || (x === Number.NEGATIVE_INFINITY)) {
+        return x;
+    }
+
+    var sign = (x < 0) ? -1 : 1;
+
+    return (sign * Math.floor(Math.abs(x)));
+}
+
+//Date_constants.js
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+var HoursPerDay = 24;
+var MinutesPerHour = 60;
+var SecondsPerMinute = 60;
+
+var msPerDay = 86400000;
+var msPerSecond = 1000;
+var msPerMinute = 60000;
+var msPerHour = 3600000;
+
+var date_1899_end = -2208988800001;
+var date_1900_start = -2208988800000;
+var date_1969_end = -1;
+var date_1970_start = 0;
+var date_1999_end = 946684799999;
+var date_2000_start = 946684800000;
+var date_2099_end = 4102444799999;
+var date_2100_start = 4102444800000;
+
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+//the following values are normally generated by the sputnik.py driver
+var $LocalTZ,
+    $DST_start_month,
+    $DST_start_sunday,
+    $DST_start_hour,
+    $DST_start_minutes,
+    $DST_end_month,
+    $DST_end_sunday,
+    $DST_end_hour,
+    $DST_end_minutes;
+
+(function () {
+    /**
+      * Finds the first date, starting from |start|, where |predicate|
+      * holds.
+      */
+    var findNearestDateBefore = function(start, predicate) {
+        var current = start;
+        var month = 1000 * 60 * 60 * 24 * 30;
+        for (var step = month; step > 0; step = Math.floor(step / 3)) {
+            if (!predicate(current)) {
+                while (!predicate(current))
+                    current = new Date(current.getTime() + step);
+                    current = new Date(current.getTime() - step);
+                }
+        }
+        while (!predicate(current)) {
+            current = new Date(current.getTime() + 1);
+        }
+        return current;
+    }
+
+    var juneDate = new Date(2000, 5, 20, 0, 0, 0, 0);
+    var decemberDate = new Date(2000, 11, 20, 0, 0, 0, 0);
+    var juneOffset = juneDate.getTimezoneOffset();
+    var decemberOffset = decemberDate.getTimezoneOffset();
+    var isSouthernHemisphere = (juneOffset > decemberOffset);
+    var winterTime = isSouthernHemisphere ? juneDate : decemberDate;
+    var summerTime = isSouthernHemisphere ? decemberDate : juneDate;
+    
+    var dstStart = findNearestDateBefore(winterTime, function (date) {
+        return date.getTimezoneOffset() == summerTime.getTimezoneOffset();
+    });
+    $DST_start_month = dstStart.getMonth();
+    $DST_start_sunday = dstStart.getDate() > 15 ? '"last"' : '"first"';
+    $DST_start_hour = dstStart.getHours();
+    $DST_start_minutes = dstStart.getMinutes();
+      
+    var dstEnd = findNearestDateBefore(summerTime, function (date) {
+        return date.getTimezoneOffset() == winterTime.getTimezoneOffset();
+    });
+    $DST_end_month = dstEnd.getMonth();
+    $DST_end_sunday = dstEnd.getDate() > 15 ? '"last"' : '"first"';
+    $DST_end_hour = dstEnd.getHours();
+    $DST_end_minutes = dstEnd.getMinutes();
+    
+    return;
+})();
+
+
+//Date.library.js
+// Copyright 2009 the Sputnik authors.  All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+//15.9.1.2 Day Number and Time within Day
+function Day(t) {
+  return Math.floor(t/msPerDay);
+}
+
+function TimeWithinDay(t) {
+  return t%msPerDay;
+}
+
+//15.9.1.3 Year Number
+function DaysInYear(y){
+  if(y%4 != 0) return 365;
+  if(y%4 == 0 && y%100 != 0) return 366;
+  if(y%100 == 0 && y%400 != 0) return 365;
+  if(y%400 == 0) return 366;
+}
+
+function DayFromYear(y) {
+  return (365*(y-1970)
+          + Math.floor((y-1969)/4)
+          - Math.floor((y-1901)/100)
+          + Math.floor((y-1601)/400));
+}
+
+function TimeFromYear(y){
+  return msPerDay*DayFromYear(y);
+}
+
+function YearFromTime(t) {
+  t = Number(t);
+  var sign = ( t < 0 ) ? -1 : 1;
+  var year = ( sign < 0 ) ? 1969 : 1970;
+  
+  for(var time = 0;;year += sign){
+    time = TimeFromYear(year);
+    
+    if(sign > 0 && time > t){
+      year -= sign;
+      break;
+    }
+    else if(sign < 0 && time <= t){
+      break;
+    }
+  };
+  return year;
+}
+  
+function InLeapYear(t){
+  if(DaysInYear(YearFromTime(t)) == 365)
+    return 0;
+  
+  if(DaysInYear(YearFromTime(t)) == 366)
+    return 1;
+}
+
+function DayWithinYear(t) {
+  return Day(t)-DayFromYear(YearFromTime(t));
+}
+
+//15.9.1.4 Month Number
+function MonthFromTime(t){
+  var day = DayWithinYear(t);
+  var leap = InLeapYear(t);
+
+  if((0 <= day) && (day < 31)) return 0;
+  if((31 <= day) && (day < (59+leap))) return 1;
+  if(((59+leap) <= day) && (day < (90+leap))) return 2;
+  if(((90+leap) <= day) && (day < (120+leap))) return 3;
+  if(((120+leap) <= day) && (day < (151+leap))) return 4;
+  if(((151+leap) <= day) && (day < (181+leap))) return 5;
+  if(((181+leap) <= day) && (day < (212+leap))) return 6;
+  if(((212+leap) <= day) && (day < (243+leap))) return 7;
+  if(((243+leap) <= day) && (day < (273+leap))) return 8;
+  if(((273+leap) <= day) && (day < (304+leap))) return 9;
+  if(((304+leap) <= day) && (day < (334+leap))) return 10;
+  if(((334+leap) <= day) && (day < (365+leap))) return 11;
+}
+
+//15.9.1.5 Date Number
+function DateFromTime(t) {
+  var day = DayWithinYear(t);
+  var month = MonthFromTime(t);
+  var leap = InLeapYear(t);
+
+  if(month == 0) return day+1;
+  if(month == 1) return day-30;
+  if(month == 2) return day-58-leap;
+  if(month == 3) return day-89-leap;
+  if(month == 4) return day-119-leap;
+  if(month == 5) return day-150-leap;
+  if(month == 6) return day-180-leap;
+  if(month == 7) return day-211-leap;
+  if(month == 8) return day-242-leap;
+  if(month == 9) return day-272-leap;
+  if(month == 10) return day-303-leap;
+  if(month == 11) return day-333-leap;
+}
+
+//15.9.1.6 Week Day
+function WeekDay(t) {
+  var weekday = (Day(t)+4)%7;
+  return (weekday < 0 ? 7+weekday : weekday);
+}
+
+//15.9.1.9 Daylight Saving Time Adjustment
+$LocalTZ = (new Date()).getTimezoneOffset() / -60;
+if (DaylightSavingTA((new Date()).valueOf()) !== 0) {
+   $LocalTZ -= 1;
+}
+var LocalTZA = $LocalTZ*msPerHour;
+
+function DaysInMonth(m, leap) {
+  m = m%12;
+  
+  //April, June, Sept, Nov
+  if(m == 3 || m == 5 || m == 8 || m == 10 ) {
+    return 30;
+  }
+
+  //Jan, March, May, July, Aug, Oct, Dec
+  if(m == 0 || m == 2 || m == 4 || m == 6 || m == 7 || m == 9 || m == 11){
+    return 31;
+  }
+
+  //Feb
+  return 28+leap;
+}
+
+function GetSundayInMonth(t, m, count){
+    var year = YearFromTime(t);
+    
+    if (count==='"first"') {
+        for (var d=1; d <= DaysInMonth(m, InLeapYear(t)); d++) {
+            tempDate = new Date(year, m, d);
+            if (tempDate.getDay()===0) {
+                return tempDate.valueOf();
+            }         
+        }
+    } else if(count==='"last"') {
+        for (var d=DaysInMonth(m, InLeapYear(t)); d>0; d--) {
+            tempDate = new Date(year, m, d);
+            if (tempDate.getDay()===0) {
+                return tempDate.valueOf();
+            }
+        }
+    }
+    throw new Error("Unsupported 'count' arg:" + count);
+}
+/*
+function GetSundayInMonth(t, m, count){
+  var year = YearFromTime(t);
+  var leap = InLeapYear(t);
+  var day = 0;
+  
+  if(m >= 1) day += DaysInMonth(0, leap);
+  if(m >= 2) day += DaysInMonth(1, leap);
+  if(m >= 3) day += DaysInMonth(2, leap);
+  if(m >= 4) day += DaysInMonth(3, leap);
+  if(m >= 5) day += DaysInMonth(4, leap);
+  if(m >= 6) day += DaysInMonth(5, leap);
+  if(m >= 7) day += DaysInMonth(6, leap);
+  if(m >= 8) day += DaysInMonth(7, leap);
+  if(m >= 9) day += DaysInMonth(8, leap);
+  if(m >= 10) day += DaysInMonth(9, leap);
+  if(m >= 11) day += DaysInMonth(10, leap);
+  
+  var month_start = TimeFromYear(year)+day*msPerDay;
+  var sunday = 0;
+  
+  if(count === "last"){
+    for(var last_sunday = month_start+DaysInMonth(m, leap)*msPerDay; 
+      WeekDay(last_sunday)>0;
+      last_sunday -= msPerDay
+    ){};
+    sunday = last_sunday;
+  }
+  else {
+    for(var first_sunday = month_start; 
+      WeekDay(first_sunday)>0;
+      first_sunday += msPerDay
+    ){};
+    sunday = first_sunday+7*msPerDay*(count-1);
+  }
+  
+  return sunday;
+}*/
+
+function DaylightSavingTA(t) {
+//  t = t-LocalTZA;
+
+  var DST_start = GetSundayInMonth(t, $DST_start_month, $DST_start_sunday) +
+                  $DST_start_hour*msPerHour + 
+                  $DST_start_minutes*msPerMinute;
+                  
+  var k = new Date(DST_start);
+  
+  var DST_end   = GetSundayInMonth(t, $DST_end_month, $DST_end_sunday) +
+                  $DST_end_hour*msPerHour +
+                  $DST_end_minutes*msPerMinute;
+
+  if ( t >= DST_start && t < DST_end ) {
+    return msPerHour;
+  } else {
+    return 0;
+  }
+}
+
+//15.9.1.9 Local Time
+function LocalTime(t){
+  return t+LocalTZA+DaylightSavingTA(t);
+}
+
+function UTC(t) {
+  return t-LocalTZA-DaylightSavingTA(t-LocalTZA);
+}
+
+//15.9.1.10 Hours, Minutes, Second, and Milliseconds
+function HourFromTime(t){
+  return Math.floor(t/msPerHour)%HoursPerDay;
+}
+
+function MinFromTime(t){
+  return Math.floor(t/msPerMinute)%MinutesPerHour;
+}
+
+function SecFromTime(t){
+  return Math.floor(t/msPerSecond)%SecondsPerMinute;
+}
+
+function msFromTime(t){
+  return t%msPerSecond;
+}
+
+//15.9.1.11 MakeTime (hour, min, sec, ms)
+function MakeTime(hour, min, sec, ms){
+  if ( !isFinite(hour) || !isFinite(min) || !isFinite(sec) || !isFinite(ms)) {
+    return Number.NaN;
+  }
+
+  hour = ToInteger(hour);
+  min  = ToInteger(min);
+  sec  = ToInteger(sec);
+  ms   = ToInteger(ms);
+
+  return ((hour*msPerHour) + (min*msPerMinute) + (sec*msPerSecond) + ms);
+}
+
+//15.9.1.12 MakeDay (year, month, date)
+function MakeDay(year, month, date) {
+  if ( !isFinite(year) || !isFinite(month) || !isFinite(date)) {
+    return Number.NaN;
+  }
+
+  year = ToInteger(year);
+  month = ToInteger(month);
+  date = ToInteger(date );
+
+  var result5 = year + Math.floor(month/12);
+  var result6 = month%12;
+
+  var sign = ( year < 1970 ) ? -1 : 1;
+  var t =    ( year < 1970 ) ? 1 :  0;
+  var y =    ( year < 1970 ) ? 1969 : 1970;
+
+  if( sign == -1 ){
+    for ( y = 1969; y >= year; y += sign ) {
+      t += sign * DaysInYear(y)*msPerDay;
+    }
+  } else {
+    for ( y = 1970 ; y < year; y += sign ) {
+      t += sign * DaysInYear(y)*msPerDay;
+    }
+  }
+
+  var leap = 0;
+  for ( var m = 0; m < month; m++ ) {
+    //if year is changed, than we need to recalculate leep
+    leap = InLeapYear(t);
+    t += DaysInMonth(m, leap)*msPerDay;
+  }
+
+  if ( YearFromTime(t) != result5 ) {
+    return Number.NaN;
+  }
+  if ( MonthFromTime(t) != result6 ) {
+    return Number.NaN;
+  }
+  if ( DateFromTime(t) != 1 ) {
+    return Number.NaN;
+  }
+
+  return Day(t)+date-1;
+}
+
+//15.9.1.13 MakeDate (day, time)
+function MakeDate( day, time ) {
+  if(!isFinite(day) || !isFinite(time)) {
+    return Number.NaN;
+  }
+  
+  return day*msPerDay+time;
+}
+
+//15.9.1.14 TimeClip (time)
+function TimeClip(time) {
+  if(!isFinite(time) || Math.abs(time) > 8.64e15){
+    return Number.NaN;
+  }
+
+  return ToInteger(time);
+}
+
+//Test Functions
+function ConstructDate(year, month, date, hours, minutes, seconds, ms){
+  /*
+   * 1. Call ToNumber(year)
+   * 2. Call ToNumber(month)
+   * 3. If date is supplied use ToNumber(date); else use 1
+   * 4. If hours is supplied use ToNumber(hours); else use 0
+   * 5. If minutes is supplied use ToNumber(minutes); else use 0
+   * 6. If seconds is supplied use ToNumber(seconds); else use 0
+   * 7. If ms is supplied use ToNumber(ms); else use 0
+   * 8. If Result(1) is not NaN and 0 <= ToInteger(Result(1)) <= 99, Result(8) is
+   * 1900+ToInteger(Result(1)); otherwise, Result(8) is Result(1)
+   * 9. Compute MakeDay(Result(8), Result(2), Result(3))
+   * 10. Compute MakeTime(Result(4), Result(5), Result(6), Result(7))
+   * 11. Compute MakeDate(Result(9), Result(10))
+   * 12. Set the [[Value]] property of the newly constructed object to TimeClip(UTC(Result(11)))
+   */
+  var r1 = Number(year);
+  var r2 = Number(month);
+  var r3 = ((date && arguments.length > 2) ? Number(date) : 1);
+  var r4 = ((hours && arguments.length > 3) ? Number(hours) : 0);   
+  var r5 = ((minutes && arguments.length > 4) ? Number(minutes) : 0);   
+  var r6 = ((seconds && arguments.length > 5) ? Number(seconds) : 0);   
+  var r7 = ((ms && arguments.length > 6) ? Number(ms) : 0);
+  
+  var r8 = r1;
+  
+  if(!isNaN(r1) && (0 <= ToInteger(r1)) && (ToInteger(r1) <= 99))
+    r8 = 1900+r1;
+  
+  var r9 = MakeDay(r8, r2, r3);
+  var r10 = MakeTime(r4, r5, r6, r7);
+  var r11 = MakeDate(r9, r10);
+  
+  return TimeClip(UTC(r11));
+}
+
+
+
+/**** Python code for initialize the above constants
+// We may want to replicate the following in JavaScript.
+// However, using JS date operations to generate parameters that are then used to
+// test those some date operations seems unsound.  However, it isn't clear if there
+//is a good interoperable alternative.
+
+# Copyright 2009 the Sputnik authors.  All rights reserved.
+# This code is governed by the BSD license found in the LICENSE file.
+
+def GetDaylightSavingsTimes():
+# Is the given floating-point time in DST?
+def IsDst(t):
+return time.localtime(t)[-1]
+# Binary search to find an interval between the two times no greater than
+# delta where DST switches, returning the midpoint.
+def FindBetween(start, end, delta):
+while end - start > delta:
+middle = (end + start) / 2
+if IsDst(middle) == IsDst(start):
+start = middle
+else:
+end = middle
+return (start + end) / 2
+now = time.time()
+one_month = (30 * 24 * 60 * 60)
+# First find a date with different daylight savings.  To avoid corner cases
+# we try four months before and after today.
+after = now + 4 * one_month
+before = now - 4 * one_month
+if IsDst(now) == IsDst(before) and IsDst(now) == IsDst(after):
+logger.warning("Was unable to determine DST info.")
+return None
+# Determine when the change occurs between now and the date we just found
+# in a different DST.
+if IsDst(now) != IsDst(before):
+first = FindBetween(before, now, 1)
+else:
+first = FindBetween(now, after, 1)
+# Determine when the change occurs between three and nine months from the
+# first.
+second = FindBetween(first + 3 * one_month, first + 9 * one_month, 1)
+# Find out which switch is into and which if out of DST
+if IsDst(first - 1) and not IsDst(first + 1):
+start = second
+end = first
+else:
+start = first
+end = second
+return (start, end)
+
+
+def GetDaylightSavingsAttribs():
+times = GetDaylightSavingsTimes()
+if not times:
+return None
+(start, end) = times
+def DstMonth(t):
+return time.localtime(t)[1] - 1
+def DstHour(t):
+return time.localtime(t - 1)[3] + 1
+def DstSunday(t):
+if time.localtime(t)[2] > 15:
+return "'last'"
+else:
+return "'first'"
+def DstMinutes(t):
+return (time.localtime(t - 1)[4] + 1) % 60
+attribs = { }
+attribs['start_month'] = DstMonth(start)
+attribs['end_month'] = DstMonth(end)
+attribs['start_sunday'] = DstSunday(start)
+attribs['end_sunday'] = DstSunday(end)
+attribs['start_hour'] = DstHour(start)
+attribs['end_hour'] = DstHour(end)
+attribs['start_minutes'] = DstMinutes(start)
+attribs['end_minutes'] = DstMinutes(end)
+return attribs
+
+*********/
+
 //--Test case registration-----------------------------------------------------
 function runTestCase(testcase) {
     if (testcase() !== true) {
diff --git a/website/harness/sth.js b/website/harness/sth.js
index f60ce575894733495a2408a88e8ae38ced6e6d7f..8d2658d868934172fbccb86f2bbda6403600ee25 100644
--- a/website/harness/sth.js
+++ b/website/harness/sth.js
@@ -127,11 +127,6 @@ function BrowserRunner() {
         //TODO: these should be moved to sta.js
         var includes = code.match(/\$INCLUDE\(([^\)]+)\)/g), // find all of the $INCLUDE statements
             include;
-        iwin.Test262Error = Test262Error;
-        iwin.$ERROR = $ERROR;
-        iwin.$FAIL = $FAIL;
-        iwin.$PRINT = function () { };
-        iwin.$INCLUDE = function () { };
 
         if (includes !== null) {
             // We have some includes, so loop through each include and
diff --git a/website/json/default.json b/website/json/default.json
index 62823d1bc8f3e22b89bd9ae22538e512bd2c6a14..78f65c25c0e95f695512dee2608e69546a91d307 100644
--- a/website/json/default.json
+++ b/website/json/default.json
@@ -1 +1 @@
-{"date":"2011-09-25","numTests":11016,"testSuite":["json/07_Lexical_Conventions.json","json/08_Types.json","json/09_Type_Conversion.json","json/10_Execution_Contexts.json","json/11.10_Binary_Bitwise_Operators.json","json/11.11_Binary_Logical_Operators.json","json/11.12_Conditional_Operator.json","json/11.13_Assignment_Operators.json","json/11.14_Comma_Operator.json","json/11.1_Primary_Expressions.json","json/11.2_Left_Hand_Side_Expressions.json","json/11.3_PostfixExpressions.json","json/11.4_Unary_Operators.json","json/11.5_Multiplicative_Operators.json","json/11.6_Additive_Operators.json","json/11.7_Bitwise_Shift_Operators.json","json/11.8_Relational_Operators.json","json/11.9_Equality_Operators.json","json/12_Statement.json","json/13_Function_Definition.json","json/14_Program.json","json/15.10_RegExp_Objects.json","json/15.11_Error_Objects.json","json/15.12_The_JSON_Object.json","json/15.1_The_Global_Object.json","json/15.2_Object_Objects.json","json/15.3_Function_Objects.json","json/15.4_Array_Objects.json","json/15.5_String_Objects.json","json/15.6_Boolean_Objects.json","json/15.7_Number_Objects.json","json/15.8_The_Math_Object.json","json/15.9_Date_Objects.json","json/chapter07.json","json/chapter08.json","json/chapter10.json","json/chapter11.json","json/chapter12.json","json/chapter13.json","json/chapter14.json","json/15.1.json","json/15.10.json","json/15.11.json","json/15.12.json","json/15.2.3.1.json","json/15.2.3.10.json","json/15.2.3.11.json","json/15.2.3.12.json","json/15.2.3.13.json","json/15.2.3.14.json","json/15.2.3.2.json","json/15.2.3.3.json","json/15.2.3.4.json","json/15.2.3.5.json","json/15.2.3.6.json","json/15.2.3.7.json","json/15.2.3.8.json","json/15.2.3.9.json","json/15.2.4.json","json/15.3.json","json/15.4.3.json","json/15.4.4.10.json","json/15.4.4.12.json","json/15.4.4.14.json","json/15.4.4.15.json","json/15.4.4.16.json","json/15.4.4.17.json","json/15.4.4.18.json","json/15.4.4.19.json","json/15.4.4.20.json","json/15.4.4.21.json","json/15.4.4.22.json","json/15.4.4.4.json","json/15.4.5.json","json/15.5.json","json/15.7.json","json/15.9.json"],"version":"ES5"}
\ No newline at end of file
+{"date":"2011-09-26","numTests":11016,"testSuite":["json/07_Lexical_Conventions.json","json/08_Types.json","json/09_Type_Conversion.json","json/10_Execution_Contexts.json","json/11.10_Binary_Bitwise_Operators.json","json/11.11_Binary_Logical_Operators.json","json/11.12_Conditional_Operator.json","json/11.13_Assignment_Operators.json","json/11.14_Comma_Operator.json","json/11.1_Primary_Expressions.json","json/11.2_Left_Hand_Side_Expressions.json","json/11.3_PostfixExpressions.json","json/11.4_Unary_Operators.json","json/11.5_Multiplicative_Operators.json","json/11.6_Additive_Operators.json","json/11.7_Bitwise_Shift_Operators.json","json/11.8_Relational_Operators.json","json/11.9_Equality_Operators.json","json/12_Statement.json","json/13_Function_Definition.json","json/14_Program.json","json/15.10_RegExp_Objects.json","json/15.11_Error_Objects.json","json/15.12_The_JSON_Object.json","json/15.1_The_Global_Object.json","json/15.2_Object_Objects.json","json/15.3_Function_Objects.json","json/15.4_Array_Objects.json","json/15.5_String_Objects.json","json/15.6_Boolean_Objects.json","json/15.7_Number_Objects.json","json/15.8_The_Math_Object.json","json/15.9_Date_Objects.json","json/chapter07.json","json/chapter08.json","json/chapter10.json","json/chapter11.json","json/chapter12.json","json/chapter13.json","json/chapter14.json","json/15.1.json","json/15.10.json","json/15.11.json","json/15.12.json","json/15.2.3.1.json","json/15.2.3.10.json","json/15.2.3.11.json","json/15.2.3.12.json","json/15.2.3.13.json","json/15.2.3.14.json","json/15.2.3.2.json","json/15.2.3.3.json","json/15.2.3.4.json","json/15.2.3.5.json","json/15.2.3.6.json","json/15.2.3.7.json","json/15.2.3.8.json","json/15.2.3.9.json","json/15.2.4.json","json/15.3.json","json/15.4.3.json","json/15.4.4.10.json","json/15.4.4.12.json","json/15.4.4.14.json","json/15.4.4.15.json","json/15.4.4.16.json","json/15.4.4.17.json","json/15.4.4.18.json","json/15.4.4.19.json","json/15.4.4.20.json","json/15.4.4.21.json","json/15.4.4.22.json","json/15.4.4.4.json","json/15.4.5.json","json/15.5.json","json/15.7.json","json/15.9.json"],"version":"ES5"}
\ No newline at end of file