Index: mbstring.xml
===================================================================
--- mbstring.xml	(revision 0)
+++ mbstring.xml	(working copy)
@@ -0,0 +1,11 @@
+<phpunit
+        bootstrap="bootstrap.php"
+        backupGlobals="false"
+        colors="true"
+        >
+    <testsuites>
+        <testsuite>
+            <directory suffix=".php">tests/mbstring</directory>
+        </testsuite>
+    </testsuites>
+</phpunit>
Index: phpunit.xml
===================================================================
--- phpunit.xml	(revision 1058)
+++ phpunit.xml	(working copy)
@@ -14,6 +14,7 @@
     <groups>
         <exclude>
             <group>ajax</group>
+			<group>mbstring</group>
         </exclude>
     </groups>
     <logging>
Index: tests/mbstring/serialize.php
===================================================================
--- tests/mbstring/serialize.php	(revision 0)
+++ tests/mbstring/serialize.php	(working copy)
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * @group mbstring
+ */
+class Tests_Mbstring_Serialize extends WP_UnitTestCase {
+
+	/**
+	 * @ticket 180071
+	 * @see http://core.trac.wordpress.org/ticket/18007
+	 * @global mixed $wpdb
+	 */
+	public function test_get_option() {
+		global $wpdb;
+
+		/**
+		 * Context
+		 * 
+		 * utf-8 encoded database fields
+		 * auto overlaoding singlebyte functions from conf (see  http://www.php.net/manual/en/mbstring.overload.php)
+		 */
+
+		if ( ini_get( 'mbstring.func_overload' ) < 4 ) {
+			$this->markTestIncomplete( 'Please run as php -d mbstring.func_overload=4 /usr/bin/phpunit -c mbstring.xml');
+		}
+		
+		// Need to figure out a better solution for this.  It won't get rolled back during teardown
+		$wpdb->query( 'ALTER TABLE ' . $wpdb->options . ' MODIFY option_value LONGTEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci ' );
+
+		/**
+		 * Bug scenario
+		 * 
+		 * the strlen call is actually a mb_strlen one
+		 * the $length var is the number of characters (not bytes)
+		 * using $data[$length-1] don't retrieve the last char but one before, it's actual position is undefined, depending on the other content of the string
+		 * this $lastc is not ; or }
+		 * the string is understood has not serialized
+		 */
+
+		// Set an option with 
+		$expected = array( "aéùp" );
+		$serialized = serialize( serialize( $expected ) );
+
+		// Alternate way to create the serialized data
+		// $serialized = 's:23:"a:1:{i:0;s:6:"aÃ©Ã¹p";}';
+
+		update_option( 'test_18007_option', $expected );
+		
+		//*
+		// Alternate way to set an option
+		$result = $wpdb->query(
+			$wpdb->prepare(
+					"INSERT INTO `$wpdb->options` (`option_name`, `option_value`, `autoload`) VALUES (%s, %s, %s)
+					ON DUPLICATE KEY UPDATE `option_name` = VALUES(`option_name`), `option_value` = VALUES(`option_value`), `autoload` = VALUES(`autoload`)",
+					'test_18007_option', $serialized, 'no'
+				)
+			);
+		//*/
+
+		// Retrieve the option
+		$test = get_option( 'test_18007_option' );		
+		
+		// This should not unserialize properly
+		$this->assertNotEquals( $expected, $test );
+	}
+}
