diff --git a/common/src/java/com/example/android/common/midi/MidiInputPortSelector.java b/common/src/java/com/example/android/common/midi/MidiInputPortSelector.java
index 7ca2272..7c665ba 100644
--- a/common/src/java/com/example/android/common/midi/MidiInputPortSelector.java
+++ b/common/src/java/com/example/android/common/midi/MidiInputPortSelector.java
@@ -32,7 +32,6 @@
  * Manages a Spinner for selecting a MidiInputPort.
  */
 public class MidiInputPortSelector extends MidiPortSelector {
-    private static final String TAG = "MidiInputPortSelector";
 
     private MidiInputPort mInputPort;
     private MidiDevice mOpenDevice;
@@ -44,27 +43,30 @@
      */
     public MidiInputPortSelector(MidiManager midiManager, Activity activity,
             int spinnerId) {
-        super(midiManager, activity, spinnerId, TYPE_INPUT);
+        super(midiManager, activity, spinnerId, MidiDeviceInfo.PortInfo.TYPE_INPUT);
     }
 
     @Override
     public void onPortSelected(final MidiPortWrapper wrapper) {
-        onClose();
-
+        close();
         final MidiDeviceInfo info = wrapper.getDeviceInfo();
         if (info != null) {
             mMidiManager.openDevice(info, new MidiManager.OnDeviceOpenedListener() {
                     @Override
                 public void onDeviceOpened(MidiDevice device) {
                     if (device == null) {
-                        Log.e(TAG, "could not open " + info);
+                        Log.e(MidiConstants.TAG, "could not open " + info);
                     } else {
                         mOpenDevice = device;
                         mInputPort = mOpenDevice.openInputPort(
                                 wrapper.getPortIndex());
+                        if (mInputPort == null) {
+                            Log.e(MidiConstants.TAG, "could not open input port on " + info);
+                        }
                     }
                 }
-            }, new Handler(Looper.getMainLooper()));
+            }, null);
+            // Don't run the callback on the UI thread because openInputPort might take a while.
         }
     }
 
@@ -76,6 +78,7 @@
     public void onClose() {
         try {
             if (mInputPort != null) {
+                Log.i(MidiConstants.TAG, "MidiInputPortSelector.onClose() - close port");
                 mInputPort.close();
             }
             mInputPort = null;
@@ -84,7 +87,7 @@
             }
             mOpenDevice = null;
         } catch (IOException e) {
-            Log.e(TAG, "cleanup failed", e);
+            Log.e(MidiConstants.TAG, "cleanup failed", e);
         }
     }
 }
diff --git a/common/src/java/com/example/android/common/midi/MidiOutputPortConnectionSelector.java b/common/src/java/com/example/android/common/midi/MidiOutputPortConnectionSelector.java
new file mode 100644
index 0000000..ca1ade4
--- /dev/null
+++ b/common/src/java/com/example/android/common/midi/MidiOutputPortConnectionSelector.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2015 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.example.android.common.midi;
+
+import android.app.Activity;
+import android.media.midi.MidiDeviceInfo;
+import android.media.midi.MidiManager;
+import android.util.Log;
+
+import java.io.IOException;
+
+/**
+ * Select an output port and connect it to a destination input port.
+ */
+public class MidiOutputPortConnectionSelector extends MidiPortSelector {
+
+    private MidiPortConnector mSynthConnector;
+    private MidiDeviceInfo mDestinationDeviceInfo;
+    private int mDestinationPortIndex;
+    private MidiPortConnector.OnPortsConnectedListener mConnectedListener;
+
+    /**
+     * @param midiManager
+     * @param activity
+     * @param spinnerId
+     * @param type
+     */
+    public MidiOutputPortConnectionSelector(MidiManager midiManager,
+            Activity activity, int spinnerId,
+            MidiDeviceInfo destinationDeviceInfo, int destinationPortIndex) {
+        super(midiManager, activity, spinnerId,
+                MidiDeviceInfo.PortInfo.TYPE_OUTPUT);
+        mDestinationDeviceInfo = destinationDeviceInfo;
+        mDestinationPortIndex = destinationPortIndex;
+    }
+
+    @Override
+    public void onPortSelected(final MidiPortWrapper wrapper) {
+        Log.i(MidiConstants.TAG, "connectPortToSynth: " + wrapper);
+        onClose();
+        if (wrapper.getDeviceInfo() != null) {
+            mSynthConnector = new MidiPortConnector(mMidiManager);
+            mSynthConnector.connectToDevicePort(wrapper.getDeviceInfo(),
+                    wrapper.getPortIndex(), mDestinationDeviceInfo,
+                    mDestinationPortIndex,
+                    // not safe on UI thread
+                    mConnectedListener, null);
+        }
+    }
+
+    @Override
+    public void onClose() {
+        try {
+            if (mSynthConnector != null) {
+                mSynthConnector.close();
+                mSynthConnector = null;
+            }
+        } catch (IOException e) {
+            Log.e(MidiConstants.TAG, "Exception in closeSynthResources()", e);
+        }
+    }
+
+    /**
+     * @param myPortsConnectedListener
+     */
+    public void setConnectedListener(
+            MidiPortConnector.OnPortsConnectedListener connectedListener) {
+        mConnectedListener = connectedListener;
+    }
+}
diff --git a/common/src/java/com/example/android/common/midi/MidiOutputPortSelector.java b/common/src/java/com/example/android/common/midi/MidiOutputPortSelector.java
index d01d304..5aebf72 100644
--- a/common/src/java/com/example/android/common/midi/MidiOutputPortSelector.java
+++ b/common/src/java/com/example/android/common/midi/MidiOutputPortSelector.java
@@ -32,10 +32,7 @@
  * Manages a Spinner for selecting a MidiOutputPort.
  */
 public class MidiOutputPortSelector extends MidiPortSelector {
-
-    private static final String TAG = "MidiOutputPortSelector";
-
-    private MidiOutputPort mSender;
+    private MidiOutputPort mOutputPort;
     private MidiDispatcher mDispatcher = new MidiDispatcher();
     private MidiDevice mOpenDevice;
 
@@ -46,13 +43,13 @@
      */
     public MidiOutputPortSelector(MidiManager midiManager, Activity activity,
             int spinnerId) {
-        super(midiManager, activity, spinnerId, TYPE_OUTPUT);
+        super(midiManager, activity, spinnerId, MidiDeviceInfo.PortInfo.TYPE_OUTPUT);
     }
 
     @Override
     public void onPortSelected(final MidiPortWrapper wrapper) {
-        Log.i(TAG, "onPortSelected: " + wrapper);
-        onClose();
+        Log.i(MidiConstants.TAG, "onPortSelected: " + wrapper);
+        close();
 
         final MidiDeviceInfo info = wrapper.getDeviceInfo();
         if (info != null) {
@@ -61,35 +58,36 @@
                     @Override
                 public void onDeviceOpened(MidiDevice device) {
                     if (device == null) {
-                        Log.e(TAG, "could not open " + info);
+                        Log.e(MidiConstants.TAG, "could not open " + info);
                     } else {
                         mOpenDevice = device;
-                        mSender = device.openOutputPort(wrapper.getPortIndex());
-                        if (mSender == null) {
-                            Log.e(TAG,
-                                    "could not get sender for " + info);
+                        mOutputPort = device.openOutputPort(wrapper.getPortIndex());
+                        if (mOutputPort == null) {
+                            Log.e(MidiConstants.TAG,
+                                    "could not open output port for " + info);
                             return;
                         }
-                        mSender.connect(mDispatcher);
+                        mOutputPort.connect(mDispatcher);
                     }
                 }
-            }, new Handler(Looper.getMainLooper()));
+            }, null);
+            // Don't run the callback on the UI thread because openOutputPort might take a while.
         }
     }
 
     @Override
     public void onClose() {
         try {
-            if (mSender != null) {
-                mSender.disconnect(mDispatcher);
+            if (mOutputPort != null) {
+                mOutputPort.disconnect(mDispatcher);
             }
-            mSender = null;
+            mOutputPort = null;
             if (mOpenDevice != null) {
                 mOpenDevice.close();
             }
             mOpenDevice = null;
         } catch (IOException e) {
-            Log.e(TAG, "cleanup failed", e);
+            Log.e(MidiConstants.TAG, "cleanup failed", e);
         }
     }
 
diff --git a/common/src/java/com/example/android/common/midi/MidiPortConnector.java b/common/src/java/com/example/android/common/midi/MidiPortConnector.java
index 92517be..457494d 100644
--- a/common/src/java/com/example/android/common/midi/MidiPortConnector.java
+++ b/common/src/java/com/example/android/common/midi/MidiPortConnector.java
@@ -27,7 +27,7 @@
 import java.io.IOException;
 
 /**
- * Simple wrapper for connecting MIDI ports.
+ * Tool for connecting MIDI ports on two remote devices.
  */
 public class MidiPortConnector {
     private final MidiManager mMidiManager;
@@ -44,6 +44,8 @@
 
     public void close() throws IOException {
         if (mConnection != null) {
+            Log.i(MidiConstants.TAG,
+                    "MidiPortConnector closing connection " + mConnection);
             mConnection.close();
             mConnection = null;
         }
@@ -57,23 +59,12 @@
         }
     }
 
-    /**
-     * @return a device that matches the manufacturer and product or null
-     */
-    public MidiDeviceInfo findDevice(String manufacturer, String product) {
-        for (MidiDeviceInfo info : mMidiManager.getDevices()) {
-            String deviceManufacturer = info.getProperties()
-                    .getString(MidiDeviceInfo.PROPERTY_MANUFACTURER);
-            if ((manufacturer != null)
-                    && manufacturer.equals(deviceManufacturer)) {
-                String deviceProduct = info.getProperties()
-                        .getString(MidiDeviceInfo.PROPERTY_PRODUCT);
-                if ((product != null) && product.equals(deviceProduct)) {
-                    return info;
-                }
-            }
+    private void safeClose() {
+        try {
+            close();
+        } catch (IOException e) {
+            Log.e(MidiConstants.TAG, "could not close resources", e);
         }
-        return null;
     }
 
     /**
@@ -120,35 +111,38 @@
             final MidiDeviceInfo destinationDeviceInfo,
             final int destinationPortIndex,
             final OnPortsConnectedListener listener, final Handler handler) {
+        safeClose();
         mMidiManager.openDevice(destinationDeviceInfo,
                 new MidiManager.OnDeviceOpenedListener() {
                     @Override
-                    public void onDeviceOpened(MidiDevice device) {
-                        if (device == null) {
+                    public void onDeviceOpened(MidiDevice destinationDevice) {
+                        if (destinationDevice == null) {
                             Log.e(MidiConstants.TAG,
                                     "could not open " + destinationDeviceInfo);
                             if (listener != null) {
                                 listener.onPortsConnected(null);
                             }
                         } else {
+                            mDestinationDevice = destinationDevice;
                             Log.i(MidiConstants.TAG,
                                     "connectToDevicePort opened "
                                             + destinationDeviceInfo);
                             // Destination device was opened so go to next step.
-                            mDestinationDevice = device;
-                            MidiInputPort destinationInputPort = device
+                            MidiInputPort destinationInputPort = destinationDevice
                                     .openInputPort(destinationPortIndex);
                             if (destinationInputPort != null) {
                                 Log.i(MidiConstants.TAG,
                                         "connectToDevicePort opened port on "
                                                 + destinationDeviceInfo);
                                 connectToDevicePort(sourceDeviceInfo,
-                                        sourcePortIndex, destinationInputPort,
+                                        sourcePortIndex,
+                                        destinationInputPort,
                                         listener, handler);
                             } else {
                                 Log.e(MidiConstants.TAG,
                                         "could not open port on "
                                                 + destinationDeviceInfo);
+                                safeClose();
                                 if (listener != null) {
                                     listener.onPortsConnected(null);
                                 }
@@ -158,20 +152,6 @@
                 }, handler);
     }
 
-    /**
-     * Open a source device and connect its output port to the
-     * destinationInputPort.
-     *
-     * @param sourceDeviceInfo
-     * @param sourcePortIndex
-     * @param destinationInputPort
-     */
-    public void connectToDevicePort(final MidiDeviceInfo sourceDeviceInfo,
-            final int sourcePortIndex,
-            final MidiInputPort destinationInputPort) {
-        connectToDevicePort(sourceDeviceInfo, sourcePortIndex,
-                destinationInputPort, null, null);
-    }
 
     /**
      * Open a source device and connect its output port to the
@@ -181,8 +161,9 @@
      * @param sourcePortIndex
      * @param destinationInputPort
      */
-    public void connectToDevicePort(final MidiDeviceInfo sourceDeviceInfo,
-            final int sourcePortIndex, final MidiInputPort destinationInputPort,
+    private void connectToDevicePort(final MidiDeviceInfo sourceDeviceInfo,
+            final int sourcePortIndex,
+            final MidiInputPort destinationInputPort,
             final OnPortsConnectedListener listener, final Handler handler) {
         mMidiManager.openDevice(sourceDeviceInfo,
                 new MidiManager.OnDeviceOpenedListener() {
@@ -191,6 +172,7 @@
                         if (device == null) {
                             Log.e(MidiConstants.TAG,
                                     "could not open " + sourceDeviceInfo);
+                            safeClose();
                             if (listener != null) {
                                 listener.onPortsConnected(null);
                             }
@@ -205,6 +187,7 @@
                             if (mConnection == null) {
                                 Log.e(MidiConstants.TAG, "could not connect to "
                                         + sourceDeviceInfo);
+                                safeClose();
                             }
                             if (listener != null) {
                                 listener.onPortsConnected(mConnection);
diff --git a/common/src/java/com/example/android/common/midi/MidiPortSelector.java b/common/src/java/com/example/android/common/midi/MidiPortSelector.java
index d491c03..39f983e 100644
--- a/common/src/java/com/example/android/common/midi/MidiPortSelector.java
+++ b/common/src/java/com/example/android/common/midi/MidiPortSelector.java
@@ -18,35 +18,38 @@
 
 import android.app.Activity;
 import android.media.midi.MidiDeviceInfo;
+import android.media.midi.MidiDeviceStatus;
 import android.media.midi.MidiManager;
 import android.media.midi.MidiManager.DeviceCallback;
 import android.os.Handler;
 import android.os.Looper;
+import android.util.Log;
 import android.view.View;
 import android.widget.AdapterView;
 import android.widget.ArrayAdapter;
 import android.widget.Spinner;
 
+import java.util.HashSet;
+
 /**
  * Base class that uses a Spinner to select available MIDI ports.
  */
 public abstract class MidiPortSelector extends DeviceCallback {
-
-    public static final int TYPE_INPUT = 0;
-    public static final int TYPE_OUTPUT = 1;
-    private int mType = TYPE_INPUT;
+    private int mType = MidiDeviceInfo.PortInfo.TYPE_INPUT;
     protected ArrayAdapter<MidiPortWrapper> mAdapter;
+    protected HashSet<MidiPortWrapper> mBusyPorts = new HashSet<MidiPortWrapper>();
     private Spinner mSpinner;
     protected MidiManager mMidiManager;
     protected Activity mActivity;
     private MidiPortWrapper mCurrentWrapper;
 
     /**
-     *
      * @param midiManager
      * @param activity
-     * @param spinnerId ID from the layout resource
-     * @param type TYPE_INPUT or TYPE_OUTPUT
+     * @param spinnerId
+     *            ID from the layout resource
+     * @param type
+     *            TYPE_INPUT or TYPE_OUTPUT
      */
     public MidiPortSelector(MidiManager midiManager, Activity activity,
             int spinnerId, int type) {
@@ -57,7 +60,7 @@
                 android.R.layout.simple_spinner_item);
         mAdapter.setDropDownViewResource(
                 android.R.layout.simple_spinner_dropdown_item);
-        mAdapter.add(new MidiPortWrapper(null, 0));
+        mAdapter.add(new MidiPortWrapper(null, 0, 0));
 
         mSpinner = (Spinner) activity.findViewById(spinnerId);
         mSpinner.setOnItemSelectedListener(
@@ -85,9 +88,16 @@
         }
     }
 
+    /**
+     * Set to no port selected.
+     */
+    public void clearSelection() {
+        mSpinner.setSelection(0);
+    }
+
     private int getInfoPortCount(final MidiDeviceInfo info) {
-        int portCount = (mType == TYPE_INPUT) ? info.getInputPortCount()
-                : info.getOutputPortCount();
+        int portCount = (mType == MidiDeviceInfo.PortInfo.TYPE_INPUT)
+                ? info.getInputPortCount() : info.getOutputPortCount();
         return portCount;
     }
 
@@ -95,7 +105,10 @@
     public void onDeviceAdded(final MidiDeviceInfo info) {
         int portCount = getInfoPortCount(info);
         for (int i = 0; i < portCount; ++i) {
-            mAdapter.add(new MidiPortWrapper(info, i));
+            MidiPortWrapper wrapper = new MidiPortWrapper(info, mType, i);
+            mAdapter.add(wrapper);
+            Log.i(MidiConstants.TAG, wrapper + " was added");
+            mAdapter.notifyDataSetChanged();
         }
     }
 
@@ -103,12 +116,48 @@
     public void onDeviceRemoved(final MidiDeviceInfo info) {
         int portCount = getInfoPortCount(info);
         for (int i = 0; i < portCount; ++i) {
-            MidiPortWrapper wrapper = new MidiPortWrapper(info, i);
+            MidiPortWrapper wrapper = new MidiPortWrapper(info, mType, i);
             MidiPortWrapper currentWrapper = mCurrentWrapper;
             mAdapter.remove(wrapper);
             // If the currently selected port was removed then select no port.
             if (wrapper.equals(currentWrapper)) {
-                mSpinner.setSelection(0);
+                clearSelection();
+            }
+            mAdapter.notifyDataSetChanged();
+            Log.i(MidiConstants.TAG, wrapper + " was removed");
+        }
+    }
+
+    @Override
+    public void onDeviceStatusChanged(final MidiDeviceStatus status) {
+        // If an input port becomes busy then remove it from the menu.
+        // If it becomes free then add it back to the menu.
+        if (mType == MidiDeviceInfo.PortInfo.TYPE_INPUT) {
+            MidiDeviceInfo info = status.getDeviceInfo();
+            Log.i(MidiConstants.TAG, "MidiPortSelector.onDeviceStatusChanged status = " + status
+                    + ", mType = " + mType
+                    + ", activity = " + mActivity.getPackageName()
+                    + ", info = " + info);
+            // Look for transitions from free to busy.
+            int portCount = info.getInputPortCount();
+            for (int i = 0; i < portCount; ++i) {
+                MidiPortWrapper wrapper = new MidiPortWrapper(info, mType, i);
+                if (!wrapper.equals(mCurrentWrapper)) {
+                    if (status.isInputPortOpen(i)) { // busy?
+                        if (!mBusyPorts.contains(wrapper)) {
+                            // was free, now busy
+                            mBusyPorts.add(wrapper);
+                            mAdapter.remove(wrapper);
+                            mAdapter.notifyDataSetChanged();
+                        }
+                    } else {
+                        if (mBusyPorts.remove(wrapper)) {
+                            // was busy, now free
+                            mAdapter.add(wrapper);
+                            mAdapter.notifyDataSetChanged();
+                        }
+                    }
+                }
             }
         }
     }
@@ -124,4 +173,11 @@
      * Implement this method to clean up any open resources.
      */
     public abstract void onClose();
+
+    /**
+     *
+     */
+    public void close() {
+        onClose();
+    }
 }
diff --git a/common/src/java/com/example/android/common/midi/MidiPortWrapper.java b/common/src/java/com/example/android/common/midi/MidiPortWrapper.java
index 9f82694..77aa734 100644
--- a/common/src/java/com/example/android/common/midi/MidiPortWrapper.java
+++ b/common/src/java/com/example/android/common/midi/MidiPortWrapper.java
@@ -18,16 +18,28 @@
 
 import android.media.midi.MidiDeviceInfo;
 import android.media.midi.MidiDeviceInfo.PortInfo;
+import android.util.Log;
 
 // Wrapper for a MIDI device and port description.
 public class MidiPortWrapper {
     private MidiDeviceInfo mInfo;
     private int mPortIndex;
+    private int mType;
     private String mString;
 
-    public MidiPortWrapper(MidiDeviceInfo info, int portIndex) {
+    /**
+     * Wrapper for a MIDI device and port description.
+     * @param info
+     * @param portType
+     * @param portIndex
+     */
+    public MidiPortWrapper(MidiDeviceInfo info, int portType, int portIndex) {
         mInfo = info;
+        mType = portType;
         mPortIndex = portIndex;
+    }
+
+    private void updateString() {
         if (mInfo == null) {
             mString = "- - - - - -";
         } else {
@@ -36,17 +48,39 @@
                     .getString(MidiDeviceInfo.PROPERTY_NAME);
             if (name == null) {
                 name = mInfo.getProperties()
-                        .getString(MidiDeviceInfo.PROPERTY_MANUFACTURER)
-                       + ", " + mInfo.getProperties()
-                       .getString(MidiDeviceInfo.PROPERTY_PRODUCT);
+                        .getString(MidiDeviceInfo.PROPERTY_MANUFACTURER) + ", "
+                        + mInfo.getProperties()
+                                .getString(MidiDeviceInfo.PROPERTY_PRODUCT);
             }
-            sb.append("#" + mInfo.getId()).append(", ").append(name);
-            PortInfo portInfo = mInfo.getPorts()[portIndex];
-            sb.append(", ").append(portInfo.getName());
+            sb.append("#" + mInfo.getId());
+            sb.append(", ").append(name);
+            PortInfo portInfo = findPortInfo();
+            sb.append("[" + mPortIndex + "]");
+            if (portInfo != null) {
+                sb.append(", ").append(portInfo.getName());
+            } else {
+                sb.append(", null");
+            }
             mString = sb.toString();
         }
     }
 
+    /**
+     * @param info
+     * @param portIndex
+     * @return
+     */
+    private PortInfo findPortInfo() {
+        PortInfo[] ports = mInfo.getPorts();
+        for (PortInfo portInfo : ports) {
+            if (portInfo.getPortNumber() == mPortIndex
+                    && portInfo.getType() == mType) {
+                return portInfo;
+            }
+        }
+        return null;
+    }
+
     public int getPortIndex() {
         return mPortIndex;
     }
@@ -57,6 +91,9 @@
 
     @Override
     public String toString() {
+        if (mString == null) {
+            updateString();
+        }
         return mString;
     }
 
@@ -69,6 +106,8 @@
         MidiPortWrapper otherWrapper = (MidiPortWrapper) other;
         if (mPortIndex != otherWrapper.mPortIndex)
             return false;
+        if (mType != otherWrapper.mType)
+            return false;
         if (mInfo == null)
             return (otherWrapper.mInfo == null);
         return mInfo.equals(otherWrapper.mInfo);
@@ -76,7 +115,11 @@
 
     @Override
     public int hashCode() {
-        return toString().hashCode();
+        int hashCode = 1;
+        hashCode = 31 * hashCode + mPortIndex;
+        hashCode = 31 * hashCode + mType;
+        hashCode = 31 * hashCode + mInfo.hashCode();
+        return hashCode;
     }
 
 }
diff --git a/common/src/java/com/example/android/common/midi/MidiTools.java b/common/src/java/com/example/android/common/midi/MidiTools.java
new file mode 100644
index 0000000..82e3de4
--- /dev/null
+++ b/common/src/java/com/example/android/common/midi/MidiTools.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2015 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.example.android.common.midi;
+
+import android.media.midi.MidiDeviceInfo;
+import android.media.midi.MidiManager;
+
+/**
+ * Miscellaneous tools for Android MIDI.
+ */
+public class MidiTools {
+
+    /**
+     * @return a device that matches the manufacturer and product or null
+     */
+    public static MidiDeviceInfo findDevice(MidiManager midiManager,
+            String manufacturer, String product) {
+        for (MidiDeviceInfo info : midiManager.getDevices()) {
+            String deviceManufacturer = info.getProperties()
+                    .getString(MidiDeviceInfo.PROPERTY_MANUFACTURER);
+            if ((manufacturer != null)
+                    && manufacturer.equals(deviceManufacturer)) {
+                String deviceProduct = info.getProperties()
+                        .getString(MidiDeviceInfo.PROPERTY_PRODUCT);
+                if ((product != null) && product.equals(deviceProduct)) {
+                    return info;
+                }
+            }
+        }
+        return null;
+    }
+}
diff --git a/media/Camera2Basic/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java b/media/Camera2Basic/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java
index 020ca14..4bf8534 100644
--- a/media/Camera2Basic/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java
+++ b/media/Camera2Basic/Application/src/main/java/com/example/android/camera2basic/Camera2BasicFragment.java
@@ -16,6 +16,7 @@
 
 package com.example.android.camera2basic;
 
+import android.Manifest;
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
@@ -23,6 +24,7 @@
 import android.app.Fragment;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.pm.PackageManager;
 import android.content.res.Configuration;
 import android.graphics.ImageFormat;
 import android.graphics.Matrix;
@@ -43,7 +45,8 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.HandlerThread;
-import android.os.Message;
+import android.support.annotation.NonNull;
+import android.support.v13.app.FragmentCompat;
 import android.util.Log;
 import android.util.Size;
 import android.util.SparseIntArray;
@@ -66,12 +69,15 @@
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 
-public class Camera2BasicFragment extends Fragment implements View.OnClickListener {
+public class Camera2BasicFragment extends Fragment
+        implements View.OnClickListener, FragmentCompat.OnRequestPermissionsResultCallback {
 
     /**
      * Conversion from screen rotation to JPEG orientation.
      */
     private static final SparseIntArray ORIENTATIONS = new SparseIntArray();
+    private static final int REQUEST_CAMERA_PERMISSION = 1;
+    private static final String FRAGMENT_DIALOG = "dialog";
 
     static {
         ORIENTATIONS.append(Surface.ROTATION_0, 90);
@@ -94,14 +100,17 @@
      * Camera state: Waiting for the focus to be locked.
      */
     private static final int STATE_WAITING_LOCK = 1;
+
     /**
      * Camera state: Waiting for the exposure to be precapture state.
      */
     private static final int STATE_WAITING_PRECAPTURE = 2;
+
     /**
      * Camera state: Waiting for the exposure state to be something other than precapture.
      */
     private static final int STATE_WAITING_NON_PRECAPTURE = 3;
+
     /**
      * Camera state: Picture was taken.
      */
@@ -148,17 +157,16 @@
     /**
      * A {@link CameraCaptureSession } for camera preview.
      */
-
     private CameraCaptureSession mCaptureSession;
+
     /**
      * A reference to the opened {@link CameraDevice}.
      */
-
     private CameraDevice mCameraDevice;
+
     /**
      * The {@link android.util.Size} of camera preview.
      */
-
     private Size mPreviewSize;
 
     /**
@@ -167,7 +175,7 @@
     private final CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {
 
         @Override
-        public void onOpened(CameraDevice cameraDevice) {
+        public void onOpened(@NonNull CameraDevice cameraDevice) {
             // This method is called when the camera is opened.  We start camera preview here.
             mCameraOpenCloseLock.release();
             mCameraDevice = cameraDevice;
@@ -175,14 +183,14 @@
         }
 
         @Override
-        public void onDisconnected(CameraDevice cameraDevice) {
+        public void onDisconnected(@NonNull CameraDevice cameraDevice) {
             mCameraOpenCloseLock.release();
             cameraDevice.close();
             mCameraDevice = null;
         }
 
         @Override
-        public void onError(CameraDevice cameraDevice, int error) {
+        public void onError(@NonNull CameraDevice cameraDevice, int error) {
             mCameraOpenCloseLock.release();
             cameraDevice.close();
             mCameraDevice = null;
@@ -303,43 +311,36 @@
         }
 
         @Override
-        public void onCaptureProgressed(CameraCaptureSession session, CaptureRequest request,
-                                        CaptureResult partialResult) {
+        public void onCaptureProgressed(@NonNull CameraCaptureSession session,
+                                        @NonNull CaptureRequest request,
+                                        @NonNull CaptureResult partialResult) {
             process(partialResult);
         }
 
         @Override
-        public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
-                                       TotalCaptureResult result) {
+        public void onCaptureCompleted(@NonNull CameraCaptureSession session,
+                                       @NonNull CaptureRequest request,
+                                       @NonNull TotalCaptureResult result) {
             process(result);
         }
 
     };
 
     /**
-     * A {@link Handler} for showing {@link Toast}s.
-     */
-    private Handler mMessageHandler = new Handler() {
-        @Override
-        public void handleMessage(Message msg) {
-            Activity activity = getActivity();
-            if (activity != null) {
-                Toast.makeText(activity, (String) msg.obj, Toast.LENGTH_SHORT).show();
-            }
-        }
-    };
-
-    /**
      * Shows a {@link Toast} on the UI thread.
      *
      * @param text The message to show
      */
-    private void showToast(String text) {
-        // We show a Toast by sending request message to mMessageHandler. This makes sure that the
-        // Toast is shown on the UI thread.
-        Message message = Message.obtain();
-        message.obj = text;
-        mMessageHandler.sendMessage(message);
+    private void showToast(final String text) {
+        final Activity activity = getActivity();
+        if (activity != null) {
+            activity.runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    Toast.makeText(activity, text, Toast.LENGTH_SHORT).show();
+                }
+            });
+        }
     }
 
     /**
@@ -355,7 +356,7 @@
      */
     private static Size chooseOptimalSize(Size[] choices, int width, int height, Size aspectRatio) {
         // Collect the supported resolutions that are at least as big as the preview Surface
-        List<Size> bigEnough = new ArrayList<Size>();
+        List<Size> bigEnough = new ArrayList<>();
         int w = aspectRatio.getWidth();
         int h = aspectRatio.getHeight();
         for (Size option : choices) {
@@ -375,9 +376,7 @@
     }
 
     public static Camera2BasicFragment newInstance() {
-        Camera2BasicFragment fragment = new Camera2BasicFragment();
-        fragment.setRetainInstance(true);
-        return fragment;
+        return new Camera2BasicFragment();
     }
 
     @Override
@@ -422,6 +421,28 @@
         super.onPause();
     }
 
+    private void requestCameraPermission() {
+        if (FragmentCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
+            new ConfirmationDialog().show(getChildFragmentManager(), FRAGMENT_DIALOG);
+        } else {
+            FragmentCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA},
+                    REQUEST_CAMERA_PERMISSION);
+        }
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
+                                           @NonNull int[] grantResults) {
+        if (requestCode == REQUEST_CAMERA_PERMISSION) {
+            if (grantResults.length != 1 || grantResults[0] != PackageManager.PERMISSION_GRANTED) {
+                ErrorDialog.newInstance(getString(R.string.request_permission))
+                        .show(getChildFragmentManager(), FRAGMENT_DIALOG);
+            }
+        } else {
+            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+        }
+    }
+
     /**
      * Sets up member variables related to camera.
      *
@@ -437,13 +458,16 @@
                         = manager.getCameraCharacteristics(cameraId);
 
                 // We don't use a front facing camera in this sample.
-                if (characteristics.get(CameraCharacteristics.LENS_FACING)
-                        == CameraCharacteristics.LENS_FACING_FRONT) {
+                Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING);
+                if (facing != null && facing == CameraCharacteristics.LENS_FACING_FRONT) {
                     continue;
                 }
 
                 StreamConfigurationMap map = characteristics.get(
                         CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
+                if (map == null) {
+                    continue;
+                }
 
                 // For still image captures, we use the largest available size.
                 Size largest = Collections.max(
@@ -478,7 +502,8 @@
         } catch (NullPointerException e) {
             // Currently an NPE is thrown when the Camera2API is used but not supported on the
             // device this code runs.
-            new ErrorDialog().show(getFragmentManager(), "dialog");
+            ErrorDialog.newInstance(getString(R.string.camera_error))
+                    .show(getChildFragmentManager(), FRAGMENT_DIALOG);
         }
     }
 
@@ -486,6 +511,11 @@
      * Opens the camera specified by {@link Camera2BasicFragment#mCameraId}.
      */
     private void openCamera(int width, int height) {
+        if (getActivity().checkSelfPermission(Manifest.permission.CAMERA)
+                != PackageManager.PERMISSION_GRANTED) {
+            requestCameraPermission();
+            return;
+        }
         setUpCameraOutputs(width, height);
         configureTransform(width, height);
         Activity activity = getActivity();
@@ -574,7 +604,7 @@
                     new CameraCaptureSession.StateCallback() {
 
                         @Override
-                        public void onConfigured(CameraCaptureSession cameraCaptureSession) {
+                        public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
                             // The camera is already closed
                             if (null == mCameraDevice) {
                                 return;
@@ -600,7 +630,8 @@
                         }
 
                         @Override
-                        public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
+                        public void onConfigureFailed(
+                                @NonNull CameraCaptureSession cameraCaptureSession) {
                             showToast("Failed");
                         }
                     }, null
@@ -668,8 +699,8 @@
     }
 
     /**
-     * Run the precapture sequence for capturing a still image. This method should be called when we
-     * get a response in {@link #mCaptureCallback} from {@link #lockFocus()}.
+     * Run the precapture sequence for capturing a still image. This method should be called when
+     * we get a response in {@link #mCaptureCallback} from {@link #lockFocus()}.
      */
     private void runPrecaptureSequence() {
         try {
@@ -714,9 +745,11 @@
                     = new CameraCaptureSession.CaptureCallback() {
 
                 @Override
-                public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
-                                               TotalCaptureResult result) {
+                public void onCaptureCompleted(@NonNull CameraCaptureSession session,
+                                               @NonNull CaptureRequest request,
+                                               @NonNull TotalCaptureResult result) {
                     showToast("Saved: " + mFile);
+                    Log.d(TAG, mFile.toString());
                     unlockFocus();
                 }
             };
@@ -729,11 +762,12 @@
     }
 
     /**
-     * Unlock the focus. This method should be called when still image capture sequence is finished.
+     * Unlock the focus. This method should be called when still image capture sequence is
+     * finished.
      */
     private void unlockFocus() {
         try {
-            // Reset the autofucos trigger
+            // Reset the auto-focus trigger
             mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER,
                     CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);
             mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
@@ -827,13 +861,26 @@
 
     }
 
+    /**
+     * Shows an error message dialog.
+     */
     public static class ErrorDialog extends DialogFragment {
 
+        private static final String ARG_MESSAGE = "message";
+
+        public static ErrorDialog newInstance(String message) {
+            ErrorDialog dialog = new ErrorDialog();
+            Bundle args = new Bundle();
+            args.putString(ARG_MESSAGE, message);
+            dialog.setArguments(args);
+            return dialog;
+        }
+
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
             final Activity activity = getActivity();
             return new AlertDialog.Builder(activity)
-                    .setMessage("This device doesn't support Camera2 API.")
+                    .setMessage(getArguments().getString(ARG_MESSAGE))
                     .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                         @Override
                         public void onClick(DialogInterface dialogInterface, int i) {
@@ -845,4 +892,36 @@
 
     }
 
+    /**
+     * Shows OK/Cancel confirmation dialog about camera permission.
+     */
+    public static class ConfirmationDialog extends DialogFragment {
+
+        @Override
+        public Dialog onCreateDialog(Bundle savedInstanceState) {
+            final Fragment parent = getParentFragment();
+            return new AlertDialog.Builder(getActivity())
+                    .setMessage(R.string.request_permission)
+                    .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialog, int which) {
+                            FragmentCompat.requestPermissions(parent,
+                                    new String[]{Manifest.permission.CAMERA},
+                                    REQUEST_CAMERA_PERMISSION);
+                        }
+                    })
+                    .setNegativeButton(android.R.string.cancel,
+                            new DialogInterface.OnClickListener() {
+                                @Override
+                                public void onClick(DialogInterface dialog, int which) {
+                                    Activity activity = parent.getActivity();
+                                    if (activity != null) {
+                                        activity.finish();
+                                    }
+                                }
+                            })
+                    .create();
+        }
+    }
+
 }
diff --git a/media/Camera2Basic/Application/src/main/res/values/strings.xml b/media/Camera2Basic/Application/src/main/res/values/strings.xml
index 66f1000..7fdf6e6 100644
--- a/media/Camera2Basic/Application/src/main/res/values/strings.xml
+++ b/media/Camera2Basic/Application/src/main/res/values/strings.xml
@@ -16,4 +16,6 @@
 <resources>
     <string name="picture">Picture</string>
     <string name="description_info">Info</string>
+    <string name="request_permission">This sample needs camera permission.</string>
+    <string name="camera_error">This device doesn\'t support Camera2 API.</string>
 </resources>
diff --git a/media/Camera2Basic/README.md b/media/Camera2Basic/README.md
index 73ad24a..a77df09 100644
--- a/media/Camera2Basic/README.md
+++ b/media/Camera2Basic/README.md
@@ -42,7 +42,7 @@
 Pre-requisites
 --------------
 
-- Android SDK v21
+- Android SDK v23
 - Android Build Tools v23.0.0
 - Android Support Repository
 
diff --git a/media/Camera2Basic/template-params.xml b/media/Camera2Basic/template-params.xml
index 9841830..7f7edef 100644
--- a/media/Camera2Basic/template-params.xml
+++ b/media/Camera2Basic/template-params.xml
@@ -21,8 +21,9 @@
     <name>Camera2Basic</name>
     <group>Media</group>
     <package>com.example.android.camera2basic</package>
+
+    <dependency>com.android.support:appcompat-v7:23.0.0</dependency>
     <minSdk>21</minSdk>
-    <targetSdkVersion>22</targetSdkVersion>
     <strings>
         <intro>
             <![CDATA[
diff --git a/media/Camera2Raw/Application/src/main/java/com/example/android/camera2raw/Camera2RawFragment.java b/media/Camera2Raw/Application/src/main/java/com/example/android/camera2raw/Camera2RawFragment.java
index 6460bf3..47cce38 100644
--- a/media/Camera2Raw/Application/src/main/java/com/example/android/camera2raw/Camera2RawFragment.java
+++ b/media/Camera2Raw/Application/src/main/java/com/example/android/camera2raw/Camera2RawFragment.java
@@ -16,6 +16,7 @@
 
 package com.example.android.camera2raw;
 
+import android.Manifest;
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
@@ -23,6 +24,7 @@
 import android.app.Fragment;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.pm.PackageManager;
 import android.graphics.ImageFormat;
 import android.graphics.Matrix;
 import android.graphics.RectF;
@@ -52,6 +54,8 @@
 import android.os.Looper;
 import android.os.Message;
 import android.os.SystemClock;
+import android.support.v13.app.FragmentCompat;
+import android.support.v4.app.ActivityCompat;
 import android.util.Log;
 import android.util.Size;
 import android.util.SparseIntArray;
@@ -84,7 +88,7 @@
 
 /**
  * A fragment that demonstrates use of the Camera2 API to capture RAW and JPEG photos.
- *
+ * <p/>
  * In this example, the lifecycle of a single request to take a photo is:
  * <ul>
  * <li>
@@ -113,7 +117,9 @@
  * </li>
  * </ul>
  */
-public class Camera2RawFragment extends Fragment implements View.OnClickListener {
+public class Camera2RawFragment extends Fragment
+        implements View.OnClickListener, FragmentCompat.OnRequestPermissionsResultCallback {
+
     /**
      * Conversion from screen rotation to JPEG orientation.
      */
@@ -127,6 +133,20 @@
     }
 
     /**
+     * Request code for camera permissions.
+     */
+    private static final int REQUEST_CAMERA_PERMISSIONS = 1;
+
+    /**
+     * Permissions required to take a picture.
+     */
+    private static final String[] CAMERA_PERMISSIONS = {
+            Manifest.permission.CAMERA,
+            Manifest.permission.READ_EXTERNAL_STORAGE,
+            Manifest.permission.WRITE_EXTERNAL_STORAGE,
+    };
+
+    /**
      * Timeout for the pre-capture sequence.
      */
     private static final long PRECAPTURE_TIMEOUT_MS = 1000;
@@ -264,9 +284,9 @@
     private Handler mBackgroundHandler;
 
     /**
-     * A reference counted holder wrapping the {@link ImageReader} that handles JPEG image captures.
-     * This is used to allow us to clean up the {@link ImageReader} when all background tasks using
-     * its {@link Image}s have completed.
+     * A reference counted holder wrapping the {@link ImageReader} that handles JPEG image
+     * captures. This is used to allow us to clean up the {@link ImageReader} when all background
+     * tasks using its {@link Image}s have completed.
      */
     private RefCountedAutoCloseable<ImageReader> mJpegImageReader;
 
@@ -310,8 +330,8 @@
     private int mState = STATE_CLOSED;
 
     /**
-     * Timer to use with pre-capture sequence to ensure a timely capture if 3A convergence is taking
-     * too long.
+     * Timer to use with pre-capture sequence to ensure a timely capture if 3A convergence is
+     * taking too long.
      */
     private long mCaptureTimer;
 
@@ -352,7 +372,7 @@
         @Override
         public void onError(CameraDevice cameraDevice, int error) {
             Log.e(TAG, "Received camera device error: " + error);
-            synchronized(mCameraStateLock) {
+            synchronized (mCameraStateLock) {
                 mState = STATE_CLOSED;
                 mCameraOpenCloseLock.release();
                 cameraDevice.close();
@@ -402,7 +422,7 @@
             = new CameraCaptureSession.CaptureCallback() {
 
         private void process(CaptureResult result) {
-            synchronized(mCameraStateLock) {
+            synchronized (mCameraStateLock) {
                 switch (mState) {
                     case STATE_PREVIEW: {
                         // We have nothing to do when the camera preview is running normally.
@@ -416,7 +436,7 @@
                             // If auto-focus has reached locked state, we are ready to capture
                             readyToCapture =
                                     (afState == CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED ||
-                                    afState == CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
+                                            afState == CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED);
                         }
 
                         // If we are running on an non-legacy device, we should also wait until
@@ -559,9 +579,7 @@
     };
 
     public static Camera2RawFragment newInstance() {
-        Camera2RawFragment fragment = new Camera2RawFragment();
-        fragment.setRetainInstance(true);
-        return fragment;
+        return new Camera2RawFragment();
     }
 
     @Override
@@ -621,6 +639,20 @@
     }
 
     @Override
+    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
+        if (requestCode == REQUEST_CAMERA_PERMISSIONS) {
+            for (int result : grantResults) {
+                if (result != PackageManager.PERMISSION_GRANTED) {
+                    showMissingPermissionError();
+                    return;
+                }
+            }
+        } else {
+            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+        }
+    }
+
+    @Override
     public void onClick(View view) {
         switch (view.getId()) {
             case R.id.picture: {
@@ -659,7 +691,7 @@
 
                 // We only use a camera that supports RAW in this sample.
                 if (!contains(characteristics.get(
-                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES),
+                                CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES),
                         CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_RAW)) {
                     continue;
                 }
@@ -676,14 +708,14 @@
                         Arrays.asList(map.getOutputSizes(ImageFormat.RAW_SENSOR)),
                         new CompareSizesByArea());
 
-                synchronized(mCameraStateLock) {
+                synchronized (mCameraStateLock) {
                     // Set up ImageReaders for JPEG and RAW outputs.  Place these in a reference
                     // counted wrapper to ensure they are only closed when all background tasks
                     // using them are finished.
                     if (mJpegImageReader == null || mJpegImageReader.getAndRetain() == null) {
                         mJpegImageReader = new RefCountedAutoCloseable<>(
                                 ImageReader.newInstance(largestJpeg.getWidth(),
-                                largestJpeg.getHeight(), ImageFormat.JPEG, /*maxImages*/5));
+                                        largestJpeg.getHeight(), ImageFormat.JPEG, /*maxImages*/5));
                     }
                     mJpegImageReader.get().setOnImageAvailableListener(
                             mOnJpegImageAvailableListener, mBackgroundHandler);
@@ -691,7 +723,7 @@
                     if (mRawImageReader == null || mRawImageReader.getAndRetain() == null) {
                         mRawImageReader = new RefCountedAutoCloseable<>(
                                 ImageReader.newInstance(largestRaw.getWidth(),
-                                largestRaw.getHeight(), ImageFormat.RAW_SENSOR, /*maxImages*/ 5));
+                                        largestRaw.getHeight(), ImageFormat.RAW_SENSOR, /*maxImages*/ 5));
                     }
                     mRawImageReader.get().setOnImageAvailableListener(
                             mOnRawImageAvailableListener, mBackgroundHandler);
@@ -718,6 +750,10 @@
         if (!setUpCameraOutputs()) {
             return;
         }
+        if (!hasAllPermissionsGranted()) {
+            requestCameraPermissions();
+            return;
+        }
 
         Activity activity = getActivity();
         CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
@@ -745,12 +781,63 @@
     }
 
     /**
+     * Requests permissions necessary to use camera and save pictures.
+     */
+    private void requestCameraPermissions() {
+        if (shouldShowRationale()) {
+            PermissionConfirmationDialog.newInstance().show(getChildFragmentManager(), "dialog");
+        } else {
+            FragmentCompat.requestPermissions(this, CAMERA_PERMISSIONS, REQUEST_CAMERA_PERMISSIONS);
+        }
+    }
+
+    /**
+     * Tells whether all the necessary permissions are granted to this app.
+     *
+     * @return True if all the required permissions are granted.
+     */
+    private boolean hasAllPermissionsGranted() {
+        for (String permission : CAMERA_PERMISSIONS) {
+            if (ActivityCompat.checkSelfPermission(getActivity(), permission)
+                    != PackageManager.PERMISSION_GRANTED) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Gets whether you should show UI with rationale for requesting the permissions.
+     *
+     * @return True if the UI should be shown.
+     */
+    private boolean shouldShowRationale() {
+        for (String permission : CAMERA_PERMISSIONS) {
+            if (FragmentCompat.shouldShowRequestPermissionRationale(this, permission)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Shows that this app really needs the permission and finishes the app.
+     */
+    private void showMissingPermissionError() {
+        Activity activity = getActivity();
+        if (activity != null) {
+            Toast.makeText(activity, R.string.request_permission, Toast.LENGTH_SHORT).show();
+            activity.finish();
+        }
+    }
+
+    /**
      * Closes the current {@link CameraDevice}.
      */
     private void closeCamera() {
         try {
             mCameraOpenCloseLock.acquire();
-            synchronized(mCameraStateLock) {
+            synchronized (mCameraStateLock) {
 
                 // Reset state and clean up resources used by the camera.
                 // Note: After calling this, the ImageReaders will be closed after any background
@@ -787,7 +874,7 @@
     private void startBackgroundThread() {
         mBackgroundThread = new HandlerThread("CameraBackground");
         mBackgroundThread.start();
-        synchronized(mCameraStateLock) {
+        synchronized (mCameraStateLock) {
             mBackgroundHandler = new Handler(mBackgroundThread.getLooper());
         }
     }
@@ -810,7 +897,7 @@
 
     /**
      * Creates a new {@link CameraCaptureSession} for camera preview.
-     *
+     * <p/>
      * Call this only with {@link #mCameraStateLock} held.
      */
     private void createCameraPreviewSessionLocked() {
@@ -829,8 +916,8 @@
 
             // Here, we create a CameraCaptureSession for camera preview.
             mCameraDevice.createCaptureSession(Arrays.asList(surface,
-                    mJpegImageReader.get().getSurface(),
-                    mRawImageReader.get().getSurface()), new CameraCaptureSession.StateCallback() {
+                            mJpegImageReader.get().getSurface(),
+                            mRawImageReader.get().getSurface()), new CameraCaptureSession.StateCallback() {
                         @Override
                         public void onConfigured(CameraCaptureSession cameraCaptureSession) {
                             synchronized (mCameraStateLock) {
@@ -846,7 +933,7 @@
                                             mPreviewRequestBuilder.build(),
                                             mPreCaptureCallback, mBackgroundHandler);
                                     mState = STATE_PREVIEW;
-                                } catch (CameraAccessException|IllegalStateException e) {
+                                } catch (CameraAccessException | IllegalStateException e) {
                                     e.printStackTrace();
                                     return;
                                 }
@@ -869,7 +956,7 @@
     /**
      * Configure the given {@link CaptureRequest.Builder} to use auto-focus, auto-exposure, and
      * auto-white-balance controls if available.
-     *
+     * <p/>
      * Call this only with {@link #mCameraStateLock} held.
      *
      * @param builder the builder to configure.
@@ -923,7 +1010,7 @@
     /**
      * Configure the necessary {@link android.graphics.Matrix} transformation to `mTextureView`,
      * and start/restart the preview capture session if necessary.
-     *
+     * <p/>
      * This method should be called after the camera state has been initialized in
      * setUpCameraOutputs.
      *
@@ -932,7 +1019,7 @@
      */
     private void configureTransform(int viewWidth, int viewHeight) {
         Activity activity = getActivity();
-        synchronized(mCameraStateLock) {
+        synchronized (mCameraStateLock) {
             if (null == mTextureView || null == activity) {
                 return;
             }
@@ -1027,14 +1114,14 @@
 
     /**
      * Initiate a still image capture.
-     *
+     * <p/>
      * This function sends a capture request that initiates a pre-capture sequence in our state
      * machine that waits for auto-focus to finish, ending in a "locked" state where the lens is no
      * longer moving, waits for auto-exposure to choose a good exposure value, and waits for
      * auto-white-balance to converge.
      */
     private void takePicture() {
-        synchronized(mCameraStateLock) {
+        synchronized (mCameraStateLock) {
             mPendingUserCaptures++;
 
             // If we already triggered a pre-capture sequence, or are in a state where we cannot
@@ -1078,7 +1165,7 @@
     /**
      * Send a capture request to the camera device that initiates a capture targeting the JPEG and
      * RAW outputs.
-     *
+     * <p/>
      * Call this only with {@link #mCameraStateLock} held.
      */
     private void captureStillPictureLocked() {
@@ -1127,7 +1214,7 @@
     /**
      * Called after a RAW/JPEG capture has completed; resets the AF trigger state for the
      * pre-capture sequence.
-     *
+     * <p/>
      * Call this only with {@link #mCameraStateLock} held.
      */
     private void finishedCaptureLocked() {
@@ -1156,8 +1243,8 @@
      * thread.
      *
      * @param pendingQueue the currently active requests.
-     * @param reader a reference counted wrapper containing an {@link ImageReader} from which to
-     *               acquire an image.
+     * @param reader       a reference counted wrapper containing an {@link ImageReader} from which
+     *                     to acquire an image.
      */
     private void dequeueAndSaveImage(TreeMap<Integer, ImageSaver.ImageSaverBuilder> pendingQueue,
                                      RefCountedAutoCloseable<ImageReader> reader) {
@@ -1195,7 +1282,7 @@
     /**
      * Runnable that saves an {@link Image} into the specified {@link File}, and updates
      * {@link android.provider.MediaStore} to include the resulting file.
-     *
+     * <p/>
      * This can be constructed through an {@link ImageSaverBuilder} as the necessary image and
      * result information becomes available.
      */
@@ -1231,8 +1318,8 @@
         private final RefCountedAutoCloseable<ImageReader> mReader;
 
         private ImageSaver(Image image, File file, CaptureResult result,
-                CameraCharacteristics characteristics, Context context,
-                RefCountedAutoCloseable<ImageReader> reader) {
+                           CameraCharacteristics characteristics, Context context,
+                           RefCountedAutoCloseable<ImageReader> reader) {
             mImage = image;
             mFile = file;
             mCaptureResult = result;
@@ -1245,7 +1332,7 @@
         public void run() {
             boolean success = false;
             int format = mImage.getFormat();
-            switch(format) {
+            switch (format) {
                 case ImageFormat.JPEG: {
                     ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
                     byte[] bytes = new byte[buffer.remaining()];
@@ -1289,7 +1376,7 @@
 
             // If saving the file succeeded, update MediaStore.
             if (success) {
-                MediaScannerConnection.scanFile(mContext, new String[] { mFile.getPath()},
+                MediaScannerConnection.scanFile(mContext, new String[]{mFile.getPath()},
                 /*mimeTypes*/null, new MediaScannerConnection.MediaScannerConnectionClient() {
                     @Override
                     public void onMediaScannerConnected() {
@@ -1307,7 +1394,7 @@
 
         /**
          * Builder class for constructing {@link ImageSaver}s.
-         *
+         * <p/>
          * This class is thread safe.
          */
         public static class ImageSaverBuilder {
@@ -1320,8 +1407,9 @@
 
             /**
              * Construct a new ImageSaverBuilder using the given {@link Context}.
+             *
              * @param context a {@link Context} to for accessing the
-             *                  {@link android.provider.MediaStore}.
+             *                {@link android.provider.MediaStore}.
              */
             public ImageSaverBuilder(final Context context) {
                 mContext = context;
@@ -1329,7 +1417,7 @@
 
             public synchronized ImageSaverBuilder setRefCountedReader(
                     RefCountedAutoCloseable<ImageReader> reader) {
-                if (reader == null ) throw new NullPointerException();
+                if (reader == null) throw new NullPointerException();
 
                 mReader = reader;
                 return this;
@@ -1440,6 +1528,7 @@
 
         /**
          * Wrap the given object.
+         *
          * @param object an object to wrap.
          */
         public RefCountedAutoCloseable(T object) {
@@ -1551,7 +1640,7 @@
      * Return true if the given array contains the given integer.
      *
      * @param modes array to check.
-     * @param mode integer to get for.
+     * @param mode  integer to get for.
      * @return true if the array contains the given integer, otherwise false.
      */
     private static boolean contains(int[] modes, int mode) {
@@ -1582,7 +1671,9 @@
     /**
      * Rotation need to transform from the camera sensor orientation to the device's current
      * orientation.
-     * @param c the {@link CameraCharacteristics} to query for the camera sensor orientation.
+     *
+     * @param c                 the {@link CameraCharacteristics} to query for the camera sensor
+     *                          orientation.
      * @param deviceOrientation the current device orientation relative to the native device
      *                          orientation.
      * @return the total rotation from the sensor orientation to the current device orientation.
@@ -1620,12 +1711,12 @@
      * If the given request has been completed, remove it from the queue of active requests and
      * send an {@link ImageSaver} with the results from this request to a background thread to
      * save a file.
-     *
+     * <p/>
      * Call this only with {@link #mCameraStateLock} held.
      *
      * @param requestId the ID of the {@link CaptureRequest} to handle.
-     * @param builder the {@link ImageSaver.ImageSaverBuilder} for this request.
-     * @param queue the queue to remove this request from, if completed.
+     * @param builder   the {@link ImageSaver.ImageSaverBuilder} for this request.
+     * @param queue     the queue to remove this request from, if completed.
      */
     private void handleCompletionLocked(int requestId, ImageSaver.ImageSaverBuilder builder,
                                         TreeMap<Integer, ImageSaver.ImageSaverBuilder> queue) {
@@ -1639,7 +1730,7 @@
 
     /**
      * Check if we are using a device that only supports the LEGACY hardware level.
-     *
+     * <p/>
      * Call this only with {@link #mCameraStateLock} held.
      *
      * @return true if this is a legacy device.
@@ -1651,7 +1742,7 @@
 
     /**
      * Start the timer for the pre-capture sequence.
-     *
+     * <p/>
      * Call this only with {@link #mCameraStateLock} held.
      */
     private void startTimerLocked() {
@@ -1660,7 +1751,7 @@
 
     /**
      * Check if the timer for the pre-capture sequence has been hit.
-     *
+     * <p/>
      * Call this only with {@link #mCameraStateLock} held.
      *
      * @return true if the timeout occurred.
@@ -1669,6 +1760,37 @@
         return (SystemClock.elapsedRealtime() - mCaptureTimer) > PRECAPTURE_TIMEOUT_MS;
     }
 
-    // *********************************************************************************************
+    /**
+     * A dialog that explains about the necessary permissions.
+     */
+    public static class PermissionConfirmationDialog extends DialogFragment {
+
+        public static PermissionConfirmationDialog newInstance() {
+            return new PermissionConfirmationDialog();
+        }
+
+        @Override
+        public Dialog onCreateDialog(Bundle savedInstanceState) {
+            final Fragment parent = getParentFragment();
+            return new AlertDialog.Builder(getActivity())
+                    .setMessage(R.string.request_permission)
+                    .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialog, int which) {
+                            FragmentCompat.requestPermissions(parent, CAMERA_PERMISSIONS,
+                                    REQUEST_CAMERA_PERMISSIONS);
+                        }
+                    })
+                    .setNegativeButton(android.R.string.cancel,
+                            new DialogInterface.OnClickListener() {
+                                @Override
+                                public void onClick(DialogInterface dialog, int which) {
+                                    getActivity().finish();
+                                }
+                            })
+                    .create();
+        }
+
+    }
 
 }
diff --git a/media/Camera2Raw/Application/src/main/res/values/strings.xml b/media/Camera2Raw/Application/src/main/res/values/strings.xml
index 0f56ce9..84672a0 100644
--- a/media/Camera2Raw/Application/src/main/res/values/strings.xml
+++ b/media/Camera2Raw/Application/src/main/res/values/strings.xml
@@ -16,4 +16,5 @@
 <resources>
     <string name="picture">Picture</string>
     <string name="description_info">Info</string>
+    <string name="request_permission">This app needs camera permission.</string>
 </resources>
diff --git a/media/Camera2Raw/template-params.xml b/media/Camera2Raw/template-params.xml
index 18a0a7f..7cf0664 100644
--- a/media/Camera2Raw/template-params.xml
+++ b/media/Camera2Raw/template-params.xml
@@ -19,8 +19,10 @@
     <name>Camera2Raw</name>
     <group>Media</group>
     <package>com.example.android.camera2raw</package>
+
+    <dependency>com.android.support:appcompat-v7:23.0.0</dependency>
     <minSdk>21</minSdk>
-    <targetSdkVersion>22</targetSdkVersion>
+
     <strings>
         <intro>
             <![CDATA[
diff --git a/media/Camera2Video/Application/src/main/java/com/example/android/camera2video/Camera2VideoFragment.java b/media/Camera2Video/Application/src/main/java/com/example/android/camera2video/Camera2VideoFragment.java
index 78e276a..1ea5318 100644
--- a/media/Camera2Video/Application/src/main/java/com/example/android/camera2video/Camera2VideoFragment.java
+++ b/media/Camera2Video/Application/src/main/java/com/example/android/camera2video/Camera2VideoFragment.java
@@ -16,6 +16,7 @@
 
 package com.example.android.camera2video;
 
+import android.Manifest;
 import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
@@ -23,6 +24,7 @@
 import android.app.Fragment;
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.pm.PackageManager;
 import android.content.res.Configuration;
 import android.graphics.Matrix;
 import android.graphics.RectF;
@@ -39,6 +41,9 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.HandlerThread;
+import android.support.annotation.NonNull;
+import android.support.v13.app.FragmentCompat;
+import android.support.v4.app.ActivityCompat;
 import android.util.Log;
 import android.util.Size;
 import android.util.SparseIntArray;
@@ -59,11 +64,19 @@
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 
-public class Camera2VideoFragment extends Fragment implements View.OnClickListener {
+public class Camera2VideoFragment extends Fragment
+        implements View.OnClickListener, FragmentCompat.OnRequestPermissionsResultCallback {
 
     private static final SparseIntArray ORIENTATIONS = new SparseIntArray();
 
     private static final String TAG = "Camera2VideoFragment";
+    private static final int REQUEST_VIDEO_PERMISSIONS = 1;
+    private static final String FRAGMENT_DIALOG = "dialog";
+
+    private static final String[] VIDEO_PERMISSIONS = {
+            Manifest.permission.CAMERA,
+            Manifest.permission.RECORD_AUDIO,
+    };
 
     static {
         ORIENTATIONS.append(Surface.ROTATION_0, 90);
@@ -88,7 +101,8 @@
     private CameraDevice mCameraDevice;
 
     /**
-     * A reference to the current {@link android.hardware.camera2.CameraCaptureSession} for preview.
+     * A reference to the current {@link android.hardware.camera2.CameraCaptureSession} for
+     * preview.
      */
     private CameraCaptureSession mPreviewSession;
 
@@ -198,14 +212,12 @@
     };
 
     public static Camera2VideoFragment newInstance() {
-        Camera2VideoFragment fragment = new Camera2VideoFragment();
-        fragment.setRetainInstance(true);
-        return fragment;
+        return new Camera2VideoFragment();
     }
 
     /**
-     * In this sample, we choose a video size with 3x4 aspect ratio. Also, we don't use sizes larger
-     * than 1080p, since MediaRecorder cannot handle such a high-resolution video.
+     * In this sample, we choose a video size with 3x4 aspect ratio. Also, we don't use sizes
+     * larger than 1080p, since MediaRecorder cannot handle such a high-resolution video.
      *
      * @param choices The list of available sizes
      * @return The video size
@@ -332,15 +344,78 @@
     }
 
     /**
+     * Gets whether you should show UI with rationale for requesting permissions.
+     *
+     * @param permissions The permissions your app wants to request.
+     * @return Whether you can show permission rationale UI.
+     */
+    private boolean shouldShowRequestPermissionRationale(String[] permissions) {
+        for (String permission : permissions) {
+            if (FragmentCompat.shouldShowRequestPermissionRationale(this, permission)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Requests permissions needed for recording video.
+     */
+    private void requestVideoPermissions() {
+        if (shouldShowRequestPermissionRationale(VIDEO_PERMISSIONS)) {
+            new ConfirmationDialog().show(getChildFragmentManager(), FRAGMENT_DIALOG);
+        } else {
+            FragmentCompat.requestPermissions(this, VIDEO_PERMISSIONS, REQUEST_VIDEO_PERMISSIONS);
+        }
+    }
+
+    @Override
+    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
+                                           @NonNull int[] grantResults) {
+        Log.d(TAG, "onRequestPermissionsResult");
+        if (requestCode == REQUEST_VIDEO_PERMISSIONS) {
+            if (grantResults.length == VIDEO_PERMISSIONS.length) {
+                for (int result : grantResults) {
+                    if (result != PackageManager.PERMISSION_GRANTED) {
+                        ErrorDialog.newInstance(getString(R.string.permission_request))
+                                .show(getChildFragmentManager(), FRAGMENT_DIALOG);
+                        break;
+                    }
+                }
+            } else {
+                ErrorDialog.newInstance(getString(R.string.permission_request))
+                        .show(getChildFragmentManager(), FRAGMENT_DIALOG);
+            }
+        } else {
+            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+        }
+    }
+
+    private boolean hasPermissionsGranted(String[] permissions) {
+        for (String permission : permissions) {
+            if (ActivityCompat.checkSelfPermission(getActivity(), permission)
+                    != PackageManager.PERMISSION_GRANTED) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
      * Tries to open a {@link CameraDevice}. The result is listened by `mStateCallback`.
      */
     private void openCamera(int width, int height) {
+        if (!hasPermissionsGranted(VIDEO_PERMISSIONS)) {
+            requestVideoPermissions();
+            return;
+        }
         final Activity activity = getActivity();
         if (null == activity || activity.isFinishing()) {
             return;
         }
         CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
         try {
+            Log.d(TAG, "tryAcquire");
             if (!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) {
                 throw new RuntimeException("Time out waiting to lock camera opening.");
             }
@@ -369,7 +444,8 @@
         } catch (NullPointerException e) {
             // Currently an NPE is thrown when the Camera2API is used but not supported on the
             // device this code runs.
-            new ErrorDialog().show(getFragmentManager(), "dialog");
+            ErrorDialog.newInstance(getString(R.string.camera_error))
+                    .show(getChildFragmentManager(), FRAGMENT_DIALOG);
         } catch (InterruptedException e) {
             throw new RuntimeException("Interrupted while trying to lock camera opening.");
         }
@@ -389,7 +465,7 @@
         } catch (InterruptedException e) {
             throw new RuntimeException("Interrupted while trying to lock camera closing.");
         } finally {
-             mCameraOpenCloseLock.release();
+            mCameraOpenCloseLock.release();
         }
     }
 
@@ -559,11 +635,21 @@
 
     public static class ErrorDialog extends DialogFragment {
 
+        private static final String ARG_MESSAGE = "message";
+
+        public static ErrorDialog newInstance(String message) {
+            ErrorDialog dialog = new ErrorDialog();
+            Bundle args = new Bundle();
+            args.putString(ARG_MESSAGE, message);
+            dialog.setArguments(args);
+            return dialog;
+        }
+
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
             final Activity activity = getActivity();
             return new AlertDialog.Builder(activity)
-                    .setMessage("This device doesn't support Camera2 API.")
+                    .setMessage(getArguments().getString(ARG_MESSAGE))
                     .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                         @Override
                         public void onClick(DialogInterface dialogInterface, int i) {
@@ -575,4 +661,30 @@
 
     }
 
+    public static class ConfirmationDialog extends DialogFragment {
+
+        @Override
+        public Dialog onCreateDialog(Bundle savedInstanceState) {
+            final Fragment parent = getParentFragment();
+            return new AlertDialog.Builder(getActivity())
+                    .setMessage(R.string.permission_request)
+                    .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+                        @Override
+                        public void onClick(DialogInterface dialog, int which) {
+                            FragmentCompat.requestPermissions(parent, VIDEO_PERMISSIONS,
+                                    REQUEST_VIDEO_PERMISSIONS);
+                        }
+                    })
+                    .setNegativeButton(android.R.string.cancel,
+                            new DialogInterface.OnClickListener() {
+                                @Override
+                                public void onClick(DialogInterface dialog, int which) {
+                                    parent.getActivity().finish();
+                                }
+                            })
+                    .create();
+        }
+
+    }
+
 }
diff --git a/media/Camera2Video/Application/src/main/res/values/strings.xml b/media/Camera2Video/Application/src/main/res/values/strings.xml
index bf5e439..bce323f 100644
--- a/media/Camera2Video/Application/src/main/res/values/strings.xml
+++ b/media/Camera2Video/Application/src/main/res/values/strings.xml
@@ -3,4 +3,6 @@
     <string name="record">Record</string>
     <string name="stop">Stop</string>
     <string name="description_info">Info</string>
+    <string name="permission_request">This sample needs permission for camera and audio recording.</string>
+    <string name="camera_error">This device doesn\'t support Camera2 API.</string>
 </resources>
\ No newline at end of file
diff --git a/media/Camera2Video/README.md b/media/Camera2Video/README.md
index c6bb215..ac5084c 100644
--- a/media/Camera2Video/README.md
+++ b/media/Camera2Video/README.md
@@ -43,7 +43,7 @@
 Pre-requisites
 --------------
 
-- Android SDK v21
+- Android SDK v23
 - Android Build Tools v23.0.0
 - Android Support Repository
 
diff --git a/media/Camera2Video/template-params.xml b/media/Camera2Video/template-params.xml
index 9a5d8c4..cc82fa0 100644
--- a/media/Camera2Video/template-params.xml
+++ b/media/Camera2Video/template-params.xml
@@ -20,8 +20,8 @@
     <group>Media</group>
     <package>com.example.android.camera2video</package>
 
+    <dependency>com.android.support:appcompat-v7:23.0.0</dependency>
     <minSdk>21</minSdk>
-    <targetSdkVersion>22</targetSdkVersion>
 
     <strings>
         <intro>
diff --git a/media/MidiSynth/Application/.gitignore b/media/MidiSynth/Application/.gitignore
new file mode 100644
index 0000000..6eb878d
--- /dev/null
+++ b/media/MidiSynth/Application/.gitignore
@@ -0,0 +1,16 @@
+# Copyright 2013 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.
+src/template/
+src/common/
+build.gradle
diff --git a/media/MidiSynth/Application/proguard-project.txt b/media/MidiSynth/Application/proguard-project.txt
new file mode 100644
index 0000000..f2fe155
--- /dev/null
+++ b/media/MidiSynth/Application/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
diff --git a/media/MidiSynth/Application/src/androidTest/java/com/example/android/midisynth/test/SampleTests.java b/media/MidiSynth/Application/src/androidTest/java/com/example/android/midisynth/test/SampleTests.java
new file mode 100644
index 0000000..3d5d7a7
--- /dev/null
+++ b/media/MidiSynth/Application/src/androidTest/java/com/example/android/midisynth/test/SampleTests.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2015 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.example.android.midisynth.test;
+
+import com.example.android.midisynth.*;
+
+import android.test.ActivityInstrumentationTestCase2;
+
+/**
+ * Tests for MidiSynth sample.
+ */
+public class SampleTests extends ActivityInstrumentationTestCase2<MainActivity> {
+
+    private MainActivity mTestActivity;
+
+    public SampleTests() {
+        super(MainActivity.class);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mTestActivity = getActivity();
+    }
+
+    /**
+    * Test if the test fixture has been set up correctly.
+    */
+    public void testPreconditions() {
+        assertNotNull("mTestActivity is null", mTestActivity);
+    }
+
+    /**
+    * Add more tests below.
+    */
+
+}
diff --git a/media/MidiSynth/Application/src/main/AndroidManifest.xml b/media/MidiSynth/Application/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..1002419
--- /dev/null
+++ b/media/MidiSynth/Application/src/main/AndroidManifest.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2015 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 package="com.example.android.midisynth"
+          xmlns:android="http://schemas.android.com/apk/res/android"
+          android:versionCode="1"
+          android:versionName="1.0">
+
+    <uses-feature
+        android:name="android.software.midi"
+        android:required="true"/>
+
+    <application
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:theme="@style/MidiSynthTheme">
+
+        <activity
+            android:name=".MainActivity"
+            android:label="@string/app_name">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity>
+
+        <service
+            android:name=".MidiSynthDeviceService"
+            android:permission="android.permission.BIND_MIDI_DEVICE_SERVICE">
+            <intent-filter>
+                <action android:name="android.media.midi.MidiDeviceService"/>
+            </intent-filter>
+            <meta-data
+                android:name="android.media.midi.MidiDeviceService"
+                android:resource="@xml/synth_device_info"/>
+        </service>
+
+    </application>
+
+</manifest>
diff --git a/media/MidiSynth/Application/src/main/java/com/example/android/midisynth/MainActivity.java b/media/MidiSynth/Application/src/main/java/com/example/android/midisynth/MainActivity.java
new file mode 100644
index 0000000..92964b4
--- /dev/null
+++ b/media/MidiSynth/Application/src/main/java/com/example/android/midisynth/MainActivity.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2015 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.example.android.midisynth;
+
+import android.app.ActionBar;
+import android.app.Activity;
+import android.content.pm.PackageManager;
+import android.media.midi.MidiDevice.MidiConnection;
+import android.media.midi.MidiDeviceInfo;
+import android.media.midi.MidiManager;
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.WindowManager;
+import android.widget.Toast;
+import android.widget.Toolbar;
+
+import com.example.android.common.midi.MidiOutputPortConnectionSelector;
+import com.example.android.common.midi.MidiPortConnector;
+import com.example.android.common.midi.MidiTools;
+
+/**
+ * Simple synthesizer as a MIDI Device.
+ */
+public class MainActivity extends Activity {
+    static final String TAG = "MidiSynthExample";
+
+    private MidiManager mMidiManager;
+    private MidiOutputPortConnectionSelector mPortSelector;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.main);
+        setActionBar((Toolbar) findViewById(R.id.toolbar));
+        ActionBar actionBar = getActionBar();
+        if (actionBar != null) {
+            actionBar.setDisplayShowTitleEnabled(false);
+        }
+
+        if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_MIDI)) {
+            setupMidi();
+        }
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.main, menu);
+        setKeepScreenOn(menu.findItem(R.id.action_keep_screen_on).isChecked());
+        return true;
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        switch (item.getItemId()) {
+            case R.id.action_keep_screen_on:
+                boolean checked = !item.isChecked();
+                setKeepScreenOn(checked);
+                item.setChecked(checked);
+                break;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    private void setKeepScreenOn(boolean keepScreenOn) {
+        if (keepScreenOn) {
+            getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+        } else {
+            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+        }
+    }
+
+    private void setupMidi() {
+        // Setup MIDI
+        mMidiManager = (MidiManager) getSystemService(MIDI_SERVICE);
+
+        MidiDeviceInfo synthInfo = MidiTools.findDevice(mMidiManager, "AndroidTest",
+                "SynthExample");
+        int portIndex = 0;
+        mPortSelector = new MidiOutputPortConnectionSelector(mMidiManager, this,
+                R.id.spinner_synth_sender, synthInfo, portIndex);
+        mPortSelector.setConnectedListener(new MyPortsConnectedListener());
+    }
+
+    private void closeSynthResources() {
+        if (mPortSelector != null) {
+            mPortSelector.close();
+        }
+    }
+
+    // TODO A better way would be to listen to the synth server
+    // for open/close events and then disable/enable the spinner.
+    private class MyPortsConnectedListener
+            implements MidiPortConnector.OnPortsConnectedListener {
+        @Override
+        public void onPortsConnected(final MidiConnection connection) {
+            runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    if (connection == null) {
+                        Toast.makeText(MainActivity.this,
+                                R.string.error_port_busy, Toast.LENGTH_SHORT)
+                                .show();
+                        mPortSelector.clearSelection();
+                    } else {
+                        Toast.makeText(MainActivity.this,
+                                R.string.port_open_ok, Toast.LENGTH_SHORT)
+                                .show();
+                    }
+                }
+            });
+        }
+    }
+
+    @Override
+    public void onDestroy() {
+        closeSynthResources();
+        super.onDestroy();
+    }
+
+}
diff --git a/media/MidiSynth/Application/src/main/java/com/example/android/midisynth/MidiSynthDeviceService.java b/media/MidiSynth/Application/src/main/java/com/example/android/midisynth/MidiSynthDeviceService.java
new file mode 100644
index 0000000..b9f25ee
--- /dev/null
+++ b/media/MidiSynth/Application/src/main/java/com/example/android/midisynth/MidiSynthDeviceService.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2015 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.example.android.midisynth;
+
+import android.media.midi.MidiDeviceService;
+import android.media.midi.MidiDeviceStatus;
+import android.media.midi.MidiReceiver;
+
+import com.example.android.common.midi.synth.SynthEngine;
+
+public class MidiSynthDeviceService extends MidiDeviceService {
+
+    private static final String TAG = MainActivity.TAG;
+    private SynthEngine mSynthEngine = new SynthEngine();
+    private boolean mSynthStarted = false;
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+    }
+
+    @Override
+    public void onDestroy() {
+        mSynthEngine.stop();
+        super.onDestroy();
+    }
+
+    @Override
+    public MidiReceiver[] onGetInputPortReceivers() {
+        return new MidiReceiver[]{mSynthEngine};
+    }
+
+    /**
+     * This will get called when clients connect or disconnect.
+     */
+    @Override
+    public void onDeviceStatusChanged(MidiDeviceStatus status) {
+        if (status.isInputPortOpen(0) && !mSynthStarted) {
+            mSynthEngine.start();
+            mSynthStarted = true;
+        } else if (!status.isInputPortOpen(0) && mSynthStarted) {
+            mSynthEngine.stop();
+            mSynthStarted = false;
+        }
+    }
+
+}
diff --git a/media/MidiSynth/Application/src/main/res/layout/main.xml b/media/MidiSynth/Application/src/main/res/layout/main.xml
new file mode 100644
index 0000000..6b9e2c7
--- /dev/null
+++ b/media/MidiSynth/Application/src/main/res/layout/main.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2015 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:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <Toolbar
+        android:id="@+id/toolbar"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="?android:attr/colorPrimary"
+        android:elevation="4dp"
+        android:minHeight="?android:attr/actionBarSize"
+        android:popupTheme="@android:style/ThemeOverlay.Material.Light"
+        android:theme="@android:style/ThemeOverlay.Material.Dark.ActionBar">
+
+        <Spinner
+            android:id="@+id/spinner_synth_sender"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:entries="@array/senders"
+            android:popupTheme="@android:style/ThemeOverlay.Material.Light" />
+
+    </Toolbar>
+
+    <TextView
+        android:id="@+id/message"
+        style="@android:style/TextAppearance.Medium"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="1"
+        android:paddingBottom="8dp"
+        android:paddingEnd="16dp"
+        android:paddingStart="16dp"
+        android:paddingTop="8dp"
+        android:text="@string/synth_sender_text" />
+
+</LinearLayout>
diff --git a/media/MidiSynth/Application/src/main/res/menu/main.xml b/media/MidiSynth/Application/src/main/res/menu/main.xml
new file mode 100644
index 0000000..33093f0
--- /dev/null
+++ b/media/MidiSynth/Application/src/main/res/menu/main.xml
@@ -0,0 +1,25 @@
+<!--
+ Copyright 2015 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.
+-->
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item
+        android:id="@+id/action_keep_screen_on"
+        android:checkable="true"
+        android:checked="true"
+        android:showAsAction="never"
+        android:title="@string/keep_screen_on"/>
+
+</menu>
diff --git a/media/MidiSynth/Application/src/main/res/mipmap-hdpi/ic_launcher.png b/media/MidiSynth/Application/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..38250e7
--- /dev/null
+++ b/media/MidiSynth/Application/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/media/MidiSynth/Application/src/main/res/mipmap-mdpi/ic_launcher.png b/media/MidiSynth/Application/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..58c0025
--- /dev/null
+++ b/media/MidiSynth/Application/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/media/MidiSynth/Application/src/main/res/mipmap-xhdpi/ic_launcher.png b/media/MidiSynth/Application/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..3694855
--- /dev/null
+++ b/media/MidiSynth/Application/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/media/MidiSynth/Application/src/main/res/mipmap-xxhdpi/ic_launcher.png b/media/MidiSynth/Application/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..fb50ad1
--- /dev/null
+++ b/media/MidiSynth/Application/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/media/MidiSynth/Application/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/media/MidiSynth/Application/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..801bf9c
--- /dev/null
+++ b/media/MidiSynth/Application/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/media/MidiSynth/Application/src/main/res/values/colors.xml b/media/MidiSynth/Application/src/main/res/values/colors.xml
new file mode 100644
index 0000000..4d2204f
--- /dev/null
+++ b/media/MidiSynth/Application/src/main/res/values/colors.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2015 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>
+    <color name="primary">#4CAF50</color>
+    <color name="primary_dark">#388E3C</color>
+    <color name="primary_light">#C8E6C9</color>
+    <color name="accent">#FFEB3B</color>
+    <color name="primary_text">#212121</color>
+    <color name="secondary_text">#727272</color>
+    <color name="icons">#FFFFFF</color>
+    <color name="divider">#B6B6B6</color>
+</resources>
diff --git a/media/MidiSynth/Application/src/main/res/values/strings.xml b/media/MidiSynth/Application/src/main/res/values/strings.xml
new file mode 100644
index 0000000..76a8fa2
--- /dev/null
+++ b/media/MidiSynth/Application/src/main/res/values/strings.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2015 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="synth_sender_text">Select Sender for Synth</string>
+    <string name="error_port_busy">Selected port is in use or unavailable.</string>
+    <string name="port_open_ok">Port opened OK.</string>
+    <string-array name="senders">
+        <item>"none"</item>
+    </string-array>
+    <string name="keep_screen_on">Keep screen on</string>
+</resources>
diff --git a/media/MidiSynth/Application/src/main/res/values/styles.xml b/media/MidiSynth/Application/src/main/res/values/styles.xml
new file mode 100644
index 0000000..30d6455
--- /dev/null
+++ b/media/MidiSynth/Application/src/main/res/values/styles.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2015 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>
+
+    <style name="MidiSynthTheme" parent="android:Theme.Material.Light.NoActionBar">
+        <item name="android:colorPrimary">@color/primary</item>
+        <item name="android:colorPrimaryDark">@color/primary_dark</item>
+        <item name="android:colorAccent">@color/accent</item>
+    </style>
+
+</resources>
diff --git a/media/MidiSynth/Application/src/main/res/xml/synth_device_info.xml b/media/MidiSynth/Application/src/main/res/xml/synth_device_info.xml
new file mode 100644
index 0000000..405e87e
--- /dev/null
+++ b/media/MidiSynth/Application/src/main/res/xml/synth_device_info.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2015 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.
+-->
+<devices>
+    <device manufacturer="AndroidTest" product="SynthExample">
+        <input-port name="input" />
+    </device>
+</devices>
diff --git a/media/MidiSynth/build.gradle b/media/MidiSynth/build.gradle
new file mode 100644
index 0000000..9b6a9ce
--- /dev/null
+++ b/media/MidiSynth/build.gradle
@@ -0,0 +1,12 @@
+
+
+// BEGIN_EXCLUDE
+import com.example.android.samples.build.SampleGenPlugin
+apply plugin: SampleGenPlugin
+
+samplegen {
+  pathToBuild "../../../../build"
+  pathToSamplesCommon "../../common"
+}
+apply from: "../../../../build/build.gradle"
+// END_EXCLUDE
diff --git a/media/MidiSynth/buildSrc/build.gradle b/media/MidiSynth/buildSrc/build.gradle
new file mode 100644
index 0000000..d77115d
--- /dev/null
+++ b/media/MidiSynth/buildSrc/build.gradle
@@ -0,0 +1,16 @@
+
+repositories {
+    jcenter()
+}
+dependencies {
+    compile 'org.freemarker:freemarker:2.3.20'
+}
+
+sourceSets {
+    main {
+        groovy {
+            srcDir new File(rootDir, "../../../../../build/buildSrc/src/main/groovy")
+        }
+    }
+}
+
diff --git a/media/MidiSynth/gradle/wrapper/gradle-wrapper.jar b/media/MidiSynth/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..8c0fb64
--- /dev/null
+++ b/media/MidiSynth/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/media/MidiSynth/gradle/wrapper/gradle-wrapper.properties b/media/MidiSynth/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..afb3296
--- /dev/null
+++ b/media/MidiSynth/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed Apr 10 15:27:10 PDT 2013
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=http\://services.gradle.org/distributions/gradle-2.2.1-bin.zip
diff --git a/media/MidiSynth/gradlew b/media/MidiSynth/gradlew
new file mode 100755
index 0000000..91a7e26
--- /dev/null
+++ b/media/MidiSynth/gradlew
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+    [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/media/MidiSynth/gradlew.bat b/media/MidiSynth/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/media/MidiSynth/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/media/MidiSynth/screenshots/1-main.png b/media/MidiSynth/screenshots/1-main.png
new file mode 100644
index 0000000..43a4f80
--- /dev/null
+++ b/media/MidiSynth/screenshots/1-main.png
Binary files differ
diff --git a/media/MidiSynth/screenshots/icon-web.png b/media/MidiSynth/screenshots/icon-web.png
new file mode 100644
index 0000000..dfd5a51
--- /dev/null
+++ b/media/MidiSynth/screenshots/icon-web.png
Binary files differ
diff --git a/media/MidiSynth/settings.gradle b/media/MidiSynth/settings.gradle
new file mode 100644
index 0000000..0a5c310
--- /dev/null
+++ b/media/MidiSynth/settings.gradle
@@ -0,0 +1,2 @@
+
+include 'Application'
diff --git a/media/MidiSynth/template-params.xml b/media/MidiSynth/template-params.xml
new file mode 100644
index 0000000..7e35471
--- /dev/null
+++ b/media/MidiSynth/template-params.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright 2015 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.
+-->
+<sample>
+    <name>MidiSynth</name>
+    <group>Media</group>
+    <package>com.example.android.midisynth</package>
+
+    <minSdk>23</minSdk>
+    <targetSdkVersion>23</targetSdkVersion>
+    <compileSdkVersion>23</compileSdkVersion>
+    <strings>
+        <intro>
+            <![CDATA[
+This sample demonstrates how to use the MIDI API to receive and play MIDI signals coming from an
+attached input device.
+            ]]>
+        </intro>
+    </strings>
+
+    <common src="midi" />
+    <template src="base" />
+
+    <metadata>
+        <status>PUBLISHED</status>
+        <categories>Media</categories>
+        <technologies>Android</technologies>
+        <languages>Java</languages>
+        <solutions>Mobile</solutions>
+        <level>INTERMEDIATE</level>
+        <icon>screenshots/icon-web.png</icon>
+        <screenshots>
+            <img>screenshots/1-main.png</img>
+        </screenshots>
+        <api_refs>
+            <android>android.media.midi.MidiManager</android>
+            <android>android.media.midi.MidiReceiver</android>
+        </api_refs>
+        <description>
+            <![CDATA[
+Sample demonstrating how to use the MIDI API to receive and play MIDI signals coming from an
+attached input device (MIDI keyboard).
+	    ]]>
+        </description>
+
+        <!-- Multi-paragraph introduction to sample, from an educational point-of-view.
+        Makrdown formatting allowed. This will be used to generate a mini-article for the
+        sample on DAC. -->
+        <intro>
+            <![CDATA[
+The Android MIDI API ([android.media.midi][1]) allows developers to connect a MIDI device to Android
+and process MIDI signals coming from it. This sample demonstrates some basic features of the MIDI
+API, such as enumeration of currently available devices (Information includes name, vendor,
+capabilities, etc), notification when MIDI devices are plugged in or unplugged, and receiving MIDI
+signals. This sample contains a simple implementation of oscillator and play sound for incoming MIDI
+signals.
+[1]: https://developer.android.com/reference/android/media/midi/package-summary.html
+	    ]]>
+        </intro>
+    </metadata>
+</sample>
