diff --git a/CleanSpec.mk b/CleanSpec.mk
new file mode 100644
index 0000000..b84e1b6
--- /dev/null
+++ b/CleanSpec.mk
@@ -0,0 +1,49 @@
+# Copyright (C) 2007 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# If you don't need to do a full clean build but would like to touch
+# a file or delete some intermediate files, add a clean step to the end
+# of the list.  These steps will only be run once, if they haven't been
+# run before.
+#
+# E.g.:
+#     $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
+#     $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
+#
+# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
+# files that are missing or have been moved.
+#
+# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
+# Use $(OUT_DIR) to refer to the "out" directory.
+#
+# If you need to re-do something that's already mentioned, just copy
+# the command and add it to the bottom of the list.  E.g., if a change
+# that you made last week required touching a file and a change you
+# made today requires touching the same file, just copy the old
+# touch step and add it to the end of the list.
+#
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
+
+# For example:
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
+#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
+#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
+#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
+
+# ************************************************
+# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
+# ************************************************
diff --git a/libcore-disabled/NOTICE b/libcore-disabled/NOTICE
deleted file mode 100644
index a0a06da..0000000
--- a/libcore-disabled/NOTICE
+++ /dev/null
@@ -1,16 +0,0 @@
-   =========================================================================
-   ==  NOTICE file corresponding to the section 4 d of                    ==
-   ==  the Apache License, Version 2.0,                                   ==
-   ==  in this case for the Apache Harmony distribution.                  ==
-   =========================================================================
-
-Apache Harmony
-Copyright 2006 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-Portions of Harmony were originally developed by
-Intel Corporation and are licensed to the Apache Software
-Foundation under the "Software Grant and Corporate Contribution
-License Agreement", informally known as the "Intel Harmony CLA".
diff --git a/libcore-disabled/SoundTest/Android.mk b/libcore-disabled/SoundTest/Android.mk
deleted file mode 100644
index bd628a5..0000000
--- a/libcore-disabled/SoundTest/Android.mk
+++ /dev/null
@@ -1,19 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_JAVA_LIBRARIES := framework core
-
-LOCAL_MODULE_TAGS := tests
-
-LOCAL_SRC_FILES := $(call all-subdir-java-files)
-
-#define all-core-resource-dirs
-#$(shell cd $(LOCAL_PATH) && find resources)
-#endef
-
-#LOCAL_JAVA_RESOURCE_DIRS := $(call all-core-resource-dirs)
-
-LOCAL_PACKAGE_NAME := SoundTest
-
-include $(BUILD_PACKAGE)
diff --git a/libcore-disabled/SoundTest/AndroidManifest.xml b/libcore-disabled/SoundTest/AndroidManifest.xml
deleted file mode 100644
index 6c8d257..0000000
--- a/libcore-disabled/SoundTest/AndroidManifest.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.tests.soundtest">
- -      <application>
-       <!-- icon="@drawable/logo" -->
-        <activity android:name="SoundTest" android:label="SoundTest">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.DEFAULT"/>
-                <category android:name="android.intent.category.LAUNCHER"/>
-            </intent-filter>
-        </activity>
-    </application> 
-</manifest>
diff --git a/libcore-disabled/SoundTest/assets/fx_foghorn.mp3 b/libcore-disabled/SoundTest/assets/fx_foghorn.mp3
deleted file mode 100644
index 71226cf..0000000
--- a/libcore-disabled/SoundTest/assets/fx_foghorn.mp3
+++ /dev/null
Binary files differ
diff --git a/libcore-disabled/SoundTest/res/layout/riproaring_activity.xml b/libcore-disabled/SoundTest/res/layout/riproaring_activity.xml
deleted file mode 100644
index a21599e..0000000
--- a/libcore-disabled/SoundTest/res/layout/riproaring_activity.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2007 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content">
-	<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" />
-		
-	<TextView android:id="@+id/label" android:textStyle="bold" android:textColor="#00000000" android:textSize="16sp" 
-		android:layout_weight="1"
-		android:text="@string/textview_text" />
-		
-	<EditText android:id="@+id/entry" 
-        android:layout_width="match_parent" 
-        android:layout_height="wrap_content" 
-        android:background="@android:drawable/editbox_background"
-        android:text="@string/edittext_text"
-        android:layout_below="@id/label"/>
-  
-    <Button android:id="@+id/ok" 
-        android:layout_width="wrap_content" 
-        android:layout_height="wrap_content" 
-        android:layout_below="@id/entry"
-        android:layout_alignParentRight="true"
-        android:text="@string/button_text" />
-		
-</LinearLayout>
diff --git a/libcore-disabled/SoundTest/res/values/strings.xml b/libcore-disabled/SoundTest/res/values/strings.xml
deleted file mode 100644
index 6ad4891..0000000
--- a/libcore-disabled/SoundTest/res/values/strings.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
-* Copyright (C) 2007 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*      http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
--->
-
-<resources>
-
-    <string name="textview_text">I am a TextView</string>
-    <string name="edittext_text">I am an EditText</string>
-    <string name="button_text">I am a Button</string>
-
-</resources>
diff --git a/libcore-disabled/SoundTest/src/com/android/tests/soundtest/SoundTest.java b/libcore-disabled/SoundTest/src/com/android/tests/soundtest/SoundTest.java
deleted file mode 100644
index 3be10a0..0000000
--- a/libcore-disabled/SoundTest/src/com/android/tests/soundtest/SoundTest.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.tests.soundtest;
-
-import android.app.Activity;
-import android.content.Context;
-import android.os.Bundle;
-import android.os.HandlerInterface;
-import android.os.Message;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup.LayoutParams;
-import android.widget.Button;
-import android.widget.LinearLayout;
-
-import java.io.InputStream;
-
-import javax.sound.midi.MidiSystem;
-import javax.sound.midi.Sequencer;
-import javax.sound.sampled.AudioFormat;
-import javax.sound.sampled.AudioInputStream;
-import javax.sound.sampled.AudioSystem;
-import javax.sound.sampled.DataLine;
-import javax.sound.sampled.SourceDataLine;
-
-
-public class SoundTest extends Activity implements HandlerInterface {
-
-    public Context mContext;
-    private LinearLayout mLinearLayout;
-    public LayoutParams mParams;
-    Button button, button2;
-
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-
-        Window wp = getWindow();
-        mContext = wp.getContext();
-        mParams = wp.getAttributes();
-
-        mLinearLayout = new LinearLayout(this);
-        mLinearLayout.setOrientation(LinearLayout.VERTICAL);
-        setContentView(mLinearLayout);
-
-        button = new Button(mContext);
-        button.setMinimumWidth(300);
-        button.setMinimumHeight(70);
-        button.setTextSize(14);
-        button.setText("Play sample");
-        button.setOnClickListener(buttonListener);
-
-        mLinearLayout.addView(button, new LinearLayout.LayoutParams(
-            ViewGroup.LayoutParams.WRAP_CONTENT,
-            ViewGroup.LayoutParams.WRAP_CONTENT));
-        
-        button2 = new Button(mContext);
-        button2.setMinimumWidth(300);
-        button2.setMinimumHeight(70);
-        button2.setTextSize(14);
-        button2.setText("Play MIDI");
-        button2.setOnClickListener(buttonListener2);
-
-        mLinearLayout.addView(button2, new LinearLayout.LayoutParams(
-            ViewGroup.LayoutParams.WRAP_CONTENT,
-            ViewGroup.LayoutParams.WRAP_CONTENT));
-        
-    }
-
-    private OnClickListener buttonListener = new OnClickListener() {
-        public void onClick(View v) {
-            try {
-                button.setText(button.getText() + ".");
-                
-                int RENDER_BUFF_SIZE = 1024*48;
-
-                InputStream is = getAssets().open("fx_foghorn.mp3");
-                
-                AudioInputStream ais = null;
-
-                ais = AudioSystem.getAudioInputStream(is);
-
-                AudioFormat af = ais.getFormat();
-                SourceDataLine sdl = null;
-                DataLine.Info dli = new DataLine.Info(SourceDataLine.class, af);
-                sdl = (SourceDataLine)AudioSystem.getLine(dli);
-
-                sdl.open(af);
-                sdl.start();
-
-                int bytesReaded = 0;
-                byte samplesBuff[] = new byte[RENDER_BUFF_SIZE];
-
-                while (bytesReaded != -1) {
-                    bytesReaded = ais.read(samplesBuff, 0, samplesBuff.length);
-                    if (bytesReaded > 0) {
-                        sdl.write(samplesBuff, 0, bytesReaded);
-                    }
-                }
-
-                sdl.drain();
-                sdl.close();
-            } catch (Exception ee) {
-                ee.printStackTrace();
-            }
-        }
-    };
-
-    private OnClickListener buttonListener2 = new OnClickListener() {
-        public void onClick(View v) {
-            try {
-                button2.setText(button2.getText() + ".");
-                
-                int RENDER_BUFF_SIZE = 1024*48;
-
-                InputStream is = getAssets().open("Dancing_Queen.mid");
-                
-                Sequencer s = MidiSystem.getSequencer(); 
-                s.open();
-                s.setSequence(is);
-                s.setLoopCount(1);
-                s.start();
-                
-            } catch (Exception ee) {
-                ee.printStackTrace();
-            }
-        }
-    };
-    
-    public void handleMessage(Message arg0) {
-    }
-}
diff --git a/libcore-disabled/instrument/MODULE_LICENSE_APACHE2 b/libcore-disabled/instrument/MODULE_LICENSE_APACHE2
deleted file mode 100644
index e69de29..0000000
--- a/libcore-disabled/instrument/MODULE_LICENSE_APACHE2
+++ /dev/null
diff --git a/libcore-disabled/instrument/src/main/java/java/lang/instrument/ClassDefinition.java b/libcore-disabled/instrument/src/main/java/java/lang/instrument/ClassDefinition.java
deleted file mode 100644
index 0780ca0..0000000
--- a/libcore-disabled/instrument/src/main/java/java/lang/instrument/ClassDefinition.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/* 
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *     http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package java.lang.instrument;
-
-import org.apache.harmony.instrument.internal.nls.Messages;
-
-/**
- * Wraps a {@link java.lang.Class} that is to be redefined together with the
- * byte array which constitutes the updated version of the class.
- * 
- */
-public final class ClassDefinition {
-
-    /**
-     * The <code>Class</code> object for the class that will be instrumented.
-     */
-    private Class<?> definitionClass;
-
-    /**
-     * The new version of the class file bytes for the class being instrumented.
-     */
-    private byte[] definitionClassFile;
-
-    /**
-     * Constructs a new instance of <code>ClassDefinition</code> with the
-     * supplied {@link Class} object and byte array representing the new class
-     * file bytes.
-     * 
-     * @param theClass
-     *            the <code>Class</code> object for the class to be redefined
-     * @param theClassFile
-     *            an array of bytes containing the updated version of the class
-     *            to be redefined.
-     * @throws NullPointerException
-     *             if either <code>theClass</code> or
-     *             <code>theClassFile</code> are <code>null</code>.
-     */
-    public ClassDefinition(Class<?> theClass, byte[] theClassFile) {
-        if (theClass == null) {
-            throw new NullPointerException(Messages.getString("instrument.1")); //$NON-NLS-1$
-        }
-        if (theClassFile == null) {
-            throw new NullPointerException(Messages.getString("instrument.2")); //$NON-NLS-1$
-        }
-        this.definitionClass = theClass;
-        this.definitionClassFile = theClassFile;
-    }
-
-    /**
-     * Returns the {@link Class} object for the class to be redefined.
-     * 
-     * @return the <code>Class</code> object
-     */
-    public Class<?> getDefinitionClass() {
-        return this.definitionClass;
-    }
-
-    /**
-     * Returns a reference to the byte array containing the re-engineered
-     * version of the class.
-     * 
-     * @return byte array containing the new version of the class
-     */
-    public byte[] getDefinitionClassFile() {
-        return this.definitionClassFile;
-    }
-}
diff --git a/libcore-disabled/instrument/src/main/java/java/lang/instrument/ClassFileTransformer.java b/libcore-disabled/instrument/src/main/java/java/lang/instrument/ClassFileTransformer.java
deleted file mode 100644
index 429184d..0000000
--- a/libcore-disabled/instrument/src/main/java/java/lang/instrument/ClassFileTransformer.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/* 
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *     http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package java.lang.instrument;
-
-import java.security.ProtectionDomain;
-
-/**
- * This interface must be implemented by types used to instrument classes as
- * they are loaded by a running VM. Implementations are registered by agents in
- * the {@link java.lang.instrument.Instrumentation#addTransformer} operation.
- * Once registered, a <code>ClassFileTransformer</code> has the opportunity to
- * instrument every class that is loaded or redefined by the VM provided that
- * the transformer does not have a dependency on that class.
- * <p>
- * Transformations of classes takes place just prior to them being defined by
- * the VM.
- * </p>
- * 
- */
-public interface ClassFileTransformer {
-
-    /**
-     * Receives a <code>byte</code> array containing the raw contents of a
-     * class for <i>possible</i> transformation into a new <code>byte</code>
-     * array which gets returned to the caller. It is left up to the
-     * implementation to decide what, if any, transformations are carried out
-     * and returned.
-     * <p>
-     * Requests for class transformations can occur in two situations.
-     * <ul>
-     * <li>the attempted defining of a class using
-     * {@link ClassLoader#defineClass(java.lang.String, byte[], int, int)}
-     * <li>the attempted re-defining of a previously defined class using
-     * {@link Instrumentation#redefineClasses(ClassDefinition[])}
-     * </ul>
-     * In both cases this operation will be called before the verification of
-     * the specified bytes in the <code>Class</code> file format. Each
-     * registered <code>ClassFileTransformer</code> instance will have this
-     * operation called on it. The order of the invocations matches the order in
-     * which the transformers were registered using the method
-     * {@link Instrumentation#addTransformer(ClassFileTransformer)}.
-     * </p>
-     * <p>
-     * Provided that the implementation of this method wishes to carry out a
-     * transformation, the return is a newly allocated <code>byte</code> array
-     * which contains <i>a copy of</i> the <code>classfileBuffer</code>
-     * argument plus the transformations to the array specific to the method
-     * implementation. If the transformer is written so as to pass on the
-     * opportunity to modify a given input then the return value should be
-     * <code>null</code>.
-     * </p>
-     * 
-     * @param loader
-     *            the <i>defining</i> <code>ClassLoader</code> for the
-     *            candidate class to be transformed.
-     * @param className
-     *            the fully qualified name of the candidate class to be
-     *            transformed in the <i>fully/qualified/Name</i> format.
-     * @param classBeingRedefined
-     *            if a class redefinition is in process then this argument will
-     *            be the <code>Class</code> object for the class. Otherwise,
-     *            if a class definition is in process, a <code>null</code>.
-     * @param protectionDomain
-     *            the security protection domain for the class being defined or
-     *            redefined.
-     * @param classfileBuffer
-     *            a <code>byte</code> array containing the class to be
-     *            transformed in <code>Class</code> file format.
-     *            <em>This argument
-     *            must not be modified</em>.
-     * @return if transformation occurs, a newly allocated <code>byte</code>
-     *         array containing the modified version of
-     *         <code>classfileBuffer</code>, otherwise <code>null</code>.
-     * @throws IllegalClassFormatException
-     *             if the <code>classfileBuffer</code> does not contain a
-     *             well-formed representation of a class in the
-     *             <code>Class</code> file format. Note that if an invocation
-     *             of this operation ends on an exception throw then (a) the
-     *             remaining transformers in the &quot;chain&quot; will still
-     *             have this method called, and (b) the class definition or
-     *             redefinition that was the catalyst for the transformation
-     *             opportunities will still be attempted.
-     */
-    public byte[] transform(ClassLoader loader, String className,
-            Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
-            byte[] classfileBuffer) throws IllegalClassFormatException;
-}
diff --git a/libcore-disabled/instrument/src/main/java/java/lang/instrument/IllegalClassFormatException.java b/libcore-disabled/instrument/src/main/java/java/lang/instrument/IllegalClassFormatException.java
deleted file mode 100644
index 9696bfe..0000000
--- a/libcore-disabled/instrument/src/main/java/java/lang/instrument/IllegalClassFormatException.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/* 
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *     http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package java.lang.instrument;
-
-/**
- * This exception may be thrown from implementations of the method
- * {@link java.lang.instrument.ClassFileTransformer#transform} when the class
- * file bytes supplied to it are found to be corrupted or otherwise in a format
- * which does not adhere to the expected Java class file format.
- * 
- */
-public class IllegalClassFormatException extends Exception {
-
-    private static final long serialVersionUID = -3841736710924794009L;
-
-    /**
-     * Constructs a new instance of <code>IllegalClassFormatException</code>
-     * with no explanatory message.
-     */
-    public IllegalClassFormatException() {
-        super();
-    }
-
-    /**
-     * Constructs a new instance of <code>IllegalClassFormatException</code>
-     * with the supplied message, <code>s</code>, for explanation.
-     * 
-     * @param s
-     *            a string containing information on why the exception is being
-     *            created.
-     */
-    public IllegalClassFormatException(String s) {
-        super(s);
-    }
-}
\ No newline at end of file
diff --git a/libcore-disabled/instrument/src/main/java/java/lang/instrument/Instrumentation.java b/libcore-disabled/instrument/src/main/java/java/lang/instrument/Instrumentation.java
deleted file mode 100644
index 6dd053f..0000000
--- a/libcore-disabled/instrument/src/main/java/java/lang/instrument/Instrumentation.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/* 
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *     http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package java.lang.instrument;
-
-/**
- * Instances of this interface may be used by Java instrumentation agent code
- * for support in carrying out the runtime instrumentation of classes. Using
- * such an approach, classes may be enhanced with services such as profiling,
- * logging or tracing which were not included in the source of the original
- * class.
- * <p>
- * A concrete instance of this interface is made available as an input argument
- * to all Java instrumentation agents'
- * <code>premain(String agentArgs, Instrumentation inst)</code> method.
- * </p>
- * 
- */
-public interface Instrumentation {
-
-    /**
-     * Registers the supplied <code>transformer</code> argument with the VM.
-     * Any classes that are to be defined or re-defined (if supported) in the VM
-     * will then be offered to the transformer for it to carry out any byte code
-     * modifications. The exception to this scheme is if the class to be defined /
-     * re-defined is a dependency of the transformer.
-     * <p>
-     * This operation can be carried out multiple times on a concrete
-     * <code>Instrumentation</code>. The order of registration is important
-     * as it defines the order in which the transformers' transformation
-     * operation gets called.
-     * <p>
-     * <p>
-     * It is possible for any given instance of
-     * <code>ClassFileTransformer</code> to be registered more than once with
-     * this operation.
-     * 
-     * @param transformer
-     *            a class file transformer
-     * @throws NullPointerException
-     *             if <code>transformer</code> is <code>null</code>.
-     */
-    public void addTransformer(ClassFileTransformer transformer);
-
-    /**
-     * Returns an array of all of the classes that have been loaded into the VM.
-     * 
-     * @return an array of <code>Class</code> objects with each element
-     *         identifying a class that has been loaded into the VM.
-     */
-    public Class[] getAllLoadedClasses();
-
-    /**
-     * Returns an array of all of the classes for which <code>loader</code> is
-     * the <i>initiating</i> class loader.
-     * 
-     * @param loader
-     *            a class loader. In order to obtain the array of classes
-     *            initiated by the bootstrap class loader this argument should
-     *            be <code>null</code>.
-     * @return an array of <code>Class</code> objects with each element
-     *         identifying a class that has been initiated by the specified
-     *         class loader.
-     */
-    public Class[] getInitiatedClasses(ClassLoader loader);
-
-    /**
-     * Returns the number of bytes in memory required by this VM for the
-     * supplied object <code>objectToSize</code>. The returned value should
-     * be taken as an estimation only which is susceptible to change between
-     * separate launches of the VM.
-     * 
-     * @param objectToSize
-     *            any object
-     * @return an approximation of the number of bytes in memory taken up by
-     *         <code>objectToSize</code>.
-     * @throws NullPointerException
-     *             if the given object is null.
-     */
-    public long getObjectSize(Object objectToSize);
-
-    /**
-     * Returns a boolean indication of whether or not this VM supports the
-     * on-the-fly redefining of classes that have been already loaded.
-     * 
-     * @return <code>true</code> if class redefining is supported, otherwise
-     *         <code>false</code>.
-     */
-    public boolean isRedefineClassesSupported();
-
-    /**
-     * Receives an array of {@link ClassDefinition} instances and attempts to
-     * carry out on-the-fly redefining on each of the associated classes.
-     * Redefining in this manner may be used to update the following parts of an
-     * already loaded class:
-     * <ul>
-     * <li>attributes
-     * <li>constant pool
-     * <li>method implementations
-     * </ul>
-     * If any invocations of a redefined method are already active in the VM
-     * when this call is made then they will run to completion and be unaffected
-     * by the outcome of this method. Provided the method redefinition is
-     * successful, all subsequent calls on the method will run the new version.
-     * <br>
-     * Redefining a class may <em>not</em> be used to make changes to any
-     * other aspects of a previously loaded class such as its inheritance
-     * hierarchy, the names or signatures of any of its methods, the names of
-     * any fields, the values of any static variables etc.
-     * <p>
-     * If a class associated with a <code>ClassDefinition</code> is
-     * successfully redefined then there will be no resulting re-run of any of
-     * its initialization code. Similarly, any instances of the class that were
-     * created before the redefining will not be changed in any way. That is,
-     * they will remain in the VM as instances of the previous version of the
-     * class.
-     * </p>
-     * <p>
-     * Note that before the requested redefinitions are attempted, each
-     * {@link ClassFileTransformer} registered with the VM will be given the
-     * opportunity to carry out their own custom transformations of the new
-     * version of the class.
-     * </p>
-     * 
-     * @param definitions
-     *            an array of <code>ClassDefinition</code> objects wrapping
-     *            the details of the classes to be redefined. A zero-length
-     *            array value will not cause an error but, instead, will
-     *            silently do nothing.
-     * @throws ClassNotFoundException
-     *             if any of the classes specified in the contents of
-     *             <code>definitions</code> cannot be located.
-     * @throws UnmodifiableClassException
-     *             if any of the classes specified in the contents of
-     *             <code>definitions</code> cannot be modified.
-     * @throws UnsupportedOperationException
-     *             if this method is not supported in by the VM. May be checked
-     *             in advance by calling {@link #isRedefineClassesSupported()}.
-     * @throws ClassFormatError
-     *             if any of the <code>definitions</code> elements has been
-     *             created with a <code>byte</code> array containing a badly
-     *             formed class file.
-     * @throws NoClassDefFoundError
-     *             if there is disagreement between the name of a class to be
-     *             redefined and the name of the class from the corresponding
-     *             class file format byte array.
-     * @throws UnsupportedClassVersionError
-     *             if the version of any of the classes to be redefined is not
-     *             supported by the VM.
-     * @throws ClassCircularityError
-     *             if a circular dependency is detected among the classes to be
-     *             redefined.
-     * @throws LinkageError
-     *             if a linkage error situation is detected such that there is
-     *             an incompatability between dependent classes.
-     * @throws NullPointerException
-     *             if <code>definitions</code> or any of its elements are
-     *             found to be <code>null</code>.
-     * @see #isRedefineClassesSupported()
-     */
-    public void redefineClasses(ClassDefinition[] definitions)
-            throws ClassNotFoundException, UnmodifiableClassException;
-
-    /**
-     * Removes <i>the most recently added instance of</i> the
-     * <code>ClassFileTransformer</code> object from the VM's list of
-     * registered transformers. After this call completes, the specified
-     * <code>ClassFileTransformer</code> object will no longer have its
-     * <code>transform()<code> method automatically invoked when class definitions or
-     * redefinitions are attempted. 
-     * 
-     * @param transformer
-     *            a previously registered <code>ClassFileTransformer</code>.
-     * @return <code>true</code> if <code>transformer</code> was located in
-     *         the list of registered transformers and successfully removed.
-     *         Otherwise, <code>false</code>.
-     * @throws NullPointerException
-     *            if <code>transformer</code> is <code>null</code>.
-     */
-    public boolean removeTransformer(ClassFileTransformer transformer);
-}
diff --git a/libcore-disabled/instrument/src/main/java/java/lang/instrument/UnmodifiableClassException.java b/libcore-disabled/instrument/src/main/java/java/lang/instrument/UnmodifiableClassException.java
deleted file mode 100644
index e8c8d57..0000000
--- a/libcore-disabled/instrument/src/main/java/java/lang/instrument/UnmodifiableClassException.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/* 
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *     http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package java.lang.instrument;
-
-/**
- * This exception may be thrown from implementations of the method
- * {@link java.lang.instrument.Instrumentation#redefineClasses} when one of the
- * desired class redefinition operations cannot be carried out. Such a situation
- * may arise if a redefinition attempts to alter the members of a class or its
- * inheritance hierarchy.
- * 
- */
-public class UnmodifiableClassException extends Exception {
-
-    private static final long serialVersionUID = 1716652643585309178L;
-
-    /**
-     * Constructs a new instance of <code>UnmodifiableClassException</code>
-     * with no explanatory message.
-     */
-    public UnmodifiableClassException() {
-        super();
-    }
-
-    /**
-     * Constructs a new instance of <code>UnmodifiableClassException</code>
-     * with the supplied message, <code>s</code>, for explanation.
-     * 
-     * @param s
-     *            a string containing information on why the exception is being
-     *            created.
-     */
-    public UnmodifiableClassException(String s) {
-        super(s);
-    }
-}
diff --git a/libcore-disabled/instrument/src/main/java/java/lang/instrument/package.html b/libcore-disabled/instrument/src/main/java/java/lang/instrument/package.html
deleted file mode 100644
index 50224d7..0000000
--- a/libcore-disabled/instrument/src/main/java/java/lang/instrument/package.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<html>
-  <body>
-    <p>
-      Provides classes and interfaces needed for instrumenting applications.
-    <p>
-  </body>
-</html>
\ No newline at end of file
diff --git a/libcore-disabled/instrument/src/main/java/org/apache/harmony/instrument/internal/nls/Messages.java b/libcore-disabled/instrument/src/main/java/org/apache/harmony/instrument/internal/nls/Messages.java
deleted file mode 100644
index cdde768..0000000
--- a/libcore-disabled/instrument/src/main/java/org/apache/harmony/instrument/internal/nls/Messages.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/* 
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *     http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * THE FILE HAS BEEN AUTOGENERATED BY MSGTOOL TOOL.
- * All changes made to this file manually will be overwritten 
- * if this tool runs again. Better make changes in the template file.
- */
-
-package org.apache.harmony.instrument.internal.nls;
-
-// BEGIN android-added
-import org.apache.harmony.luni.util.MsgHelp;
-// END android-added
-
-/**
- * This class retrieves strings from a resource bundle and returns them,
- * formatting them with MessageFormat when required.
- * <p>
- * It is used by the system classes to provide national language support, by
- * looking up messages in the <code>
- *    org.apache.harmony.instrument.internal.nls.messages
- * </code>
- * resource bundle. Note that if this file is not available, or an invalid key
- * is looked up, or resource bundle support is not available, the key itself
- * will be returned as the associated message. This means that the <em>KEY</em>
- * should a reasonable human-readable (english) string.
- * 
- */
-public class Messages {
-
-    // BEGIN android-changed
-    private static final String sResource =
-        "org.apache.harmony.instrument.internal.nls.messages";
-    // END android-changed
-
-    /**
-     * Retrieves a message which has no arguments.
-     * 
-     * @param msg
-     *            String the key to look up.
-     * @return String the message for that key in the system message bundle.
-     */
-    static public String getString(String msg) {
-        // BEGIN android-changed
-        return MsgHelp.getString(sResource, msg);
-        // END android-changed
-    }
-
-    /**
-     * Retrieves a message which takes 1 argument.
-     * 
-     * @param msg
-     *            String the key to look up.
-     * @param arg
-     *            Object the object to insert in the formatted output.
-     * @return String the message for that key in the system message bundle.
-     */
-    static public String getString(String msg, Object arg) {
-        return getString(msg, new Object[] { arg });
-    }
-
-    /**
-     * Retrieves a message which takes 1 integer argument.
-     * 
-     * @param msg
-     *            String the key to look up.
-     * @param arg
-     *            int the integer to insert in the formatted output.
-     * @return String the message for that key in the system message bundle.
-     */
-    static public String getString(String msg, int arg) {
-        return getString(msg, new Object[] { Integer.toString(arg) });
-    }
-
-    /**
-     * Retrieves a message which takes 1 character argument.
-     * 
-     * @param msg
-     *            String the key to look up.
-     * @param arg
-     *            char the character to insert in the formatted output.
-     * @return String the message for that key in the system message bundle.
-     */
-    static public String getString(String msg, char arg) {
-        return getString(msg, new Object[] { String.valueOf(arg) });
-    }
-
-    /**
-     * Retrieves a message which takes 2 arguments.
-     * 
-     * @param msg
-     *            String the key to look up.
-     * @param arg1
-     *            Object an object to insert in the formatted output.
-     * @param arg2
-     *            Object another object to insert in the formatted output.
-     * @return String the message for that key in the system message bundle.
-     */
-    static public String getString(String msg, Object arg1, Object arg2) {
-        return getString(msg, new Object[] { arg1, arg2 });
-    }
-
-    /**
-     * Retrieves a message which takes several arguments.
-     * 
-     * @param msg
-     *            String the key to look up.
-     * @param args
-     *            Object[] the objects to insert in the formatted output.
-     * @return String the message for that key in the system message bundle.
-     */
-    static public String getString(String msg, Object[] args) {
-        // BEGIN android-changed
-        return MsgHelp.getString(sResource, msg, args);
-        // END android-changed
-    }
-}
diff --git a/libcore-disabled/instrument/src/main/java/org/apache/harmony/instrument/internal/nls/messages.properties b/libcore-disabled/instrument/src/main/java/org/apache/harmony/instrument/internal/nls/messages.properties
deleted file mode 100644
index 6c59186..0000000
--- a/libcore-disabled/instrument/src/main/java/org/apache/harmony/instrument/internal/nls/messages.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#  
-#      http://www.apache.org/licenses/LICENSE-2.0
-#  
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-# 
-
-# messages for EN locale
-instrument.1=Received null class argument.
-instrument.2=Received null class file argument.
-instrument.3=Redefinition operation is not supported!
-instrument.4=Fatal error: failed to execute premain class of java agent.
diff --git a/libcore-disabled/sound/MODULE_LICENSE_APACHE2 b/libcore-disabled/sound/MODULE_LICENSE_APACHE2
deleted file mode 100644
index e69de29..0000000
--- a/libcore-disabled/sound/MODULE_LICENSE_APACHE2
+++ /dev/null
diff --git a/libcore-disabled/sound/src/main/java/com/android/internal/sound/midi/AndroidMidiFileReader.java b/libcore-disabled/sound/src/main/java/com/android/internal/sound/midi/AndroidMidiFileReader.java
deleted file mode 100644
index fb6b0e5..0000000
--- a/libcore-disabled/sound/src/main/java/com/android/internal/sound/midi/AndroidMidiFileReader.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.sound.midi;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-import javax.sound.midi.InvalidMidiDataException;
-import javax.sound.midi.MidiFileFormat;
-import javax.sound.midi.Sequence;
-import javax.sound.midi.spi.MidiFileReader;
-
-/**
- * Implements a MidiFileReader for Android. We need to cache data coming from an
- * arbitrary InputStream, since the Android MediaPlayer expects us to pass in a
- * file or a URL.
- */
-public class AndroidMidiFileReader extends MidiFileReader {
-
-    @Override
-    public MidiFileFormat getMidiFileFormat(File file) throws InvalidMidiDataException, IOException {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public MidiFileFormat getMidiFileFormat(InputStream stream) throws InvalidMidiDataException,
-            IOException {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public MidiFileFormat getMidiFileFormat(URL url) throws InvalidMidiDataException, IOException {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public Sequence getSequence(File file) throws InvalidMidiDataException, IOException {
-        return new AndroidSequence(file.toURL());
-    }
-
-    @Override
-    public Sequence getSequence(InputStream stream) throws InvalidMidiDataException, IOException {
-        File file = File.createTempFile("javax.sound.midi-", null);
-        file.deleteOnExit();
-
-        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));
-        byte[] buffer = new byte[1024];
-
-        int count = stream.read(buffer);
-        while (count >= 0) {
-            out.write(buffer, 0, count);
-            count = stream.read(buffer);
-        }
-
-        out.flush();
-        out.close();
-
-        return getSequence(file);
-    }
-
-    @Override
-    public Sequence getSequence(URL url) throws InvalidMidiDataException, IOException {
-        return new AndroidSequence(url);
-    }
-
-}
diff --git a/libcore-disabled/sound/src/main/java/com/android/internal/sound/midi/AndroidSequence.java b/libcore-disabled/sound/src/main/java/com/android/internal/sound/midi/AndroidSequence.java
deleted file mode 100644
index 861f970..0000000
--- a/libcore-disabled/sound/src/main/java/com/android/internal/sound/midi/AndroidSequence.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.sound.midi;
-
-import java.net.URL;
-
-import javax.sound.midi.InvalidMidiDataException;
-import javax.sound.midi.Sequence;
-
-/**
- * Implements a MIDI Sequence for Android. Its set of tracks etc. will always
- * be empty (at least we don't care about the contents). Instead, we store the
- * URL to the original MIDI data in it, so we can feed it into the Android
- * MediaPlayer.
- */
-public class AndroidSequence extends Sequence {
-
-    /**
-     * Holds the URL to the MIDI data.
-     */
-    private URL url;
-    
-    /**
-     * Creates a new AndroidSequence.
-     * 
-     * @param url The URL that points to the MIDI data.
-     *  
-     * @throws InvalidMidiDataException If the MIDI data is invalid (which we
-     *         actually don't check at all).
-     */
-    public AndroidSequence(URL url) throws InvalidMidiDataException {
-        super(0.0f, 1);
-        
-        this.url = url;
-    }
-
-    /**
-     * Returns the URL pointing to the MIDI data.
-     * 
-     * @return The URL.
-     */
-    URL getURL() {
-        return url;
-    }
-
-}
diff --git a/libcore-disabled/sound/src/main/java/com/android/internal/sound/midi/AndroidSequencer.java b/libcore-disabled/sound/src/main/java/com/android/internal/sound/midi/AndroidSequencer.java
deleted file mode 100644
index 6b3ea20..0000000
--- a/libcore-disabled/sound/src/main/java/com/android/internal/sound/midi/AndroidSequencer.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.sound.midi;
-
-import android.media.AudioManager;
-import android.media.MediaPlayer;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.sound.midi.ControllerEventListener;
-import javax.sound.midi.InvalidMidiDataException;
-import javax.sound.midi.MetaEventListener;
-import javax.sound.midi.MidiDevice;
-import javax.sound.midi.MidiUnavailableException;
-import javax.sound.midi.Receiver;
-import javax.sound.midi.Sequence;
-import javax.sound.midi.Sequencer;
-import javax.sound.midi.Track;
-import javax.sound.midi.Transmitter;
-
-/**
- * Implements a MIDI Sequencer for Android. Since Android's MediaPlayer is
- * somewhat limited, we only support MIDI playback, but not recording or the
- * querying of MIDI information. Many of the methods hence throw
- * {@link java.lang.UnsupportedOperationException} or return dummy results.
- */
-public class AndroidSequencer implements Sequencer {
-
-    /**
-     * Defines the DeviceInfo for our AndroidSequencer.
-     */
-    private class Info extends MidiDevice.Info {
-        public Info() {
-            super("Android Sequencer", "Android Sequencer", "The Android Project", "1.0");        
-        }
-    }
-    
-    /**
-     * Holds the Android MediaPlayer we use.
-     */
-    private MediaPlayer player;
-    
-    /**
-     * Holds the Android Sequence we want to play.
-     */
-    private AndroidSequence sequence;
-
-    public int[] addControllerEventListener(ControllerEventListener listener, int[] controllers) {
-        throw new UnsupportedOperationException();
-    }
-
-    public boolean addMetaEventListener(MetaEventListener listener) {
-        throw new UnsupportedOperationException();
-    }
-
-    public int getLoopCount() {
-        throw new UnsupportedOperationException();
-    }
-
-    public long getLoopEndPoint() {
-        throw new UnsupportedOperationException();
-    }
-
-    public long getLoopStartPoint() {
-        throw new UnsupportedOperationException();
-    }
-
-    public SyncMode getMasterSyncMode() {
-        throw new UnsupportedOperationException();
-    }
-
-    public SyncMode[] getMasterSyncModes() {
-        throw new UnsupportedOperationException();
-    }
-
-    public long getMicrosecondLength() {
-        throw new UnsupportedOperationException();
-    }
-
-    public long getMicrosecondPosition() {
-        throw new UnsupportedOperationException();
-    }
-
-    public Sequence getSequence() {
-        return sequence;
-    }
-
-    public SyncMode getSlaveSyncMode() {
-        throw new UnsupportedOperationException();
-    }
-
-    public SyncMode[] getSlaveSyncModes() {
-        throw new UnsupportedOperationException();
-    }
-
-    public float getTempoFactor() {
-        throw new UnsupportedOperationException();
-    }
-
-    public float getTempoInBPM() {
-        throw new UnsupportedOperationException();
-    }
-
-    public float getTempoInMPQ() {
-        throw new UnsupportedOperationException();
-    }
-
-    public long getTickLength() {
-        throw new UnsupportedOperationException();
-    }
-
-    public long getTickPosition() {
-        throw new UnsupportedOperationException();
-    }
-
-    public boolean getTrackMute(int track) {
-        throw new UnsupportedOperationException();
-    }
-
-    public boolean getTrackSolo(int track) {
-        throw new UnsupportedOperationException();
-    }
-
-    public boolean isRecording() {
-        return false;
-    }
-
-    public boolean isRunning() {
-        return player != null && player.isPlaying();
-    }
-
-    public void recordDisable(Track track) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void recordEnable(Track track, int channel) {
-        throw new UnsupportedOperationException();
-    }
-
-    public int[] removeControllerEventListener(ControllerEventListener listener, int[] controllers) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void removeMetaEventListener(MetaEventListener listener) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setLoopCount(int count) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setLoopEndPoint(long tick) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setLoopStartPoint(long tick) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setMasterSyncMode(SyncMode sync) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setMicrosecondPosition(long microseconds) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setSequence(InputStream stream) throws IOException, InvalidMidiDataException {
-        setSequence(new AndroidMidiFileReader().getSequence(stream));
-    }
-
-    public void setSequence(Sequence sequence) throws InvalidMidiDataException {
-        if (!(sequence instanceof AndroidSequence)) {
-            throw new InvalidMidiDataException("Sequence must be an AndroidSequence");
-        }
-        
-        if (isRunning()) {
-            stop();
-        }
-        
-        this.sequence = (AndroidSequence)sequence;
-    }
-
-    public void setSlaveSyncMode(SyncMode sync) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setTempoFactor(float factor) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setTempoInBPM(float bpm) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setTempoInMPQ(float mpq) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setTickPosition(long tick) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setTrackMute(int track, boolean mute) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setTrackSolo(int track, boolean solo) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void start() {
-        if (!isOpen()) {
-            throw new IllegalStateException("Sequencer must be open");
-        }
-        
-        if (sequence == null) {
-            throw new IllegalStateException("Need a Sequence to play");
-        }
-
-        if (!isRunning()) {
-            /*
-             * This is ugly, but there is no way around it: The javax.sound API
-             * doesn't expect to throw an exception at this point for illegal
-             * MIDI sequences. Since we don't really construct the MIDI sequence
-             * from the original binary data, but only refer to its URL, the
-             * MediaPlayer can actually bail out at this point. We wrap the
-             * exception into a RuntimeException, to at least keep the API
-             * contract.
-             */
-            try {
-                String s = this.sequence.getURL().toExternalForm();
-                
-                /*
-                 * TODO Workaround for 1107794: MediaPlayer doesn't handle
-                 * "file:" URLs. Get rid of this.
-                 */
-                if (s.startsWith("file:")) {
-                    s = s.substring(5);
-                }
-                
-                player.setDataSource(s);
-                player.setAudioStreamType(AudioManager.STREAM_MUSIC);
-                player.prepare();
-            } catch (IOException ex) {
-                throw new RuntimeException(ex.toString());
-            }
-            
-            player.start();
-        }
-    }
-
-    public void startRecording() {
-        throw new UnsupportedOperationException();
-    }
-
-    public void stop() {
-        if (!isOpen()) {
-            throw new IllegalStateException("Sequencer must be open");
-        }
-        
-        if (isRunning()) {
-            player.stop();
-        }
-    }
-
-    public void stopRecording() {
-        throw new UnsupportedOperationException();
-    }
-
-    public void close() {
-        if (isOpen()) {
-            stop();
-            player = null;
-        }
-    }
-    
-    public Info getDeviceInfo() {
-        return new Info();
-    }
-
-    public int getMaxReceivers() {
-        return 0;
-    }
-
-    public int getMaxTransmitters() {
-        return 0;
-    }
-
-    public Receiver getReceiver() throws MidiUnavailableException {
-        throw new MidiUnavailableException("No receiver available");
-    }
-
-    public List<Receiver> getReceivers() {
-        return new ArrayList<Receiver>();
-    }
-
-    public Transmitter getTransmitter() throws MidiUnavailableException {
-        throw new MidiUnavailableException("No receiver available");
-    }
-
-    public List<Transmitter> getTransmitters() {
-        return new ArrayList<Transmitter>();
-    }
-
-    public boolean isOpen() {
-        return player != null;
-    }
-
-    public void open() throws MidiUnavailableException {
-        try {
-            player = new MediaPlayer();
-        } catch (Exception ex) {
-            throw new MidiUnavailableException(ex.toString());
-        }
-    }
-
-}
diff --git a/libcore-disabled/sound/src/main/java/com/android/internal/sound/sampled/AndroidAudioFileReader.java b/libcore-disabled/sound/src/main/java/com/android/internal/sound/sampled/AndroidAudioFileReader.java
deleted file mode 100644
index f9b1d47..0000000
--- a/libcore-disabled/sound/src/main/java/com/android/internal/sound/sampled/AndroidAudioFileReader.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.sound.sampled;
-
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-import javax.sound.sampled.AudioFileFormat;
-import javax.sound.sampled.AudioInputStream;
-import javax.sound.sampled.UnsupportedAudioFileException;
-import javax.sound.sampled.spi.AudioFileReader;
-
-/**
- * Implements an AudioFileReader for Android. We need to cache data coming from
- * an arbitrary InputStream, since the Android MediaPlayer expects us to pass in
- * a file or URL.
- */
-public class AndroidAudioFileReader extends AudioFileReader {
-
-    @Override
-    public AudioFileFormat getAudioFileFormat(File file) throws UnsupportedAudioFileException,
-            IOException {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public AudioFileFormat getAudioFileFormat(InputStream stream)
-            throws UnsupportedAudioFileException, IOException {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public AudioFileFormat getAudioFileFormat(URL url) throws UnsupportedAudioFileException,
-            IOException {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public AudioInputStream getAudioInputStream(File file) throws UnsupportedAudioFileException,
-            IOException {
-        return new AndroidAudioInputStream(file.toURL());
-    }
-
-    @Override
-    public AudioInputStream getAudioInputStream(InputStream stream)
-            throws UnsupportedAudioFileException, IOException {
-        File file = File.createTempFile("javax.sound.sampled-", null);
-        file.deleteOnExit();
-
-        BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file));
-        byte[] buffer = new byte[1024];
-
-        int count = stream.read(buffer);
-        while (count >= 0) {
-            out.write(buffer, 0, count);
-            count = stream.read(buffer);
-        }
-
-        out.flush();
-        out.close();
-
-        return getAudioInputStream(file);
-    }
-
-    @Override
-    public AudioInputStream getAudioInputStream(URL url) throws UnsupportedAudioFileException,
-            IOException {
-        return new AndroidAudioInputStream(url);
-    }
-
-}
diff --git a/libcore-disabled/sound/src/main/java/com/android/internal/sound/sampled/AndroidAudioInputStream.java b/libcore-disabled/sound/src/main/java/com/android/internal/sound/sampled/AndroidAudioInputStream.java
deleted file mode 100644
index ba97021..0000000
--- a/libcore-disabled/sound/src/main/java/com/android/internal/sound/sampled/AndroidAudioInputStream.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.sound.sampled;
-
-import java.net.URL;
-
-import javax.sound.sampled.AudioFormat;
-import javax.sound.sampled.AudioInputStream;
-
-/**
- * Implements an AudioInputStream for Android. Its internal InputStream is
- * unused (at least we don't care about the contents). Instead, we store the
- * URL to the original audio data in it, so we can feed it into the Android
- * MediaPlayer.
- */
-public class AndroidAudioInputStream extends AudioInputStream {
-
-    /**
-     * Holds the URL to the MIDI data.
-     */
-    private URL url;
-    
-    /**
-     * Creates a new AndroidAudioInputStream.
-     * 
-     * @param url The URL that points to the audio data.
-     */
-    public AndroidAudioInputStream(URL url) {
-        super(null, new AudioFormat(0.0f, 0, 0, false, false), 0);
-        
-        this.url = url;
-    }
-
-    /**
-     * Returns the URL pointing to the audio data.
-     * 
-     * @return The URL.
-     */
-    URL getURL() {
-        return url;
-    }
- 
-}
diff --git a/libcore-disabled/sound/src/main/java/com/android/internal/sound/sampled/AndroidClip.java b/libcore-disabled/sound/src/main/java/com/android/internal/sound/sampled/AndroidClip.java
deleted file mode 100644
index d70eec1..0000000
--- a/libcore-disabled/sound/src/main/java/com/android/internal/sound/sampled/AndroidClip.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.internal.sound.sampled;
-
-import android.media.AudioManager;
-import android.media.MediaPlayer;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import javax.sound.sampled.AudioFormat;
-import javax.sound.sampled.AudioInputStream;
-import javax.sound.sampled.Clip;
-import javax.sound.sampled.Control;
-import javax.sound.sampled.Line;
-import javax.sound.sampled.LineListener;
-import javax.sound.sampled.LineUnavailableException;
-import javax.sound.sampled.Control.Type;
-
-/**
- * Implements an audio Clip for Android. Since Android's MediaPlayer is somewhat
- * limited, we only support sample playback, but not recording or the querying
- * of sample information. Many of the methods hence throw
- * {@link java.lang.UnsupportedOperationException} or return dummy results.
- */
-public class AndroidClip implements Clip {
-
-    /**
-     * Holds the Android MediaPlayer we use.
-     */
-    private MediaPlayer player;
-    
-    /**
-     * Holds the AndroidAudioInputStream we want to play.
-     */
-    private AndroidAudioInputStream stream;
-    
-    public int getFrameLength() {
-        throw new UnsupportedOperationException();
-    }
-
-    public long getMicrosecondLength() {
-        throw new UnsupportedOperationException();
-    }
-
-    public void loop(int count) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void open(AudioFormat format, byte[] data, int offset, int bufferSize)
-            throws LineUnavailableException {
-        InputStream stream = new ByteArrayInputStream(data, offset, bufferSize);
-
-        open();
-        
-        try {
-            this.stream = (AndroidAudioInputStream)(new AndroidAudioFileReader().getAudioInputStream(stream));
-        } catch (Exception ex) {
-            throw new LineUnavailableException(ex.toString());
-        }
-    }
-
-    public void open(AudioInputStream stream) throws LineUnavailableException, IOException {
-        open();
-        
-        if (!(stream instanceof AndroidAudioInputStream)) {
-            try {
-                stream = new AndroidAudioFileReader().getAudioInputStream(stream);
-            } catch (Exception ex) {
-                throw new LineUnavailableException(ex.toString());
-            }
-        }
-        
-        this.stream = (AndroidAudioInputStream)stream;
-    }
-
-    public void setFramePosition(int frames) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setLoopPoints(int start, int end) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void setMicrosecondPosition(long microseconds) {
-        if (!isOpen()) {
-            throw new IllegalStateException("Clip must be open");
-        }
-        
-        player.seekTo((int)(microseconds / 1000));
-    }
-
-    public int available() {
-        throw new UnsupportedOperationException();
-    }
-
-    public void drain() {
-    }
-
-    public void flush() {
-    }
-
-    public int getBufferSize() {
-        throw new UnsupportedOperationException();
-    }
-
-    public AudioFormat getFormat() {
-        throw new UnsupportedOperationException();
-    }
-
-    public int getFramePosition() {
-        throw new UnsupportedOperationException();
-    }
-
-    public float getLevel() {
-        throw new UnsupportedOperationException();
-    }
-
-    public long getLongFramePosition() {
-        throw new UnsupportedOperationException();
-    }
-
-    public long getMicrosecondPosition() {
-        if (isOpen()) {
-            return player.getCurrentPosition() * 1000;
-        } else {
-            return 0;
-        }
-    }
-
-    public boolean isActive() {
-        return false;
-    }
-
-    public boolean isRunning() {
-        return player != null && player.isPlaying();
-    }
-
-    public void start() {
-        if (!isOpen()) {
-            throw new IllegalStateException("Clip must be open");
-        }
-        
-        if (stream == null) {
-            throw new IllegalStateException("Need an AudioInputStream to play");
-        }
-
-        if (!isRunning()) {
-            /*
-             * This is ugly, but there is no way around it: The javax.sound API
-             * doesn't expect to throw an exception at this point for illegal
-             * MIDI sequences. Since we don't really construct the MIDI sequence
-             * from the original binary data, but only refer to its URL, the
-             * MediaPlayer can actually bail out at this point. We wrap the
-             * exception into a RuntimeException, to at least keep the API
-             * contract.
-             */
-            try {
-                String s = this.stream.getURL().toExternalForm();
-                
-                /*
-                 * TODO Workaround for 1107794: MediaPlayer doesn't handle
-                 * "file:" URLs. Get rid of this.
-                 */
-                if (s.startsWith("file:")) {
-                    s = s.substring(5);
-                }
-                
-                player.setDataSource(s);
-                player.setAudioStreamType(AudioManager.STREAM_MUSIC);
-                player.prepare();
-            } catch (IOException ex) {
-                throw new RuntimeException(ex.toString());
-            }
-            
-            player.start();
-        }
-    }
-
-    public void stop() {
-        if (!isOpen()) {
-            throw new IllegalStateException("Clip must be open");
-        }
-        
-        if (isRunning()) {
-            player.stop();
-        }
-    }
-
-    public void addLineListener(LineListener listener) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void close() {
-        if (isOpen()) {
-            stop();
-            player = null;
-        }
-    }
-
-    public Control getControl(Type control) {
-        throw new IllegalArgumentException("No controls available");
-    }
-
-    public Control[] getControls() {
-        return new Control[0];
-    }
-
-    public javax.sound.sampled.Line.Info getLineInfo() {
-        return new Line.Info(this.getClass());
-    }
-
-    public boolean isControlSupported(Type control) {
-        return false;
-    }
-
-    public boolean isOpen() {
-        return player != null;
-    }
-
-    public void open() throws LineUnavailableException {
-        try {
-            player = new MediaPlayer();
-        } catch (Exception ex) {
-            throw new LineUnavailableException(ex.toString());
-        }
-    }
-
-    public void removeLineListener(LineListener listener) {
-        throw new UnsupportedOperationException();
-    }
-
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/ControllerEventListener.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/ControllerEventListener.java
deleted file mode 100644
index 318139d..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/ControllerEventListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-import java.util.EventListener;
-
-public interface ControllerEventListener extends EventListener {
-    void controlChange(ShortMessage event);
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/Instrument.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/Instrument.java
deleted file mode 100644
index 397e53e..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/Instrument.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-public abstract class Instrument extends SoundbankResource {
-    private Patch patch;
-
-    protected Instrument(Soundbank soundbank, Patch patch, String name, Class<?> dataClass) {
-        super(soundbank, name, dataClass);
-        this.patch = patch;
-    }
-
-    public Patch getPatch() {
-        return patch;
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/InvalidMidiDataException.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/InvalidMidiDataException.java
deleted file mode 100644
index bc1cb83..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/InvalidMidiDataException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-public class InvalidMidiDataException extends Exception {
-    private static final long serialVersionUID = 2780771756789932067L;
-
-    public InvalidMidiDataException() {
-        super();
-    }
-
-    public InvalidMidiDataException(String message) {
-        super(message);
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/MetaEventListener.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/MetaEventListener.java
deleted file mode 100644
index 0cf0d38..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/MetaEventListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-import java.util.EventListener;
-
-public interface MetaEventListener extends EventListener {
-    void meta(MetaMessage meta);
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/MetaMessage.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/MetaMessage.java
deleted file mode 100644
index fe5d9cf..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/MetaMessage.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-import org.apache.harmony.sound.internal.nls.Messages;
-
-public class MetaMessage extends MidiMessage {
-    public static final int META = 255;
-    
-    private int dsp; //displacement from begin of array that 
-                     //return by method getData() from begin
-                     //of array that contain data
-    
-    public MetaMessage() {
-        super(new byte[] {-1, 0});
-    }
-
-    protected MetaMessage(byte[] data) {
-        super(data);
-        if (data == null) {
-            throw new NullPointerException();
-        }
-        if (super.length > 3) {
-            int n = 3;
-            while ((n <= super.length) && (super.data[n - 1] < 0)) {
-                n++;
-            }
-            dsp = n;
-        }
-    }
-
-    @Override
-    public Object clone() {
-        return new MetaMessage(this.getMessage());
-    }
-
-    public byte[] getData() {
-        if ((super.data != null) && (super.length > 3)) {
-            byte[] bt = new byte[super.length - dsp];
-            for (int i = dsp; i < super.length; i++) {
-                bt[i - dsp] = super.data[i];
-            }
-            return bt;
-        }
-        return new byte[0];
-    }
-
-    public int getType() {
-        if ((super.data != null) && (super.length >= 2)) {
-            return super.data[1] & 0xFF;
-        }
-        return 0;
-    }
-
-    public void setMessage(int type, byte[] data, int length) throws InvalidMidiDataException {
-        if (type < 0 || type >= 128) {
-            // sound.0A=Invalid meta event with type {0}
-            throw new InvalidMidiDataException(Messages.getString("sound.0A", type)); //$NON-NLS-1$
-        }
-        if (length < 0 || (data != null && length > data.length)) {
-            // sound.03=length out of bounds: {0}
-            throw new InvalidMidiDataException(Messages.getString("sound.03", length)); //$NON-NLS-1$
-        }
-        try {
-            if (data == null) {
-                if (length != 0) {
-                    throw new NullPointerException();
-                }
-                super.setMessage(new byte[] { -1, (byte) type, 0 }, 3);
-            } else {
-                int div = 128;
-                int n = 1;
-                int ost;
-                int sm = 0;
-                while (length / div != 0) {
-                    n++;
-                    div *= 128;
-                }
-                int ln = n;
-                byte[] tdata = new byte[length + ln + 2];
-                div = 1;
-                ost = (length / div) % 128;
-                while (n != 0) {
-                    tdata[n - 1 + 2] = (byte) (ost + sm);
-                    n--;
-                    div *= 128;
-                    ost = (length / div) % 128;
-                    sm = 128;
-                }
-                tdata[0] = -1;
-                tdata[1] = (byte) type;
-                if (length > 0) {
-                    for (int i = 0; i < length; i++) {
-                        tdata[2 + ln + i] = data[i];
-                    }
-                }
-                super.setMessage(tdata, length + 2 + ln);
-                dsp = ln + 2;
-            }
-        } catch (InvalidMidiDataException e) {
-            throw e;
-        }
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiChannel.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiChannel.java
deleted file mode 100644
index e970641..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiChannel.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-public interface MidiChannel {
-    void allNotesOff();
-
-    void allSoundOff();
-
-    void controlChange(int controller, int value);
-
-    int getChannelPressure();
-
-    int getController(int controller);
-
-    boolean getMono();
-
-    boolean getMute();
-
-    boolean getOmni();
-
-    int getPitchBend();
-
-    int getPolyPressure(int noteNumber);
-
-    int getProgram();
-
-    boolean getSolo();
-
-    boolean localControl(boolean on);
-
-    void noteOff(int noteNumber);
-
-    void noteOff(int noteNumber, int velocity);
-
-    void noteOn(int noteNumber, int velocity);
-
-    void programChange(int program);
-
-    void programChange(int bank, int program);
-
-    void resetAllControllers();
-
-    void setChannelPressure(int pressure);
-
-    void setMono(boolean on);
-
-    void setMute(boolean mute);
-
-    void setOmni(boolean on);
-
-    void setPitchBend(int bend);
-
-    void setPolyPressure(int noteNumber, int pressure);
-
-    void setSolo(boolean soloState);
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiDevice.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiDevice.java
deleted file mode 100644
index 9eb5169..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiDevice.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-import java.util.List;
-
-public interface MidiDevice {
-    class Info {
-        private String name;
-
-        private String vendor;
-
-        private String description;
-
-        private String version;
-
-        protected Info(String name, String vendor, String description, String version) {
-            this.name = name;
-            this.vendor = vendor;
-            this.description = description;
-            this.version = version;
-        }
-
-        /*
-         * returns true when objects are the same
-         * 
-         * @see java.lang.Object#equals(java.lang.Object)
-         */
-        @Override
-        public final boolean equals(Object obj) {
-            return this == obj;
-        }
-
-        public final String getDescription() {
-            return description;
-        }
-
-        public final String getName() {
-            return name;
-        }
-
-        public final String getVendor() {
-            return vendor;
-        }
-
-        public final String getVersion() {
-            return version;
-        }
-
-        @Override
-        public final int hashCode() {
-            final int PRIME = 31;
-            int result = super.hashCode();
-            result = PRIME * result + ((description == null) ? 0 : description.hashCode());
-            result = PRIME * result + ((name == null) ? 0 : name.hashCode());
-            result = PRIME * result + ((vendor == null) ? 0 : vendor.hashCode());
-            result = PRIME * result + ((version == null) ? 0 : version.hashCode());
-            return result;
-        }
-
-        @Override
-        public final String toString() {
-            return name;
-        }
-    }
-
-    void close();
-
-    MidiDevice.Info getDeviceInfo();
-
-    int getMaxReceivers();
-
-    int getMaxTransmitters();
-
-    long getMicrosecondPosition();
-
-    Receiver getReceiver() throws MidiUnavailableException;
-
-    List<Receiver> getReceivers();
-
-    Transmitter getTransmitter() throws MidiUnavailableException;
-
-    List<Transmitter> getTransmitters();
-
-    boolean isOpen();
-
-    void open() throws MidiUnavailableException;
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiEvent.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiEvent.java
deleted file mode 100644
index 145529b..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiEvent.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-public class MidiEvent {
-    private MidiMessage message;
-    
-    private long tick;
-    
-    public MidiEvent(MidiMessage message, long tick) {
-        this.message = message;
-        this.tick = tick;
-    }
-
-    public MidiMessage getMessage() {
-        return message;
-    }
-
-    public long getTick() {
-        return tick;
-    }
-
-    public void setTick(long tick) {
-        this.tick = tick;
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiFileFormat.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiFileFormat.java
deleted file mode 100644
index e4e9498..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiFileFormat.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-public class MidiFileFormat {
-    public static final int UNKNOWN_LENGTH = -1;
-
-    protected int byteLength;
-
-    protected float divisionType;
-
-    protected long microsecondLength;
-
-    protected int resolution;
-
-    protected int type;
-    
-    private HashMap<String, Object> properties;
-
-    public MidiFileFormat(int type, float divisionType, int resolution, int bytes,
-            long microseconds) {
-        this.type = type;
-        this.divisionType = divisionType;
-        this.resolution = resolution;
-        this.byteLength = bytes;
-        this.microsecondLength = microseconds;
-        this.properties = new HashMap<String, Object>();
-    }
-
-    public MidiFileFormat(int type, float divisionType, int resolution, int bytes,
-            long microseconds, Map<String, Object> properties) {
-        this.type = type;
-        this.divisionType = divisionType;
-        this.resolution = resolution;
-        this.byteLength = bytes;
-        this.microsecondLength = microseconds;
-        
-        this.properties = new HashMap<String, Object>();
-        this.properties.putAll(properties);
-    }
-
-    public int getByteLength() {
-        return byteLength;
-    }
-
-    public float getDivisionType() {
-        return divisionType;
-    }
-
-    public long getMicrosecondLength() {
-        return microsecondLength;
-    }
-
-    public Object getProperty(String key) {
-        return properties.get(key);
-    }
-
-    public int getResolution() {
-        return resolution;
-    }
-
-    public int getType() {
-        return type;
-    }
-
-    public Map<String, Object> properties() {
-        return Collections.unmodifiableMap(properties);
-        
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiMessage.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiMessage.java
deleted file mode 100644
index 1629ee1..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiMessage.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-import org.apache.harmony.sound.internal.nls.Messages;
-
-public abstract class MidiMessage implements Cloneable {
-
-    protected byte[] data;
-
-    protected int length;
-
-    protected MidiMessage(byte[] data) {
-        if (data == null) {
-            length = 0;
-        } else {
-            length = data.length;
-            this.data = data;
-        }
-    }
-
-    @Override
-    public abstract Object clone();
-
-    public int getLength() {
-        return length;
-    }
-
-    public byte[] getMessage() {
-        if (data == null) {
-            throw new NullPointerException();
-        }
-        return data.clone();
-    }
-
-    public int getStatus() {
-        if ((data == null) || (length == 0)) {
-            return 0;
-        }
-        return data[0] & 0xFF;
-    }
-
-    protected void setMessage(byte[] data, int length) throws InvalidMidiDataException {
-        if ((length < 0) || (length > data.length)) {
-            // sound.03=length out of bounds: {0}
-            throw new IndexOutOfBoundsException(Messages.getString("sound.03", length)); //$NON-NLS-1$
-        }
-
-        this.data = new byte[length];
-        if (length != 0) {
-            for (int i = 0; i < length; i++) {
-                this.data[i] = data[i];
-            }
-        }
-        this.length = length;
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiSystem.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiSystem.java
deleted file mode 100644
index eede0a9..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiSystem.java
+++ /dev/null
@@ -1,837 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URL;
-
-import javax.sound.midi.MidiDevice.Info;
-import javax.sound.midi.spi.MidiDeviceProvider;
-import javax.sound.midi.spi.MidiFileReader;
-import javax.sound.midi.spi.MidiFileWriter;
-import javax.sound.midi.spi.SoundbankReader;
-
-import org.apache.harmony.sound.utils.ProviderService;
-
-public class MidiSystem {
-    //path to javax.sound.midi.spi.MidiDeviceProvider file in the jar-file
-    private final static String midiDeviceProviderPath = 
-        "META-INF/services/javax.sound.midi.spi.MidiDeviceProvider";
-    
-    //path to javax.sound.midi.spi.MidiFileReader file in the jar-file
-    private final static String midiFileReaderPath =
-        "META-INF/services/javax.sound.midi.spi.MidiFileReader";
-    
-    //path to javax.sound.midi.spi.MidiFileWriter file in the jar-file
-    private final static String midiFileWriterPath =
-        "META-INF/services/javax.sound.midi.spi.MidiFileWriter";
-    
-    //path to javax.sound.midi.spi.SoundbankReader file in the jar-file
-    private final static String soundbankReaderPath =
-        "META-INF/services/javax.sound.midi.spi.SoundbankReader";
-    
-    //key to find default receiver in the sound.properties file
-    private final static String receiverName = "javax.sound.midi.Receiver";
-    
-    //key to find default sequencer in the sound.properties file
-    private final static String sequencerName = "javax.sound.midi.Sequencer";
-    
-    //key to find default synthesizer in the sound.properties file
-    private final static String synthesizerName = "javax.sound.midi.Synthesizer";
-    
-    //key to find default transmitter in the sound.properties file
-    private final static String transmitterName = "javax.sound.midi.Transmitter";
-    
-    public static MidiDevice getMidiDevice(MidiDevice.Info info)
-            throws MidiUnavailableException {
-        //FIXME
-        /*
-         * this method must to throw out MidiUnavailableException if requested device
-         * is not available
-         */
-        
-        /* 
-         * obtain the list of MidiDeviceProviders
-         */
-        List<?> deviceProviders = ProviderService.getProviders(midiDeviceProviderPath);
-        /*
-         * find device that describes by parameter info and return it
-         */
-        for (int i = 0; i < deviceProviders.size(); i++) {
-            MidiDevice.Info[] deviceInfo = ((MidiDeviceProvider) deviceProviders.get(i)).getDeviceInfo();
-            for (Info element : deviceInfo) {
-                if (element.equals(info)) {
-                    return ((MidiDeviceProvider) deviceProviders.get(i)).getDevice(info);
-                }
-            }
-        }
-        /*
-         * if we can't find device with requested info, we throw out IllegalArgumentException
-         */
-        throw new IllegalArgumentException("Requested device not installed: " + info.getName());
-    }
-
-    public static MidiDevice.Info[] getMidiDeviceInfo() {
-        /*
-         * obtain the list of MidiDeviceProviders
-         */
-        List<?> deviceProviders = ProviderService.getProviders(midiDeviceProviderPath);
-        //variable to save MidiDevice.Info
-        List<MidiDevice.Info> infos = new ArrayList<MidiDevice.Info>();
-        /*
-         * look through list of providers and save info of devices
-         */
-        for (int i = 0; i < deviceProviders.size(); i++) {
-            MidiDevice.Info[] deviceInfo = ((MidiDeviceProvider) deviceProviders.get(i)).getDeviceInfo();
-            for (Info element : deviceInfo) {
-                infos.add(element);
-            }
-        }
-        
-        MidiDevice.Info[] temp = new MidiDevice.Info[infos.size()];
-        return infos.toArray(temp);
-    }
-
-    public static MidiFileFormat getMidiFileFormat(File file) throws InvalidMidiDataException,
-            IOException {
-        /*
-         * obtain the list of MidiFileReaderProviders
-         */
-        List<?> fileReaderProviders = ProviderService.getProviders(midiFileReaderPath);
-        if (fileReaderProviders.size() == 0) {
-            //FIXME
-            /*
-             * I don't understand what type of exception we should throw out if we haven't
-             * appropriate providers...
-             * Maybe here is should be MidiUnavailableException
-             */
-            throw new Error("There is no MidiFileReaderProviders on your system!!!");
-        }
-        /*
-         * It's not determine what provider for this service I should to use, and so
-         * I use the first one
-         */
-        return ((MidiFileReader) fileReaderProviders.get(0)).getMidiFileFormat(file);
-    }
-
-    public static MidiFileFormat getMidiFileFormat(InputStream stream) throws InvalidMidiDataException, 
-            IOException {
-        /*
-         * obtain the list of MidiFileReaderProviders
-         */
-        List<?> fileReaderProviders = ProviderService.getProviders(midiFileReaderPath);
-        if (fileReaderProviders.size() == 0) {
-            //FIXME
-            /*
-             * I don't understand what type of exception we should throw out if we haven't
-             * appropriate providers...
-             * Maybe here is should be MidiUnavailableException
-             */
-            throw new Error("There is no MidiFileReaderProviders on your system!!!");
-        }
-        /*
-         * It's not determine what provider for this service I should to use, and so
-         * I use the first one
-         */
-        return ((MidiFileReader) fileReaderProviders.get(0)).getMidiFileFormat(stream);
-    }
-
-    public static MidiFileFormat getMidiFileFormat(URL url) throws InvalidMidiDataException,
-            IOException {
-        /*
-         * obtain the list of MidiFileReaderProviders
-         */
-        List<?> fileReaderProviders = ProviderService.getProviders(midiFileReaderPath);
-        if (fileReaderProviders.size() == 0) {
-            //FIXME
-            /*
-             * I don't understand what type of exception we should throw out if we haven't
-             * appropriate providers...
-             * Maybe here is should be MidiUnavailableException
-             */
-            throw new Error("There is no MidiFileReaderProviders on your system!!!");
-        }
-        /*
-         * It's not determine what provider for this service I should to use, and so
-         * I use the first one
-         */
-        return ((MidiFileReader) fileReaderProviders.get(0)).getMidiFileFormat(url);
-    }
-
-    public static int[] getMidiFileTypes() {
-        /*
-         * obtain the list of MidiFileWriterProviders
-         */
-        List<?> fileWriterProviders = ProviderService.getProviders(midiFileWriterPath);
-        if (fileWriterProviders.size() == 0) {
-            //FIXME
-            /*
-             * I don't understand what type of exception we should throw out if we haven't
-             * appropriate providers...
-             * Maybe here is should be MidiUnavailableException
-             */
-            throw new Error("There is no MidiFileWriterProviders on your system!!!");
-        }
-        /*
-         * It's not determine what provider for this service I should to use, and so
-         * I use the first one
-         */
-        return ((MidiFileWriter) fileWriterProviders.get(0)).getMidiFileTypes();
-    }
-
-    public static int[] getMidiFileTypes(Sequence sequence) {
-        /*
-         * obtain the list of MidiFileWriterProviders
-         */
-        List<?> fileWriterProviders = ProviderService.getProviders(midiFileWriterPath);
-        if (fileWriterProviders.size() == 0) {
-            //FIXME
-            /*
-             * I don't understand what type of exception we should throw out if we haven't
-             * appropriate providers...
-             * Maybe here is should be MidiUnavailableException
-             */
-            throw new Error("There is no MidiFileWriterProviders on your system!!!");
-        }
-        /*
-         * It's not determine what provider for this service I should to use, and so
-         * I use the first one
-         */
-        return ((MidiFileWriter) fileWriterProviders.get(0)).getMidiFileTypes(sequence);
-    }
-
-    public static Receiver getReceiver() throws MidiUnavailableException {
-        /*
-         * description of the default device for javax.sound.midi.Receiver
-         */
-        List<String> defaultDevice = ProviderService.getDefaultDeviceDescription(receiverName);
-        /*
-         * obtain the list of MidiDeviceProviders
-         */
-        List<?> deviceProviders = ProviderService.getProviders(midiDeviceProviderPath);
-        String provName;
-        int deviceNum = -1;
-        /*
-         * defaultDevice.get(0) --> provider
-         * defaultDevice.get(1) --> name
-         */      
-        if (defaultDevice.size() != 0) {
-            /*
-             * obtain the provider number in the list of deviceProviders that is provider for default device
-             */
-            for (int i = 0; i < deviceProviders.size(); i++) {
-                provName = deviceProviders.get(i).toString();
-                if (provName.substring(0, provName.indexOf("@")).equals(defaultDevice.get(0))) {
-                    deviceNum = i;
-                    break;
-                }
-            }
-            /*
-             * the first case: find the same provider and name that describes by default device
-             */
-            if (deviceNum != -1) {
-                MidiDevice.Info[] deviceInfo = ((MidiDeviceProvider) deviceProviders.get(deviceNum)).getDeviceInfo();
-                for (Info element : deviceInfo) {
-                    if (element.getName().equals(defaultDevice.get(1))) {
-                        try {
-                            return ((MidiDeviceProvider) deviceProviders.get(deviceNum)).getDevice(element).getReceiver();
-                        } catch (MidiUnavailableException e) {}
-                    }
-                }
-            for (Info element : deviceInfo) {
-                    try {
-                        return ((MidiDeviceProvider) deviceProviders.get(deviceNum)).getDevice(element).getReceiver();
-                    } catch (MidiUnavailableException e) {}
-                }
-            }
-            /*
-             * if we don't find again, find any receivers describe by name
-             */
-            for (int i = 0; i < deviceProviders.size(); i++) {
-                MidiDevice.Info[] deviceInfo = ((MidiDeviceProvider) deviceProviders.get(i)).getDeviceInfo();
-                for (Info element : deviceInfo) {
-                    if (element.getName().equals(defaultDevice.get(1))) {
-                        try {
-                            return ((MidiDeviceProvider) deviceProviders.get(i)).getDevice(element).getReceiver();
-                        } catch (MidiUnavailableException e) {}
-                    }
-                }
-            }
-        }
-        /*
-         * in the last case we look throw all providers and find any receiver
-         */
-        for (int i = 0; i < deviceProviders.size(); i++) {
-            MidiDevice.Info[] deviceInfo = ((MidiDeviceProvider) deviceProviders.get(i)).getDeviceInfo();
-            for (Info element : deviceInfo) {
-                try {
-                    return ((MidiDeviceProvider) deviceProviders.get(i)).getDevice(element).getReceiver();
-                } catch (MidiUnavailableException e) {}
-            }
-        }
-        /*
-         * if we don't find anyway, we throw out MidiUnavailableException
-         */
-        throw new MidiUnavailableException("There are no Recivers installed on your system!");
-    }
-
-    public static Sequence getSequence(File file) throws InvalidMidiDataException, IOException {
-        /*
-         * obtain the list of MidiFileReaderProviders
-         */
-        List<?> fileReaderProviders = ProviderService.getProviders(midiFileReaderPath);
-        // BEGIN android-added
-        try {
-            ((List)fileReaderProviders).add((Object)Class.forName("com.android.internal.sound.midi.AndroidMidiFileReader").newInstance());
-        } catch (Exception ex) {
-            // Ignore
-        }
-        // END android-added
-        if (fileReaderProviders.size() == 0) {
-            //FIXME
-            /*
-             * I don't understand what type of exception we should throw out if we haven't
-             * appropriate providers...
-             * Maybe here is should be MidiUnavailableException
-             */
-            throw new Error("There is no MidiFileReaderProviders on your system!!!");
-        }
-        /*
-         * It's not determine what provider for this service I should to use, and so
-         * I use the first one
-         */
-        return ((MidiFileReader) fileReaderProviders.get(0)).getSequence(file);
-    }
-
-    public static Sequence getSequence(InputStream stream) throws InvalidMidiDataException,
-            IOException {
-        /*
-         * obtain the list of MidiFileReaderProviders
-         */
-        List<?> fileReaderProviders = ProviderService.getProviders(midiFileReaderPath);
-        // BEGIN android-added
-        try {
-            ((List)fileReaderProviders).add(Class.forName("com.android.internal.sound.midi.AndroidMidiFileReader").newInstance());
-        } catch (Exception ex) {
-            // Ignore
-        }
-        // END android-added
-        if (fileReaderProviders.size() == 0) {
-            //FIXME
-            /*
-             * I don't understand what type of exception we should throw out if we haven't
-             * appropriate providers...
-             * Maybe here is should be MidiUnavailableException
-             */
-            throw new Error("There is no MidiFileReaderProviders on your system!!!");
-        }
-        /*
-         * It's not determine what provider for this service I should to use, and so
-         * I use the first one
-         */
-        return ((MidiFileReader) fileReaderProviders.get(0)).getSequence(stream);
-    }
-
-    public static Sequence getSequence(URL url) throws InvalidMidiDataException, IOException {
-        /*
-         * obtain the list of MidiFileReaderProviders
-         */
-        List<?> fileReaderProviders = ProviderService.getProviders(midiFileReaderPath);
-        // BEGIN android-added
-        try {
-            ((List)fileReaderProviders).add(Class.forName("com.android.internal.sound.midi.AndroidMidiFileReader").newInstance());
-        } catch (Exception ex) {
-            // Ignore
-        }
-        // END android-added
-        if (fileReaderProviders.size() == 0) {
-            //FIXME
-            /*
-             * I don't understand what type of exception we should throw out if we haven't
-             * appropriate providers...
-             * Maybe here is should be MidiUnavailableException
-             */
-            throw new Error("There is no MidiFileReaderProviders on your system!!!");
-        }
-        /*
-         * It's not determine what provider for this service I should to use, and so
-         * I use the first one
-         */
-        return ((MidiFileReader) fileReaderProviders.get(0)).getSequence(url);
-    }
-
-    public static Sequencer getSequencer() throws MidiUnavailableException {
-        /*
-         * this method is equals to method MidiSystem.getSequencer(true)
-         */
-        return getSequencer(true);
-    }
-
-    public static Sequencer getSequencer(boolean connected) throws MidiUnavailableException {
-        /*
-         * description of the default device for javax.sound.midi.Sequencer
-         */
-        List<String> defaultDevice = ProviderService.getDefaultDeviceDescription(sequencerName);
-        /*
-         * obtain the list of MidiDeviceProviders
-         */
-        List<?>  deviceProviders = ProviderService.getProviders(midiDeviceProviderPath);
-        
-        Sequencer sequencer;
-        Transmitter seqTrans;
-        Synthesizer synth;
-        Receiver recv;
-        String provName;
-        int deviceNum = -1;
-        /*
-         * defaultDevice.get(0) --> provider
-         * defaultDevice.get(1) --> name
-         */      
-        if (defaultDevice.size() != 0) {
-            /*
-             * obtain the provider number in the list of deviceProviders that is provider for default device
-             */
-            for (int i = 0; i < deviceProviders.size(); i++) {
-                provName = deviceProviders.get(i).toString();
-                if (provName.substring(0, provName.indexOf("@")).equals(defaultDevice.get(0))) {
-                    deviceNum = i;
-                    break;
-                }
-            }
-            /*
-             * the first case: find the same provider and name that describes by default device
-             */
-            if (deviceNum != -1) {
-                MidiDevice.Info[] deviceInfo = ((MidiDeviceProvider) deviceProviders.get(deviceNum)).getDeviceInfo();
-                for (Info element : deviceInfo) {
-                    if (element.getName().equals(defaultDevice.get(1))) {
-                        if (((MidiDeviceProvider) deviceProviders.get(deviceNum)).getDevice(element) instanceof Sequencer) {
-                            if (connected) {
-                                sequencer = (Sequencer) ((MidiDeviceProvider) deviceProviders.get(deviceNum)).getDevice(element);
-                                seqTrans = sequencer.getTransmitter();
-                                try {
-                                    synth = MidiSystem.getSynthesizer();
-                                    recv = synth.getReceiver();                                    
-                                } catch (MidiUnavailableException e) {
-                                    /*
-                                     * if we haven't Synthesizer in the system, we use default receiver
-                                     */
-                                    recv = MidiSystem.getReceiver();
-                                }
-                                seqTrans.setReceiver(recv);
-                                return sequencer;
-                            }
-                            return (Sequencer) ((MidiDeviceProvider) deviceProviders.get(deviceNum)).getDevice(element);
-                        }
-                    }
-                }
-                for (Info element : deviceInfo) {
-                    if (((MidiDeviceProvider) deviceProviders.get(deviceNum)).getDevice(element) instanceof Sequencer) {
-                        if (connected) {
-                            sequencer = (Sequencer) ((MidiDeviceProvider) deviceProviders.get(deviceNum)).getDevice(element);
-                            seqTrans = sequencer.getTransmitter();
-                            try {
-                                synth = MidiSystem.getSynthesizer();
-                                recv = synth.getReceiver();                                    
-                            } catch (MidiUnavailableException e) {
-                                /*
-                                 * if we haven't Synthesizer in the system, we use default receiver
-                                 */
-                                recv = MidiSystem.getReceiver();
-                            }
-                            seqTrans.setReceiver(recv);
-                            return sequencer;
-                        }
-                        return (Sequencer) ((MidiDeviceProvider) deviceProviders.get(deviceNum)).getDevice(element);
-                    }
-                }
-            }
-            /*
-             * if we don't find again, find any receivers describe by name
-             */
-            for (int i = 0; i < deviceProviders.size(); i++) {
-                MidiDevice.Info[] deviceInfo = ((MidiDeviceProvider) deviceProviders.get(i)).getDeviceInfo();
-                for (Info element : deviceInfo) {
-                    if (element.getName().equals(defaultDevice.get(1))) {
-                        if (((MidiDeviceProvider) deviceProviders.get(i)).getDevice(element) instanceof Sequencer) {
-                            if (connected) {
-                                sequencer = (Sequencer) ((MidiDeviceProvider) deviceProviders.get(i)).getDevice(element);
-                                seqTrans = sequencer.getTransmitter();
-                                try {
-                                    synth = MidiSystem.getSynthesizer();
-                                    recv = synth.getReceiver();                                    
-                                } catch (MidiUnavailableException e) {
-                                    /*
-                                     * if we haven't Synthesizer in the system, we use default receiver
-                                     */
-                                    recv = MidiSystem.getReceiver();
-                                }
-                                seqTrans.setReceiver(recv);
-                                return sequencer;
-                            }
-                            return (Sequencer) ((MidiDeviceProvider) deviceProviders.get(i)).getDevice(element);
-                        }
-                    }
-                }
-            }
-        }
-        /*
-         * in the last case we look throw all providers and find any receiver
-         */
-        for (int i = 0; i < deviceProviders.size(); i++) {
-            MidiDevice.Info[] deviceInfo = ((MidiDeviceProvider) deviceProviders.get(i)).getDeviceInfo();
-            for (Info element : deviceInfo) {
-                if (((MidiDeviceProvider) deviceProviders.get(i)).getDevice(element) instanceof Sequencer) {
-                    if (connected) {
-                        sequencer = (Sequencer) ((MidiDeviceProvider) deviceProviders.get(i)).getDevice(element);
-                        seqTrans = sequencer.getTransmitter();
-                        try {
-                            synth = MidiSystem.getSynthesizer();
-                            recv = synth.getReceiver();                                    
-                        } catch (MidiUnavailableException e) {
-                            /*
-                             * if we haven't Synthesizer in the system, we use default receiver
-                             */
-                            recv = MidiSystem.getReceiver();
-                        }
-                        seqTrans.setReceiver(recv);
-                        return sequencer;
-                    }
-                    return (Sequencer) ((MidiDeviceProvider) deviceProviders.get(i)).getDevice(element);
-                }
-            }
-        }
-        // BEGIN android-added
-        try {
-            return (Sequencer)(Class.forName("com.android.internal.sound.midi.AndroidSequencer").newInstance());
-        } catch (Exception ex) {
-            // Ignore
-        }
-        // END android-added
-        /*
-         * if we don't find anyway, we throw out MidiUnavailableException
-         */
-        throw new MidiUnavailableException("There are no Synthesizers installed on your system!");
-    }
-
-    public static Soundbank getSoundbank(File file) throws InvalidMidiDataException,
-            IOException {
-        /*
-         * obtain the list of SoundbankReaderProviders
-         */
-        List<?> soundbankReaderProviders = ProviderService.getProviders(soundbankReaderPath);
-        if (soundbankReaderProviders.size() == 0) {
-            //FIXME
-            /*
-             * I don't understand what type of exception we should throw out if we haven't
-             * appropriate providers...
-             * Maybe here is should be MidiUnavailableException
-             */
-            throw new Error("There is no SoundbankReaderProviders on your system!!!");
-        }
-        /*
-         * It's not determine what provider for this service I should to use, and so
-         * I use the first one
-         */
-        return ((SoundbankReader) soundbankReaderProviders.get(0)).getSoundbank(file);
-    }
-
-    public static Soundbank getSoundbank(InputStream stream) throws InvalidMidiDataException, IOException {
-        /*
-         * obtain the list of SoundbankReaderProviders
-         */
-        List<?> soundbankReaderProviders = ProviderService.getProviders(soundbankReaderPath);
-        if (soundbankReaderProviders.size() == 0) {
-            //FIXME
-            /*
-             * I don't understand what type of exception we should throw out if we haven't
-             * appropriate providers...
-             * Maybe here is should be MidiUnavailableException
-             */
-            throw new Error("There is no SoundbankReaderProviders on your system!!!");
-        }
-        /*
-         * It's not determine what provider for this service I should to use, and so
-         * I use the first one
-         */
-        return ((SoundbankReader) soundbankReaderProviders.get(0)).getSoundbank(stream);
-    }
-
-    public static Soundbank getSoundbank(URL url) throws InvalidMidiDataException, IOException {
-        /*
-         * obtain the list of SoundbankReaderProviders
-         */
-        List<?> soundbankReaderProviders = ProviderService.getProviders(soundbankReaderPath);
-        if (soundbankReaderProviders.size() == 0) {
-            //FIXME
-            /*
-             * I don't understand what type of exception we should throw out if we haven't
-             * appropriate providers...
-             * Maybe here is should be MidiUnavailableException
-             */
-            throw new Error("There is no SoundbankReaderProviders on your system!!!");
-        }
-        /*
-         * It's not determine what provider for this service I should to use, and so
-         * I use the first one
-         */
-        return ((SoundbankReader) soundbankReaderProviders.get(0)).getSoundbank(url);
-    }
-
-    public static Synthesizer getSynthesizer() throws MidiUnavailableException {
-        /*
-         * description of the default device for javax.sound.midi.Synthesizer
-         */
-        List<String> defaultDevice = ProviderService.getDefaultDeviceDescription(synthesizerName);
-        /*
-         * obtain the list of MidiDeviceProviders
-         */
-        List<?> deviceProviders = ProviderService.getProviders(midiDeviceProviderPath);
-        String provName;
-        int deviceNum = -1;
-        
-        /*
-         * defaultDevice.get(0) --> provider
-         * defaultDevice.get(1) --> name
-         */      
-        if (defaultDevice.size() != 0) {
-            /*
-             * obtain the provider number in the list of deviceProviders that is provider for default device
-             */
-            for (int i = 0; i < deviceProviders.size(); i++) {
-                provName = deviceProviders.get(i).toString();
-                if (provName.substring(0, provName.indexOf("@")).equals(defaultDevice.get(0))) {
-                    deviceNum = i;
-                    break;
-                }
-            }
-            /*
-             * the first case: find the same provider and name that describes by default device
-             */
-            if (deviceNum != -1) {
-                MidiDevice.Info[] deviceInfo = ((MidiDeviceProvider) deviceProviders.get(deviceNum)).getDeviceInfo();
-                for (Info element : deviceInfo) {
-                    if (element.getName().equals(defaultDevice.get(1))) {
-                        if (((MidiDeviceProvider) deviceProviders.get(deviceNum)).getDevice(element) instanceof Synthesizer) {
-                            return (Synthesizer) ((MidiDeviceProvider) deviceProviders.get(deviceNum)).getDevice(element);
-                        }
-                    }
-                }
-                for (Info element : deviceInfo) {
-                    if (((MidiDeviceProvider) deviceProviders.get(deviceNum)).getDevice(element) instanceof Synthesizer) {
-                        return (Synthesizer) ((MidiDeviceProvider) deviceProviders.get(deviceNum)).getDevice(element);
-                    }
-                }
-            }
-            /*
-             * if we don't find again, find any receivers describe by name
-             */
-            for (int i = 0; i < deviceProviders.size(); i++) {
-                MidiDevice.Info[] deviceInfo = ((MidiDeviceProvider) deviceProviders.get(i)).getDeviceInfo();
-                for (Info element : deviceInfo) {
-                    if (element.getName().equals(defaultDevice.get(1))) {
-                        if (((MidiDeviceProvider) deviceProviders.get(i)).getDevice(element) instanceof Synthesizer) {
-                            return (Synthesizer) ((MidiDeviceProvider) deviceProviders.get(i)).getDevice(element);
-                        }
-                    }
-                }
-            }
-        }
-        /*
-         * in the last case we look throw all providers and find any receiver
-         */
-        for (int i = 0; i < deviceProviders.size(); i++) {
-            MidiDevice.Info[] deviceInfo = ((MidiDeviceProvider) deviceProviders.get(i)).getDeviceInfo();
-            for (Info element : deviceInfo) {
-                if (((MidiDeviceProvider) deviceProviders.get(i)).getDevice(element) instanceof Synthesizer) {
-                    return (Synthesizer) ((MidiDeviceProvider) deviceProviders.get(i)).getDevice(element);
-                }
-            }
-        }
-        /*
-         * if we don't find anyway, we throw out MidiUnavailableException
-         */
-        throw new MidiUnavailableException("There are no Synthesizers installed on your system!");
-    }
-
-    public static Transmitter getTransmitter() throws MidiUnavailableException {
-        /*
-         * description of the default device for javax.sound.midi.Transmitter
-         */
-        List<String> defaultDevice = ProviderService.getDefaultDeviceDescription(transmitterName);
-        /*
-         * obtain the list of MidiDeviceProviders
-         */
-        List<?> deviceProviders = ProviderService.getProviders(midiDeviceProviderPath);
-        String provName;
-        int deviceNum = -1;
-        /*
-         * defaultDevice.get(0) --> provider
-         * defaultDevice.get(1) --> name
-         */      
-        if (defaultDevice.size() != 0) {
-            /*
-             * obtain the provider number in the list of deviceProviders that is provider for default device
-             */
-            for (int i = 0; i < deviceProviders.size(); i++) {
-                provName = deviceProviders.get(i).toString();
-                if (provName.substring(0, provName.indexOf("@")).equals(defaultDevice.get(0))) {
-                    deviceNum = i;
-                    break;
-                }
-            }
-            /*
-             * the first case: find the same provider and name that describes by default device
-             */
-            if (deviceNum != -1) {
-                MidiDevice.Info[] deviceInfo = ((MidiDeviceProvider) deviceProviders.get(deviceNum)).getDeviceInfo();
-                for (Info element : deviceInfo) {
-                    if (element.getName().equals(defaultDevice.get(1))) {
-                        try {
-                            return ((MidiDeviceProvider) deviceProviders.get(deviceNum)).getDevice(element).getTransmitter();
-                        } catch (MidiUnavailableException e) {}
-                    }
-                }
-                for (Info element : deviceInfo) {
-                    try {
-                        return ((MidiDeviceProvider) deviceProviders.get(deviceNum)).getDevice(element).getTransmitter();
-                    } catch (MidiUnavailableException e) {}
-                }
-            }
-            /*
-             * if we don't find again, find any receivers describe by name
-             */
-            for (int i = 0; i < deviceProviders.size(); i++) {
-                MidiDevice.Info[] deviceInfo = ((MidiDeviceProvider) deviceProviders.get(i)).getDeviceInfo();
-                for (Info element : deviceInfo) {
-                    if (element.getName().equals(defaultDevice.get(1))) {
-                        try {
-                            return ((MidiDeviceProvider) deviceProviders.get(i)).getDevice(element).getTransmitter();
-                        } catch (MidiUnavailableException e) {}
-                    }
-                }
-            }
-        }
-        /*
-         * in the last case we look throw all providers and find any receiver
-         */
-        for (int i = 0; i < deviceProviders.size(); i++) {
-            MidiDevice.Info[] deviceInfo = ((MidiDeviceProvider) deviceProviders.get(i)).getDeviceInfo();
-            for (Info element : deviceInfo) {
-                try {
-                    return ((MidiDeviceProvider) deviceProviders.get(i)).getDevice(element).getTransmitter();
-                } catch (MidiUnavailableException e) {}
-            }
-        }
-        /*
-         * if we don't find anyway, we throw out MidiUnavailableException
-         */
-        throw new MidiUnavailableException("There are no Transmitters installed on your system!");
-    }
-
-    public static boolean isFileTypeSupported(int fileType) {
-        /*
-         * obtain the list of MidiFileWriterProviders;
-         * if we already obtain the list of providers, we don't obtain it again
-         */
-        List<?> fileWriterProviders = ProviderService.getProviders(midiFileWriterPath);
-        if (fileWriterProviders.size() == 0) {
-            //FIXME
-            /*
-             * I don't understand what type of exception we should throw out if we haven't
-             * appropriate providers...
-             * Maybe here is should be MidiUnavailableException
-             */
-            throw new Error("There is no MidiFileWriterProviders on your system!!!");
-        }
-        /*
-         * It's not determine what provider for this service I should to use, and so
-         * I use the first one
-         */
-        return ((MidiFileWriter) fileWriterProviders.get(0)).isFileTypeSupported(fileType);
-    }
-
-    public static boolean isFileTypeSupported(int fileType, Sequence sequence) {
-        /*
-         * obtain the list of MidiFileWriterProviders
-         */
-        List<?> fileWriterProviders = ProviderService.getProviders(midiFileWriterPath);
-        if (fileWriterProviders.size() == 0) {
-            //FIXME
-            /*
-             * I don't understand what type of exception we should throw out if we haven't
-             * appropriate providers...
-             * Maybe here is should be MidiUnavailableException
-             */
-            throw new Error("There is no MidiFileWriterProviders on your system!!!");
-        }
-        /*
-         * It's not determine what provider for this service I should to use, and so
-         * I use the first one
-         */
-        return ((MidiFileWriter) fileWriterProviders.get(0)).isFileTypeSupported(fileType, sequence);
-    }
-
-    public static int write(Sequence in, int type, File out) throws IOException {
-        /*
-         * obtain the list of MidiFileWriterProviders
-         */
-        List<?>  fileWriterProviders = ProviderService.getProviders(midiFileWriterPath);
-        if (fileWriterProviders.size() == 0) {
-            //FIXME
-            /*
-             * I don't understand what type of exception we should throw out if we haven't
-             * appropriate providers...
-             * Maybe here is should be MidiUnavailableException
-             */
-            throw new Error("There is no MidiFileWriterProviders on your system!!!");
-        }
-        /*
-         * It's not determine what provider for this service I should to use, and so
-         * I use the first one
-         */
-        return ((MidiFileWriter) fileWriterProviders.get(0)).write(in, type, out);
-    }
-
-    public static int write(Sequence in, int fileType, OutputStream out) throws IOException {
-        /*
-         * obtain the list of MidiFileWriterProviders
-         */
-        List<?>  fileWriterProviders = ProviderService.getProviders(midiFileWriterPath);
-        if (fileWriterProviders.size() == 0) {
-            //FIXME
-            /*
-             * I don't understand what type of exception we should throw out if we haven't
-             * appropriate providers...
-             * Maybe here is should be MidiUnavailableException
-             */
-            throw new Error("There is no MidiFileWriterProviders on your system!!!");
-        }
-        /*
-         * It's not determine what provider for this service I should to use, and so
-         * I use the first one
-         */
-        return ((MidiFileWriter) fileWriterProviders.get(0)).write(in, fileType, out);
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiUnavailableException.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiUnavailableException.java
deleted file mode 100644
index bd50af5..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/MidiUnavailableException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-public class MidiUnavailableException extends Exception {
-    private static final long serialVersionUID = 6093809578628944323L;
-
-    public MidiUnavailableException() {
-        super();
-    }
-
-    public MidiUnavailableException(String message) {
-        super(message);
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/Patch.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/Patch.java
deleted file mode 100644
index fc1d280..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/Patch.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-public class Patch {
-    private int bank;
-
-    private int program;
-
-    public Patch(int bank, int program) {
-        this.bank = bank;
-        this.program = program;
-    }
-
-    public int getBank() {
-        return bank;
-    }
-
-    public int getProgram() {
-        return program;
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/Receiver.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/Receiver.java
deleted file mode 100644
index 014c05f..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/Receiver.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-public interface Receiver {
-    void close();
-
-    void send(MidiMessage message, long timeStamp);
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/Sequence.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/Sequence.java
deleted file mode 100644
index 0a12834..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/Sequence.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-import java.util.Vector;
-
-import org.apache.harmony.sound.internal.nls.Messages;
-
-public class Sequence {
-    public static final float PPQ = 0.0f;
-
-    public static final float SMPTE_24 = 24.0f;
-
-    public static final float SMPTE_25 = 25.0f;
-
-    public static final float SMPTE_30 = 30.0f;
-
-    public static final float SMPTE_30DROP = 29.969999313354492f;
-    
-    protected float divisionType;
-
-    protected int resolution;
-
-    protected Vector<Track> tracks;
-    
-    private Vector<Patch> patches;
-
-    public Sequence(float divisionType, int resolution) throws InvalidMidiDataException {
-        if (divisionType != Sequence.PPQ &&
-                divisionType != Sequence.SMPTE_24 &&
-                divisionType != Sequence.SMPTE_25 &&
-                divisionType != Sequence.SMPTE_30 &&
-                divisionType != Sequence.SMPTE_30DROP ) {
-            // sound.0B=Unsupported division type: {0}
-            throw new InvalidMidiDataException(Messages.getString("sound.0B", divisionType));       //$NON-NLS-1$
-        }
-        this.divisionType = divisionType;
-        this.resolution = resolution;
-        this.tracks = new Vector<Track>();
-        this.patches = new Vector<Patch>();
-        
-    }
-
-    public Sequence(float divisionType, int resolution, int numTracks)
-            throws InvalidMidiDataException {
-        if (divisionType != Sequence.PPQ &&
-                divisionType != Sequence.SMPTE_24 &&
-                divisionType != Sequence.SMPTE_25 &&
-                divisionType != Sequence.SMPTE_30 &&
-                divisionType != Sequence.SMPTE_30DROP ) {
-            // sound.0B=Unsupported division type: {0}
-            throw new InvalidMidiDataException(Messages.getString("sound.0B", divisionType));       //$NON-NLS-1$
-        }
-        this.divisionType = divisionType;
-        this.resolution = resolution;
-        this.patches = new Vector<Patch>();
-        this.tracks = new Vector<Track>();
-        if (numTracks > 0) {
-            for (int i = 0; i < numTracks; i++) {
-                tracks.add(new Track());
-            }
-        }
-    }
-
-    public Track createTrack() {
-        /*
-         * new Tracks accrue to the end of vector
-         */
-        Track tr = new Track();
-        tracks.add(tr);
-        return tr;
-    }
-
-    public boolean deleteTrack(Track track) {
-        return tracks.remove(track);
-    }
-
-    public float getDivisionType() {
-        return divisionType;
-    }
-
-    public long getMicrosecondLength() {
-        float divisionType;
-        if (this.divisionType == 0.0f) {
-            divisionType = 2;
-        } else {
-            divisionType = this.divisionType;
-        }
-        return (long) (1000000.0 * getTickLength() / 
-                (divisionType * this.resolution * 1.0f));
-    }
-
-    public Patch[] getPatchList() {
-        //FIXME
-        /*
-         * I don't understand how to works this method, and so
-         * I simply return an empty array. 'patches' initializes
-         * in the constructor as empty vector 
-         */
-        Patch[] patch = new Patch[patches.size()];
-        patches.toArray(patch);
-        return patch;
-    }
-
-    public int getResolution() {
-        return resolution;
-    }
-
-    public long getTickLength() {
-        /*
-         * this method return the biggest value of tick of 
-         * all tracks contain in the Sequence
-         */
-        long maxTick = 0;
-        for (int i = 0; i < tracks.size(); i++) {
-            if (maxTick < tracks.get(i).ticks()) {
-                maxTick = tracks.get(i).ticks();
-            }
-        }
-        return maxTick;
-    }
-
-    public Track[] getTracks() {
-        Track[] track = new Track[tracks.size()];
-        tracks.toArray(track);
-        return track;
-    }
-
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/Sequencer.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/Sequencer.java
deleted file mode 100644
index 4f0d8f8..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/Sequencer.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-public interface Sequencer extends MidiDevice {
-    int LOOP_CONTINUOUSLY = -1;
-
-    class SyncMode {
-        public static final SyncMode INTERNAL_CLOCK = new SyncMode("INTERNAL_CLOCK"); //$NON-NLS-1$
-
-        public static final SyncMode MIDI_SYNC = new SyncMode("MIDI_SYNC"); //$NON-NLS-1$
-
-        public static final SyncMode MIDI_TIME_CODE = new SyncMode("MIDI_TIME_CODE"); //$NON-NLS-1$
-
-        public static final SyncMode NO_SYNC = new SyncMode("NO_SYNC"); //$NON-NLS-1$
-
-        private String name;
-
-        protected SyncMode(String name) {
-            this.name = name;
-        }
-
-        @Override
-        public final boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (!super.equals(obj)) {
-                return false;
-            }
-            if (getClass() != obj.getClass()) {
-                return false;
-            }
-            final SyncMode other = (SyncMode) obj;
-            if (name == null) {
-                if (other.name != null) {
-                    return false;
-                }
-            } else if (!name.equals(other.name)) {
-                return false;
-            }
-            return true;
-        }
-
-        @Override
-        public final int hashCode() {
-            final int PRIME = 31;
-            int result = super.hashCode();
-            result = PRIME * result + ((name == null) ? 0 : name.hashCode());
-            return result;
-        }
-
-        @Override
-        public final String toString() {
-            return name;
-        }
-    }
-
-    int[] addControllerEventListener(ControllerEventListener listener, int[] controllers);
-
-    boolean addMetaEventListener(MetaEventListener listener);
-
-    int getLoopCount();
-
-    long getLoopEndPoint();
-
-    long getLoopStartPoint();
-
-    Sequencer.SyncMode getMasterSyncMode();
-
-    Sequencer.SyncMode[] getMasterSyncModes();
-
-    long getMicrosecondLength();
-
-    long getMicrosecondPosition();
-
-    Sequence getSequence();
-
-    Sequencer.SyncMode getSlaveSyncMode();
-
-    Sequencer.SyncMode[] getSlaveSyncModes();
-
-    float getTempoFactor();
-
-    float getTempoInBPM();
-
-    float getTempoInMPQ();
-
-    long getTickLength();
-
-    long getTickPosition();
-
-    boolean getTrackMute(int track);
-
-    boolean getTrackSolo(int track);
-
-    boolean isRecording();
-
-    boolean isRunning();
-
-    void recordDisable(Track track);
-
-    void recordEnable(Track track, int channel);
-
-    int[] removeControllerEventListener(ControllerEventListener listener, int[] controllers);
-
-    void removeMetaEventListener(MetaEventListener listener);
-
-    void setLoopCount(int count);
-
-    void setLoopEndPoint(long tick);
-
-    void setLoopStartPoint(long tick);
-
-    void setMasterSyncMode(Sequencer.SyncMode sync);
-
-    void setMicrosecondPosition(long microseconds);
-
-    void setSequence(InputStream stream) throws IOException, InvalidMidiDataException;
-
-    void setSequence(Sequence sequence) throws InvalidMidiDataException;
-
-    void setSlaveSyncMode(Sequencer.SyncMode sync);
-
-    void setTempoFactor(float factor);
-
-    void setTempoInBPM(float bpm);
-
-    void setTempoInMPQ(float mpq);
-
-    void setTickPosition(long tick);
-
-    void setTrackMute(int track, boolean mute);
-
-    void setTrackSolo(int track, boolean solo);
-
-    void start();
-
-    void startRecording();
-
-    void stop();
-
-    void stopRecording();
-
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/ShortMessage.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/ShortMessage.java
deleted file mode 100644
index e75b784..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/ShortMessage.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-import org.apache.harmony.sound.internal.nls.Messages;
-
-public class ShortMessage extends MidiMessage {
-
-    public static final int ACTIVE_SENSING = 254;
-
-    public static final int CHANNEL_PRESSURE = 208;
-
-    public static final int CONTINUE = 251;
-
-    public static final int CONTROL_CHANGE = 176;
-
-    public static final int END_OF_EXCLUSIVE = 247;
-
-    public static final int MIDI_TIME_CODE = 241;
-
-    public static final int NOTE_OFF = 128;
-
-    public static final int NOTE_ON = 144;
-
-    public static final int PITCH_BEND = 224;
-
-    public static final int POLY_PRESSURE = 160;
-
-    public static final int PROGRAM_CHANGE = 192;
-
-    public static final int SONG_POSITION_POINTER = 242;
-
-    public static final int SONG_SELECT = 243;
-
-    public static final int START = 250;
-
-    public static final int STOP = 252;
-
-    public static final int SYSTEM_RESET = 255;
-
-    public static final int TIMING_CLOCK = 248;
-
-    public static final int TUNE_REQUEST = 246;
-
-    public ShortMessage() {
-        super(new byte[] {-112, 64, 127});
-    }
-
-    protected ShortMessage(byte[] data) {
-        super(data);
-    }
-
-    @Override
-    public Object clone() {
-        return new ShortMessage(this.getMessage());
-    }
-
-    public int getChannel() {
-        /*
-         * channel change from 0 up to 15
-         */
-        if ((data == null) || (data.length == 0)) {
-            return 0;
-        }
-        return data[0] & 0x0F;
-    }
-
-    public int getCommand() {
-       /*
-        * command should be divisible by 16 without rest 
-        */
-        if ((data == null) || (data.length == 0)) {
-            return 0;
-        }
-        return (data[0] & 0xFF) - getChannel();
-    }
-
-    public int getData1() {
-        if ((data == null) || (data.length == 0)) {
-            return 0;
-        } else if (data.length < 2) {
-            return 0;
-        } else {
-            return data[1] & 0xFF;
-        }
-    }
-
-    public int getData2() {
-        if ((data == null) || (data.length == 0)) {
-            return 0;
-        } else if (data.length < 3) {
-            return 0;
-        } else {
-            return data[2] & 0xFF;
-        }
-    }
-
-    protected final int getDataLength(int status)
-            throws InvalidMidiDataException {
-        // FIXME
-        /*
-         * I have some question about this method. I didn't understand how
-         * should to work this method, but some results I get by experimental
-         * method. From 0 up to 127, from 256 up to 383 and so on this method
-         * throw out exception, i.e. after 256 begin cycle with some small
-         * differences in the first lap, from 0 up to 255. From the second lap
-         * and so on this method, getDataLenght(int), throw out exception with
-         * value of status from 496 up to 511, from 752 up to 767 and so on,
-         * i.e. on the last 16 number of 256-lap. And now differences in the
-         * first lap. This method don't throw out exception with value of status
-         * from 240 up to 255. It has next behavior: 
-         * - value of status equals 240 -- throw out exception; 
-         * - 241 -- return 1; 
-         * - 242 -- return 2; 
-         * - 243 -- return 1; 
-         * - from 244 up to 245 -- throw out exception; 
-         * - from 246 up to 255 -- return 0;
-         */
-        if (status < 0) {
-            // sound.04=Invalid status byte: {0}
-            throw new InvalidMidiDataException(Messages.getString("sound.04", status)); //$NON-NLS-1$
-        }
-        if (((status % 256) >= 0) && ((status % 256) <= 127)) {
-            // sound.04=Invalid status byte: {0}
-            throw new InvalidMidiDataException(Messages.getString("sound.04", status)); //$NON-NLS-1$
-        }
-        if (((status / 256) == 0)
-                && ((status == 240) || (status == 244) || (status == 245))) {
-            // sound.04=Invalid status byte: {0}
-            throw new InvalidMidiDataException(Messages.getString("sound.04", status)); //$NON-NLS-1$
-        }
-        if (((status / 256) != 0) && ((status % 256) >= 244)
-                && ((status % 256) <= 255)) {
-            // sound.04=Invalid status byte: {0}
-            throw new InvalidMidiDataException(Messages.getString("sound.04", status)); //$NON-NLS-1$
-        }
-
-        if ((status / 256) == 0) {
-            if ((status == 241) || (status == 243)) {
-                return 1;
-            } else if (status == 242) {
-                return 2;
-            } else if ((status >= 246) && (status <= 255)) {
-                return 0;
-            }
-        }
-        if (((status % 256) >= 128) && ((status % 256) <= 191)) {
-            return 2;
-        } else if (((status % 256) >= 192) && ((status % 256) <= 223)) {
-            return 1;
-        } else {
-            return 2;
-        }
-    }
-
-    public void setMessage(int status) throws InvalidMidiDataException {
-        /*
-         * value of variable status is more or equals 246 and less or equals 255
-         */
-        if ((status < 246) || (status > 255)) {
-            // sound.04=Invalid status byte: {0}
-            throw new InvalidMidiDataException(Messages.getString("sound.04", status)); //$NON-NLS-1$
-        }
-        super.setMessage(new byte[] {(byte) status}, 1);
-    }
-
-    public void setMessage(int status, int data1, int data2)
-            throws InvalidMidiDataException {
-        // FIXME
-        /*
-         * In the Sun's implementation variables data1 and data2 don't use; I
-         * don't find situation when this variables influence on result of
-         * functions getData1() and getData2(). But function getDataLength(int)
-         * return 0 when I modify status byte from 246 up to 255, and so I think
-         * it's true.
-         */
-        if ((status < 246) || (status > 255)) {
-            // sound.04=Invalid status byte: {0}
-            throw new InvalidMidiDataException(Messages.getString("sound.04", status)); //$NON-NLS-1$
-        }
-        super.setMessage(new byte[] {(byte) status}, 1);
-    }
-
-    public void setMessage(int command, int channel, int data1, int data2)
-            throws InvalidMidiDataException {
-        // FIXME
-        /*
-         * value of variable command is more or equals 128 and less or equals
-         * 239
-         */
-        if ((command < 128) || (command > 239)) {
-            /*
-             * when this exception throw out, the value of variable command
-             * should be the hexadecimal number
-             */
-            // sound.05=command out of range: {0}
-            throw new InvalidMidiDataException(Messages.getString("sound.05", command)); //$NON-NLS-1$
-        }
-        /*
-         * value of variable channel is more or equals 0 and less or equals 15
-         */
-        if ((channel < 0) || (channel > 15)) {
-            // sound.06=channel out of range: {0}
-            throw new InvalidMidiDataException(Messages.getString("sound.06", channel)); //$NON-NLS-1$
-        }
-        /*
-         * value of data1 and data2 is more or equals 0 and less or equals 127,
-         * but when command more or equals 192 and less or equals 223 the second
-         * data, data2, is unused, because getDataLength(int) return 1 in this
-         * case, and in other cases it return 2
-         */
-        if ((getDataLength(command) >= 1) && ((data1 < 0) || (data1 > 127))) {
-            // sound.07=data1 out of range: {0}
-            throw new InvalidMidiDataException(Messages.getString("sound.07", data1)); //$NON-NLS-1$
-        }
-        if ((getDataLength(command) == 2) && ((data2 < 0) || (data2 > 127))) {
-            // sound.08=data2 out of range: {0}
-            throw new InvalidMidiDataException(Messages.getString("sound.08", data2)); //$NON-NLS-1$
-        }
-
-        int tcom = command - (command % 16);
-        if (getDataLength(command) == 1) {
-            super.setMessage(new byte[] {(byte) (tcom + channel), (byte) data1}, 2);
-        } else {
-            super.setMessage(new byte[] {(byte) (tcom + channel), (byte) data1, 
-                    (byte) data2}, 3);
-        }
-    }
-
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/Soundbank.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/Soundbank.java
deleted file mode 100644
index c2a7a85..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/Soundbank.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-public interface Soundbank {
-    String getDescription();
-
-    Instrument getInstrument(Patch patch);
-
-    Instrument[] getInstruments();
-
-    String getName();
-
-    SoundbankResource[] getResources();
-
-    String getVendor();
-
-    String getVersion();
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/SoundbankResource.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/SoundbankResource.java
deleted file mode 100644
index d824d53..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/SoundbankResource.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-public abstract class SoundbankResource {
-    private Soundbank soundbank;
-    private String name;
-    private Class<?> dataClass;
-    
-    protected SoundbankResource(Soundbank soundbank, String name, Class<?> dataClass) {
-        super();
-        this.soundbank = soundbank;
-        this.name = name;
-        this.dataClass = dataClass;
-    }
-
-    public abstract Object getData();
-
-    public Class<?> getDataClass() {
-        return dataClass;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public Soundbank getSoundbank() {
-        return soundbank;
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/Synthesizer.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/Synthesizer.java
deleted file mode 100644
index b203a85..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/Synthesizer.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-public interface Synthesizer extends MidiDevice {
-    Instrument[] getAvailableInstruments();
-
-    MidiChannel[] getChannels();
-
-    Soundbank getDefaultSoundbank();
-
-    long getLatency();
-
-    Instrument[] getLoadedInstruments();
-
-    int getMaxPolyphony();
-
-    VoiceStatus[] getVoiceStatus();
-
-    boolean isSoundbankSupported(Soundbank soundbank);
-
-    boolean loadAllInstruments(Soundbank soundbank);
-
-    boolean loadInstrument(Instrument instrument);
-
-    boolean loadInstruments(Soundbank soundbank, Patch[] patchList);
-
-    boolean remapInstrument(Instrument from, Instrument to);
-
-    void unloadAllInstruments(Soundbank soundbank);
-
-    void unloadInstrument(Instrument instrument);
-
-    void unloadInstruments(Soundbank soundbank, Patch[] patchList);
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/SysexMessage.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/SysexMessage.java
deleted file mode 100644
index 8ba7b86..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/SysexMessage.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-import org.apache.harmony.sound.internal.nls.Messages;
-
-public class SysexMessage extends MidiMessage {
-    public static final int SPECIAL_SYSTEM_EXCLUSIVE = 247;
-
-    public static final int SYSTEM_EXCLUSIVE = 240;
-
-    public SysexMessage() {
-        super(new byte[] {-16, -9});
-    }
-
-    protected SysexMessage(byte[] data) {
-        super(data);
-    }
-
-    @Override
-    public Object clone() {
-        return new SysexMessage(this.getMessage());
-    }
-
-    public byte[] getData() {
-        byte[] bt = new byte[super.length - 1];
-        for(int i = 1; i < super.length; i++) {
-            bt[i-1] = super.data[i];
-        }
-        return bt;
-    }
-
-    @Override
-    public void setMessage(byte[] data, int length) throws InvalidMidiDataException {
-        //FIXME
-        /*
-         * if this exception throw out, the value of wrong status byte
-         * should be the hexadecimal value
-         */
-        if(((data[0] & 0xFF) != SysexMessage.SPECIAL_SYSTEM_EXCLUSIVE) &&
-                ((data[0] & 0xFF) != SysexMessage.SYSTEM_EXCLUSIVE)) {
-            // sound.09=Invalid status byte for sysex message: {0}
-            throw new InvalidMidiDataException(Messages.getString("sound.09",  //$NON-NLS-1$
-                    data[0] & 0xFF));
-        }
-        super.setMessage(data, length);
-    }
-
-    public void setMessage(int status, byte[] data, int length) throws InvalidMidiDataException {
-        //FIXME
-        /*
-         * if this exception throw out, the value of wrong status byte
-         * should be the hexadecimal value
-         */
-        if((status != SysexMessage.SPECIAL_SYSTEM_EXCLUSIVE) &&
-                (status != SysexMessage.SYSTEM_EXCLUSIVE)) {
-            // sound.09=Invalid status byte for sysex message: {0}
-            throw new InvalidMidiDataException(Messages.getString("sound.09",  //$NON-NLS-1$
-                    status));
-        }
-        if((length < 0) || (length > data.length)) {
-            // sound.03=length out of bounds: {0}
-            throw new IndexOutOfBoundsException(Messages.getString("sound.03", length)); //$NON-NLS-1$
-        }
-        byte[] bt = new byte[length + 1];
-        bt[0] = (byte) status;
-        for(int i = 0; i < length; i++) {
-            bt[i+1] = data[i];
-        }
-        super.setMessage(bt, length + 1);
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/Track.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/Track.java
deleted file mode 100644
index 27dab92..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/Track.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-import java.util.ArrayList;
-
-import org.apache.harmony.sound.internal.nls.Messages;
-
-public class Track {
-    private ArrayList<MidiEvent> events; //vector of events contain in the Track
-    
-    private MidiEvent badEvent; //variable to save event which I try to add
-                                //to empty Track; see description below
-    
-    private long tick; 
-    
-    Track() {
-        /*
-         * create an empty Track; new Track must contain only meta-event End of Track.
-         * MetaMessage with MetaMessage.data contains -1, 47 and 0 is meta-event
-         */
-        events = new ArrayList<MidiEvent>();
-        events.add(new MidiEvent(new MetaMessage(new byte[] {-1, 47, 0}), 0));
-    }
-    public boolean add(MidiEvent event) {
-        //FIXME
-        /*
-         * Some words about badEvent.
-         * When I write tests, I find following situation in the RI:
-         * if I want to add to empty Track new event that is not meta-event End of Track,
-         * I catch exception ArrayIndexOutOfBoundsException with meaning -1, and my
-         * event doesn't add to Track, but meta-event adds. If I try to add the same 
-         * event after it, method Track.add(MidiEvent) return 'false', and my event
-         * doesn't add again. So, I want to delete this event and use method 
-         * Track.remove(MidiEvent) for it, but it return 'false' too! And only after
-         * this "shamanism" I can add this event to Track normally. 
-         * And only for this situation I use variable badEvent. 
-         * 
-         * See test org.apache.harmony.sound.tests.javax.sound.midi.TrackTest 
-         * for more details
-         */
-        
-        /*
-         * if event equals null or badEvent, this method return 'false'
-         */
-        if (event == null || event == badEvent) {
-            return false;
-        }
-        /*
-         * If event equals meta-event End of Track and Track in this moment
-         * doesn't contain some events, i.e. Track.size() return 0, this 
-         * event accrue to Track; 
-         * if Track is not empty, but it doesn't contain meta-event, 
-         * this event accrue to the end of Track;
-         * in any case addition of this meta-event is successful, this method 
-         * return 'true' even if meta-event End of Track already contains in the Track
-         */
-        if (event.getMessage().getMessage()[0] == -1 &&
-                event.getMessage().getMessage()[1] == 47 &&
-                event.getMessage().getMessage()[2] == 0 ) {
-            if (events.size() == 0) {
-                return events.add(event);
-            }
-            byte[] bt = events.get(events.size() - 1).getMessage().getMessage();
-            if ((bt[0] != -1) && (bt[1] != 47) && (bt[2] != 0)) {
-                return events.add(event);
-            }         
-            return true;
-        }
-        /*
-         * after use method Track.add(MidiEvent) Track must contain meta-event
-         * End of Track; so, at first I add this event to Track if it doesn't 
-         * contain meta-event and parameter 'event' is not meta-event
-         */
-        if (events.size() == 0) {
-            events.add(new MidiEvent(new MetaMessage(new byte[] {-1, 47, 0}), 0));
-            badEvent = event;
-            // sounds.01=-1
-            throw new ArrayIndexOutOfBoundsException(Messages.getString("sound.01")); //$NON-NLS-1$
-        }
-        byte[] bt = events.get(events.size() - 1).getMessage().getMessage();
-        if ((bt[0] != -1) && (bt[1] != 47) && (bt[2] != 0)) {
-            events.add(new MidiEvent(new MetaMessage(new byte[] {-1, 47, 0}), 0));
-        }
-        
-        if (events.contains(event)) {
-            return false;
-        } 
-        
-        /*
-         * events in the Track must take up position in ascending ticks
-         */
-        if (events.size() == 1) {
-            events.add(0, event);
-        }
-        for (int i = 0; i < events.size() - 1; i++ ) {
-            if (events.get(i).getTick() <= event.getTick()) {
-                continue;
-            }
-            events.add(i, event);
-            break;
-        }
-        /*
-         * method Track.ticks() return the biggest value of tick of all events
-         * and save it even I remove event with the biggest values of tick
-         */
-        if (tick < event.getTick()) {
-            tick = event.getTick();
-        }
-        return true;           
-    }
-
-    public MidiEvent get(int index) throws ArrayIndexOutOfBoundsException {
-        if (index < 0 || index >= events.size()) {
-            // sound.02=Index: {0}, Size: {1}
-            throw new ArrayIndexOutOfBoundsException(Messages.getString("sound.02", index, events.size()));  //$NON-NLS-1$
-        }
-        return events.get(index);
-    }
-
-    public boolean remove(MidiEvent event) {
-        /*
-         * if I remove event that equals badEvent, I "delete" badEvent
-         */
-        if (event == badEvent) {
-            badEvent = null;
-            return false;
-        }
-        /*
-         * method Track.ticks() always return the biggest value that ever has been
-         * in the Track; so only when Track is empty Track.ticks() return 0 
-         */
-        if (events.remove(event)) {
-            if (events.size() == 0) {
-                tick = 0;
-            }
-            return true;
-        }
-        return false;
-    }
-
-    public int size() {
-        return events.size();
-    }
-
-    public long ticks() {
-        return tick;
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/Transmitter.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/Transmitter.java
deleted file mode 100644
index 1e89197..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/Transmitter.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-public interface Transmitter {
-    void close();
-
-    Receiver getReceiver();
-
-    void setReceiver(Receiver receiver);
-
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/VoiceStatus.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/VoiceStatus.java
deleted file mode 100644
index 370f48e..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/VoiceStatus.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi;
-
-public class VoiceStatus {
-    public boolean active;
-
-    public int bank;
-
-    public int channel;
-
-    public int note;
-
-    public int program;
-
-    public int volume;
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/spi/MidiDeviceProvider.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/spi/MidiDeviceProvider.java
deleted file mode 100644
index 6112ec7..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/spi/MidiDeviceProvider.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi.spi;
-
-import javax.sound.midi.MidiDevice;
-import javax.sound.midi.MidiDevice.Info;
-
-public abstract class MidiDeviceProvider {
-
-    public abstract MidiDevice getDevice(MidiDevice.Info info);
-
-    public abstract MidiDevice.Info[] getDeviceInfo();
-
-    public boolean isDeviceSupported(MidiDevice.Info info) {
-        MidiDevice.Info[] devices = getDeviceInfo();
-        for (Info element : devices) {
-            if (info.equals(element)) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/spi/MidiFileReader.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/spi/MidiFileReader.java
deleted file mode 100644
index 0d61181..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/spi/MidiFileReader.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi.spi;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-import javax.sound.midi.InvalidMidiDataException;
-import javax.sound.midi.MidiFileFormat;
-import javax.sound.midi.Sequence;
-
-public abstract class MidiFileReader {
-
-    public abstract MidiFileFormat getMidiFileFormat(File file)
-            throws InvalidMidiDataException, IOException;
-
-    public abstract MidiFileFormat getMidiFileFormat(InputStream stream)
-            throws InvalidMidiDataException, IOException;
-
-    public abstract MidiFileFormat getMidiFileFormat(URL url)
-            throws InvalidMidiDataException, IOException;
-
-    public abstract Sequence getSequence(File file)
-            throws InvalidMidiDataException, IOException;
-
-    public abstract Sequence getSequence(InputStream stream)
-            throws InvalidMidiDataException, IOException;
-
-    public abstract Sequence getSequence(URL url)
-            throws InvalidMidiDataException, IOException;
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/spi/MidiFileWriter.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/spi/MidiFileWriter.java
deleted file mode 100644
index e47d17c..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/spi/MidiFileWriter.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi.spi;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-
-import javax.sound.midi.Sequence;
-
-public abstract class MidiFileWriter {
-
-    public abstract int[] getMidiFileTypes();
-
-    public abstract int[] getMidiFileTypes(Sequence sequence);
-
-    public boolean isFileTypeSupported(int fileType) {
-        int[] supported = getMidiFileTypes();
-        for (int element : supported) {
-            if (fileType == element) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public boolean isFileTypeSupported(int fileType, Sequence sequence) {
-        int[] supported = getMidiFileTypes(sequence);
-        for (int element : supported) {
-            if (fileType == element) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public abstract int write(Sequence in, int fileType, File out)
-            throws IOException;
-
-    public abstract int write(Sequence in, int fileType, OutputStream out)
-            throws IOException;
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/midi/spi/SoundbankReader.java b/libcore-disabled/sound/src/main/java/javax/sound/midi/spi/SoundbankReader.java
deleted file mode 100644
index 4fd195a..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/midi/spi/SoundbankReader.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.midi.spi;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-import javax.sound.midi.InvalidMidiDataException;
-import javax.sound.midi.Soundbank;
-
-public abstract class SoundbankReader {
-
-    public abstract Soundbank getSoundbank(File file)
-            throws InvalidMidiDataException, IOException;
-
-    public abstract Soundbank getSoundbank(InputStream stream)
-            throws InvalidMidiDataException, IOException;
-
-    public abstract Soundbank getSoundbank(URL url)
-            throws InvalidMidiDataException, IOException;
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/AudioFileFormat.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/AudioFileFormat.java
deleted file mode 100644
index ce476f1..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/AudioFileFormat.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-public class AudioFileFormat {
-
-    private AudioFileFormat.Type type;
-    private int byteLength = AudioSystem.NOT_SPECIFIED;
-    private AudioFormat format;
-    private int frameLength;
-    private HashMap<String, Object> prop;
-
-    protected AudioFileFormat(AudioFileFormat.Type type,
-            int byteLength,
-            AudioFormat format,
-            int frameLength) {
-        this.type = type;
-        this.byteLength = byteLength;
-        this.format = format;
-        this.frameLength = frameLength;
-    }
-    
-    public AudioFileFormat(AudioFileFormat.Type type,
-            AudioFormat format,
-            int frameLength) {
-        this.type = type;
-        this.format = format;
-        this.frameLength = frameLength;
-    }
-
-    public AudioFileFormat(AudioFileFormat.Type type,
-            AudioFormat format,
-            int frameLength,
-            Map<String,Object> properties) {
-        this.type = type;
-        this.format = format;
-        this.frameLength = frameLength;
-        prop = new HashMap<String, Object>();
-        prop.putAll(properties);
-    }
-    
-    public AudioFileFormat.Type getType() {
-        return type;
-    }
-    
-    public int getByteLength() {
-        return byteLength;
-    }
-
-    public AudioFormat getFormat() {
-        return format;
-    }
-    
-    public int getFrameLength() {
-        return frameLength;
-    }
-    
-    public Map<String,Object> properties() {
-        if (prop == null) {
-            return null;
-        }
-        return Collections.unmodifiableMap(prop);
-    }
-    
-    public Object getProperty(String key) {
-        if (prop == null) {
-            return null;
-        }
-        return prop.get(key);
-    }
-    
-    public String toString() {
-        return type + " (." + type.getExtension() + ") file, data format: " + format + //$NON-NLS-1$ //$NON-NLS-2$
-            " frame length: " + frameLength; //$NON-NLS-1$
-    }
-    
-    public static class Type {
-
-        private String name;
-
-        private String extension;
-
-        public static final Type AIFC = new Type("AIFF-C", "aifc"); //$NON-NLS-1$ //$NON-NLS-2$
-
-        public static final Type AIFF = new Type("AIFF", "aif"); //$NON-NLS-1$ //$NON-NLS-2$
-
-        public static final Type AU = new Type("AU", "au"); //$NON-NLS-1$ //$NON-NLS-2$
-
-        public static final Type SND = new Type("SND", "snd"); //$NON-NLS-1$ //$NON-NLS-2$
-
-        public static final Type WAVE = new Type("WAVE", "wav"); //$NON-NLS-1$ //$NON-NLS-2$
-
-        public Type(String name, String extension) {
-            this.name = name;
-            this.extension = extension;
-        }
-
-        /*
-         * according to the spec it should return true when objects are same but
-         * RI seem to compare internals
-         * 
-         * @see java.lang.Object#equals(java.lang.Object)
-         */
-        @Override
-        public final boolean equals(Object another) {
-            if (this == another) {
-                return true;
-            }
-
-            if (another == null || !(another instanceof Type)) {
-                return false;
-            }
-
-            Type obj = (Type) another;
-            return (name == null ? obj.name == null : name.equals(obj.name))
-                    && (extension == null ? obj.extension == null : extension
-                            .equals(obj.extension));
-        }
-
-        public String getExtension() {
-            return extension;
-        }
-
-        @Override
-        public final int hashCode() {
-            return (name == null ? 0 : name.hashCode()) + 
-                    (extension == null ? 0 : extension.hashCode());
-        }
-
-        @Override
-        public final String toString() {
-            return name;
-        }
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/AudioFormat.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/AudioFormat.java
deleted file mode 100644
index 721ed6a..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/AudioFormat.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-public class AudioFormat {
-    public static class Encoding {
-
-        public static final Encoding ALAW = new Encoding("ALAW"); //$NON-NLS-1$
-
-        public static final Encoding PCM_SIGNED = new Encoding("PCM_SIGNED"); //$NON-NLS-1$
-
-        public static final Encoding PCM_UNSIGNED = new Encoding("PCM_UNSIGNED"); //$NON-NLS-1$
-
-        public static final Encoding ULAW = new Encoding("ULAW"); //$NON-NLS-1$
-
-        private String name;
-
-        public Encoding(String name) {
-            this.name = name;
-        }
-
-        @Override
-        public boolean equals(Object another) {
-            if (this == another) {
-                return true;
-            }
-
-            if (another == null || !(another instanceof Encoding)) {
-                return false;
-            }
-
-            Encoding obj = (Encoding) another;
-            return name == null ? obj.name == null : name.equals(obj.name);
-        }
-
-        @Override
-        public final int hashCode() {
-            return name == null ? 0 : name.hashCode();
-        }
-
-        @Override
-        public final String toString() {
-            return name;
-        }
-    }
-
-    protected boolean bigEndian;
-
-    protected int channels;
-
-    protected Encoding encoding;
-
-    protected float frameRate;
-
-    protected int frameSize;
-
-    protected float sampleRate;
-
-    protected int sampleSizeInBits;
-
-    private HashMap<String, Object> prop;
-
-    public AudioFormat(AudioFormat.Encoding encoding,
-            float sampleRate,
-            int sampleSizeInBits,
-            int channels,
-            int frameSize,
-            float frameRate,
-            boolean bigEndian) {
-
-        this.encoding = encoding;
-        this.sampleRate = sampleRate;
-        this.sampleSizeInBits = sampleSizeInBits;
-        this.channels = channels;
-        this.frameSize = frameSize;
-        this.frameRate = frameRate;
-        this.bigEndian = bigEndian;
-
-    }
-
-    public AudioFormat(AudioFormat.Encoding encoding,
-            float sampleRate,
-            int sampleSizeInBits,
-            int channels,
-            int frameSize,
-            float frameRate,
-            boolean bigEndian,
-            Map<String,Object> properties) {
-
-        this.encoding = encoding;
-        this.sampleRate = sampleRate;
-        this.sampleSizeInBits = sampleSizeInBits;
-        this.channels = channels;
-        this.frameSize = frameSize;
-        this.frameRate = frameRate;
-        this.bigEndian = bigEndian;
-        prop = new HashMap<String, Object>();
-        prop.putAll(properties);
-
-    }
-
-    public AudioFormat(float sampleRate,
-            int sampleSizeInBits,
-            int channels,
-            boolean signed,
-            boolean bigEndian) {
-
-        this.encoding = (signed?  Encoding.PCM_SIGNED : Encoding.PCM_UNSIGNED);
-        this.sampleRate = sampleRate;
-        this.sampleSizeInBits = sampleSizeInBits;
-        this.channels = channels;
-        this.frameSize = sampleSizeInBits >> 3;
-        if ((sampleSizeInBits & 0x7) != 0) {
-            this.frameSize++;
-        }
-        this.frameSize *= channels;
-        this.frameRate = sampleRate;
-        this.bigEndian = bigEndian;
-
-    }
-
-    public Encoding getEncoding() {
-        return encoding;
-    }
-
-    public float getSampleRate() {
-        return sampleRate;
-    }
-    
-    public int getSampleSizeInBits() {
-        return sampleSizeInBits;
-    }
-
-    public int getChannels() {
-        return channels;
-    }
-
-    public int getFrameSize() {
-        return frameSize;
-    }
-
-    public float getFrameRate() {
-        return frameRate;
-    }
-
-    public boolean isBigEndian() {
-        return bigEndian;
-    }
-
-    public Map<String,Object> properties() {
-        if (prop != null) {
-            return Collections.unmodifiableMap(prop);
-        } else {
-            return Collections.emptyMap();
-        }
-    }
-
-    public Object getProperty(String key) {
-        if (prop == null) {
-            return null;
-        }
-        return prop.get(key);
-    }
-
-    public boolean matches(AudioFormat format) {
-        if (!encoding.equals(format.getEncoding()) ||
-                channels != format.getChannels() ||
-                sampleSizeInBits != format.getSampleSizeInBits() ||
-                frameSize != format.getFrameSize()) {
-            return false;
-        }
-        if (format.getSampleRate() != AudioSystem.NOT_SPECIFIED &&
-                sampleRate != format.getSampleRate()) {
-            return false;
-        }
-        
-        if (format.getFrameRate() != AudioSystem.NOT_SPECIFIED &&
-                frameRate != format.getFrameRate()) {
-            return false;
-        }
-        
-        if ((sampleSizeInBits > 8) 
-                && (bigEndian != format.isBigEndian())) {
-            return false;
-        }
-        return true;
-        
-    }
-
-    public String toString() {
-
-        String ch;
-        switch (channels) {
-        case 1:
-            ch = "mono,"; //$NON-NLS-1$
-            break;
-        case 2:
-            ch = "stereo,"; //$NON-NLS-1$
-        default:
-            ch = channels + " channels, "; //$NON-NLS-1$
-        }       
-
-        return encoding + " " + sampleRate + " Hz, " + sampleSizeInBits + " bit, " //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-            + ch + frameSize + " bytes/frame, " + frameRate + " frames/second"; //$NON-NLS-1$ //$NON-NLS-2$
-    }
-    
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/AudioInputStream.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/AudioInputStream.java
deleted file mode 100644
index 3105f94..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/AudioInputStream.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.apache.harmony.sound.internal.nls.Messages;
-
-public class AudioInputStream extends InputStream {
-
-    protected AudioFormat format;
-
-    protected long frameLength;
-
-    protected long framePos;
-
-    protected int frameSize;
-
-    private InputStream stream;
-
-    private TargetDataLine line;
-
-    private byte[] oneByte = new byte[1];
-
-    private long marketFramePos;
-
-    public AudioInputStream(InputStream stream, AudioFormat format, long length) {
-        this.stream = stream;
-        this.format = format;
-        this.frameLength = length;
-        this.frameSize = format.getFrameSize();
-    }
-
-    public AudioInputStream(TargetDataLine line) {
-        this.line = line;
-        this.format = line.getFormat();
-        this.frameLength = AudioSystem.NOT_SPECIFIED; //TODO
-        this.frameSize = this.format.getFrameSize();
-    }
-
-    public AudioFormat getFormat() {
-        return format;
-    }
-
-    public long getFrameLength() {
-        return frameLength;
-    }
-
-    public int read() throws IOException {
-        if (frameSize != 1) {
-            // sound.0C=Frame size must be one byte
-            throw new IOException(Messages.getString("sound.0C")); //$NON-NLS-1$
-        }
-        int res;
-        if (stream != null) { // InputStream
-            if (framePos == frameLength) {
-                return 0;
-            }
-            res = stream.read();
-            if (res == -1) {
-                return -1;
-            }
-            framePos += 1;
-            return res;
-        } else { // TargetDataLine
-            if (line.read(oneByte, 0, 1) == 0) {
-                return -1;
-            }
-            framePos = line.getLongFramePosition();
-            return oneByte[0];
-        }
-    }
-
-    public int read(byte[] b) throws IOException {
-        return read(b, 0, b.length);
-    }
-
-    public int read(byte[] b, int off, int len) throws IOException {
-        int l = Math.min(len, (int) ((frameLength - framePos) * frameSize));
-        l = l - (l % frameSize);
-        if (l == 0) {
-            return 0;
-        }
-        int res;
-        if (stream != null) { // InputStream
-            res = stream.read(b, off, l);
-            if (res == -1) {
-                return -1;
-            }
-            framePos = framePos + res / frameSize;
-            return res;
-        } else { // TargetDataLine
-            res = line.read(b, off, l);
-            if (res == 0) {
-                return -1;
-            }
-            framePos = line.getLongFramePosition();
-            return res;
-        }
-
-    }
-
-    public long skip(long n) throws IOException {
-
-        if (n < frameSize) {
-            return 0;
-        }
-        byte[] skipBuf = new byte[frameSize];
-        long skipped = 0;
-        while (skipped < n) {
-            int read = read(skipBuf, 0, frameSize);
-            if (read == -1) {
-                return skipped;
-            }
-            skipped += read;
-            if (n - skipped < frameSize) {
-                return skipped;
-            }
-        }
-        return skipped;
-
-    }
-
-    public int available() throws IOException {
-        if (stream != null) { // InputStream
-            return Math.min(stream.available(),
-                    (int)((frameLength - framePos) * frameSize));
-        } else { // TargetDataLine
-            return line.available();
-        }
-    }
-
-    public void close() throws IOException {
-        if (stream != null) { // InputStream
-            stream.close();
-        } else { // TargetDataLine
-            line.close();
-        }
-    }
-
-    public void mark(int readlimit) {
-        if (stream != null) { //InputStream
-            stream.mark(readlimit);
-            marketFramePos = framePos;
-        } else { // TargetDataLine
-            // do nothing
-        }
-    }
-
-    public void reset() throws IOException {
-        if (stream != null) { //InputStream
-            stream.reset();
-            framePos = marketFramePos;
-        } else { // TargetDataLine
-            // do nothing
-        }
-    }
-
-    public boolean markSupported() {
-        if (stream != null) { //InputStream
-            return stream.markSupported();
-        } else { // TargetDataLine
-            return false;
-        }
-    }
-
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/AudioPermission.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/AudioPermission.java
deleted file mode 100644
index 04ddd94..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/AudioPermission.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-import java.security.BasicPermission;
-
-public class AudioPermission extends BasicPermission {
-
-    private static final long serialVersionUID = -5518053473477801126L;
-
-    public AudioPermission(String name) {
-        super(name);
-    }
-
-    public AudioPermission(String name, String actions) {
-        super(name, actions);
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/AudioSystem.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/AudioSystem.java
deleted file mode 100644
index c279c17..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/AudioSystem.java
+++ /dev/null
@@ -1,638 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Iterator;
-import java.util.Properties;
-
-import javax.sound.sampled.spi.AudioFileReader;
-import javax.sound.sampled.spi.AudioFileWriter;
-import javax.sound.sampled.spi.FormatConversionProvider;
-import javax.sound.sampled.spi.MixerProvider;
-
-import org.apache.harmony.sound.utils.ProviderService;
-
-import org.apache.harmony.sound.internal.nls.Messages;
-
-public class AudioSystem {
-
-    public static final int NOT_SPECIFIED = -1;
-
-    private final static String audioFileReaderPath = "META-INF/services/javax.sound.sampled.spi.AudioFileReader"; //$NON-NLS-1$
-
-    private final static String audioFileWriterPath = "META-INF/services/javax.sound.sampled.spi.AudioFileWriter"; //$NON-NLS-1$
-
-    private final static String formatConversionProviderPath = "META-INF/services/javax.sound.sampled.spi.FormatConversionProvider"; //$NON-NLS-1$
-
-    private final static String mixerProviderPath = "META-INF/services/javax.sound.sampled.spi.MixerProvider"; //$NON-NLS-1$
-
-    private final static String CLIP = "javax.sound.sampled.Clip"; //$NON-NLS-1$
-
-    private final static String PORT = "javax.sound.sampled.Port"; //$NON-NLS-1$
-
-    private final static String SOURCEDATALINE = "javax.sound.sampled.SourceDataLine"; //$NON-NLS-1$
-
-    private final static String TARGETDATALINE = "javax.sound.sampled.TargetDataLine"; //$NON-NLS-1$
-
-    public static Mixer.Info[] getMixerInfo() {
-        List<Mixer.Info> result = new ArrayList<Mixer.Info>();
-        for (Iterator providers = ProviderService.getProviders(
-                mixerProviderPath).iterator(); providers.hasNext();) {
-            try {
-                Mixer.Info[] infos = ((MixerProvider) (providers.next()))
-                        .getMixerInfo();
-                for (Mixer.Info info : infos) {
-                    result.add(info);
-                }
-            } catch (ClassCastException e) {}
-        }
-        Mixer.Info[] temp = new Mixer.Info[result.size()];
-        return result.toArray(temp);
-    }
-
-    public static Mixer getMixer(Mixer.Info info) {
-        Mixer.Info[] infos;
-        Mixer.Info inf;
-        if (info == null) {
-            infos = getMixerInfo();
-            if (infos == null) {
-                throw new IllegalArgumentException(
-                        "No system default mixer installed"); //$NON-NLS-1$
-            }
-            inf = infos[0];
-        } else {
-            inf = info;
-        }
-
-        for (Iterator providers = ProviderService.getProviders(
-                mixerProviderPath).iterator(); providers.hasNext();) {
-            try {
-                return ((MixerProvider) (providers.next())).getMixer(inf);
-            } catch (ClassCastException e) {} catch (IllegalArgumentException e) {}
-        }
-        throw new IllegalArgumentException("Mixer not supported: " + inf); //$NON-NLS-1$
-    }
-
-    public static Line.Info[] getSourceLineInfo(Line.Info info) {
-        List<Line.Info> result = new ArrayList<Line.Info>();
-        for (Iterator providers = ProviderService.getProviders(
-                mixerProviderPath).iterator(); providers.hasNext();) {
-            try {
-                MixerProvider pr = (MixerProvider) providers.next();
-                Mixer.Info[] mixinfos = pr.getMixerInfo();
-                for (Mixer.Info mixinfo : mixinfos) {
-                    Mixer mix = pr.getMixer(mixinfo);
-                    Line.Info[] linfos = mix.getSourceLineInfo(info);
-                    for (Line.Info linfo : linfos) {
-                        result.add(linfo);
-                    }
-                }
-            } catch (ClassCastException e) {}
-        }
-        Line.Info[] temp = new Line.Info[result.size()];
-        return result.toArray(temp);
-    }
-
-    public static Line.Info[] getTargetLineInfo(Line.Info info) {
-        List<Line.Info> result = new ArrayList<Line.Info>();
-        for (Iterator providers = ProviderService.getProviders(
-                mixerProviderPath).iterator(); providers.hasNext();) {
-            try {
-                MixerProvider pr = (MixerProvider) providers.next();
-                Mixer.Info[] mixinfos = pr.getMixerInfo();
-                for (Mixer.Info mixinfo : mixinfos) {
-                    Mixer mix = pr.getMixer(mixinfo);
-                    Line.Info[] linfos = mix.getTargetLineInfo(info);
-                    for (Line.Info linfo : linfos) {
-                        result.add(linfo);
-                    }
-                }
-            } catch (ClassCastException e) {}
-        }
-        Line.Info[] temp = new Line.Info[result.size()];
-        return result.toArray(temp);
-    }
-
-    public static boolean isLineSupported(Line.Info info) {
-
-        for (Iterator providers = ProviderService.getProviders(
-                mixerProviderPath).iterator(); providers.hasNext();) {
-            try {
-                MixerProvider pr = (MixerProvider) providers.next();
-                Mixer.Info[] mixinfos = pr.getMixerInfo();
-                for (Mixer.Info mixinfo : mixinfos) {
-                    Mixer mix = pr.getMixer(mixinfo);
-                    if (mix.isLineSupported(info)) {
-                        return true;
-                    }
-                }
-            } catch (ClassCastException e) {}
-        }
-        return false;
-    }
-
-    private static Mixer getMixer(String propVal, Line.Info info,
-            List<?> mixerProviders) {
-
-        int index = propVal.indexOf("#"); //$NON-NLS-1$
-        String className;
-        String mixName;
-        if (index == -1) {
-            className = propVal.trim();
-            mixName = ""; //$NON-NLS-1$
-        } else {
-            className = propVal.substring(0, index).trim();
-            if (index == propVal.length()) {
-                mixName = ""; //$NON-NLS-1$
-            } else {
-                mixName = propVal.substring(index + 1).trim();
-            }
-        }
-        Mixer.Info[] minfos = null;
-        if (!className.equals("")) { //$NON-NLS-1$
-            for (Iterator providers = mixerProviders.iterator(); providers
-                    .hasNext();) {
-                try {
-                    MixerProvider pr = (MixerProvider) (providers.next());
-                    if (className.equals(pr.getClass().getName())) {
-                        minfos = pr.getMixerInfo();
-                        break;
-                    }
-                } catch (ClassCastException e) {}
-            }
-        }
-        if (minfos == null) {
-            minfos = getMixerInfo();
-        }
-
-        if (!mixName.equals("")) { //$NON-NLS-1$
-            for (Mixer.Info minfo : minfos) {
-                if (mixName.equals(minfo.getName())) {
-                    return getMixer(minfo);
-                }
-            }
-        }
-        if (minfos.length > 0) {
-            return getMixer(minfos[0]);
-        }
-        return null;
-    }
-
-    public static Line getLine(Line.Info info) throws LineUnavailableException {
-        String propName = null;
-        Class lineClass = info.getLineClass();
-
-        if (Clip.class.isAssignableFrom(lineClass)) {
-            propName = CLIP;
-        } else if (Port.class.isAssignableFrom(lineClass)) {
-            propName = PORT;
-        } else if (SourceDataLine.class.isAssignableFrom(lineClass)) {
-            propName = SOURCEDATALINE;
-        } else if (TargetDataLine.class.isAssignableFrom(lineClass)) {
-            propName = TARGETDATALINE;
-        }
-        return getLine(propName, info);
-    }
-
-    private static Line getLine(String propName, Line.Info info)
-            throws LineUnavailableException {
-
-        List<?> mixerProviders = ProviderService
-                .getProviders(mixerProviderPath);
-
-        if (propName != null) {
-            String propVal = System.getProperty(propName);
-            if (propVal != null) {
-                Mixer m = getMixer(propVal, info, mixerProviders);
-                if (m != null) {
-                    Line l = m.getLine(info);
-                    if (l != null) {
-                        return l;
-                    }
-                }
-            }
-
-            Properties soundProperties = ProviderService.getSoundProperties();
-            propVal = soundProperties.getProperty(propName);
-            if (propVal != null) {
-                Mixer m = getMixer(propVal, info, mixerProviders);
-                if (m != null) {
-                    Line l = m.getLine(info);
-                    if (l != null) {
-                        return l;
-                    }
-                }
-            }
-        }
-
-        for (Iterator providers = ProviderService.getProviders(
-                mixerProviderPath).iterator(); providers.hasNext();) {
-            try {
-                MixerProvider pr = (MixerProvider) (providers.next());
-                Mixer.Info[] mixinfos = pr.getMixerInfo();
-                for (Mixer.Info mixinfo : mixinfos) {
-                    try {
-                        Mixer mix = pr.getMixer(mixinfo);
-                        return mix.getLine(info);
-                    } catch (IllegalArgumentException e) {
-                        // continue
-                    }
-                }
-            } catch (ClassCastException e) {}
-        }
-        
-        // BEGIN android-added
-        if (CLIP.equals(propName)) {
-            try {
-                return (Clip)(Class.forName("com.android.internal.sound.sampled.AndroidClip").newInstance());
-            } catch (Exception ex) {
-                // Ignore
-            }
-        }
-        // END android-added
-        
-        // sound.11=Could not get line
-        throw new IllegalArgumentException(Messages.getString("sound.11")); //$NON-NLS-1$
-    }
-
-    public static Clip getClip() throws LineUnavailableException {
-        return (Clip) getLine(new Line.Info(Clip.class));
-    }
-
-    public static Clip getClip(Mixer.Info mixerInfo)
-            throws LineUnavailableException {
-        return (Clip) (getMixer(mixerInfo).getLine(new Line.Info(Clip.class)));
-    }
-
-    public static SourceDataLine getSourceDataLine(AudioFormat format)
-            throws LineUnavailableException {
-        SourceDataLine line = (SourceDataLine) getLine(new Line.Info(
-                SourceDataLine.class));
-        line.open(format);
-        return line;
-    }
-
-    public static SourceDataLine getSourceDataLine(AudioFormat format,
-            Mixer.Info mixerinfo) throws LineUnavailableException {
-
-        SourceDataLine line = (SourceDataLine) getMixer(mixerinfo).getLine(
-                new Line.Info(SourceDataLine.class));
-        line.open(format);
-        return line;
-    }
-
-    public static TargetDataLine getTargetDataLine(AudioFormat format)
-            throws LineUnavailableException {
-        TargetDataLine line = (TargetDataLine) getLine(new Line.Info(
-                TargetDataLine.class));
-        line.open(format);
-        return line;
-    }
-
-    public static TargetDataLine getTargetDataLine(AudioFormat format,
-            Mixer.Info mixerinfo) throws LineUnavailableException {
-
-        TargetDataLine line = (TargetDataLine) getMixer(mixerinfo).getLine(
-                new Line.Info(TargetDataLine.class));
-        line.open(format);
-        return line;
-    }
-
-    public static AudioFormat.Encoding[] getTargetEncodings(
-            AudioFormat.Encoding sourceEncoding) {
-
-        List<AudioFormat.Encoding> result = new ArrayList<AudioFormat.Encoding>();
-        for (Iterator providers = ProviderService.getProviders(
-                formatConversionProviderPath).iterator(); providers.hasNext();) {
-            try {
-                FormatConversionProvider pr = (FormatConversionProvider) providers
-                        .next();
-                if (!pr.isSourceEncodingSupported(sourceEncoding)) {
-                    continue;
-                }
-                AudioFormat.Encoding[] encodings = pr.getTargetEncodings();
-                for (AudioFormat.Encoding encoding : encodings) {
-                    result.add(encoding);
-                }
-            } catch (ClassCastException e) {}
-        }
-        AudioFormat.Encoding[] temp = new AudioFormat.Encoding[result.size()];
-        return result.toArray(temp);
-    }
-
-    public static AudioFormat.Encoding[] getTargetEncodings(
-            AudioFormat sourceFormat) {
-
-        List<AudioFormat.Encoding> result = new ArrayList<AudioFormat.Encoding>();
-        for (Iterator providers = ProviderService.getProviders(
-                formatConversionProviderPath).iterator(); providers.hasNext();) {
-            try {
-                AudioFormat.Encoding[] encodings = ((FormatConversionProvider) (providers
-                        .next())).getTargetEncodings(sourceFormat);
-                for (AudioFormat.Encoding encoding : encodings) {
-                    result.add(encoding);
-                }
-            } catch (ClassCastException e) {}
-        }
-        AudioFormat.Encoding[] temp = new AudioFormat.Encoding[result.size()];
-        return result.toArray(temp);
-    }
-
-    public static boolean isConversionSupported(
-            AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat) {
-
-        for (Iterator providers = ProviderService.getProviders(
-                formatConversionProviderPath).iterator(); providers.hasNext();) {
-            if (((FormatConversionProvider) (providers.next()))
-                    .isConversionSupported(targetEncoding, sourceFormat)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public static AudioInputStream getAudioInputStream(
-            AudioFormat.Encoding targetEncoding, AudioInputStream sourceStream) {
-
-        if (sourceStream.getFormat().getEncoding().equals(targetEncoding)) {
-            return sourceStream;
-        }
-        for (Iterator providers = ProviderService.getProviders(
-                formatConversionProviderPath).iterator(); providers.hasNext();) {
-            try {
-                return ((FormatConversionProvider) (providers.next()))
-                        .getAudioInputStream(targetEncoding, sourceStream);
-            } catch (ClassCastException e) {} catch (IllegalArgumentException e) {}
-        }
-        // sound.12=Could not get audio input stream from source stream
-        throw new IllegalArgumentException(Messages.getString("sound.12")); //$NON-NLS-1$
-    }
-
-    public static AudioFormat[] getTargetFormats(
-            AudioFormat.Encoding targetEncoding, AudioFormat sourceFormat) {
-
-        List<AudioFormat> result = new ArrayList<AudioFormat>();
-        for (Iterator providers = ProviderService.getProviders(
-                formatConversionProviderPath).iterator(); providers.hasNext();) {
-            try {
-                AudioFormat[] formats = ((FormatConversionProvider) (providers
-                        .next()))
-                        .getTargetFormats(targetEncoding, sourceFormat);
-                for (AudioFormat format : formats) {
-                    result.add(format);
-                }
-            } catch (ClassCastException e) {}
-        }
-        AudioFormat[] temp = new AudioFormat[result.size()];
-        return result.toArray(temp);
-    }
-
-    public static boolean isConversionSupported(AudioFormat targetFormat,
-            AudioFormat sourceFormat) {
-
-        for (Iterator providers = ProviderService.getProviders(
-                formatConversionProviderPath).iterator(); providers.hasNext();) {
-            if (((FormatConversionProvider) (providers.next()))
-                    .isConversionSupported(targetFormat, sourceFormat)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public static AudioInputStream getAudioInputStream(
-            AudioFormat targetFormat, AudioInputStream sourceStream) {
-
-        if (sourceStream.getFormat().matches(targetFormat)) {
-            return sourceStream;
-        }
-        for (Iterator providers = ProviderService.getProviders(
-                formatConversionProviderPath).iterator(); providers.hasNext();) {
-            try {
-                return ((FormatConversionProvider) (providers.next()))
-                        .getAudioInputStream(targetFormat, sourceStream);
-            } catch (ClassCastException e) {} catch (IllegalArgumentException e) {}
-        }
-        // sound.13=Could not get audio input stream from source stream
-        throw new IllegalArgumentException(Messages.getString("sound.13")); //$NON-NLS-1$
-    }
-
-    public static AudioFileFormat getAudioFileFormat(InputStream stream)
-            throws UnsupportedAudioFileException, IOException {
-
-        for (Iterator providers = ProviderService.getProviders(
-                audioFileReaderPath).iterator(); providers.hasNext();) {
-            try {
-                return ((AudioFileReader) (providers.next()))
-                        .getAudioFileFormat(stream);
-            } catch (ClassCastException e) {} catch (UnsupportedAudioFileException e) {}
-        }
-        // sound.14=File is not a supported file type
-        throw new UnsupportedAudioFileException(Messages.getString("sound.14")); //$NON-NLS-1$
-    }
-
-    public static AudioFileFormat getAudioFileFormat(URL url)
-            throws UnsupportedAudioFileException, IOException {
-
-        for (Iterator providers = ProviderService.getProviders(
-                audioFileReaderPath).iterator(); providers.hasNext();) {
-            try {
-                return ((AudioFileReader) (providers.next()))
-                        .getAudioFileFormat(url);
-            } catch (ClassCastException e) {} catch (UnsupportedAudioFileException e) {}
-        }
-        // sound.14=File is not a supported file type
-        throw new UnsupportedAudioFileException(Messages.getString("sound.14")); //$NON-NLS-1$
-    }
-
-    public static AudioFileFormat getAudioFileFormat(File file)
-            throws UnsupportedAudioFileException, IOException {
-
-        for (Iterator providers = ProviderService.getProviders(
-                audioFileReaderPath).iterator(); providers.hasNext();) {
-            try {
-                return ((AudioFileReader) (providers.next()))
-                        .getAudioFileFormat(file);
-            } catch (ClassCastException e) {} catch (UnsupportedAudioFileException e) {}
-        }
-        // sound.14=File is not a supported file type
-        throw new UnsupportedAudioFileException(Messages.getString("sound.14")); //$NON-NLS-1$
-    }
-
-    public static AudioInputStream getAudioInputStream(InputStream stream)
-            throws UnsupportedAudioFileException, IOException {
-
-        if (stream instanceof AudioInputStream) {
-            return (AudioInputStream) stream;
-        }
-        for (Iterator providers = ProviderService.getProviders(
-                audioFileReaderPath).iterator(); providers.hasNext();) {
-            try {
-                return ((AudioFileReader) (providers.next()))
-                        .getAudioInputStream(stream);
-            } catch (ClassCastException e) {} catch (UnsupportedAudioFileException e) {}
-        }
-        // BEGIN android-added
-        try {
-            AudioFileReader reader = (AudioFileReader)(Class.forName("com.android.internal.sound.sampled.AndroidAudioFileReader").newInstance());
-            return reader.getAudioInputStream(stream);
-        } catch (Exception ex) {
-            // Ignore
-        }
-        // END android-added
-        // sound.15=Could not get audio input stream from input stream
-        throw new UnsupportedAudioFileException(Messages.getString("sound.15")); //$NON-NLS-1$
-    }
-
-    public static AudioInputStream getAudioInputStream(URL url)
-            throws UnsupportedAudioFileException, IOException {
-
-        for (Iterator providers = ProviderService.getProviders(
-                audioFileReaderPath).iterator(); providers.hasNext();) {
-            try {
-                return ((AudioFileReader) (providers.next()))
-                        .getAudioInputStream(url);
-            } catch (ClassCastException e) {} catch (UnsupportedAudioFileException e) {}
-        }
-        // BEGIN android-added
-        try {
-            AudioFileReader reader = (AudioFileReader)(Class.forName("com.android.internal.sound.sampled.AndroidAudioFileReader").newInstance());
-            return reader.getAudioInputStream(url);
-        } catch (Exception ex) {
-            // Ignore
-        }
-        // END android-added
-        // sound.16=Could not get audio input stream from input URL
-        throw new UnsupportedAudioFileException(Messages.getString("sound.16")); //$NON-NLS-1$
-    }
-
-    public static AudioInputStream getAudioInputStream(File file)
-            throws UnsupportedAudioFileException, IOException {
-
-        for (Iterator providers = ProviderService.getProviders(
-                audioFileReaderPath).iterator(); providers.hasNext();) {
-            try {
-                return ((AudioFileReader) (providers.next()))
-                        .getAudioInputStream(file);
-            } catch (ClassCastException e) {} catch (UnsupportedAudioFileException e) {}
-        }
-        // BEGIN android-added
-        try {
-            AudioFileReader reader = (AudioFileReader)(Class.forName("com.android.internal.sound.sampled.AndroidAudioFileReader").newInstance());
-            return reader.getAudioInputStream(file);
-        } catch (Exception ex) {
-            // Ignore
-        }
-        // END android-added
-        // sound.17=Could not get audio input stream from input file
-        throw new UnsupportedAudioFileException(Messages.getString("sound.17")); //$NON-NLS-1$
-    }
-
-    public static AudioFileFormat.Type[] getAudioFileTypes() {
-        List<AudioFileFormat.Type> result = new ArrayList<AudioFileFormat.Type>();
-        for (Iterator providers = ProviderService.getProviders(
-                audioFileWriterPath).iterator(); providers.hasNext();) {
-            try {
-                AudioFileFormat.Type[] types = ((AudioFileWriter) (providers
-                        .next())).getAudioFileTypes();
-                for (AudioFileFormat.Type type : types) {
-                    result.add(type);
-                }
-            } catch (ClassCastException e) {}
-        }
-        AudioFileFormat.Type[] temp = new AudioFileFormat.Type[result.size()];
-        return result.toArray(temp);
-    }
-
-    public static boolean isFileTypeSupported(AudioFileFormat.Type fileType) {
-
-        for (Iterator providers = ProviderService.getProviders(
-                audioFileWriterPath).iterator(); providers.hasNext();) {
-            if (((AudioFileWriter) (providers.next()))
-                    .isFileTypeSupported(fileType)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public static AudioFileFormat.Type[] getAudioFileTypes(
-            AudioInputStream stream) {
-        List<AudioFileFormat.Type> result = new ArrayList<AudioFileFormat.Type>();
-        for (Iterator providers = ProviderService.getProviders(
-                audioFileWriterPath).iterator(); providers.hasNext();) {
-            try {
-                AudioFileFormat.Type[] types = ((AudioFileWriter) (providers
-                        .next())).getAudioFileTypes(stream);
-                for (AudioFileFormat.Type type : types) {
-                    result.add(type);
-                }
-            } catch (ClassCastException e) {}
-        }
-        AudioFileFormat.Type[] temp = new AudioFileFormat.Type[result.size()];
-        return result.toArray(temp);
-    }
-
-    public static boolean isFileTypeSupported(AudioFileFormat.Type fileType,
-            AudioInputStream stream) {
-
-        for (Iterator providers = ProviderService.getProviders(
-                audioFileWriterPath).iterator(); providers.hasNext();) {
-            if (((AudioFileWriter) (providers.next())).isFileTypeSupported(
-                    fileType, stream)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public static int write(AudioInputStream stream,
-            AudioFileFormat.Type fileType, OutputStream out) throws IOException {
-        AudioFileWriter writer;
-        for (Iterator providers = ProviderService.getProviders(
-                audioFileWriterPath).iterator(); providers.hasNext();) {
-            writer = (AudioFileWriter) (providers.next());
-            if (writer.isFileTypeSupported(fileType, stream)) {
-                return writer.write(stream, fileType, out);
-            }
-        }
-        // sound.18=Type is not supported
-        throw new IllegalArgumentException(Messages.getString("sound.18")); //$NON-NLS-1$
-    }
-
-    public static int write(AudioInputStream stream,
-            AudioFileFormat.Type fileType, File out) throws IOException {
-        AudioFileWriter writer;
-        for (Iterator providers = ProviderService.getProviders(
-                audioFileWriterPath).iterator(); providers.hasNext();) {
-            writer = (AudioFileWriter) (providers.next());
-            if (writer.isFileTypeSupported(fileType, stream)) {
-                return writer.write(stream, fileType, out);
-            }
-        }
-        // sound.18=Type is not supported
-        throw new IllegalArgumentException(Messages.getString("sound.18")); //$NON-NLS-1$
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/BooleanControl.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/BooleanControl.java
deleted file mode 100644
index 5ab87fb..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/BooleanControl.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-public abstract class BooleanControl extends Control {
-
-    public static class Type extends Control.Type {
-        public static final Type APPLY_REVERB = new Type("Apply Reverb"); //$NON-NLS-1$
-
-        public static final Type MUTE = new Type("Mute"); //$NON-NLS-1$
-
-        protected Type(String name) {
-            super(name);
-        }
-    }
-
-    private boolean value;
-
-    private String trueStateLabel;
-
-    private String falseStateLabel;
-
-    protected BooleanControl(BooleanControl.Type type, boolean initialValue,
-            String trueStateLabel, String falseStateLabel) {
-        super(type);
-        this.value = initialValue;
-        this.trueStateLabel = trueStateLabel;
-        this.falseStateLabel = falseStateLabel;
-    }
-
-    protected BooleanControl(BooleanControl.Type type, boolean initialValue) {
-        this(type, initialValue, "true", "false"); //$NON-NLS-1$ //$NON-NLS-2$
-    }
-
-    public void setValue(boolean value) {
-        this.value = value;
-    }
-
-    public boolean getValue() {
-        return this.value;
-    }
-
-    public String getStateLabel(boolean state) {
-        if (state) {
-            return this.trueStateLabel;
-        } else {
-            return this.falseStateLabel;
-        }
-    }
-
-    public String toString() {
-        return getType() + " Control with current value: " + getStateLabel(value); //$NON-NLS-1$
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/Clip.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/Clip.java
deleted file mode 100644
index 0e65b59..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/Clip.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-import java.io.IOException;
-
-public interface Clip extends DataLine {
-    static final int LOOP_CONTINUOUSLY = -1;
-
-    int getFrameLength();
-
-    long getMicrosecondLength();
-
-    void loop(int count);
-
-    void open(AudioFormat format, byte[] data, int offset, int bufferSize)
-            throws LineUnavailableException;
-
-    void open(AudioInputStream stream) throws LineUnavailableException,
-            IOException;
-
-    void setFramePosition(int frames);
-
-    void setLoopPoints(int start, int end);
-
-    void setMicrosecondPosition(long microseconds);
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/CompoundControl.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/CompoundControl.java
deleted file mode 100644
index 5862761..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/CompoundControl.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-public abstract class CompoundControl extends Control {
-    public static class Type extends Control.Type {
-        protected Type(String name) {
-            super(name);
-        }
-    }
-
-    private Control[] memberControls;
-
-    protected CompoundControl(CompoundControl.Type type,
-            Control[] memberControls) {
-        super(type);
-        this.memberControls = memberControls;
-    }
-
-    public Control[] getMemberControls() {
-        return this.memberControls;
-    }
-
-    public String toString() {
-        return getType() + "CompoundControl containing "  //$NON-NLS-1$
-            + String.valueOf(memberControls) + " Controls."; //$NON-NLS-1$
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/Control.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/Control.java
deleted file mode 100644
index b6128e8..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/Control.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-public abstract class Control {
-
-    public static class Type {
-
-        private String name;
-
-        public Type(String name) {
-            this.name = name;
-        }
-
-        @Override
-        public boolean equals(Object another) {
-            if (this == another) {
-                return true;
-            }
-
-            if (another == null || !(another instanceof Type)) {
-                return false;
-            }
-
-            Type obj = (Type) another;
-            return name == null ? obj.name == null : name.equals(obj.name);
-        }
-
-        @Override
-        public final int hashCode() {
-            return name == null ? 0 : name.hashCode();
-        }
-
-        @Override
-        public final String toString() {
-            return name;
-        }
-    }
-
-    private Type type;
-
-    protected Control(Type type) {
-        this.type = type;
-    }
-
-    public Type getType() {
-        return type;
-    }
-
-    public String toString() {
-        return type + " Control"; //$NON-NLS-1$
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/DataLine.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/DataLine.java
deleted file mode 100644
index e37ea3f..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/DataLine.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-public interface DataLine extends Line {
-
-    class Info extends Line.Info {
-        private AudioFormat[] formats;
-        private int minBufferSize;
-        private int maxBufferSize;
-        
-        public Info(Class <?> lineClass, AudioFormat format) {
-            super(lineClass);
-
-            this.formats = new AudioFormat[] { format };
-            this.minBufferSize = AudioSystem.NOT_SPECIFIED;
-            this.maxBufferSize = AudioSystem.NOT_SPECIFIED;
-        }
-
-        public Info(Class <?> lineClass, AudioFormat[] formats, int minBufferSize, int maxBufferSize) {
-            super(lineClass);
-
-            this.formats = formats;
-            this.minBufferSize = minBufferSize;
-            this.maxBufferSize = maxBufferSize;
-        }
-
-        public Info(Class <?> lineClass, AudioFormat format, int bufferSize) {
-            super(lineClass);
-
-            this.formats = new AudioFormat[] { format };
-            this.minBufferSize = bufferSize;
-            this.maxBufferSize = bufferSize;
-        }
-
-        public AudioFormat[] getFormats(){
-            return formats;
-        }
-        
-        public boolean isFormatSupported(AudioFormat format) {
-            if (formats == null) {
-                return false;
-            }
-            for (AudioFormat supported : formats) {
-                if (format.matches(supported)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        public int getMinBufferSize() {
-            return minBufferSize;
-        }
-
-        public int getMaxBufferSize() {
-            return maxBufferSize;
-        }
-
-        @Override
-        public boolean matches(Line.Info info) {
-            
-            if (!super.matches(info)) {
-                return false;
-            }
-            
-            DataLine.Info inf = (DataLine.Info)info;
-            if ((minBufferSize != AudioSystem.NOT_SPECIFIED
-                    && inf.getMinBufferSize() != AudioSystem.NOT_SPECIFIED 
-                    && minBufferSize < inf.getMinBufferSize())
-                    || (maxBufferSize != AudioSystem.NOT_SPECIFIED
-                            && inf.getMaxBufferSize() != AudioSystem.NOT_SPECIFIED
-                            && maxBufferSize > inf.getMaxBufferSize())) {
-                return false;
-            }
-            
-            for (AudioFormat supported : formats) {
-                if (!inf.isFormatSupported(supported)) {
-                    return false;
-                }
-            }
-
-            return true;
-        }
-        
-        @Override
-        public String toString() {
-            String formatStr = (formats.length == 1? "format " + formats[0].toString() //$NON-NLS-1$
-                    : formats.length + " audio formats"); //$NON-NLS-1$
-            String bufStr = ""; //$NON-NLS-1$
-            if (minBufferSize != AudioSystem.NOT_SPECIFIED) {
-                bufStr = "and buffers of " + minBufferSize + //$NON-NLS-1$
-                    " to " + maxBufferSize + " bytes"; //$NON-NLS-1$ //$NON-NLS-2$
-            }
-            return getLineClass() + " supporting " + formatStr + ", " + bufStr; //$NON-NLS-1$
-        }
-    }
-
-    int available();
-
-    void drain();
-
-    void flush();
-    
-    int getBufferSize();
-    
-    AudioFormat getFormat();
-    
-    int getFramePosition();
-    
-    float getLevel();
-    
-    long getLongFramePosition();
-    
-    long getMicrosecondPosition();
-    
-    boolean isActive();
-    
-    boolean isRunning();
-    
-    void start();
-    
-    void stop();
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/EnumControl.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/EnumControl.java
deleted file mode 100644
index a21a4cc..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/EnumControl.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-import org.apache.harmony.sound.internal.nls.Messages;
-
-public abstract class EnumControl extends Control {
-    public static class Type extends Control.Type {
-        public static final Type REVERB = new Type("Reverb"); //$NON-NLS-1$
-
-        protected Type(String name) {
-            super(name);
-        }
-    }
-
-    private Object[] values;
-
-    private Object value;
-
-    protected EnumControl(EnumControl.Type type, Object[] values, Object value) {
-        super(type);
-        this.value = value;
-        this.values = values;
-    }
-
-    public void setValue(Object value) {
-        for (Object val : values) {
-            if (val.equals(value)) {
-                this.value = value;
-                return;
-            }
-        }
-        // sound.0D=The value is not supported
-        throw new IllegalArgumentException(Messages.getString("sound.0D")); //$NON-NLS-1$
-    }
-
-    public Object getValue() {
-        return value;
-    }
-
-    public Object[] getValues() {
-        return values;
-    }
-
-    public String toString() {
-        return getType() + " with current value: " + value; //$NON-NLS-1$
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/FloatControl.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/FloatControl.java
deleted file mode 100644
index 6bf92be..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/FloatControl.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-import org.apache.harmony.sound.internal.nls.Messages;
-
-public abstract class FloatControl extends Control {
-
-    public static class Type extends Control.Type {
-        public static final Type MASTER_GAIN = new Type("Master Gain"); //$NON-NLS-1$
-
-        public static final Type AUX_SEND = new Type("AUX Send"); //$NON-NLS-1$
-
-        public static final Type AUX_RETURN = new Type("AUX Return"); //$NON-NLS-1$
-
-        public static final Type REVERB_SEND = new Type("Reverb Send"); //$NON-NLS-1$
-
-        public static final Type REVERB_RETURN = new Type("Reverb Return"); //$NON-NLS-1$
-
-        public static final Type VOLUME = new Type("Volume"); //$NON-NLS-1$
-
-        public static final Type PAN = new Type("Pan"); //$NON-NLS-1$
-
-        public static final Type BALANCE = new Type("Balance"); //$NON-NLS-1$
-
-        public static final Type SAMPLE_RATE = new Type("Sample Rate"); //$NON-NLS-1$
-
-        protected Type(String name) {
-            super(name);
-        }
-    }
-
-    private float value;
-
-    private float maximum;
-
-    private float minimum;
-
-    private String units;
-
-    private String minLabel;
-
-    private String midLabel;
-
-    private String maxLabel;
-
-    private float precision;
-
-    private int updatePeriod;
-
-    protected FloatControl(FloatControl.Type type, float minimum,
-            float maximum, float precision, int updatePeriod,
-            float initialValue, String units, String minLabel, String midLabel,
-            String maxLabel) {
-        super(type);
-        this.maximum = maximum;
-        this.maxLabel = maxLabel;
-        this.midLabel = midLabel;
-        this.minLabel = minLabel;
-        this.minimum = minimum;
-        this.precision = precision;
-        this.units = units;
-        this.updatePeriod = updatePeriod;
-        this.value = initialValue;
-    }
-
-    protected FloatControl(FloatControl.Type type, float minimum,
-            float maximum, float precision, int updatePeriod,
-            float initialValue, String units) {
-        this(type, minimum, maximum, precision, updatePeriod, initialValue,
-                units, "", "", ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-    }
-
-    public void setValue(float newValue) {
-        if (newValue > maximum || newValue < minimum) {
-            // sound.0F=value does not fall within the allowable range
-            throw new IllegalArgumentException(Messages.getString("sound.0F")); //$NON-NLS-1$
-        }
-        this.value = newValue;
-    }
-
-    public float getValue() {
-        return this.value;
-    }
-
-    public float getMaximum() {
-        return this.maximum;
-    }
-
-    public float getMinimum() {
-        return this.minimum;
-    }
-
-    public String getUnits() {
-        return this.units;
-    }
-
-    public String getMinLabel() {
-        return this.minLabel;
-    }
-
-    public String getMidLabel() {
-        return this.midLabel;
-    }
-
-    public String getMaxLabel() {
-        return this.maxLabel;
-    }
-
-    public float getPrecision() {
-        return this.precision;
-    }
-
-    public int getUpdatePeriod() {
-        return this.updatePeriod;
-    }
-
-    public void shift(float from, float to, int microseconds) {
-        setValue(to);
-    }
-
-    public String toString() {
-        return getType() + " with current value: "+ value + " " + units  //$NON-NLS-1$ //$NON-NLS-2$
-            + " (range: " + minimum + " - " + maximum + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-    }
-
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/Line.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/Line.java
deleted file mode 100644
index decc68d..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/Line.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-public interface Line {
-
-    class Info {
-        private Class <?> lineClass;
-        
-        public Info(Class <?> lineClass) {
-            this.lineClass = lineClass;
-        }
-
-        public Class <?> getLineClass( ){
-            return lineClass;
-        }
-
-        public boolean matches(Line.Info info) {
-            return lineClass.isAssignableFrom(info.getLineClass());
-        }
-        
-        @Override
-        public String toString() {
-            return lineClass.toString();
-        }
-    }
-
-    void addLineListener(LineListener listener);
-
-    void close();
-
-    Control getControl(Control.Type control);
-
-    Control[] getControls();
-
-    Line.Info getLineInfo();
-
-    boolean isControlSupported(Control.Type control);
-
-    boolean isOpen();
-
-    void open() throws LineUnavailableException;
-
-    void removeLineListener(LineListener listener);
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/LineEvent.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/LineEvent.java
deleted file mode 100644
index 95a480a..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/LineEvent.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-import java.util.EventObject;
-
-public class LineEvent extends EventObject {
-
-    /**
-     * 
-     */
-    private static final long serialVersionUID = -1274246333383880410L;
-    
-    private LineEvent.Type type;
-    private long position;
-
-    public static class Type {
-
-        public static final Type CLOSE = new Type("Close"); //$NON-NLS-1$
-
-        public static final Type OPEN = new Type("Open"); //$NON-NLS-1$
-
-        public static final Type START = new Type("Start"); //$NON-NLS-1$
-
-        public static final Type STOP = new Type("Stop"); //$NON-NLS-1$
-
-        private String name;
-
-        public Type(String name) {
-            this.name = name;
-        }
-
-        @Override
-        public boolean equals(Object another) {
-            if (this == another) {
-                return true;
-            }
-
-            if (another == null || !(another instanceof Type)) {
-                return false;
-            }
-
-            Type obj = (Type) another;
-            return name == null ? obj.name == null : name.equals(obj.name);
-        }
-
-        @Override
-        public final int hashCode() {
-            return name == null ? 0 : name.hashCode();
-        }
-
-        @Override
-        public String toString() {
-            return name;
-        }
-    }
-
-    public LineEvent(Line line, LineEvent.Type type, long position) {
-        super(line);
-        this.type = type;
-        this.position = position;
-    }
-    
-    public final Line getLine() {
-        return (Line)getSource();
-    }
-    
-    public final LineEvent.Type getType() {
-        return type;
-    }
-    
-    public final long getFramePosition() {
-        return position;
-    }
-    
-    public String toString() {
-        return type + " event from line " + getLine(); //$NON-NLS-1$
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/LineListener.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/LineListener.java
deleted file mode 100644
index a3a828f..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/LineListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-import java.util.EventListener;
-
-public interface LineListener extends EventListener {
-    void update(LineEvent event);
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/LineUnavailableException.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/LineUnavailableException.java
deleted file mode 100644
index 5a687ed..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/LineUnavailableException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-public class LineUnavailableException extends Exception {
-    private static final long serialVersionUID = -2046718279487432130L;
-
-    public LineUnavailableException() {
-        super();
-    }
-
-    public LineUnavailableException(String message) {
-        super(message);
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/Mixer.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/Mixer.java
deleted file mode 100644
index f9fefda..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/Mixer.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-public interface Mixer extends Line {
-
-    public static class Info {
-        private String name;
-        private String vendor;
-        private String description;
-        private String version;        
-        
-        protected Info(String name, String vendor, String description, String version) {
-            this.name = name;
-            this.vendor = vendor;
-            this.description = description;
-            this.version = version;
-        }
-        
-        @Override
-        public final boolean equals(Object another) {
-            return this == another;
-        }
-        
-        public final String getDescription() {
-            return description;
-        }
-        
-        public final String getName() {
-            return name;
-        }
-        
-        public final String getVendor() {
-            return vendor;
-        }
-        
-        public final String getVersion() {
-            return version;
-        }
-        
-        @Override
-        public final int hashCode() {
-            return name.hashCode() + vendor.hashCode() + description.hashCode() + version.hashCode();
-        }
-        
-        @Override
-        public final String toString() {
-            return name + ", version " + version; //$NON-NLS-1$
-        }
-    }
-
-    Line getLine(Line.Info info) throws LineUnavailableException;
-    
-    int getMaxLines(Line.Info info);
-    
-    Mixer.Info getMixerInfo();
-    
-    Line.Info[] getSourceLineInfo();
-    
-    Line.Info[] getSourceLineInfo(Line.Info info);
-    
-    Line[] getSourceLines();
-    
-    Line.Info[] getTargetLineInfo();
-    
-    Line.Info[] getTargetLineInfo(Line.Info info);
-    
-    Line[] getTargetLines();
-    
-    boolean isLineSupported(Line.Info info);
-    
-    boolean isSynchronizationSupported(Line[] lines, boolean maintainSync);
-    
-    void synchronize(Line[] lines, boolean maintainSync);
-
-    void unsynchronize(Line[] lines);
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/Port.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/Port.java
deleted file mode 100644
index 68d0638..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/Port.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-public interface Port extends Line {
-
-    public static class Info extends Line.Info {
-
-        private String name;
-
-        private boolean isSource;
-
-        public static final Info MICROPHONE = new Info(Port.class,
-                "MICROPHONE", true); //$NON-NLS-1$
-
-        public static final Info LINE_IN = new Info(Port.class, "LINE_IN", true); //$NON-NLS-1$
-
-        public static final Info COMPACT_DISC = new Info(Port.class,
-                "COMPACT_DISC", true); //$NON-NLS-1$
-
-        public static final Info SPEAKER = new Info(Port.class, "SPEAKER", //$NON-NLS-1$
-                false);
-
-        public static final Info HEADPHONE = new Info(Port.class, "HEADPHONES", //$NON-NLS-1$
-                false);
-
-        public static final Info LINE_OUT = new Info(Port.class, "LINE_OUT", //$NON-NLS-1$
-                false);
-
-        public Info(Class<?> lineClass, String name, boolean isSource) {
-            super(lineClass);
-            this.name = name;
-            this.isSource = isSource;
-        }
-
-        public String getName() {
-            return this.name;
-        }
-
-        public boolean isSource() {
-            return this.isSource;
-        }
-
-        public boolean matches(Line.Info info) {
-            if (super.matches(info) && Port.Info.class.equals(info.getClass())
-                    && name.equals(((Port.Info) info).getName())
-                    && isSource == ((Port.Info) info).isSource()) {
-                return true;
-            }
-            return false;
-        }
-
-        public final boolean equals(Object obj) {
-            return this == obj;
-        }
-
-        public final int hashCode() {
-            return name.hashCode() ^ getLineClass().hashCode();
-        }
-
-        public final String toString() {
-            return name + (isSource ? " source port" : " target port"); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/ReverbType.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/ReverbType.java
deleted file mode 100644
index 9645ba6..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/ReverbType.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-public class ReverbType {
-
-    protected ReverbType(String name, int earlyReflectionDelay,
-            float earlyReflectionIntensity, int lateReflectionDelay,
-            float lateReflectionIntensity, int decayTime) {
-        this.name = name;
-        this.earlyReflectionDelay = earlyReflectionDelay;
-        this.earlyReflectionIntensity = earlyReflectionIntensity;
-        this.lateReflectionDelay = lateReflectionDelay;
-        this.lateReflectionIntensity = lateReflectionIntensity;
-        this.decayTime = decayTime;
-    }
-
-    private String name;
-
-    private int earlyReflectionDelay;
-
-    private float earlyReflectionIntensity;
-
-    private int lateReflectionDelay;
-
-    private float lateReflectionIntensity;
-
-    private int decayTime;
-
-    public String getName() {
-        return this.name;
-    }
-
-    public final int getEarlyReflectionDelay() {
-        return this.earlyReflectionDelay;
-    }
-
-    public final float getEarlyReflectionIntensity() {
-        return this.earlyReflectionIntensity;
-    }
-
-    public final int getLateReflectionDelay() {
-        return this.lateReflectionDelay;
-    }
-
-    public final float getLateReflectionIntensity() {
-        return this.lateReflectionIntensity;
-    }
-
-    public final int getDecayTime() {
-        return this.decayTime;
-    }
-
-    public final boolean equals(Object obj) {
-        return this == obj;
-    }
-
-    public final int hashCode() {
-        return toString().hashCode();
-    }
-
-    public final String toString() {
-        return name + ", early reflection delay " + earlyReflectionDelay //$NON-NLS-1$
-                + " ns, early reflection intensity " + earlyReflectionIntensity //$NON-NLS-1$
-                + " dB, late deflection delay " + lateReflectionDelay //$NON-NLS-1$
-                + " ns, late reflection intensity " + lateReflectionIntensity //$NON-NLS-1$
-                + " dB, decay time " + decayTime; //$NON-NLS-1$
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/SourceDataLine.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/SourceDataLine.java
deleted file mode 100644
index 4d68221..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/SourceDataLine.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-public interface SourceDataLine extends DataLine {
-    
-    void open(AudioFormat format) throws LineUnavailableException;
-
-    void open(AudioFormat format, int bufferSize)
-            throws LineUnavailableException;
-
-    int write(byte[] b, int off, int len);
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/TargetDataLine.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/TargetDataLine.java
deleted file mode 100644
index f4c37c8..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/TargetDataLine.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-public interface TargetDataLine extends DataLine {
-
-    void open(AudioFormat format) throws LineUnavailableException;
-
-    void open(AudioFormat format, int bufferSize)
-            throws LineUnavailableException;
-
-    int read(byte[] b, int off, int len);
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/UnsupportedAudioFileException.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/UnsupportedAudioFileException.java
deleted file mode 100644
index 590266f..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/UnsupportedAudioFileException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled;
-
-public class UnsupportedAudioFileException extends Exception {
-    private static final long serialVersionUID = -139127412623160368L;
-
-    public UnsupportedAudioFileException() {
-        super();
-    }
-
-    public UnsupportedAudioFileException(String message) {
-        super(message);
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/spi/AudioFileReader.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/spi/AudioFileReader.java
deleted file mode 100644
index 5c01df5..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/spi/AudioFileReader.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled.spi;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-import javax.sound.sampled.AudioFileFormat;
-import javax.sound.sampled.AudioInputStream;
-import javax.sound.sampled.UnsupportedAudioFileException;
-
-public abstract class AudioFileReader {
-
-    public abstract AudioFileFormat getAudioFileFormat(File file)
-            throws UnsupportedAudioFileException, IOException;
-
-    public abstract AudioFileFormat getAudioFileFormat(InputStream stream)
-            throws UnsupportedAudioFileException, IOException;
-
-    public abstract AudioFileFormat getAudioFileFormat(URL url)
-            throws UnsupportedAudioFileException, IOException;
-
-    public abstract AudioInputStream getAudioInputStream(File file)
-            throws UnsupportedAudioFileException, IOException;
-
-    public abstract AudioInputStream getAudioInputStream(InputStream stream)
-            throws UnsupportedAudioFileException, IOException;
-
-    public abstract AudioInputStream getAudioInputStream(URL url)
-            throws UnsupportedAudioFileException, IOException;
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/spi/AudioFileWriter.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/spi/AudioFileWriter.java
deleted file mode 100644
index 0bae3f3..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/spi/AudioFileWriter.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled.spi;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStream;
-
-import javax.sound.sampled.AudioInputStream;
-import javax.sound.sampled.AudioFileFormat;
-import javax.sound.sampled.AudioFileFormat.Type;
-
-public abstract class AudioFileWriter {
-
-    public abstract AudioFileFormat.Type[] getAudioFileTypes();
-
-    public abstract AudioFileFormat.Type[] getAudioFileTypes(AudioInputStream stream);
-
-    public boolean isFileTypeSupported(AudioFileFormat.Type fileType) {
-        AudioFileFormat.Type[] supported = getAudioFileTypes();
-        for (Type element : supported) {
-            if (fileType.equals(element)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public boolean isFileTypeSupported(AudioFileFormat.Type fileType, AudioInputStream stream) {
-        AudioFileFormat.Type[] supported = getAudioFileTypes(stream);
-        for (Type element : supported) {
-            if (fileType.equals(element)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public abstract int write(AudioInputStream stream,
-            AudioFileFormat.Type fileType, File out) throws IOException;
-
-    public abstract int write(AudioInputStream stream,
-            AudioFileFormat.Type fileType, OutputStream out) throws IOException;
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/spi/FormatConversionProvider.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/spi/FormatConversionProvider.java
deleted file mode 100644
index ed0d69f..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/spi/FormatConversionProvider.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled.spi;
-
-import javax.sound.sampled.AudioFormat;
-import javax.sound.sampled.AudioInputStream;
-import javax.sound.sampled.AudioFormat.Encoding;
-
-public abstract class FormatConversionProvider {
-
-    public abstract AudioInputStream getAudioInputStream(
-            AudioFormat.Encoding targetEncoding, AudioInputStream sourceStream);
-
-    public abstract AudioInputStream getAudioInputStream(
-            AudioFormat targetFormat, AudioInputStream sourceStream);
-
-    public abstract AudioFormat.Encoding[] getTargetEncodings(
-            AudioFormat sourceFormat);
-
-    public boolean isConversionSupported(AudioFormat.Encoding targetEncoding,
-            AudioFormat sourceFormat) {
-        AudioFormat.Encoding[] encodings = getTargetEncodings(sourceFormat);
-        for (Encoding element : encodings) {
-            if (targetEncoding.equals(element)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public abstract AudioFormat[] getTargetFormats(
-            AudioFormat.Encoding targetFormat, AudioFormat sourceFormat);
-
-    public boolean isConversionSupported(AudioFormat targetFormat,
-            AudioFormat sourceFormat) {
-        AudioFormat[] formats = getTargetFormats(targetFormat.getEncoding(),
-                sourceFormat);
-        for (AudioFormat element : formats) {
-            if (targetFormat.equals(element)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public abstract AudioFormat.Encoding[] getSourceEncodings();
-
-    public boolean isSourceEncodingSupported(AudioFormat.Encoding sourceEncoding) {
-        AudioFormat.Encoding[] encodings = getSourceEncodings();
-        for (Encoding element : encodings) {
-            if (sourceEncoding.equals(element)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    public abstract AudioFormat.Encoding[] getTargetEncodings();
-
-    public boolean isTargetEncodingSupported(AudioFormat.Encoding targetEncoding) {
-        AudioFormat.Encoding[] encodings = getTargetEncodings();
-        for (Encoding element : encodings) {
-            if (targetEncoding.equals(element)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-}
diff --git a/libcore-disabled/sound/src/main/java/javax/sound/sampled/spi/MixerProvider.java b/libcore-disabled/sound/src/main/java/javax/sound/sampled/spi/MixerProvider.java
deleted file mode 100644
index 86fdbb7..0000000
--- a/libcore-disabled/sound/src/main/java/javax/sound/sampled/spi/MixerProvider.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.sound.sampled.spi;
-
-import javax.sound.sampled.Mixer;
-import javax.sound.sampled.Mixer.Info;
-
-public abstract class MixerProvider {
-
-    public abstract Mixer getMixer(Mixer.Info info);
-
-    public abstract Mixer.Info[] getMixerInfo();
-
-    public boolean isMixerSupported(Mixer.Info info) {
-        Mixer.Info[] devices = getMixerInfo();
-        for (Info element : devices) {
-            if (info.equals(element)) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/org/apache/harmony/sound/internal/nls/Messages.java b/libcore-disabled/sound/src/main/java/org/apache/harmony/sound/internal/nls/Messages.java
deleted file mode 100644
index 65ecb83..0000000
--- a/libcore-disabled/sound/src/main/java/org/apache/harmony/sound/internal/nls/Messages.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/* 
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * 
- *     http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * THE FILE HAS BEEN AUTOGENERATED BY MSGTOOL TOOL.
- * All changes made to this file manually will be overwritten 
- * if this tool runs again. Better make changes in the template file.
- */
-
-package org.apache.harmony.sound.internal.nls;
-
-import org.apache.harmony.luni.util.MsgHelp;
-
-/**
- * This class retrieves strings from a resource bundle and returns them,
- * formatting them with MessageFormat when required.
- * <p>
- * It is used by the system classes to provide national language support, by
- * looking up messages in the <code>
- *    org.apache.harmony.sound.internal.nls.messages
- * </code>
- * resource bundle. Note that if this file is not available, or an invalid key
- * is looked up, or resource bundle support is not available, the key itself
- * will be returned as the associated message. This means that the <em>KEY</em>
- * should a reasonable human-readable (english) string.
- * 
- */
-public class Messages {
-
-    private static final String sResource =
-        "org.apache.harmony.sound.internal.nls.messages"; //$NON-NLS-1$
-
-    /**
-     * Retrieves a message which has no arguments.
-     * 
-     * @param msg
-     *            String the key to look up.
-     * @return String the message for that key in the system message bundle.
-     */
-    static public String getString(String msg) {
-        return MsgHelp.getString(sResource, msg);
-    }
-
-    /**
-     * Retrieves a message which takes 1 argument.
-     * 
-     * @param msg
-     *            String the key to look up.
-     * @param arg
-     *            Object the object to insert in the formatted output.
-     * @return String the message for that key in the system message bundle.
-     */
-    static public String getString(String msg, Object arg) {
-        return getString(msg, new Object[] { arg });
-    }
-
-    /**
-     * Retrieves a message which takes 1 integer argument.
-     * 
-     * @param msg
-     *            String the key to look up.
-     * @param arg
-     *            int the integer to insert in the formatted output.
-     * @return String the message for that key in the system message bundle.
-     */
-    static public String getString(String msg, int arg) {
-        return getString(msg, new Object[] { Integer.toString(arg) });
-    }
-
-    /**
-     * Retrieves a message which takes 1 character argument.
-     * 
-     * @param msg
-     *            String the key to look up.
-     * @param arg
-     *            char the character to insert in the formatted output.
-     * @return String the message for that key in the system message bundle.
-     */
-    static public String getString(String msg, char arg) {
-        return getString(msg, new Object[] { String.valueOf(arg) });
-    }
-
-    /**
-     * Retrieves a message which takes 2 arguments.
-     * 
-     * @param msg
-     *            String the key to look up.
-     * @param arg1
-     *            Object an object to insert in the formatted output.
-     * @param arg2
-     *            Object another object to insert in the formatted output.
-     * @return String the message for that key in the system message bundle.
-     */
-    static public String getString(String msg, Object arg1, Object arg2) {
-        return getString(msg, new Object[] { arg1, arg2 });
-    }
-
-    /**
-     * Retrieves a message which takes several arguments.
-     * 
-     * @param msg
-     *            String the key to look up.
-     * @param args
-     *            Object[] the objects to insert in the formatted output.
-     * @return String the message for that key in the system message bundle.
-     */
-    static public String getString(String msg, Object[] args) {
-        return MsgHelp.getString(sResource, msg, args);
-    }
-}
diff --git a/libcore-disabled/sound/src/main/java/org/apache/harmony/sound/internal/nls/messages.properties b/libcore-disabled/sound/src/main/java/org/apache/harmony/sound/internal/nls/messages.properties
deleted file mode 100644
index efcf80b..0000000
--- a/libcore-disabled/sound/src/main/java/org/apache/harmony/sound/internal/nls/messages.properties
+++ /dev/null
@@ -1,39 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#  
-#      http://www.apache.org/licenses/LICENSE-2.0
-#  
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-# 
-
-# messages for EN locale
-sound.01=-1
-sound.02=Index: {0}, Size: {1}
-sound.03=length out of bounds: {0}
-sound.04=Invalid status byte: {0}
-sound.05=command out of range: {0}
-sound.06=channel out of range: {0}
-sound.07=data1 out of range: {0}
-sound.08=data2 out of range: {0}
-sound.09=Invalid status byte for sysex message: {0}
-sound.0A=Invalid meta event with type {0}
-sound.0B=Unsupported division type: {0}
-sound.0C=Frame size must be one byte
-sound.0D=The value is not supported
-sound.0F=value does not fall within the allowable range
-sound.11=Could not get line
-sound.12=Could not get audio input stream from source stream
-sound.13=Could not get audio input stream from source stream
-sound.14=File is not a supported file type
-sound.15=Could not get audio input stream from input stream
-sound.16=Could not get audio input stream from input URL
-sound.17=Could not get audio input stream from input file
-sound.18=Type is not supported
diff --git a/libcore-disabled/sound/src/main/java/org/apache/harmony/sound/utils/ProviderService.java b/libcore-disabled/sound/src/main/java/org/apache/harmony/sound/utils/ProviderService.java
deleted file mode 100644
index b1bbe2e..0000000
--- a/libcore-disabled/sound/src/main/java/org/apache/harmony/sound/utils/ProviderService.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package org.apache.harmony.sound.utils;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.URL;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Properties;
-
-public class ProviderService {
-
-    // Properties from sound.propertie file
-    private static Properties devices;
-
-    static {
-        devices = new Properties();
-
-        FileInputStream fstream = AccessController
-                .doPrivileged(new PrivilegedAction<FileInputStream>() {
-
-                    public FileInputStream run() {
-                        // obtain the path to the file sound.properties
-                        String soundPropertiesPath = System
-                                .getProperty("java.home") //$NON-NLS-1$
-                                + File.separator + "lib" + File.separator //$NON-NLS-1$
-                                + "sound.properties"; //$NON-NLS-1$
-                        try {
-                            return new FileInputStream(soundPropertiesPath);
-                        } catch (FileNotFoundException e) {
-                            return null;
-                        }
-                    }
-                });
-
-        if (fstream != null) {
-            // reading file sound.properties
-            try {
-                devices.load(fstream);
-            } catch (IOException e) {}
-        }
-    }
-
-    /**
-     * this method return information about default device
-     * 
-     * @param deviceName
-     * @return
-     */
-    public static List<String> getDefaultDeviceDescription(String deviceName) {
-
-        // variable that contain information about default device
-        List<String> defaultDevice = new ArrayList<String>();
-        String str;
-        int index;
-
-        /*
-         * obtain the default device that describes by deviceName
-         */
-        str = devices.getProperty(deviceName);
-        /*
-         * if default device doesn't define, than return empty defaultDevice
-         */
-        if (str == null) {
-            return defaultDevice;
-        }
-        /*
-         * the separator between provider and name is '#'; find separator of
-         * provider and name of device in the notation of default device
-         */
-        index = str.indexOf("#"); //$NON-NLS-1$
-        /*
-         * if separator doesn't find, so in the definition of default device
-         * contain only name of provider, and so we add it
-         */
-        if (index == -1) {
-            defaultDevice.add(str);
-            defaultDevice.add(null);
-            /*
-             * if separator is the first symbol, so definition contain only name
-             * of device
-             */
-        } else if (index == 0) {
-            defaultDevice.add(null);
-            defaultDevice.add(str.substring(index + 1));
-            /*
-             * if separator is not the first, so we find provider and name of
-             * device
-             */
-        } else {
-            defaultDevice.add(str.substring(0, index));
-            defaultDevice.add(str.substring(index + 1));
-        }
-        return defaultDevice;
-    }
-
-    /**
-     * this method return the list of providers
-     * 
-     * @param providerName
-     * @return
-     */
-    public static List<?> getProviders(String providerName) {
-        final String name = providerName;
-
-        return AccessController
-                .doPrivileged(new PrivilegedAction<List<Object>>() {
-
-                    public List<Object> run() {
-                        List<Object> providers = new ArrayList<Object>();
-                        String className = null;
-                        byte[] bytes;
-
-                        ClassLoader cl = ClassLoader.getSystemClassLoader();
-                        Enumeration<URL> urls = null;
-                        try {
-                            urls = cl.getResources(name);
-                        } catch (IOException e) {
-                            return providers;
-                        }
-                        for (; urls.hasMoreElements();) {
-                            try {
-                                InputStream in = urls.nextElement()
-                                        .openStream();
-                                bytes = new byte[in.available()];
-                                in.read(bytes);
-                                in.close();
-                            } catch (IOException e) {
-                                continue;
-                            }
-                            String[] astr = new String(bytes).split("\r\n"); //$NON-NLS-1$
-                            for (String str : astr) {
-                                className = str.trim();
-                                if (!className.startsWith("#")) { // skip
-                                                                    // comments
-                                                                    // //$NON-NLS-1$
-                                    try {
-                                        providers.add(Class.forName(
-                                                className.trim(), true, cl)
-                                                .newInstance());
-                                    } catch (IllegalAccessException e) {} catch (InstantiationException e) {} catch (ClassNotFoundException e) {}
-                                }
-                            }
-                        }
-                        return providers;
-                    }
-                });
-
-    }
-
-    public static Properties getSoundProperties() {
-        return devices;
-    }
-
-}
diff --git a/libcore-disabled/sound/src/test/java/android/core/SoundTest.java b/libcore-disabled/sound/src/test/java/android/core/SoundTest.java
deleted file mode 100644
index 22a9261..0000000
--- a/libcore-disabled/sound/src/test/java/android/core/SoundTest.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.core;
-
-import android.media.MediaPlayer;
-
-import com.android.internal.sound.midi.AndroidSequencer;
-import com.android.internal.sound.sampled.AndroidClip;
-
-import junit.framework.Assert;
-import junit.framework.TestCase;
-
-import java.io.File;
-
-import javax.sound.midi.MidiDevice;
-import javax.sound.midi.MidiSystem;
-import javax.sound.midi.Sequence;
-import javax.sound.midi.Sequencer;
-import javax.sound.sampled.AudioInputStream;
-import javax.sound.sampled.AudioSystem;
-import javax.sound.sampled.Clip;
-import javax.sound.sampled.Line;
-
-public class SoundTest extends TestCase {
-
-  public static String TAG = "SoundTest";
-
-    // Regression test for #000000: Completion of MIDI file doesn't fire
-    // corresponding event.
-//    private boolean eventReceived = false;
-//  
-//    public void testMidiFileCompletion() {
-//        try {
-//            MediaPlayer player = new MediaPlayer();
-//            
-//            player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
-//                public void onCompletion(MediaPlayer player) {
-//                    eventReceived = true;
-//                }
-//            });
-//
-//            player.setDataSource("/system/sounds/test.mid");
-//            player.prepare();
-//            player.start();
-//            Thread.sleep(20000);
-//            assertFalse("Player must be stopped", player.isPlaying());
-//            assertTrue("Completion event must have been received", eventReceived);
-//
-//        } catch (Exception ex) {
-//            throw new RuntimeException(ex);
-//        }
-//    }
-  
-    // Regression test for #872614: General javax.sound weirdness.
-    public void testMidiSupport() {
-        try {
-            Sequencer sequencer = MidiSystem.getSequencer();
-            Assert.assertTrue("AndroidSequencer must exist", sequencer instanceof AndroidSequencer);
-            
-            MidiDevice.Info info = sequencer.getDeviceInfo();
-            Assert.assertNotNull("Device info must exist", info);
-    
-            Sequence sequence = MidiSystem.getSequence(new File("/system/sounds/test.mid"));
-            Assert.assertNotNull("Sequence must exist", sequence);
-    
-            Assert.assertFalse("Sequencer must not be open", sequencer.isOpen());
-            sequencer.open();
-            Assert.assertTrue("Sequencer must be open", sequencer.isOpen());
-            
-            Assert.assertNull("Sequencer must not have Sequence", sequencer.getSequence());
-            sequencer.setSequence(sequence);
-            Assert.assertNotNull("Sequencer must have Sequence", sequencer.getSequence());
-            
-            Assert.assertFalse("Sequencer must not be running", sequencer.isRunning());
-            sequencer.start();
-            Thread.sleep(1000);
-            Assert.assertTrue("Sequencer must be running (after 1 second)", sequencer.isRunning());
-    
-            Thread.sleep(3000);
-            
-            Assert.assertTrue("Sequencer must be running", sequencer.isRunning());
-            sequencer.stop();
-            Thread.sleep(1000);
-            Assert.assertFalse("Sequencer must not be running (after 1 second)", sequencer.isRunning());
-            
-            sequencer.close();
-            Assert.assertFalse("Sequencer must not be open", sequencer.isOpen());
-        } catch (Exception ex) {
-            throw new RuntimeException(ex);
-        }
-    } 
-
-    // Regression test for #872614: General javax.sound weirdness.
-    public void testSampledSupport() {
-        try {
-            Clip clip = AudioSystem.getClip();
-            Assert.assertTrue("AndroidClip must exist", clip instanceof AndroidClip);
-            
-            Line.Info info = clip.getLineInfo();
-            Assert.assertNotNull("Line info must exist", info);
-    
-            AudioInputStream stream = AudioSystem.getAudioInputStream(new File("/system/media/audio/ringtones/ringer.ogg"));
-            Assert.assertNotNull("AudioInputStream must exist", stream);
-    
-            Assert.assertFalse("Clip must not be open", clip.isOpen());
-            clip.open(stream);
-            Assert.assertTrue("Clip must be open", clip.isOpen());
-            
-            Assert.assertFalse("Clip must not be running", clip.isRunning());
-            clip.start();
-            Thread.sleep(1000);
-            Assert.assertTrue("Clip must be running (after 1 second)", clip.isRunning());
-    
-            Thread.sleep(2000);
-            
-            Assert.assertTrue("Clip must be running", clip.isRunning());
-            clip.stop();
-            Thread.sleep(1000);
-            Assert.assertFalse("Clip must not be running (after 1 second)", clip.isRunning());
-            
-            clip.close();
-            Assert.assertFalse("Clip must not be open", clip.isOpen());
-        } catch (Exception ex) {
-            throw new RuntimeException(ex);
-        }
-    } 
-    
-}
diff --git a/libcore/luni/src/main/java/java/net/InetAddress.java b/libcore/luni/src/main/java/java/net/InetAddress.java
index ad96ed6..4827e70 100644
--- a/libcore/luni/src/main/java/java/net/InetAddress.java
+++ b/libcore/luni/src/main/java/java/net/InetAddress.java
@@ -27,8 +27,10 @@
 import java.security.AccessController;
 import java.util.Arrays;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.Enumeration;
+import java.util.List;
 import java.util.StringTokenizer;
 
 import org.apache.harmony.luni.net.NetUtil;
@@ -114,40 +116,12 @@
         super();
     }
 
-    // BEGIN android-removed
-    /**
-     * Constructs an {@code InetAddress}, representing the {@code address} and
-     * {@code hostName}.
-     *
-     * @param address
-     *            the network address.
-     */
-    // InetAddress(byte[] address) {
-    //     super();
-    //     this.ipaddress = address;
-    // }
+    // BEGIN android-removed: use Inet4Address/Inet6Address instead, as appropriate.
+    // InetAddress(byte[] address) { ... }
     // END android-removed
 
-    // BEGIN android-removed
-    /**
-     * Constructs an {@code InetAddress}, representing the {@code address} and
-     * {@code hostName}.
-     *
-     * @param address
-     *            the network address.
-     *
-     */
-    // InetAddress(byte[] address, String hostName) {
-    //     super();
-    //     this.ipaddress = address;
-    //     this.hostName = hostName;
-    // }
-    // END android-removed
-
-    // BEGIN android-removed
-    // CacheElement cacheElement() {
-    //     return new CacheElement();
-    // }
+    // BEGIN android-removed: use Inet4Address/Inet6Address instead, as appropriate.
+    // InetAddress(byte[] address, String hostName) { ... }
     // END android-removed
 
     /**
@@ -744,7 +718,7 @@
      * ICMP <i>(ICMP ECHO REQUEST)</i>. When first step fails, a TCP connection
      * on port 7 (Echo) of the remote host is established.
      *
-     * @param netif
+     * @param networkInterface
      *            the network interface on which to connection should be
      *            established.
      * @param ttl
@@ -759,36 +733,16 @@
      * @throws IllegalArgumentException
      *             if ttl or timeout is less than zero.
      */
-    public boolean isReachable(NetworkInterface netif, final int ttl,
+    public boolean isReachable(NetworkInterface networkInterface, final int ttl,
             final int timeout) throws IOException {
-        if (0 > ttl || 0 > timeout) {
+        if (ttl < 0 || timeout < 0) {
             throw new IllegalArgumentException(Msg.getString("K0051")); //$NON-NLS-1$
         }
-        boolean reachable = false;
-        if (null == netif) {
-            // network interface is null, binds to no address
-            // BEGIN android-changed
-            // reachable = NETIMPL.isReachableByICMP(this, null, ttl, timeout);
-            // if (!reachable) {
-                reachable = isReachableByTCP(this, null, timeout);
-            // }
-            // END android-changed
+        if (networkInterface == null) {
+            return isReachableByTCP(this, null, timeout);
         } else {
-            // Not Bind to any address
-            if (null == netif.addresses) {
-                return false;
-            }
-            // binds to all address on this NetworkInterface, tries ICMP ping
-            // first
-            // BEGIN android-changed
-            // reachable = isReachableByICMPUseMultiThread(netif, ttl, timeout);
-            // if (!reachable) {
-                // tries TCP echo if ICMP ping fails
-                reachable = isReachableByMultiThread(netif, ttl, timeout);
-            // }
-            // END adnroid-changed
+            return isReachableByMultiThread(networkInterface, ttl, timeout);
         }
-        return reachable;
     }
 
     /*
@@ -800,16 +754,14 @@
             final int ttl, final int timeout)
     // END android-changed
             throws IOException {
-        if (null == netif.addresses) {
+        List<InetAddress> addresses = Collections.list(netif.getInetAddresses());
+        if (addresses.isEmpty()) {
             return false;
         }
-        Enumeration<InetAddress> addresses = netif.getInetAddresses();
         reached = false;
-        addrCount = netif.addresses.length;
+        addrCount = addresses.size();
         boolean needWait = false;
-        while (addresses.hasMoreElements()) {
-            final InetAddress addr = addresses.nextElement();
-
+        for (final InetAddress addr : addresses) {
             // loopback interface can only reach to local addresses
             if (addr.isLoopbackAddress()) {
                 Enumeration<NetworkInterface> NetworkInterfaces = NetworkInterface
diff --git a/libcore/luni/src/main/java/java/net/InterfaceAddress.java b/libcore/luni/src/main/java/java/net/InterfaceAddress.java
index 7bc3936..2fa99f7 100644
--- a/libcore/luni/src/main/java/java/net/InterfaceAddress.java
+++ b/libcore/luni/src/main/java/java/net/InterfaceAddress.java
@@ -20,22 +20,131 @@
  * Identifies one of a network interface's addresses.
  * These are passed back from the JNI behind NetworkInterface.getNetworkInterfaces.
  * Multiple addresses for the same interface are collected together on the Java side.
+ *
+ * @hide
+ * @since 1.6
  */
-class InterfaceAddress {
-    // An IPv4 or IPv6 address.
-    final InetAddress address;
-
-    // The kernel's interface index for the network interface this address
-    // is currently assigned to. Values start at 1, because 0 means "unknown"
-    // or "any", depending on context.
+public class InterfaceAddress {
+    /**
+     * The kernel's interface index for the network interface this address
+     * is currently assigned to. Values start at 1, because 0 means "unknown"
+     * or "any", depending on context.
+     */
     final int index;
 
-    // The network interface's name. "lo" or "eth0", for example.
+    /**
+     * The network interface's name. "lo" or "eth0", for example.
+     */
     final String name;
 
-    InterfaceAddress(int index, String name, InetAddress address) {
+    /**
+     * An IPv4 or IPv6 address.
+     */
+    final InetAddress address;
+
+    /**
+     * The IPv4 broadcast address, or null for IPv6.
+     */
+    private final InetAddress broadcastAddress;
+
+    private final short prefixLength;
+
+    InterfaceAddress(int index, String name, InetAddress address, InetAddress mask) {
+        assert ((address instanceof Inet4Address) == (mask instanceof Inet4Address));
         this.index = index;
         this.name = name;
         this.address = address;
+        this.broadcastAddress = makeBroadcastAddress(address, mask);
+        this.prefixLength = countPrefixLength(mask);
+    }
+
+    private static InetAddress makeBroadcastAddress(InetAddress address, InetAddress mask) {
+        if (!(address instanceof Inet4Address)) {
+            return null;
+        }
+        byte[] broadcast = new byte[4];
+        byte[] maskBytes = mask.ipaddress;
+        byte[] addrBytes = address.ipaddress;
+        if (maskBytes[0] != 0) {
+            for (int i = 0; i < broadcast.length; ++i) {
+                broadcast[i] = (byte) (addrBytes[i] | ~maskBytes[i]);
+            }
+        }
+        return new Inet4Address(broadcast);
+    }
+
+    private static short countPrefixLength(InetAddress mask) {
+        short count = 0;
+        for (byte b : mask.ipaddress) {
+            for (int i = 0; i < 8; ++i) {
+                if ((b & (1 << i)) != 0) {
+                    ++count;
+                }
+            }
+        }
+        return count;
+    }
+
+    /**
+     * Tests whether this object is equal to another one. Returns true if
+     * the address, broadcast address and prefix length are all equal.
+     *
+     * @param obj the object to be compared.
+     * @return true if 'obj' is equal to this InterfaceAddress, false otherwise.
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == this){
+            return true;
+        }
+        if (!(obj instanceof InterfaceAddress)) {
+            return false;
+        }
+        InterfaceAddress rhs = (InterfaceAddress) obj;
+        return ((address == null) ? rhs.address == null : address.equals(rhs.address)) &&
+                (rhs.prefixLength == prefixLength) &&
+                ((broadcastAddress == null) ? rhs.broadcastAddress == null : broadcastAddress.equals(rhs.broadcastAddress));
+    }
+
+    @Override
+    public int hashCode() {
+        int hashCode = address == null ? 0 : -address.hashCode();
+        hashCode += broadcastAddress == null ? 0 : broadcastAddress.hashCode();
+        hashCode += prefixLength;
+        return hashCode;
+    }
+
+    /**
+     * Returns a string representation for this interface address.
+     * The string is of the form: InetAddress / prefix length [ broadcast address ].
+     *
+     * @return a string representation of this interface address.
+     */
+    @Override
+    public String toString() {
+        return address + "/" + prefixLength + " [" + broadcastAddress + "]";
+    }
+
+    /**
+     * Returns the InetAddress for this address.
+     */
+    public InetAddress getAddress() {
+        return address;
+    }
+
+    /**
+     * Returns the subnet-directed broadcast address if this is an IPv4 interface, null otherwise.
+     */
+    public InetAddress getBroadcast() {
+        return broadcastAddress;
+    }
+
+    /**
+     * Returns the network prefix length in bits.
+     * (In IPv4 parlance, this is known as the subnet mask,
+     * but this method applies to IPv6 addresses too.)
+     */
+    public short getNetworkPrefixLength() {
+        return prefixLength;
     }
 }
diff --git a/libcore/luni/src/main/java/java/net/NetworkInterface.java b/libcore/luni/src/main/java/java/net/NetworkInterface.java
index 93a30cb..b3e242e 100644
--- a/libcore/luni/src/main/java/java/net/NetworkInterface.java
+++ b/libcore/luni/src/main/java/java/net/NetworkInterface.java
@@ -17,9 +17,12 @@
 
 package java.net;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.LinkedHashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Vector;
@@ -37,49 +40,45 @@
     private static final int CHECK_CONNECT_NO_PORT = -1;
 
     static final int NO_INTERFACE_INDEX = 0;
-
     static final int UNSET_INTERFACE_INDEX = -1;
 
-    private String name;
+    private final String name;
+    private final String displayName;
+    private final List<InterfaceAddress> interfaceAddresses = new LinkedList<InterfaceAddress>();
 
-    private String displayName;
-
-    InetAddress addresses[];
+    private final List<InetAddress> addresses = new LinkedList<InetAddress>();
 
     // The interface index is a positive integer which is non-negative. Where
     // value is zero then we do not have an index for the interface (which
     // occurs in systems which only support IPV4)
     private int interfaceIndex;
 
-    private int hashCode;
+    private NetworkInterface parent = null;
+
+    private final List<NetworkInterface> children = new LinkedList<NetworkInterface>();
 
     // BEGIN android-changed: we pay this extra complexity on the Java side
     // in return for vastly simpler native code.
-    private static native InterfaceAddress[] getInterfaceAddresses() throws SocketException;
+    private static native InterfaceAddress[] getAllInterfaceAddressesImpl() throws SocketException;
 
     private static NetworkInterface[] getNetworkInterfacesImpl() throws SocketException {
         Map<String, NetworkInterface> networkInterfaces = new LinkedHashMap<String, NetworkInterface>();
-        for (InterfaceAddress ia : getInterfaceAddresses()) {
+        for (InterfaceAddress ia : getAllInterfaceAddressesImpl()) {
             if (ia != null) { // The array may contain harmless null elements.
                 String name = ia.name;
                 NetworkInterface ni = networkInterfaces.get(name);
                 if (ni == null) {
                     ni = new NetworkInterface(name, name, new InetAddress[] { ia.address }, ia.index);
+                    ni.interfaceAddresses.add(ia);
                     networkInterfaces.put(name, ni);
                 } else {
-                    ni.addInterfaceAddress(ia.address);
+                    ni.addresses.add(ia.address);
+                    ni.interfaceAddresses.add(ia);
                 }
             }
         }
         return networkInterfaces.values().toArray(new NetworkInterface[networkInterfaces.size()]);
     }
-
-    private void addInterfaceAddress(InetAddress address) {
-        InetAddress[] newAddresses = new InetAddress[addresses.length + 1];
-        System.arraycopy(addresses, 0, newAddresses, 0, addresses.length);
-        newAddresses[addresses.length] = address;
-        addresses = newAddresses;
-    }
     // END android-changed
 
     /**
@@ -96,12 +95,16 @@
      *            an index for the interface. Only set for platforms that
      *            support IPV6.
      */
-    NetworkInterface(String name, String displayName, InetAddress addresses[],
+    NetworkInterface(String name, String displayName, InetAddress[] addresses,
             int interfaceIndex) {
         this.name = name;
         this.displayName = displayName;
-        this.addresses = addresses;
         this.interfaceIndex = interfaceIndex;
+        if (addresses != null) {
+            for (InetAddress address : addresses) {
+                this.addresses.add(address);
+            }
+        }
     }
 
     /**
@@ -122,8 +125,8 @@
      * @return the first address if one exists, otherwise null.
      */
     InetAddress getFirstAddress() {
-        if ((addresses != null) && (addresses.length >= 1)) {
-            return addresses[0];
+        if (addresses.size() >= 1) {
+            return addresses.get(0);
         }
         return null;
     }
@@ -143,63 +146,21 @@
      * @return the address list of the represented network interface.
      */
     public Enumeration<InetAddress> getInetAddresses() {
-        /*
-         * create new vector from which Enumeration to be returned can be
-         * generated set the initial capacity to be the number of addresses for
-         * the network interface which is the maximum required size
-         */
-
-        /*
-         * return an empty enumeration if there are no addresses associated with
-         * the interface
-         */
-        if (addresses == null) {
-            return new Vector<InetAddress>(0).elements();
+        SecurityManager sm = System.getSecurityManager();
+        if (sm == null || addresses.isEmpty()) {
+            return Collections.enumeration(addresses);
         }
-
-        /*
-         * for those configuration that support the security manager we only
-         * return addresses for which checkConnect returns true
-         */
-        Vector<InetAddress> accessibleAddresses = new Vector<InetAddress>(
-                addresses.length);
-
-        /*
-         * get the security manager. If one does not exist just return the full
-         * list
-         */
-        SecurityManager security = System.getSecurityManager();
-        if (security == null) {
-            return (new Vector<InetAddress>(Arrays.asList(addresses)))
-                    .elements();
-        }
-
-        /*
-         * ok security manager exists so check each address and return those
-         * that pass
-         */
-        for (InetAddress element : addresses) {
-            if (security != null) {
-                try {
-                    /*
-                     * since we don't have a port in this case we pass in
-                     * NO_PORT
-                     */
-                    security.checkConnect(element.getHostName(),
-                            CHECK_CONNECT_NO_PORT);
-                    accessibleAddresses.add(element);
-                } catch (SecurityException e) {
-                }
+        // TODO: Android should ditch SecurityManager and the associated pollution.
+        List<InetAddress> result = new ArrayList<InetAddress>(addresses.size());
+        for (InetAddress address : addresses) {
+            try {
+                sm.checkConnect(address.getHostName(), CHECK_CONNECT_NO_PORT);
+            } catch (SecurityException e) {
+                continue;
             }
+            result.add(address);
         }
-
-        Enumeration<InetAddress> theAccessibleElements = accessibleAddresses
-                .elements();
-        if (theAccessibleElements.hasMoreElements()) {
-            return accessibleAddresses.elements();
-        }
-
-        return new Vector<InetAddress>(0).elements();
+        return Collections.enumeration(result);
     }
 
     /**
@@ -232,24 +193,13 @@
      * @throws NullPointerException
      *             if the given interface's name is {@code null}.
      */
-    public static NetworkInterface getByName(String interfaceName)
-            throws SocketException {
-
+    public static NetworkInterface getByName(String interfaceName) throws SocketException {
         if (interfaceName == null) {
             throw new NullPointerException(Msg.getString("K0330")); //$NON-NLS-1$
         }
-
-        /*
-         * get the list of interfaces, and then loop through the list to look
-         * for one with a matching name
-         */
-        Enumeration<NetworkInterface> interfaces = getNetworkInterfaces();
-        if (interfaces != null) {
-            while (interfaces.hasMoreElements()) {
-                NetworkInterface netif = interfaces.nextElement();
-                if (netif.getName().equals(interfaceName)) {
-                    return netif;
-                }
+        for (NetworkInterface networkInterface : getNetworkInterfacesList()) {
+            if (networkInterface.name.equals(interfaceName)) {
+                return networkInterface;
             }
         }
         return null;
@@ -268,38 +218,13 @@
      * @throws NullPointerException
      *             if the given interface address is invalid.
      */
-    public static NetworkInterface getByInetAddress(InetAddress address)
-            throws SocketException {
-
+    public static NetworkInterface getByInetAddress(InetAddress address) throws SocketException {
         if (address == null) {
             throw new NullPointerException(Msg.getString("K0331")); //$NON-NLS-1$
         }
-
-        /*
-         * get the list of interfaces, and then loop through the list. For each
-         * interface loop through the associated set of internet addresses and
-         * see if one matches. If so return that network interface
-         */
-        Enumeration<NetworkInterface> interfaces = getNetworkInterfaces();
-        if (interfaces != null) {
-            while (interfaces.hasMoreElements()) {
-                NetworkInterface netif = interfaces.nextElement();
-                /*
-                 * to be compatible use the raw addresses without any security
-                 * filtering
-                 */
-                // Enumeration netifAddresses = netif.getInetAddresses();
-                if ((netif.addresses != null) && (netif.addresses.length != 0)) {
-                    Enumeration<InetAddress> netifAddresses = (new Vector<InetAddress>(
-                            Arrays.asList(netif.addresses))).elements();
-                    if (netifAddresses != null) {
-                        while (netifAddresses.hasMoreElements()) {
-                            if (address.equals(netifAddresses.nextElement())) {
-                                return netif;
-                            }
-                        }
-                    }
-                }
+        for (NetworkInterface networkInterface : getNetworkInterfacesList()) {
+            if (networkInterface.addresses.contains(address)) {
+                return networkInterface;
             }
         }
         return null;
@@ -315,32 +240,53 @@
      *             if an error occurs while getting the network interface
      *             information.
      */
-    public static Enumeration<NetworkInterface> getNetworkInterfaces()
-            throws SocketException {
+    public static Enumeration<NetworkInterface> getNetworkInterfaces() throws SocketException {
+        return Collections.enumeration(getNetworkInterfacesList());
+    }
+
+    private static List<NetworkInterface> getNetworkInterfacesList() throws SocketException {
         NetworkInterface[] interfaces = getNetworkInterfacesImpl();
-        if (interfaces == null) {
-            return null;
-        }
 
         for (NetworkInterface netif : interfaces) {
             // Ensure that current NetworkInterface is bound to at least
             // one InetAddress before processing
-            if (netif.addresses != null) {
-                for (InetAddress addr : netif.addresses) {
-                    if (16 == addr.ipaddress.length) {
-                        if (addr.isLinkLocalAddress()
-                                || addr.isSiteLocalAddress()) {
-                            ((Inet6Address) addr).scopedIf = netif;
-                            ((Inet6Address) addr).ifname = netif.name;
-                            ((Inet6Address) addr).scope_ifname_set = true;
-                        }
+            for (InetAddress addr : netif.addresses) {
+                if (addr.ipaddress.length == 16) {
+                    if (addr.isLinkLocalAddress() || addr.isSiteLocalAddress()) {
+                        ((Inet6Address) addr).scopedIf = netif;
+                        ((Inet6Address) addr).ifname = netif.name;
+                        ((Inet6Address) addr).scope_ifname_set = true;
                     }
                 }
             }
         }
 
-        return (new Vector<NetworkInterface>(Arrays.asList(interfaces)))
-                .elements();
+        List<NetworkInterface> result = new ArrayList<NetworkInterface>();
+        boolean[] peeked = new boolean[interfaces.length];
+        for (int counter = 0; counter < interfaces.length; counter++) {
+            // If this interface has been touched, continue.
+            if (peeked[counter]) {
+                continue;
+            }
+            int counter2 = counter;
+            // Checks whether the following interfaces are children.
+            for (; counter2 < interfaces.length; counter2++) {
+                if (peeked[counter2]) {
+                    continue;
+                }
+                if (interfaces[counter2].name.startsWith(interfaces[counter].name + ":")) {
+                    // Tagged as peeked
+                    peeked[counter2] = true;
+                    interfaces[counter].children.add(interfaces[counter2]);
+                    interfaces[counter2].parent = interfaces[counter];
+                    interfaces[counter].addresses.addAll(interfaces[counter2].addresses);
+                }
+            }
+            // Tagged as peeked
+            result.add(interfaces[counter]);
+            peeked[counter] = true;
+        }
+        return result;
     }
 
     /**
@@ -357,77 +303,27 @@
      */
     @Override
     public boolean equals(Object obj) {
-        // Return true if it is the exact same object.
         if (obj == this) {
             return true;
         }
-
-        // Ensure it is the right type.
         if (!(obj instanceof NetworkInterface)) {
             return false;
         }
-
-        /*
-         * Make sure that some simple checks pass. If the name is not the same
-         * then we are sure it is not the same one. We don't check the hashcode
-         * as it is generated from the name which we check
-         */
-        NetworkInterface netif = (NetworkInterface) obj;
-
-        if (netif.getIndex() != interfaceIndex) {
-            return false;
-        }
-
-        if (!(name.equals("")) && (!netif.getName().equals(name))) { //$NON-NLS-1$
-            return false;
-        }
-
-        if ((name.equals("")) && (!netif.getName().equals(displayName))) { //$NON-NLS-1$
-            return false;
-        }
-
-        // Now check that the collection of internet addresses are equal.
-        Enumeration<InetAddress> netifAddresses = netif.getInetAddresses();
-        Enumeration<InetAddress> localifAddresses = getInetAddresses();
-
-        // Check for both null (same), or one null (not same).
-        if (netifAddresses == null) {
-            return localifAddresses == null;
-        }
-        if (localifAddresses == null) {
-            return false;
-        }
-
-        // Both are not null, check InetAddress elements.
-        while (netifAddresses.hasMoreElements()
-                && localifAddresses.hasMoreElements()) {
-            if (!(localifAddresses.nextElement()).equals(
-                    netifAddresses.nextElement())) {
-                return false;
-            }
-        }
-
-        /*
-         * Now make sure that they had the same number of addresses, if not they
-         * are not the same interface.
-         */
-        return !netifAddresses.hasMoreElements()
-                && !localifAddresses.hasMoreElements();
+        NetworkInterface rhs = (NetworkInterface) obj;
+        // TODO: should the order of the addresses matter (we use List.equals)?
+        return interfaceIndex == rhs.interfaceIndex &&
+                name.equals(rhs.name) && displayName.equals(rhs.displayName) &&
+                addresses.equals(rhs.addresses);
     }
 
     /**
-     * Gets the hashcode for this {@code NetworkInterface} instance. Since the
-     * name should be unique for each network interface the hashcode is
+     * Returns the hash code for this {@code NetworkInterface}. Since the
+     * name should be unique for each network interface the hash code is
      * generated using this name.
-     * 
-     * @return the hashcode value for this {@code NetworkInterface} instance.
      */
     @Override
     public int hashCode() {
-        if (hashCode == 0) {
-            hashCode = name.hashCode();
-        }
-        return hashCode;
+        return name.hashCode();
     }
 
     /**
@@ -464,4 +360,174 @@
         }
         return string.toString();
     }
+
+    /**
+     * Returns a List the InterfaceAddresses for this network interface.
+     * <p>
+     * If there is a security manager, its checkConnect method is called with
+     * the InetAddress for each InterfaceAddress. Only InterfaceAddresses where
+     * the checkConnect doesn't throw a SecurityException will be returned.
+     * 
+     * @return a List of the InterfaceAddresses for this network interface.
+     * @since 1.6
+     * @hide
+     */
+    public List<InterfaceAddress> getInterfaceAddresses() {
+        SecurityManager sm = System.getSecurityManager();
+        if (sm == null) {
+            return Collections.unmodifiableList(interfaceAddresses);
+        }
+        // TODO: Android should ditch SecurityManager and the associated pollution.
+        List<InterfaceAddress> result = new ArrayList<InterfaceAddress>(interfaceAddresses.size());
+        for (InterfaceAddress ia : interfaceAddresses) {
+            try {
+                sm.checkConnect(ia.getAddress().getHostName(), CHECK_CONNECT_NO_PORT);
+            } catch (SecurityException e) {
+                continue;
+            }
+            result.add(ia);
+        }
+        return result;
+    }
+
+    /**
+     * Returns an {@code Enumeration} of all the sub-interfaces of this network interface.
+     * Sub-interfaces are also known as virtual interfaces.
+     * <p>
+     * For example, {@code eth0:1} would be a sub-interface of {@code eth0}.
+     * 
+     * @return an Enumeration of all the sub-interfaces of this network interface
+     * @since 1.6
+     * @hide
+     */
+    public Enumeration<NetworkInterface> getSubInterfaces() {
+        return Collections.enumeration(children);
+    }
+
+    /**
+     * Returns the parent NetworkInterface of this interface if this is a
+     * sub-interface, or null if it's a physical (non virtual) interface.
+     * 
+     * @return the NetworkInterface this interface is attached to.
+     * @since 1.6
+     * @hide
+     */
+    public NetworkInterface getParent() {
+        return parent;
+    }
+
+    /**
+     * Returns true if this network interface is up.
+     * 
+     * @return true if the interface is up.
+     * @throws SocketException if an I/O error occurs.
+     * @since 1.6
+     * @hide
+     */
+    public boolean isUp() throws SocketException {
+        if (addresses.isEmpty()) {
+            return false;
+        }
+        return isUpImpl(name, interfaceIndex);
+    }
+    private static native boolean isUpImpl(String n, int index) throws SocketException;
+
+    /**
+     * Returns true if this network interface is a loopback interface.
+     * 
+     * @return true if the interface is a loopback interface.
+     * @throws SocketException if an I/O error occurs.
+     * @since 1.6
+     * @hide
+     */
+    public boolean isLoopback() throws SocketException {
+        if (addresses.isEmpty()) {
+            return false;
+        }
+        return isLoopbackImpl(name, interfaceIndex);
+    }
+    private static native boolean isLoopbackImpl(String n, int index) throws SocketException;
+
+    /**
+     * Returns true if this network interface is a point-to-point interface.
+     * (For example, a PPP connection using a modem.)
+     * 
+     * @return true if the interface is point-to-point.
+     * @throws SocketException if an I/O error occurs.
+     * @since 1.6
+     * @hide
+     */
+    public boolean isPointToPoint() throws SocketException {
+        if (addresses.isEmpty()) {
+            return false;
+        }
+        return isPointToPointImpl(name, interfaceIndex);
+    }
+    private static native boolean isPointToPointImpl(String n, int index) throws SocketException;
+
+    /**
+     * Returns true if this network interface supports multicast.
+     * 
+     * @throws SocketException if an I/O error occurs.
+     * @since 1.6
+     * @hide
+     */
+    public boolean supportsMulticast() throws SocketException {
+        if (addresses.isEmpty()) {
+            return false;
+        }
+        return supportsMulticastImpl(name, interfaceIndex);
+    }
+    private static native boolean supportsMulticastImpl(String n, int index) throws SocketException;
+
+    /**
+     * Returns the hardware address of the interface, if it has one, and the
+     * user has the necessary privileges to access the address.
+     * 
+     * @return a byte array containing the address or null if the address
+     *         doesn't exist or is not accessible.
+     * @throws SocketException if an I/O error occurs.
+     * @since 1.6
+     * @hide
+     */
+    public byte[] getHardwareAddress() throws SocketException {
+        if (addresses.isEmpty()) {
+            return new byte[0];
+        }
+        return getHardwareAddressImpl(name, interfaceIndex);
+    }
+    private static native byte[] getHardwareAddressImpl(String n, int index) throws SocketException;
+
+    /**
+     * Returns the Maximum Transmission Unit (MTU) of this interface.
+     * 
+     * @return the value of the MTU for the interface.
+     * @throws SocketException if an I/O error occurs.
+     * @since 1.6
+     * @hide
+     */
+    public int getMTU() throws SocketException {
+        if (addresses.isEmpty()) {
+            return 0;
+        }
+        return getMTUImpl(name, interfaceIndex);
+    }
+    private static native int getMTUImpl(String n, int index) throws SocketException;
+
+    /**
+     * Returns true if this interface is a virtual interface (also called
+     * a sub-interface). Virtual interfaces are, on some systems, interfaces
+     * created as a child of a physical interface and given different settings
+     * (like address or MTU). Usually the name of the interface will the name of
+     * the parent followed by a colon (:) and a number identifying the child,
+     * since there can be several virtual interfaces attached to a single
+     * physical interface.
+     * 
+     * @return true if this interface is a virtual interface.
+     * @since 1.6
+     * @hide
+     */
+    public boolean isVirtual() {
+        return parent != null;
+    }
 }
diff --git a/libcore/luni/src/main/java/java/net/ServerSocket.java b/libcore/luni/src/main/java/java/net/ServerSocket.java
index 2fe6b5c..ce7b84f 100644
--- a/libcore/luni/src/main/java/java/net/ServerSocket.java
+++ b/libcore/luni/src/main/java/java/net/ServerSocket.java
@@ -61,13 +61,7 @@
     }
 
     /**
-     * Unspecified constructor.
-     *
-     * Warning: this function is technically part of API#1.
-     * Hiding it for API#2 broke source compatibility.
-     * Removing it entirely would theoretically break binary compatibility,
-     *     and would be better done with some visibility over the extent
-     *     of the compatibility breakage (expected to be non-existent).
+     * Unspecified constructor needed by ServerSocketChannelImpl.ServerSocketAdapter.
      *
      * @hide
      */
diff --git a/libcore/luni/src/main/native/ifaddrs-android.h b/libcore/luni/src/main/native/ifaddrs-android.h
index 0c3d203..de87b02 100644
--- a/libcore/luni/src/main/native/ifaddrs-android.h
+++ b/libcore/luni/src/main/native/ifaddrs-android.h
@@ -17,8 +17,13 @@
 #ifndef IFADDRS_ANDROID_H_included
 #define IFADDRS_ANDROID_H_included
 
+#include <arpa/inet.h>
 #include <cstring>
+#include <errno.h>
+#include <net/if.h>
+#include <netinet/in.h>
 #include <new>
+#include <sys/ioctl.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <stdio.h>
@@ -43,11 +48,14 @@
     // Interface flags.
     unsigned int ifa_flags;
 
-    // Interface address.
+    // Interface network address.
     sockaddr* ifa_addr;
 
+    // Interface netmask.
+    sockaddr* ifa_netmask;
+
     ifaddrs(ifaddrs* next)
-    : ifa_next(next), ifa_name(NULL), ifa_flags(0), ifa_addr(NULL)
+    : ifa_next(next), ifa_name(NULL), ifa_flags(0), ifa_addr(NULL), ifa_netmask(NULL)
     {
     }
 
@@ -55,6 +63,7 @@
         delete ifa_next;
         delete[] ifa_name;
         delete ifa_addr;
+        delete ifa_netmask;
     }
 
     // Sadly, we can't keep the interface index for portability with BSD.
@@ -91,16 +100,41 @@
     // stitch the two bits together into the sockaddr that's part of
     // our portable interface.
     void setAddress(int family, void* data, size_t byteCount) {
+        // Set the address proper...
         sockaddr_storage* ss = new sockaddr_storage;
-        ss->ss_family = family;
-        if (family == AF_INET) {
-            void* dst = &reinterpret_cast<sockaddr_in*>(ss)->sin_addr;
-            memcpy(dst, data, byteCount);
-        } else if (family == AF_INET6) {
-            void* dst = &reinterpret_cast<sockaddr_in6*>(ss)->sin6_addr;
-            memcpy(dst, data, byteCount);
-        }
+        memset(ss, 0, sizeof(*ss));
         ifa_addr = reinterpret_cast<sockaddr*>(ss);
+        ss->ss_family = family;
+        uint8_t* dst = sockaddrBytes(family, ss);
+        memcpy(dst, data, byteCount);
+    }
+
+    // Netlink gives us the prefix length as a bit count. We need to turn
+    // that into a BSD-compatible netmask represented by a sockaddr*.
+    void setNetmask(int family, size_t prefixLength) {
+        // ...and work out the netmask from the prefix length.
+        sockaddr_storage* ss = new sockaddr_storage;
+        memset(ss, 0, sizeof(*ss));
+        ifa_netmask = reinterpret_cast<sockaddr*>(ss);
+        ss->ss_family = family;
+        uint8_t* dst = sockaddrBytes(family, ss);
+        memset(dst, 0xff, prefixLength / 8);
+        if ((prefixLength % 8) != 0) {
+            dst[prefixLength/8] = (0xff << (8 - (prefixLength % 8)));
+        }
+    }
+
+    // Returns a pointer to the first byte in the address data (which is
+    // stored in network byte order).
+    uint8_t* sockaddrBytes(int family, sockaddr_storage* ss) {
+        if (family == AF_INET) {
+            sockaddr_in* ss4 = reinterpret_cast<sockaddr_in*>(ss);
+            return reinterpret_cast<uint8_t*>(&ss4->sin_addr);
+        } else if (family == AF_INET6) {
+            sockaddr_in6* ss6 = reinterpret_cast<sockaddr_in6*>(ss);
+            return reinterpret_cast<uint8_t*>(&ss6->sin6_addr);
+        }
+        return NULL;
     }
 };
 
@@ -167,6 +201,7 @@
                                     return -1;
                                 }
                                 (*result)->setAddress(family, RTA_DATA(rta), RTA_PAYLOAD(rta));
+                                (*result)->setNetmask(family, address->ifa_prefixlen);
                             }
                         }
                         rta = RTA_NEXT(rta, ifaPayloadLength);
diff --git a/libcore/luni/src/main/native/java_net_NetworkInterface.cpp b/libcore/luni/src/main/native/java_net_NetworkInterface.cpp
index 1a72710..724e988 100644
--- a/libcore/luni/src/main/native/java_net_NetworkInterface.cpp
+++ b/libcore/luni/src/main/native/java_net_NetworkInterface.cpp
@@ -18,6 +18,7 @@
 #include "AndroidSystemNatives.h"
 #include "JNIHelp.h"
 #include "jni.h"
+#include "ScopedFd.h"
 
 #include <errno.h>
 #include <netinet/in.h>
@@ -64,27 +65,34 @@
             jniStrError(errno, buf, sizeof(buf)));
 }
 
-static jobject makeInterfaceAddress(JNIEnv* env, jint interfaceIndex, const char* name, sockaddr_storage* ss) {
+static jobject makeInterfaceAddress(JNIEnv* env, jint interfaceIndex, ifaddrs* ifa) {
     jclass clazz = env->FindClass("java/net/InterfaceAddress");
     if (clazz == NULL) {
         return NULL;
     }
-    jmethodID constructor = env->GetMethodID(clazz, "<init>", "(ILjava/lang/String;Ljava/net/InetAddress;)V");
+    jmethodID constructor = env->GetMethodID(clazz, "<init>",
+            "(ILjava/lang/String;Ljava/net/InetAddress;Ljava/net/InetAddress;)V");
     if (constructor == NULL) {
         return NULL;
     }
-    jobject javaName = env->NewStringUTF(name);
+    jobject javaName = env->NewStringUTF(ifa->ifa_name);
     if (javaName == NULL) {
         return NULL;
     }
-    jobject javaAddress = socketAddressToInetAddress(env, ss);
+    sockaddr_storage* addr = reinterpret_cast<sockaddr_storage*>(ifa->ifa_addr);
+    jobject javaAddress = socketAddressToInetAddress(env, addr);
     if (javaAddress == NULL) {
         return NULL;
     }
-    return env->NewObject(clazz, constructor, interfaceIndex, javaName, javaAddress);
+    sockaddr_storage* mask = reinterpret_cast<sockaddr_storage*>(ifa->ifa_netmask);
+    jobject javaMask = socketAddressToInetAddress(env, mask);
+    if (javaMask == NULL) {
+        return NULL;
+    }
+    return env->NewObject(clazz, constructor, interfaceIndex, javaName, javaAddress, javaMask);
 }
 
-static jobjectArray getInterfaceAddresses(JNIEnv* env, jclass) {
+static jobjectArray getAllInterfaceAddressesImpl(JNIEnv* env, jclass) {
     // Get the list of interface addresses.
     ScopedInterfaceAddresses addresses;
     if (!addresses.init()) {
@@ -128,8 +136,7 @@
             continue;
         }
         // Make a new InterfaceAddress, and insert it into the array.
-        sockaddr_storage* ss = reinterpret_cast<sockaddr_storage*>(ifa->ifa_addr);
-        jobject element = makeInterfaceAddress(env, interfaceIndex, ifa->ifa_name, ss);
+        jobject element = makeInterfaceAddress(env, interfaceIndex, ifa);
         if (element == NULL) {
             return NULL;
         }
@@ -142,9 +149,89 @@
     return result;
 }
 
+static bool doIoctl(JNIEnv* env, jstring name, int request, ifreq& ifr) {
+    // Copy the name into the ifreq structure, if there's room...
+    jsize nameLength = env->GetStringLength(name);
+    if (nameLength >= IFNAMSIZ) {
+        errno = ENAMETOOLONG;
+        jniThrowSocketException(env);
+        return false;
+    }
+    memset(&ifr, 0, sizeof(ifr));
+    env->GetStringUTFRegion(name, 0, nameLength, ifr.ifr_name);
+
+    // ...and do the ioctl.
+    ScopedFd fd(socket(AF_INET, SOCK_DGRAM, 0));
+    if (fd.get() == -1) {
+        jniThrowSocketException(env);
+        return false;
+    }
+    int rc = ioctl(fd.get(), request, &ifr);
+    if (rc == -1) {
+        jniThrowSocketException(env);
+        return false;
+    }
+    return true;
+}
+
+static jboolean hasFlag(JNIEnv* env, jstring name, int flag) {
+    ifreq ifr;
+    doIoctl(env, name, SIOCGIFFLAGS, ifr); // May throw.
+    return (ifr.ifr_flags & flag) != 0;
+}
+
+static jbyteArray getHardwareAddressImpl(JNIEnv* env, jclass, jstring name, jint index) {
+    ifreq ifr;
+    if (!doIoctl(env, name, SIOCGIFHWADDR, ifr)) {
+        return NULL;
+    }
+    jbyte bytes[IFHWADDRLEN];
+    bool isEmpty = true;
+    for (int i = 0; i < IFHWADDRLEN; ++i) {
+        bytes[i] = ifr.ifr_hwaddr.sa_data[i];
+        if (bytes[i] != 0) {
+            isEmpty = false;
+        }
+    }
+    if (isEmpty) {
+        return NULL;
+    }
+    jbyteArray result = env->NewByteArray(IFHWADDRLEN);
+    env->SetByteArrayRegion(result, 0, IFHWADDRLEN, bytes);
+    return result;
+}
+
+static jint getMTUImpl(JNIEnv* env, jclass, jstring name, jint index) {
+    ifreq ifr;
+    doIoctl(env, name, SIOCGIFMTU, ifr); // May throw.
+    return ifr.ifr_mtu;
+}
+
+static jboolean isLoopbackImpl(JNIEnv* env, jclass, jstring name, jint index) {
+    return hasFlag(env, name, IFF_LOOPBACK);
+}
+
+static jboolean isPointToPointImpl(JNIEnv* env, jclass, jstring name, jint index) {
+    return hasFlag(env, name, IFF_POINTOPOINT); // Unix API typo!
+}
+
+static jboolean isUpImpl(JNIEnv* env, jclass, jstring name, jint index) {
+    return hasFlag(env, name, IFF_UP);
+}
+
+static jboolean supportsMulticastImpl(JNIEnv* env, jclass, jstring name, jint index) {
+    return hasFlag(env, name, IFF_MULTICAST);
+}
+
 static JNINativeMethod gMethods[] = {
     /* name, signature, funcPtr */
-    { "getInterfaceAddresses", "()[Ljava/net/InterfaceAddress;", (void*) getInterfaceAddresses },
+    { "getAllInterfaceAddressesImpl", "()[Ljava/net/InterfaceAddress;", (void*) getAllInterfaceAddressesImpl },
+    { "getHardwareAddressImpl", "(Ljava/lang/String;I)[B", (void*) getHardwareAddressImpl },
+    { "getMTUImpl", "(Ljava/lang/String;I)I", (void*) getMTUImpl },
+    { "isLoopbackImpl", "(Ljava/lang/String;I)Z", (void*) isLoopbackImpl },
+    { "isPointToPointImpl", "(Ljava/lang/String;I)Z", (void*) isPointToPointImpl },
+    { "isUpImpl", "(Ljava/lang/String;I)Z", (void*) isUpImpl },
+    { "supportsMulticastImpl", "(Ljava/lang/String;I)Z", (void*) supportsMulticastImpl },
 };
 int register_java_net_NetworkInterface(JNIEnv* env) {
     return jniRegisterNativeMethods(env, "java/net/NetworkInterface",
diff --git a/libcore/luni/src/main/native/org_apache_harmony_luni_platform_OSNetworkSystem.cpp b/libcore/luni/src/main/native/org_apache_harmony_luni_platform_OSNetworkSystem.cpp
index 12c3dd9..1a8f3a4 100644
--- a/libcore/luni/src/main/native/org_apache_harmony_luni_platform_OSNetworkSystem.cpp
+++ b/libcore/luni/src/main/native/org_apache_harmony_luni_platform_OSNetworkSystem.cpp
@@ -331,38 +331,70 @@
     return byteArrayToInetAddress(env, byteArray);
 }
 
-/**
- * Converts an IPv4 address to an IPv4-mapped IPv6 address if fd is an IPv6
- * socket.
- * @param fd the socket.
- * @param sin_ss the address.
- * @param sin6_ss scratch space where we can store the mapped address if necessary.
- * @param mapUnspecified if true, convert 0.0.0.0 to ::ffff:0:0; if false, to ::
- * @return either sin_ss or sin6_ss, depending on which the caller should use.
- */
-static const sockaddr* convertIpv4ToMapped(int fd,
-        const sockaddr_storage* sin_ss, sockaddr_storage* sin6_ss, bool mapUnspecified) {
-    // We need to map if we have an IPv4 address but an IPv6 socket.
-    bool needsMapping = (sin_ss->ss_family == AF_INET && getSocketAddressFamily(fd) == AF_INET6);
-    if (!needsMapping) {
-        return reinterpret_cast<const sockaddr*>(sin_ss);
+// Handles translating between IPv4 and IPv6 addresses so -- where possible --
+// we can use either class of address with either an IPv4 or IPv6 socket.
+class CompatibleSocketAddress {
+public:
+    // Constructs an address corresponding to 'ss' that's compatible with 'fd'.
+    CompatibleSocketAddress(int fd, const sockaddr_storage& ss, bool mapUnspecified) {
+        const int desiredFamily = getSocketAddressFamily(fd);
+        if (ss.ss_family == AF_INET6) {
+            if (desiredFamily == AF_INET6) {
+                // Nothing to do.
+                mCompatibleAddress = reinterpret_cast<const sockaddr*>(&ss);
+            } else {
+                sockaddr_in* sin = reinterpret_cast<sockaddr_in*>(&mTmp);
+                const sockaddr_in6* sin6 = reinterpret_cast<const sockaddr_in6*>(&ss);
+                memset(sin, 0, sizeof(*sin));
+                sin->sin_family = AF_INET;
+                sin->sin_port = sin6->sin6_port;
+                if (IN6_IS_ADDR_V4COMPAT(&sin6->sin6_addr)) {
+                    // We have an IPv6-mapped IPv4 address, but need plain old IPv4.
+                    // Unmap the mapped address in ss into an IPv6 address in mTmp.
+                    memcpy(&sin->sin_addr.s_addr, &sin6->sin6_addr.s6_addr[12], 4);
+                    mCompatibleAddress = reinterpret_cast<const sockaddr*>(&mTmp);
+                } else if (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr)) {
+                    // Translate the IPv6 loopback address to the IPv4 one.
+                    sin->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+                    mCompatibleAddress = reinterpret_cast<const sockaddr*>(&mTmp);
+                } else {
+                    // We can't help you. We return what you gave us, and assume you'll
+                    // get a sensible error when you use the address.
+                    mCompatibleAddress = reinterpret_cast<const sockaddr*>(&ss);
+                }
+            }
+        } else /* ss.ss_family == AF_INET */ {
+            if (desiredFamily == AF_INET) {
+                // Nothing to do.
+                mCompatibleAddress = reinterpret_cast<const sockaddr*>(&ss);
+            } else {
+                // We have IPv4 and need IPv6.
+                // Map the IPv4 address in ss into an IPv6 address in mTmp.
+                const sockaddr_in* sin = reinterpret_cast<const sockaddr_in*>(&ss);
+                sockaddr_in6* sin6 = reinterpret_cast<sockaddr_in6*>(&mTmp);
+                memset(sin6, 0, sizeof(*sin6));
+                sin6->sin6_family = AF_INET6;
+                sin6->sin6_port = sin->sin_port;
+                // TODO: mapUnspecified was introduced because kernels < 2.6.31 don't allow
+                // you to bind to ::ffff:0.0.0.0. When we move to something >= 2.6.31, we
+                // should make the code behave as if mapUnspecified were always true, and
+                // remove the parameter.
+                if (sin->sin_addr.s_addr != 0 || mapUnspecified) {
+                    memset(&(sin6->sin6_addr.s6_addr[10]), 0xff, 2);
+                }
+                memcpy(&sin6->sin6_addr.s6_addr[12], &sin->sin_addr.s_addr, 4);
+                mCompatibleAddress = reinterpret_cast<const sockaddr*>(&mTmp);
+            }
+        }
     }
-    // Map the IPv4 address in sin_ss into an IPv6 address in sin6_ss.
-    const sockaddr_in* sin = reinterpret_cast<const sockaddr_in*>(sin_ss);
-    sockaddr_in6* sin6 = reinterpret_cast<sockaddr_in6*>(sin6_ss);
-    memset(sin6, 0, sizeof(*sin6));
-    sin6->sin6_family = AF_INET6;
-    sin6->sin6_port = sin->sin_port;
-    // TODO: mapUnspecified was introduced because kernels < 2.6.31 don't allow
-    // you to bind to ::ffff:0.0.0.0. When we move to something >= 2.6.31, we
-    // should make the code behave as if mapUnspecified were always true, and
-    // remove the parameter.
-    if (sin->sin_addr.s_addr != 0 || mapUnspecified) {
-        memset(&(sin6->sin6_addr.s6_addr[10]), 0xff, 2);
+    // Returns a pointer to an address compatible with the socket.
+    const sockaddr* get() const {
+        return mCompatibleAddress;
     }
-    memcpy(&sin6->sin6_addr.s6_addr[12], &sin->sin_addr.s_addr, 4);
-    return reinterpret_cast<const sockaddr*>(sin6_ss);
-}
+private:
+    const sockaddr* mCompatibleAddress;
+    sockaddr_storage mTmp;
+};
 
 /**
  * Converts an InetAddress object and port number to a native address structure.
@@ -926,9 +958,8 @@
  * @param socketAddress the address to connect to
  */
 static int doConnect(int fd, const sockaddr_storage* socketAddress) {
-    sockaddr_storage tmp;
-    const sockaddr* realAddress = convertIpv4ToMapped(fd, socketAddress, &tmp, true);
-    return TEMP_FAILURE_RETRY(connect(fd, realAddress, sizeof(sockaddr_storage)));
+    const CompatibleSocketAddress compatibleAddress(fd, *socketAddress, true);
+    return TEMP_FAILURE_RETRY(connect(fd, compatibleAddress.get(), sizeof(sockaddr_storage)));
 }
 
 /**
@@ -1442,12 +1473,12 @@
         return -1;
     }
 
-    int sock;
-    sock = socket(PF_INET6, type, 0);
-    if (sock < 0 && errno == EAFNOSUPPORT) {
+    // Try IPv6 but fall back to IPv4...
+    int sock = socket(PF_INET6, type, 0);
+    if (sock == -1 && errno == EAFNOSUPPORT) {
         sock = socket(PF_INET, type, 0);
     }
-    if (sock < 0) {
+    if (sock == -1) {
         jniThrowSocketException(env, errno);
         return sock;
     }
@@ -1774,9 +1805,8 @@
         return;
     }
 
-    sockaddr_storage tmp;
-    const sockaddr* realAddress = convertIpv4ToMapped(fd, &socketAddress, &tmp, false);
-    int rc = TEMP_FAILURE_RETRY(bind(fd, realAddress, sizeof(sockaddr_storage)));
+    const CompatibleSocketAddress compatibleAddress(fd, socketAddress, false);
+    int rc = TEMP_FAILURE_RETRY(bind(fd, compatibleAddress.get(), sizeof(sockaddr_storage)));
     if (rc == -1) {
         jniThrowBindException(env, errno);
     }
@@ -1936,12 +1966,14 @@
         return;
     }
 
-    sockaddr_storage sockAddr;
-    memset(&sockAddr, 0, sizeof(sockAddr));
-    sockAddr.ss_family = AF_UNSPEC;
-
-    int result = doConnect(fd, &sockAddr);
-    if (result < 0) {
+    // To disconnect a datagram socket, we connect to a bogus address with
+    // the family AF_UNSPEC.
+    sockaddr_storage ss;
+    memset(&ss, 0, sizeof(ss));
+    ss.ss_family = AF_UNSPEC;
+    const sockaddr* sa = reinterpret_cast<const sockaddr*>(&ss);
+    int rc = TEMP_FAILURE_RETRY(connect(fd, sa, sizeof(ss)));
+    if (rc == -1) {
         jniThrowSocketException(env, errno);
     }
 }
diff --git a/libcore/luni/src/test/java/tests/api/java/net/NetworkInterfaceTest.java b/libcore/luni/src/test/java/tests/api/java/net/NetworkInterfaceTest.java
index 0272af1..26960c4 100644
--- a/libcore/luni/src/test/java/tests/api/java/net/NetworkInterfaceTest.java
+++ b/libcore/luni/src/test/java/tests/api/java/net/NetworkInterfaceTest.java
@@ -17,597 +17,545 @@
 
 package tests.api.java.net;
 
-import dalvik.annotation.TestTargetClass; 
-import dalvik.annotation.TestTargets;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetNew;
-
 import java.net.InetAddress;
+import java.net.InterfaceAddress;
 import java.net.NetworkInterface;
 import java.net.SocketException;
-import java.security.Permission;
 import java.util.ArrayList;
 import java.util.Enumeration;
+import java.util.List;
 
-@TestTargetClass(NetworkInterface.class) 
 public class NetworkInterfaceTest extends junit.framework.TestCase {
 
-    // private member variables used for tests
-    boolean atLeastOneInterface = false;
+	// private member variables used for tests
+    Enumeration<NetworkInterface> theInterfaces = null;
 
-    boolean atLeastTwoInterfaces = false;
+	boolean atLeastOneInterface = false;
 
-    private NetworkInterface networkInterface1 = null;
+	boolean atLeastTwoInterfaces = false;
 
-    private NetworkInterface sameAsNetworkInterface1 = null;
+	private NetworkInterface networkInterface1 = null;
 
-    private NetworkInterface networkInterface2 = null;
+	private NetworkInterface sameAsNetworkInterface1 = null;
 
-    /**
-     * @tests java.net.NetworkInterface#getName()
-     */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "",
-        method = "getName",
-        args = {}
-    )
-    public void test_getName() {
-        if (atLeastOneInterface) {
-            assertNotNull("validate that non null name is returned",
-                    networkInterface1.getName());
-            assertFalse("validate that non-zero length name is generated",
-                    networkInterface1.getName().equals(""));
-        }
-        if (atLeastTwoInterfaces) {
-            assertFalse(
-                    "Validate strings are different for different interfaces",
-                    networkInterface1.getName().equals(
-                            networkInterface2.getName()));
-        }
-    }
+	private NetworkInterface networkInterface2 = null;
 
-    /**
-     * @tests java.net.NetworkInterface#getInetAddresses()
-     */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "",
-        method = "getInetAddresses",
-        args = {}
-    )
-    public void test_getInetAddresses() {
+	/**
+	 * @tests java.net.NetworkInterface#getName()
+	 */
+	public void test_getName() {
+		if (atLeastOneInterface) {
+			assertNotNull("validate that non null name is returned",
+					networkInterface1.getName());
+			assertFalse("validate that non-zero length name is generated",
+					networkInterface1.getName().equals(""));
+		}
+		if (atLeastTwoInterfaces) {
+			assertFalse(
+					"Validate strings are different for different interfaces",
+					networkInterface1.getName().equals(
+							networkInterface2.getName()));
+		}
+	}
 
-        // security manager that allows us to check that we only return the
-        // addresses that we should
-        class mySecurityManager extends SecurityManager {
+	/**
+	 * @tests java.net.NetworkInterface#getInetAddresses()
+	 */
+	public void test_getInetAddresses() throws Exception {
 
-            ArrayList disallowedNames = null;
+		// security manager that allows us to check that we only return the
+		// addresses that we should
+		class mySecurityManager extends SecurityManager {
 
-            public mySecurityManager(ArrayList addresses) {
-                disallowedNames = new ArrayList();
-                for (int i = 0; i < addresses.size(); i++) {
-                    disallowedNames.add(((InetAddress) addresses.get(i))
-                            .getHostName());
-                    disallowedNames.add(((InetAddress) addresses.get(i))
-                            .getHostAddress());
-                }
-            }
+			ArrayList disallowedNames = null;
 
-            public void checkConnect(String host, int port) {
+			public mySecurityManager(ArrayList addresses) {
+				disallowedNames = new ArrayList();
+				for (int i = 0; i < addresses.size(); i++) {
+					disallowedNames.add(((InetAddress) addresses.get(i))
+							.getHostName());
+					disallowedNames.add(((InetAddress) addresses.get(i))
+							.getHostAddress());
+				}
+			}
 
-                if (host == null) {
-                    throw new NullPointerException("host was null)");
-                }
+			public void checkConnect(String host, int port) {
 
-                for (int i = 0; i < disallowedNames.size(); i++) {
-                    if (((String) disallowedNames.get(i)).equals(host)) {
-                        throw new SecurityException("not allowed");
-                    }
-                }
-            }
+				if (host == null) {
+					throw new NullPointerException("host was null)");
+				}
 
-            public void checkPermission(Permission perm) {
-                // allow everything
-            }
-        }
+				for (int i = 0; i < disallowedNames.size(); i++) {
+					if (((String) disallowedNames.get(i)).equals(host)) {
+						throw new SecurityException("not allowed");
+					}
+				}
+			}
 
-        if (atLeastOneInterface) {
+		}
+
+		if (atLeastOneInterface) {
             Enumeration theAddresses = networkInterface1.getInetAddresses();
-            if (theAddresses != null) {
-                while (theAddresses.hasMoreElements()) {
-                    InetAddress theAddress = (InetAddress) theAddresses
-                            .nextElement();
-                    assertTrue("validate that address is not null",
-                            null != theAddress);
-                }
+            while (theAddresses.hasMoreElements()) {
+                InetAddress theAddress = (InetAddress) theAddresses
+                        .nextElement();
+                assertNotNull("validate that address is not null", theAddress);
             }
         }
 
-        if (atLeastTwoInterfaces) {
-            Enumeration theAddresses = networkInterface2.getInetAddresses();
-            if (theAddresses != null) {
-                while (theAddresses.hasMoreElements()) {
-                    InetAddress theAddress = (InetAddress) theAddresses
+		if (atLeastTwoInterfaces) {
+			Enumeration theAddresses = networkInterface2.getInetAddresses();
+			while (theAddresses.hasMoreElements()) {
+                InetAddress theAddress = (InetAddress) theAddresses
+                        .nextElement();
+                assertNotNull("validate that address is not null", theAddress);
+            }
+		}
+
+		// create the list of ok and not ok addresses to return
+		if (atLeastOneInterface) {
+			ArrayList okAddresses = new ArrayList();
+			Enumeration addresses = networkInterface1.getInetAddresses();
+			int index = 0;
+			ArrayList notOkAddresses = new ArrayList();
+			while (addresses.hasMoreElements()) {
+                InetAddress theAddress = (InetAddress) addresses.nextElement();
+                if (index != 0) {
+                    okAddresses.add(theAddress);
+                } else {
+                    notOkAddresses.add(theAddress);
+                }
+                index++;
+            }
+
+			// do the same for network interface 2 if it exists
+			if (atLeastTwoInterfaces) {
+				addresses = networkInterface2.getInetAddresses();
+				index = 0;
+				while (addresses.hasMoreElements()) {
+					InetAddress theAddress = (InetAddress) addresses
+							.nextElement();
+					if (index != 0) {
+						okAddresses.add(theAddress);
+					} else {
+						notOkAddresses.add(theAddress);
+					}
+					index++;
+				}
+			}
+
+			// set the security manager that will make the first address not
+			// visible
+			System.setSecurityManager(new mySecurityManager(notOkAddresses));
+
+			// validate not ok addresses are not returned
+			for (int i = 0; i < notOkAddresses.size(); i++) {
+				Enumeration reducedAddresses = networkInterface1
+						.getInetAddresses();
+				while (reducedAddresses.hasMoreElements()) {
+                    InetAddress nextAddress = (InetAddress) reducedAddresses
                             .nextElement();
-                    assertTrue("validate that address is not null",
-                            null != theAddress);
+                    assertTrue(
+                            "validate that address without permission is not returned",
+                            !nextAddress.equals(notOkAddresses.get(i)));
                 }
-            }
-        }
-
-        // create the list of ok and not ok addresses to return
-        if (atLeastOneInterface) {
-            ArrayList okAddresses = new ArrayList();
-            Enumeration addresses = networkInterface1.getInetAddresses();
-            int index = 0;
-            ArrayList notOkAddresses = new ArrayList();
-            if (addresses != null) {
-                while (addresses.hasMoreElements()) {
-                    InetAddress theAddress = (InetAddress) addresses
-                            .nextElement();
-                    if (index != 0) {
-                        okAddresses.add(theAddress);
-                    } else {
-                        notOkAddresses.add(theAddress);
-                    }
-                    index++;
-                }
-            }
-
-            // do the same for network interface 2 it it exists
-            if (atLeastTwoInterfaces) {
-                addresses = networkInterface2.getInetAddresses();
-                index = 0;
-                if (addresses != null) {
-                    while (addresses.hasMoreElements()) {
-                        InetAddress theAddress = (InetAddress) addresses
-                                .nextElement();
-                        if (index != 0) {
-                            okAddresses.add(theAddress);
-                        } else {
-                            notOkAddresses.add(theAddress);
-                        }
-                        index++;
-                    }
-                }
-            }
-
-            // set the security manager that will make the first address not
-            // visible
-            System.setSecurityManager(new mySecurityManager(notOkAddresses));
-
-            // validate not ok addresses are not returned
-            for (int i = 0; i < notOkAddresses.size(); i++) {
-                Enumeration reducedAddresses = networkInterface1
-                        .getInetAddresses();
-                if (reducedAddresses != null) {
-                    while (reducedAddresses.hasMoreElements()) {
-                        InetAddress nextAddress = (InetAddress) reducedAddresses
-                                .nextElement();
-                        assertTrue(
-                                "validate that address without permission is not returned",
-                                !nextAddress.equals(notOkAddresses.get(i)));
-                    }
-                }
-                if (atLeastTwoInterfaces) {
+				if (atLeastTwoInterfaces) {
                     reducedAddresses = networkInterface2.getInetAddresses();
-                    if (reducedAddresses != null) {
-                        while (reducedAddresses.hasMoreElements()) {
-                            InetAddress nextAddress = (InetAddress) reducedAddresses
-                                    .nextElement();
-                            assertTrue(
-                                    "validate that address without permission is not returned",
-                                    !nextAddress.equals(notOkAddresses.get(i)));
-                        }
+					while (reducedAddresses.hasMoreElements()) {
+						InetAddress nextAddress = (InetAddress) reducedAddresses
+								.nextElement();
+						assertTrue(
+								"validate that address without permission is not returned",
+								!nextAddress.equals(notOkAddresses.get(i)));
+					}
+				}
+			}
+
+			// validate that ok addresses are returned
+			for (int i = 0; i < okAddresses.size(); i++) {
+				boolean addressReturned = false;
+				Enumeration reducedAddresses = networkInterface1
+						.getInetAddresses();
+				while (reducedAddresses.hasMoreElements()) {
+                    InetAddress nextAddress = (InetAddress) reducedAddresses
+                            .nextElement();
+                    if (nextAddress.equals(okAddresses.get(i))) {
+                        addressReturned = true;
                     }
                 }
+				if (atLeastTwoInterfaces) {
+					reducedAddresses = networkInterface2.getInetAddresses();
+					while (reducedAddresses.hasMoreElements()) {
+						InetAddress nextAddress = (InetAddress) reducedAddresses
+								.nextElement();
+						if (nextAddress.equals(okAddresses.get(i))) {
+							addressReturned = true;
+						}
+					}
+				}
+				assertTrue("validate that address with permission is returned",
+						addressReturned);
+			}
+
+			// validate that we can get the interface by specifying the address.
+			// This is to be compatible
+			for (int i = 0; i < notOkAddresses.size(); i++) {
+                assertNotNull(
+                        "validate we cannot get the NetworkInterface with an address for which we have no privs",
+                        NetworkInterface
+                                .getByInetAddress((InetAddress) notOkAddresses
+                                        .get(i)));
             }
 
-            // validate that ok addresses are returned
-            for (int i = 0; i < okAddresses.size(); i++) {
-                boolean addressReturned = false;
-                Enumeration reducedAddresses = networkInterface1
-                        .getInetAddresses();
-                if (reducedAddresses != null) {
-                    while (reducedAddresses.hasMoreElements()) {
-                        InetAddress nextAddress = (InetAddress) reducedAddresses
-                                .nextElement();
-                        if (nextAddress.equals(okAddresses.get(i))) {
-                            addressReturned = true;
-                        }
-                    }
-                }
-                if (atLeastTwoInterfaces) {
-                    reducedAddresses = networkInterface2.getInetAddresses();
-                    if (reducedAddresses != null) {
-                        while (reducedAddresses.hasMoreElements()) {
-                            InetAddress nextAddress = (InetAddress) reducedAddresses
-                                    .nextElement();
-                            if (nextAddress.equals(okAddresses.get(i))) {
-                                addressReturned = true;
-                            }
-                        }
-                    }
-                }
-                assertTrue("validate that address with permission is returned",
-                        addressReturned);
+			// validate that we can get the network interface for the good
+			// addresses
+			for (int i = 0; i < okAddresses.size(); i++) {
+                assertNotNull(
+                        "validate we cannot get the NetworkInterface with an address fro which we have no privs",
+                        NetworkInterface
+                                .getByInetAddress((InetAddress) okAddresses
+                                        .get(i)));
             }
 
-            // validate that we can get the interface by specifying the address.
-            // This is to be compatible
-            for (int i = 0; i < notOkAddresses.size(); i++) {
-                try {
-                    assertNotNull(
-                            "validate we cannot get the NetworkInterface with an address for which we have no privs",
-                            NetworkInterface
-                                    .getByInetAddress((InetAddress) notOkAddresses
-                                            .get(i)));
-                } catch (Exception e) {
-                    fail("get NetworkInterface for address with no perm - exception");
-                }
-            }
+			System.setSecurityManager(null);
+		}
+	}
 
-            // validate that we can get the network interface for the good
-            // addresses
-            try {
-                for (int i = 0; i < okAddresses.size(); i++) {
-                    assertNotNull(
-                            "validate we cannot get the NetworkInterface with an address fro which we have no privs",
-                            NetworkInterface
-                                    .getByInetAddress((InetAddress) okAddresses
-                                            .get(i)));
-                }
-            } catch (Exception e) {
-                fail("get NetworkInterface for address with perm - exception");
-            }
+	/**
+	 * @tests java.net.NetworkInterface#getDisplayName()
+	 */
+	public void test_getDisplayName() {
+		if (atLeastOneInterface) {
+			assertNotNull("validate that non null display name is returned",
+					networkInterface1.getDisplayName());
+			assertFalse(
+					"validate that non-zero length display name is generated",
+					networkInterface1.getDisplayName().equals(""));
+		}
+		if (atLeastTwoInterfaces) {
+			assertFalse(
+					"Validate strings are different for different interfaces",
+					networkInterface1.getDisplayName().equals(
+							networkInterface2.getDisplayName()));
+		}
+	}
 
-            System.setSecurityManager(null);
-        }
-    }
-
-    /**
-     * @tests java.net.NetworkInterface#getDisplayName()
-     */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "",
-        method = "getDisplayName",
-        args = {}
-    )
-    public void test_getDisplayName() {
-        if (atLeastOneInterface) {
-            assertNotNull("validate that non null display name is returned",
-                    networkInterface1.getDisplayName());
-            assertFalse(
-                    "validate that non-zero lengtj display name is generated",
-                    networkInterface1.getDisplayName().equals(""));
-        }
-        if (atLeastTwoInterfaces) {
-            assertFalse(
-                    "Validate strings are different for different interfaces",
-                    networkInterface1.getDisplayName().equals(
-                            networkInterface2.getDisplayName()));
-        }
-    }
-
-    /**
-     * @tests java.net.NetworkInterface#getByName(java.lang.String)
-     */
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        notes = "SocketException checking missed.",
-        method = "getByName",
-        args = {java.lang.String.class}
-    )
-    public void test_getByNameLjava_lang_String() {
-        try {
-            assertNull("validate null handled ok",
+	/**
+	 * @tests java.net.NetworkInterface#getByName(java.lang.String)
+	 */
+	public void test_getByNameLjava_lang_String() throws Exception {
+		try {
+			assertNull("validate null handled ok",
                                    NetworkInterface.getByName(null));
-            fail("getByName did not throw NullPointerException for null argument");
-        } catch (NullPointerException e) {
-        } catch (Exception e) {
-            fail("getByName, null inetAddress - raised exception : "
-                    + e.getMessage());
-        }
+			fail("getByName did not throw NullPointerException for null argument");
+		} catch (NullPointerException e) {
+		} 
 
-        try {
-            assertNull("validate handled ok if we ask for name not associated with any interface",
-                                   NetworkInterface.getByName("8not a name4"));
-        } catch (Exception e) {
-            fail("getByName, unknown inetAddress - raised exception : "
-                    + e.getMessage());
-        }
+		assertNull("validate handled ok if we ask for name not associated with any interface",
+                                  NetworkInterface.getByName("8not a name4"));
 
-        // for each address in an interface validate that we get the right
-        // interface for that name
-        if (atLeastOneInterface) {
-            String theName = networkInterface1.getName();
-            if (theName != null) {
-                try {
-                    assertTrue(
-                            "validate that Interface can be obtained with its name",
-                            NetworkInterface.getByName(theName).equals(
-                                    networkInterface1));
-                } catch (Exception e) {
-                    fail("validate to get network interface using name - socket exception");
-                }
+		// for each address in an interface validate that we get the right
+		// interface for that name
+		if (atLeastOneInterface) {
+			String theName = networkInterface1.getName();
+			if (theName != null) {
+                assertEquals(
+                        "validate that Interface can be obtained with its name",
+                        networkInterface1, NetworkInterface.getByName(theName));
             }
-            try {
-                NetworkInterface.getByName(null);
-                fail("NullPointerException was not thrown.");
-            } catch(NullPointerException npe) {
-                //expected
-            } catch (SocketException e) {
-                fail("SocketException was thrown.");
+		}
+
+		// validate that we get the right interface with the second interface as
+		// well (ie we just don't always get the first interface
+		if (atLeastTwoInterfaces) {
+			String theName = networkInterface2.getName();
+			if (theName != null) {
+                assertEquals(
+                        "validate that Interface can be obtained with its name",
+                        networkInterface2, NetworkInterface.getByName(theName));
             }
-        }
+		}
+	}
 
-        // validate that we get the right interface with the second interface as
-        // well (ie we just don't always get the first interface
-        if (atLeastTwoInterfaces) {
-            String theName = networkInterface2.getName();
-            if (theName != null) {
-                try {
-                    assertTrue(
-                            "validate that Interface can be obtained with its name",
-                            NetworkInterface.getByName(theName).equals(
-                                    networkInterface2));
-                } catch (Exception e) {
-                    fail("validate to get network interface using name - socket exception");
-                }
-            }
-        }
-    }
+	/**
+	 * @tests java.net.NetworkInterface#getByInetAddress(java.net.InetAddress)
+	 */
+	public void test_getByInetAddressLjava_net_InetAddress() throws Exception {
 
-    /**
-     * @tests java.net.NetworkInterface#getByInetAddress(java.net.InetAddress)
-     */
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        notes = "SocketException checking missed.",
-        method = "getByInetAddress",
-        args = {java.net.InetAddress.class}
-    )
-    public void test_getByInetAddressLjava_net_InetAddress() {
+		byte addressBytes[] = new byte[4];
+		addressBytes[0] = 0;
+		addressBytes[1] = 0;
+		addressBytes[2] = 0;
+		addressBytes[3] = 0;
 
-        byte addressBytes[] = new byte[4];
-        addressBytes[0] = 0;
-        addressBytes[1] = 0;
-        addressBytes[2] = 0;
-        addressBytes[3] = 0;
-
-        try {
-            assertNull("validate null handled ok",
+		try {
+			assertNull("validate null handled ok",
                                    NetworkInterface.getByInetAddress(null));
-            fail("should not get here if getByInetAddress throws "
-                    + "NullPointerException if null passed in");
-        } catch (NullPointerException e) {
-        } catch (Exception e) {
-            fail("getByInetAddress, null inetAddress should have raised NPE"
-                    + " but instead threw a : " + e.getMessage());
-        }
+			fail("should not get here if getByInetAddress throws "
+					+ "NullPointerException if null passed in");
+		} catch (NullPointerException e) {
+		}
 
-        try {
-            assertNull("validate handled ok if we ask for address not associated with any interface",
-                                   NetworkInterface.getByInetAddress(InetAddress
-                            .getByAddress(addressBytes)));
-        } catch (Exception e) {
-            fail("getByInetAddress, unknown inetAddress threw exception : " + e);
-        }
+                assertNull("validate handled ok if we ask for address not associated with any interface",
+                           NetworkInterface.getByInetAddress(InetAddress
+                                                .getByAddress(addressBytes)));
 
-        // for each address in an interface validate that we get the right
-        // interface for that address
-        if (atLeastOneInterface) {
-            Enumeration addresses = networkInterface1.getInetAddresses();
-            if (addresses != null) {
-                while (addresses.hasMoreElements()) {
-                    InetAddress theAddress = (InetAddress) addresses
-                            .nextElement();
-                    try {
-                        assertTrue(
-                                "validate that Interface can be obtained with any one of its addresses",
-                                NetworkInterface.getByInetAddress(theAddress)
-                                        .equals(networkInterface1));
-                    } catch (Exception e) {
-                        fail("validate to get address using inetAddress " +
-                                "threw exception : " + e);
-                    }
-                }
+		// for each address in an interface validate that we get the right
+		// interface for that address
+		if (atLeastOneInterface) {
+			Enumeration addresses = networkInterface1.getInetAddresses();
+			while (addresses.hasMoreElements()) {
+                InetAddress theAddress = (InetAddress) addresses.nextElement();
+                assertEquals(
+                        "validate that Interface can be obtained with any one of its addresses",
+                        networkInterface1, NetworkInterface
+                                .getByInetAddress(theAddress));
             }
+		}
+
+		// validate that we get the right interface with the second interface as
+		// well (ie we just don't always get the first interface
+		if (atLeastTwoInterfaces) {
+			Enumeration addresses = networkInterface2.getInetAddresses();
+			while (addresses.hasMoreElements()) {
+                InetAddress theAddress = (InetAddress) addresses.nextElement();
+                assertEquals(
+                        "validate that Interface can be obtained with any one of its addresses",
+                        networkInterface2, NetworkInterface
+                                .getByInetAddress(theAddress));
+            }
+		}
+	}
+
+	/**
+	 * @tests java.net.NetworkInterface#getNetworkInterfaces()
+	 */
+	public void test_getNetworkInterfaces() throws Exception {
+
+		// really this is tested by all of the other calls but just make sure we
+		// can call it and get a list of interfaces if they exist
+		Enumeration theInterfaces = NetworkInterface.getNetworkInterfaces();
+	}
+
+	/**
+	 * @tests java.net.NetworkInterface#equals(java.lang.Object)
+	 */
+	public void test_equalsLjava_lang_Object() {
+		// Test for method boolean
+		// java.net.SocketPermission.equals(java.lang.Object)
+		if (atLeastOneInterface) {
+            assertEquals("If objects are the same true is returned",
+                    sameAsNetworkInterface1, networkInterface1);
+            assertNotNull("Validate Null handled ok", networkInterface1);
+        }
+		if (atLeastTwoInterfaces) {
+			assertFalse("If objects are different false is returned",
+					networkInterface1.equals(networkInterface2));
+		}
+	}
+
+	/**
+	 * @tests java.net.NetworkInterface#hashCode()
+	 */
+	public void test_hashCode() {
+
+		if (atLeastOneInterface) {
+			assertTrue(
+					"validate that hash codes are the same for two calls on the same object",
+					networkInterface1.hashCode() == networkInterface1
+							.hashCode());
+			assertTrue(
+					"validate that hash codes are the same for two objects for which equals is true",
+					networkInterface1.hashCode() == sameAsNetworkInterface1
+							.hashCode());
+		}
+	}
+
+	/**
+	 * @tests java.net.NetworkInterface#toString()
+	 */
+	public void test_toString() {
+		if (atLeastOneInterface) {
+			assertNotNull("validate that non null string is generated",
+					networkInterface1.toString());
+			assertFalse("validate that non-zero length string is generated",
+					networkInterface1.toString().equals(""));
+		}
+		if (atLeastTwoInterfaces) {
+			assertFalse(
+					"Validate strings are different for different interfaces",
+					networkInterface1.toString().equals(
+							networkInterface2.toString()));
+		}
+	}
+
+    private class MockSecurityManager extends SecurityManager {
+        @Override
+        public void checkConnect(String host, int port) {
+            throw new SecurityException();
+        }
+    }
+
+    /**
+     * 
+     * @tests java.net.NetworkInterface#getInterfaceAddresses()
+     * 
+     * @since 1.6
+     */
+    public void test_getInterfaceAddresses() throws SocketException {
+        if (theInterfaces != null) {
+            SecurityManager oldSM = System.getSecurityManager();
+            System.setSecurityManager(new MockSecurityManager());
             
-            try {
-                NetworkInterface.getByInetAddress(null);
-                fail("NullPointerException should be thrown.");
-            } catch(NullPointerException npe) {
-                //expected
-            } catch (SocketException e) {
-                fail("SocketException was thrown.");
+            while (theInterfaces.hasMoreElements()) {
+                NetworkInterface netif = theInterfaces.nextElement();
+                assertEquals(netif.getName()
+                        + " getInterfaceAddresses should contain no element", 0,
+                        netif.getInterfaceAddresses().size());
             }
-        }
-
-        // validate that we get the right interface with the second interface as
-        // well (ie we just don't always get the first interface
-        if (atLeastTwoInterfaces) {
-            Enumeration addresses = networkInterface2.getInetAddresses();
-            if (addresses != null) {
-                while (addresses.hasMoreElements()) {
-                    InetAddress theAddress = (InetAddress) addresses
-                            .nextElement();
-                    try {
-                        assertTrue(
-                                "validate that Interface can be obtained with any one of its addresses",
-                                NetworkInterface.getByInetAddress(theAddress)
-                                        .equals(networkInterface2));
-                    } catch (Exception e) {
-                        fail("validate to get address using inetAddress "
-                                + "threw exception : " + e);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * @tests java.net.NetworkInterface#getNetworkInterfaces()
-     */
-    @TestTargetNew(
-        level = TestLevel.SUFFICIENT,
-        notes = "SocketException checking missed.",
-        method = "getNetworkInterfaces",
-        args = {}
-    )
-    public void test_getNetworkInterfaces() {
-
-        // really this is tested by all of the other calls but just make sure we
-        // can call it and get a list of interfaces if they exist
-        try {
-            Enumeration theInterfaces = NetworkInterface.getNetworkInterfaces();
-        } catch (Exception e) {
-            fail("get Network Interfaces - raised exception : "
-                    + e.getMessage());
-        }
-    }
-
-    /**
-     * @tests java.net.NetworkInterface#equals(java.lang.Object)
-     */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "",
-        method = "equals",
-        args = {java.lang.Object.class}
-    )
-    public void test_equalsLjava_lang_Object() {
-        // Test for method boolean
-        // java.net.SocketPermission.equals(java.lang.Object)
-        if (atLeastOneInterface) {
-            assertTrue("If objects are the same true is returned",
-                    networkInterface1.equals(sameAsNetworkInterface1));
-            assertFalse("Validate Null handled ok", networkInterface1
-                    .equals(null));
-        }
-        if (atLeastTwoInterfaces) {
-            assertFalse("If objects are different false is returned",
-                    networkInterface1.equals(networkInterface2));
-        }
-    }
-
-    /**
-     * @tests java.net.NetworkInterface#hashCode()
-     */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "",
-        method = "hashCode",
-        args = {}
-    )
-    public void test_hashCode() {
-
-        if (atLeastOneInterface) {
-            assertTrue(
-                    "validate that hash codes are the same for two calls on the same object",
-                    networkInterface1.hashCode() == networkInterface1
-                            .hashCode());
-            assertTrue(
-                    "validate that hash codes are the same for two objects for which equals is true",
-                    networkInterface1.hashCode() == sameAsNetworkInterface1
-                            .hashCode());
-        }
-    }
-
-    /**
-     * @tests java.net.NetworkInterface#toString()
-     */
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        notes = "",
-        method = "toString",
-        args = {}
-    )
-    public void test_toString() {
-        if (atLeastOneInterface) {
-            assertNotNull("validate that non null string is generated",
-                    networkInterface1.toString());
-            assertFalse("validate that non-zero length string is generated",
-                    networkInterface1.toString().equals(""));
-        }
-        if (atLeastTwoInterfaces) {
-            assertFalse(
-                    "Validate strings are different for different interfaces",
-                    networkInterface1.toString().equals(
-                            networkInterface2.toString()));
-        }
-    }
-
-    protected void setUp() {
-
-        Enumeration theInterfaces = null;
-        try {
+            System.setSecurityManager(oldSM);
+            
             theInterfaces = NetworkInterface.getNetworkInterfaces();
-        } catch (Exception e) {
-            fail("Exception occurred getting network interfaces : " + e);
+            while (theInterfaces.hasMoreElements()) {
+                NetworkInterface netif = theInterfaces.nextElement();
+                List<InterfaceAddress> interfaceAddrs = netif.getInterfaceAddresses();
+                assertTrue(interfaceAddrs instanceof ArrayList);
+                for (InterfaceAddress addr : interfaceAddrs) {
+                    assertNotNull(addr);                    
+                }
+                
+                List<InterfaceAddress> interfaceAddrs2 = netif.getInterfaceAddresses();
+                // RI fails on this since it cannot tolerate null broadcast address. 
+                assertEquals(interfaceAddrs, interfaceAddrs2);              
+            }
         }
-        
-        // Set up NetworkInterface instance members. Note that because the call
-        // to NetworkInterface.getNetworkInterfaces() returns *all* of the 
-        // interfaces on the test machine it is possible that one or more of 
-        // them will not currently be bound to an InetAddress. e.g. a laptop
-        // running connected by a wire to the local network may also have a 
-        // wireless interface that is not active and so has no InetAddress 
-        // bound to it. For these tests only work with NetworkInterface objects 
-        // that are bound to an InetAddress.   
-        if ((theInterfaces != null) && (theInterfaces.hasMoreElements())) {
-            while ((theInterfaces.hasMoreElements())
-                    && (atLeastOneInterface == false)) {
-                NetworkInterface theInterface = (NetworkInterface) theInterfaces
-                        .nextElement();
-                if (theInterface.getInetAddresses() != null) {
-                    // Ensure that the current NetworkInterface has at least
-                    // one InetAddress bound to it.  
-                    Enumeration addrs = theInterface.getInetAddresses();
-                    if ((addrs != null) && (addrs.hasMoreElements())) {
-                        atLeastOneInterface = true;
-                        networkInterface1 = theInterface;
-                    }// end if 
-                }
-            }
-
-            while ((theInterfaces.hasMoreElements())
-                    && (atLeastTwoInterfaces == false)) {
-                NetworkInterface theInterface = (NetworkInterface) theInterfaces
-                        .nextElement();
-                if (theInterface.getInetAddresses() != null) {
-                    // Ensure that the current NetworkInterface has at least
-                    // one InetAddress bound to it.  
-                    Enumeration addrs = theInterface.getInetAddresses();
-                    if ((addrs != null) && (addrs.hasMoreElements())) {
-                        atLeastTwoInterfaces = true;
-                        networkInterface2 = theInterface;
-                    }// end if 
-                }
-            }
-
-            // Only set sameAsNetworkInterface1 if we succeeded in finding 
-            // at least one good NetworkInterface
-            if (atLeastOneInterface) {
-                Enumeration addresses = networkInterface1.getInetAddresses();
-                if (addresses != null) {
-                    try {
-                        if (addresses.hasMoreElements()) {
-                            sameAsNetworkInterface1 = NetworkInterface
-                            .getByInetAddress((InetAddress) addresses
-                                    .nextElement());
-                        }
-                    } catch (SocketException e) {
-                        fail("SocketException occurred : " + e);
+    }   
+    
+    /**
+     * @tests java.net.NetworkInterface#isLoopback()
+     * 
+     * @since 1.6
+     */
+    public void test_isLoopback() throws SocketException {  
+        if (theInterfaces != null) {
+            while (theInterfaces.hasMoreElements()) {
+                NetworkInterface netif = theInterfaces.nextElement();
+                boolean loopback = false;
+                Enumeration<InetAddress> addrs = netif.getInetAddresses();
+                while(addrs != null && addrs.hasMoreElements()){
+                    if(addrs.nextElement().isLoopbackAddress()){
+                        loopback = true;
+                        break;
                     }
                 }
-            }// end if atLeastOneInterface
+                assertEquals(loopback, netif.isLoopback());
+            }
         }
     }
-
-    protected void tearDown() {
-        System.setSecurityManager(null);
+    
+    /**
+     * @tests java.net.NetworkInterface#getHardwareAddress()
+     * 
+     * @since 1.6
+     */
+    public void test_getHardwareAddress() throws SocketException {
+        if (theInterfaces != null) {
+            while (theInterfaces.hasMoreElements()) {
+                NetworkInterface netif = theInterfaces.nextElement();
+                byte[] hwAddr = netif.getHardwareAddress();
+                if (netif.isLoopback()) {
+                    assertTrue(hwAddr == null || hwAddr.length == 0);
+                } else {
+                    assertTrue(hwAddr.length >= 0);
+                }
+            }
+        }
     }
+    
+    /**
+     * 
+     * @tests java.net.NetworkInterface#getHardwareAddress()
+     * 
+     * @since 1.6
+     */
+    public void test_getMTU() throws SocketException {      
+        if (theInterfaces != null) {
+            while (theInterfaces.hasMoreElements()) {
+                NetworkInterface netif = theInterfaces.nextElement();
+                assertTrue(netif.getName() + "has non-positive MTU", netif.getMTU() >= 0);
+            }           
+        }
+    }
+    
+	protected void setUp() throws SocketException {
+
+		Enumeration theInterfaces = null;
+		try {
+			theInterfaces = NetworkInterface.getNetworkInterfaces();
+		} catch (Exception e) {
+			fail("Exception occurred getting network interfaces : " + e);
+		}
+		
+		// Set up NetworkInterface instance members. Note that because the call
+		// to NetworkInterface.getNetworkInterfaces() returns *all* of the 
+		// interfaces on the test machine it is possible that one or more of 
+		// them will not currently be bound to an InetAddress. e.g. a laptop
+		// running connected by a wire to the local network may also have a 
+		// wireless interface that is not active and so has no InetAddress 
+		// bound to it. For these tests only work with NetworkInterface objects 
+		// that are bound to an InetAddress.   
+		if ((theInterfaces != null) && (theInterfaces.hasMoreElements())) {
+			while ((theInterfaces.hasMoreElements())
+					&& (atLeastOneInterface == false)) {
+				NetworkInterface theInterface = (NetworkInterface) theInterfaces
+						.nextElement();
+				if (theInterface.getInetAddresses().hasMoreElements()) {
+					// Ensure that the current NetworkInterface has at least
+					// one InetAddress bound to it.  
+					Enumeration addrs = theInterface.getInetAddresses();
+					if ((addrs != null) && (addrs.hasMoreElements())) {
+						atLeastOneInterface = true;
+						networkInterface1 = theInterface;
+					}// end if 
+				}
+			}
+
+			while ((theInterfaces.hasMoreElements())
+					&& (atLeastTwoInterfaces == false)) {
+				NetworkInterface theInterface = (NetworkInterface) theInterfaces
+						.nextElement();
+				if (theInterface.getInetAddresses().hasMoreElements()) {
+					// Ensure that the current NetworkInterface has at least
+					// one InetAddress bound to it.  
+					Enumeration addrs = theInterface.getInetAddresses();
+					if ((addrs != null) && (addrs.hasMoreElements())) {
+						atLeastTwoInterfaces = true;
+						networkInterface2 = theInterface;
+					}// end if 
+				}
+			}
+
+			// Only set sameAsNetworkInterface1 if we succeeded in finding 
+			// at least one good NetworkInterface
+			if (atLeastOneInterface) {
+				Enumeration addresses = networkInterface1.getInetAddresses();
+				if (addresses.hasMoreElements()) {
+					try {
+						if (addresses.hasMoreElements()) {
+							sameAsNetworkInterface1 = NetworkInterface
+							.getByInetAddress((InetAddress) addresses
+									.nextElement());
+						}
+					} catch (SocketException e) {
+						fail("SocketException occurred : " + e);
+					}
+				}
+			}// end if atLeastOneInterface
+		}
+        theInterfaces = NetworkInterface.getNetworkInterfaces();
+	}
+
+	protected void tearDown() {
+		System.setSecurityManager(null);
+	}
 }
diff --git a/libcore/xml/src/main/java/org/apache/harmony/xml/dom/DOMImplementationImpl.java b/libcore/xml/src/main/java/org/apache/harmony/xml/dom/DOMImplementationImpl.java
index 991a707..b662a13 100644
--- a/libcore/xml/src/main/java/org/apache/harmony/xml/dom/DOMImplementationImpl.java
+++ b/libcore/xml/src/main/java/org/apache/harmony/xml/dom/DOMImplementationImpl.java
@@ -46,7 +46,7 @@
 
     public DocumentType createDocumentType(String qualifiedName,
             String publicId, String systemId) throws DOMException {
-        return new DocumentTypeImpl(this, qualifiedName, publicId, systemId);
+        return new DocumentTypeImpl(null, qualifiedName, publicId, systemId);
     }
 
     public boolean hasFeature(String feature, String version) {
diff --git a/libcore/xml/src/main/java/org/apache/harmony/xml/dom/DocumentImpl.java b/libcore/xml/src/main/java/org/apache/harmony/xml/dom/DocumentImpl.java
index b009128..b1802a6 100644
--- a/libcore/xml/src/main/java/org/apache/harmony/xml/dom/DocumentImpl.java
+++ b/libcore/xml/src/main/java/org/apache/harmony/xml/dom/DocumentImpl.java
@@ -33,6 +33,12 @@
 import org.w3c.dom.NodeList;
 import org.w3c.dom.ProcessingInstruction;
 import org.w3c.dom.Text;
+import org.w3c.dom.UserDataHandler;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.WeakHashMap;
 
 /**
  * Provides a straightforward implementation of the corresponding W3C DOM
@@ -60,14 +66,26 @@
     private boolean xmlStandalone = false;
     private boolean strictErrorChecking = true;
 
+    /**
+     * A lazily initialized map of user data values for this document's own
+     * nodes. The map is weak because the document may live longer than its
+     * nodes.
+     *
+     * <p>Attaching user data directly to the corresponding node would cost a
+     * field per node. Under the assumption that user data is rarely needed, we
+     * attach user data to the document to save those fields. Xerces also takes
+     * this approach.
+     */
+    private WeakHashMap<Node, Map<String, UserData>> nodeToUserData;
+
     public DocumentImpl(DOMImplementationImpl impl, String namespaceURI,
             String qualifiedName, DocumentType doctype, String inputEncoding) {
         super(null);
 
         this.domImplementation = impl;
         this.inputEncoding = inputEncoding;
-        // this.document = this;
-        
+        this.document = this;
+
         if (doctype != null) {
             appendChild(doctype);
         }
@@ -113,8 +131,6 @@
      * @return The new node.
      */
     Node cloneNode(Node node, boolean deep) throws DOMException {
-        // TODO: callback the UserDataHandler with a NODE_CLONED event
-
         Node target;
         
         switch (node.getNodeType()) {
@@ -191,10 +207,12 @@
                 target.appendChild(child);
             }
         }
-        
+
+        notifyUserDataHandlers(UserDataHandler.NODE_CLONED, node, target);
+
         return target;
     }
-    
+
     public AttrImpl createAttribute(String name) throws DOMException {
         return new AttrImpl(this, name);
     }
@@ -382,4 +400,48 @@
         // TODO: callback the UserDataHandler with a NODE_RENAMED event
         throw new UnsupportedOperationException(); // TODO
     }
+
+    /**
+     * Returns a map with the user data objects attached to the specified node.
+     * This map is readable and writable.
+     */
+    Map<String, UserData> getUserDataMap(Node node) {
+        if (nodeToUserData == null) {
+            nodeToUserData = new WeakHashMap<Node, Map<String, UserData>>();
+        }
+        Map<String, UserData> userDataMap = nodeToUserData.get(node);
+        if (userDataMap == null) {
+            userDataMap = new HashMap<String, UserData>();
+            nodeToUserData.put(node, userDataMap);
+        }
+        return userDataMap;
+    }
+
+    /**
+     * Returns a map with the user data objects attached to the specified node.
+     * The returned map may be read-only.
+     */
+    Map<String, UserData> getUserDataMapForRead(Node node) {
+        if (nodeToUserData == null) {
+            return Collections.emptyMap();
+        }
+        Map<String, UserData> userDataMap = nodeToUserData.get(node);
+        return userDataMap == null
+                ? Collections.<String, UserData>emptyMap()
+                : userDataMap;
+    }
+
+    /**
+     * Calls {@link UserDataHandler#handle} on each of the source node's
+     * value/handler pairs.
+     */
+    private void notifyUserDataHandlers(short operation, Node src, Node dst) {
+        for (Map.Entry<String, UserData> entry : getUserDataMapForRead(src).entrySet()) {
+            UserData userData = entry.getValue();
+            if (userData.handler != null) {
+                userData.handler.handle(
+                        operation, entry.getKey(), userData.value, src, dst);
+            }
+        }
+    }
 }
diff --git a/libcore/xml/src/main/java/org/apache/harmony/xml/dom/DocumentTypeImpl.java b/libcore/xml/src/main/java/org/apache/harmony/xml/dom/DocumentTypeImpl.java
index 67947b7..b0e8eda 100644
--- a/libcore/xml/src/main/java/org/apache/harmony/xml/dom/DocumentTypeImpl.java
+++ b/libcore/xml/src/main/java/org/apache/harmony/xml/dom/DocumentTypeImpl.java
@@ -31,7 +31,7 @@
  * the DOM implementation can easily access them while maintaining the DOM tree
  * structure.
  */
-public class DocumentTypeImpl extends LeafNodeImpl implements DocumentType {
+public final class DocumentTypeImpl extends LeafNodeImpl implements DocumentType {
 
     private String qualifiedName;
 
@@ -39,9 +39,9 @@
 
     private String systemId;
 
-    DocumentTypeImpl(DOMImplementationImpl impl, String qualifiedName,
+    public DocumentTypeImpl(DocumentImpl document, String qualifiedName,
             String publicId, String systemId) {
-        super(null);
+        super(document);
 
         if (qualifiedName == null || "".equals(qualifiedName)) {
             throw new DOMException(DOMException.NAMESPACE_ERR, qualifiedName);
diff --git a/libcore/xml/src/main/java/org/apache/harmony/xml/dom/ElementImpl.java b/libcore/xml/src/main/java/org/apache/harmony/xml/dom/ElementImpl.java
index df1383d..e272a3e 100644
--- a/libcore/xml/src/main/java/org/apache/harmony/xml/dom/ElementImpl.java
+++ b/libcore/xml/src/main/java/org/apache/harmony/xml/dom/ElementImpl.java
@@ -315,7 +315,7 @@
     public Attr setAttributeNode(Attr newAttr) throws DOMException {
         AttrImpl newAttrImpl = (AttrImpl) newAttr;
         
-        if (newAttrImpl.document != this.getOwnerDocument()) {
+        if (newAttrImpl.document != this.document) {
             throw new DOMException(DOMException.WRONG_DOCUMENT_ERR, null);
         }
 
@@ -340,7 +340,7 @@
     public Attr setAttributeNodeNS(Attr newAttr) throws DOMException {
         AttrImpl newAttrImpl = (AttrImpl) newAttr;
 
-        if (newAttrImpl.document != this.getOwnerDocument()) {
+        if (newAttrImpl.document != this.document) {
             throw new DOMException(DOMException.WRONG_DOCUMENT_ERR, null);
         }
 
diff --git a/libcore/xml/src/main/java/org/apache/harmony/xml/dom/InnerNodeImpl.java b/libcore/xml/src/main/java/org/apache/harmony/xml/dom/InnerNodeImpl.java
index fa75e21..bd4affb 100644
--- a/libcore/xml/src/main/java/org/apache/harmony/xml/dom/InnerNodeImpl.java
+++ b/libcore/xml/src/main/java/org/apache/harmony/xml/dom/InnerNodeImpl.java
@@ -43,7 +43,7 @@
     // Maintained by LeafNodeImpl and ElementImpl.
     List<LeafNodeImpl> children = new ArrayList<LeafNodeImpl>();
 
-    public InnerNodeImpl(DocumentImpl document) {
+    protected InnerNodeImpl(DocumentImpl document) {
         super(document);
     }
 
diff --git a/libcore/xml/src/main/java/org/apache/harmony/xml/dom/NamedNodeMapImpl.java b/libcore/xml/src/main/java/org/apache/harmony/xml/dom/NamedNodeMapImpl.java
index 0952d83..6eb8efa 100644
--- a/libcore/xml/src/main/java/org/apache/harmony/xml/dom/NamedNodeMapImpl.java
+++ b/libcore/xml/src/main/java/org/apache/harmony/xml/dom/NamedNodeMapImpl.java
@@ -121,7 +121,7 @@
         
         // All nodes in the map must belong to the same document.
         if (list.size() != 0) {
-            Document document = list.get(0).getOwnerDocument();
+            Document document = list.get(0).document;
 
             if (document != null && arg.getOwnerDocument() != document) {
                 throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, null);
@@ -151,7 +151,7 @@
         
         // All nodes in the map must belong to the same document.
         if (list.size() != 0) {
-            Document document = list.get(0).getOwnerDocument();
+            Document document = list.get(0).document;
 
             if (document != null && arg.getOwnerDocument() != document) {
                 throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR, null);
diff --git a/libcore/xml/src/main/java/org/apache/harmony/xml/dom/NodeImpl.java b/libcore/xml/src/main/java/org/apache/harmony/xml/dom/NodeImpl.java
index 24ed102..8376689 100644
--- a/libcore/xml/src/main/java/org/apache/harmony/xml/dom/NodeImpl.java
+++ b/libcore/xml/src/main/java/org/apache/harmony/xml/dom/NodeImpl.java
@@ -29,6 +29,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * A straightforward implementation of the corresponding W3C DOM node.
@@ -45,7 +46,6 @@
 
     private static final NodeList EMPTY_LIST = new NodeListImpl();
     
-    // Maintained by InnerNodeImpl and ElementImpl.
     DocumentImpl document;
 
     NodeImpl(DocumentImpl document) {
@@ -98,8 +98,8 @@
         return null;
     }
 
-    public Document getOwnerDocument() {
-        return document;
+    public final Document getOwnerDocument() {
+        return document == this ? null : document;
     }
 
     public Node getParentNode() {
@@ -308,7 +308,7 @@
                 }
                 // create a text node to hold the given content
                 if (textContent != null && textContent.length() != 0) {
-                    appendChild(getOwnerDocument().createTextNode(textContent));
+                    appendChild(document.createTextNode(textContent));
                 }
                 return;
 
@@ -585,12 +585,32 @@
         return isSupported(feature, version) ? this : null;
     }
 
-    public Object setUserData(String key, Object data,
-            UserDataHandler handler) {
-        throw new UnsupportedOperationException(); // TODO
+    public final Object setUserData(String key, Object data, UserDataHandler handler) {
+        if (key == null) {
+            throw new NullPointerException();
+        }
+        Map<String, UserData> map = document.getUserDataMap(this);
+        UserData previous = data == null
+                ? map.remove(key)
+                : map.put(key, new UserData(data, handler));
+        return previous != null ? previous.value : null;
     }
 
-    public Object getUserData(String key) {
-        throw new UnsupportedOperationException(); // TODO
+    public final Object getUserData(String key) {
+        if (key == null) {
+            throw new NullPointerException();
+        }
+        Map<String, UserData> map = document.getUserDataMapForRead(this);
+        UserData userData = map.get(key);
+        return userData != null ? userData.value : null;
+    }
+
+    static class UserData {
+        final Object value;
+        final UserDataHandler handler;
+        UserData(Object value, UserDataHandler handler) {
+            this.value = value;
+            this.handler = handler;
+        }
     }
 }
diff --git a/libcore/xml/src/main/java/org/apache/harmony/xml/dom/TextImpl.java b/libcore/xml/src/main/java/org/apache/harmony/xml/dom/TextImpl.java
index d39dff2..7b61b02 100644
--- a/libcore/xml/src/main/java/org/apache/harmony/xml/dom/TextImpl.java
+++ b/libcore/xml/src/main/java/org/apache/harmony/xml/dom/TextImpl.java
@@ -47,7 +47,7 @@
     }
 
     public final Text splitText(int offset) throws DOMException {
-        Text newText = getOwnerDocument().createTextNode(
+        Text newText = document.createTextNode(
                 substringData(offset, getLength() - offset));
         deleteData(0, offset);
 
diff --git a/libcore/xml/src/main/java/org/apache/harmony/xml/parsers/DocumentBuilderImpl.java b/libcore/xml/src/main/java/org/apache/harmony/xml/parsers/DocumentBuilderImpl.java
index 4b273fe..f3956f8 100644
--- a/libcore/xml/src/main/java/org/apache/harmony/xml/parsers/DocumentBuilderImpl.java
+++ b/libcore/xml/src/main/java/org/apache/harmony/xml/parsers/DocumentBuilderImpl.java
@@ -25,6 +25,7 @@
 
 import org.apache.harmony.xml.dom.CDATASectionImpl;
 import org.apache.harmony.xml.dom.DocumentImpl;
+import org.apache.harmony.xml.dom.DocumentTypeImpl;
 import org.apache.harmony.xml.dom.TextImpl;
 import org.kxml2.io.KXmlParser;
 import org.w3c.dom.Attr;
@@ -242,8 +243,8 @@
                     if (sysid != null && sysid.length() >= 2 && sysid.startsWith("\"") && sysid.endsWith("\"")) {
                         sysid = sysid.substring(1, sysid.length() - 1);
                     }
-                    
-                    document.appendChild(dom.createDocumentType(name, pubid, sysid));
+
+                    document.appendChild(new DocumentTypeImpl(document, name, pubid, sysid));
                 }
                 
             } else if (token == XmlPullParser.COMMENT) {
diff --git a/libcore/xml/src/test/java/tests/xml/DomTest.java b/libcore/xml/src/test/java/tests/xml/DomTest.java
index 69e8b37..0bb27dc 100644
--- a/libcore/xml/src/test/java/tests/xml/DomTest.java
+++ b/libcore/xml/src/test/java/tests/xml/DomTest.java
@@ -31,6 +31,7 @@
 import org.w3c.dom.Notation;
 import org.w3c.dom.ProcessingInstruction;
 import org.w3c.dom.Text;
+import org.w3c.dom.UserDataHandler;
 import org.xml.sax.InputSource;
 
 import javax.xml.parsers.DocumentBuilder;
@@ -44,7 +45,11 @@
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
+
+import static org.w3c.dom.UserDataHandler.NODE_CLONED;
 
 /**
  * Construct a DOM and then interrogate it.
@@ -87,6 +92,7 @@
     private Element name;
     private Attr standard;
     private Attr deluxe;
+    private Text waffles;
     private Element description;
     private Text descriptionText1;
     private CDATASection descriptionText2;
@@ -128,6 +134,7 @@
         name = (Element) item.getChildNodes().item(1);
         standard = name.getAttributeNode("a:standard");
         deluxe = name.getAttributeNode("deluxe");
+        waffles = (Text) name.getChildNodes().item(0);
         description = (Element) item.getChildNodes().item(3);
         descriptionText1 = (Text) description.getChildNodes().item(0);
         descriptionText2 = (CDATASection) description.getChildNodes().item(1);
@@ -153,7 +160,7 @@
         }
 
         allNodes.addAll(Arrays.asList(document, doctype, menu, item, itemXmlns,
-                itemXmlnsA, name, standard, deluxe, description,
+                itemXmlnsA, name, standard, deluxe, waffles, description,
                 descriptionText1, descriptionText2, descriptionText3, option1,
                 option2, option2Reference, wafflemaker, nutrition, vitamins,
                 vitaminsXmlnsA, comment, vitaminc, vitamincText));
@@ -740,6 +747,87 @@
         assertEquals(expected, domToString(document));
     }
 
+    public void testUserDataAttachments() {
+        Object a = new Object();
+        Object b = new Object();
+        for (Node node : allNodes) {
+            node.setUserData("a", a, null);
+            node.setUserData("b", b, null);
+        }
+        for (Node node : allNodes) {
+            assertSame(a, node.getUserData("a"));
+            assertSame(b, node.getUserData("b"));
+            assertEquals(null, node.getUserData("c"));
+            assertEquals(null, node.getUserData("A"));
+        }
+    }
+
+    public void testUserDataRejectsNullKey() {
+        try {
+            menu.setUserData(null, "apple", null);
+            fail();
+        } catch (NullPointerException e) {
+        }
+        try {
+            menu.getUserData(null);
+            fail();
+        } catch (NullPointerException e) {
+        }
+    }
+
+    /**
+     * A shallow clone requires cloning the attributes but not the child nodes.
+     */
+    public void testUserDataHandlerNotifiedOfShallowClones() {
+        RecordingHandler handler = new RecordingHandler();
+        name.setUserData("a", "apple", handler);
+        name.setUserData("b", "banana", handler);
+        standard.setUserData("c", "cat", handler);
+        waffles.setUserData("d", "dog", handler);
+
+        Element clonedName = (Element) name.cloneNode(false);
+        Attr clonedStandard = clonedName.getAttributeNode("a:standard");
+
+        Set<String> expected = new HashSet<String>();
+        expected.add(notification(NODE_CLONED, "a", "apple", name, clonedName));
+        expected.add(notification(NODE_CLONED, "b", "banana", name, clonedName));
+        expected.add(notification(NODE_CLONED, "c", "cat", standard, clonedStandard));
+        assertEquals(expected, handler.calls);
+    }
+
+    /**
+     * A deep clone requires cloning both the attributes and the child nodes.
+     */
+    public void testUserDataHandlerNotifiedOfDeepClones() {
+        RecordingHandler handler = new RecordingHandler();
+        name.setUserData("a", "apple", handler);
+        name.setUserData("b", "banana", handler);
+        standard.setUserData("c", "cat", handler);
+        waffles.setUserData("d", "dog", handler);
+
+        Element clonedName = (Element) name.cloneNode(true);
+        Attr clonedStandard = clonedName.getAttributeNode("a:standard");
+        Text clonedWaffles = (Text) clonedName.getChildNodes().item(0);
+
+        Set<String> expected = new HashSet<String>();
+        expected.add(notification(NODE_CLONED, "a", "apple", name, clonedName));
+        expected.add(notification(NODE_CLONED, "b", "banana", name, clonedName));
+        expected.add(notification(NODE_CLONED, "c", "cat", standard, clonedStandard));
+        expected.add(notification(NODE_CLONED, "d", "dog", waffles, clonedWaffles));
+        assertEquals(expected, handler.calls);
+    }
+
+    private class RecordingHandler implements UserDataHandler {
+        final Set<String> calls = new HashSet<String>();
+        public void handle(short operation, String key, Object data, Node src, Node dst) {
+            calls.add(notification(operation, key, data, src, dst));
+        }
+    }
+
+    private String notification(short operation, String key, Object data, Node src, Node dst) {
+        return "op:" + operation + " key:" + key + " data:" + data + " src:" + src + " dst:" + dst;
+    }
+
     private String domToString(Document document) throws TransformerException {
         StringWriter writer = new StringWriter();
         transformer.transform(new DOMSource(document), new StreamResult(writer));
diff --git a/vm/Thread.c b/vm/Thread.c
index 338c8b9..b2d5776 100644
--- a/vm/Thread.c
+++ b/vm/Thread.c
@@ -720,7 +720,6 @@
                     complained = true;
                     LOGD("threadid=%d: waiting briefly for daemon suspension\n",
                         threadId);
-                    // TODO: JIT can get stuck, dvmJitUnchainAll doesn't help?
                 }
             }
 
diff --git a/vm/compiler/Compiler.c b/vm/compiler/Compiler.c
index 597fbb2..e9b30de 100644
--- a/vm/compiler/Compiler.c
+++ b/vm/compiler/Compiler.c
@@ -544,6 +544,10 @@
 {
     void *threadReturn;
 
+    /* Disable new translation requests */
+    gDvmJit.pProfTable = NULL;
+    gDvmJit.pProfTableCopy = NULL;
+
     if (gDvm.verboseShutdown) {
         dvmCompilerDumpStats();
         while (gDvmJit.compilerQueueLength)
@@ -564,20 +568,16 @@
             LOGD("Compiler thread has shut down\n");
     }
 
-    dvmDestroyMutex(&gDvmJit.tableLock);
-    dvmDestroyMutex(&gDvmJit.compilerLock);
-    dvmDestroyMutex(&gDvmJit.compilerICPatchLock);
+    /* Break loops within the translation cache */
+    dvmJitUnchainAll();
 
-    if (gDvmJit.pJitEntryTable) {
-        free(gDvmJit.pJitEntryTable);
-        gDvmJit.pJitEntryTable = NULL;
-    }
-
-    if (gDvmJit.pProfTable) {
-        free(gDvmJit.pProfTable);
-        gDvmJit.pProfTable = NULL;
-    }
-
+    /*
+     * NOTE: our current implementatation doesn't allow for the compiler
+     * thread to be restarted after it exits here.  We aren't freeing
+     * the JitTable or the ProfTable because threads which still may be
+     * running or in the process of shutting down may hold references to
+     * them.
+     */
 }
 
 void dvmCompilerStateRefresh()
