Merge "Print API updated." into klp-dev
diff --git a/api/current.txt b/api/current.txt
index e50d769..87c288c 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -19000,39 +19000,21 @@
     method public void clear();
     method public int describeContents();
     method public int getColorMode();
-    method public int getDuplexMode();
-    method public int getFittingMode();
-    method public android.print.PrintAttributes.Tray getInputTray();
     method public android.print.PrintAttributes.Margins getMargins();
     method public android.print.PrintAttributes.MediaSize getMediaSize();
-    method public int getOrientation();
-    method public android.print.PrintAttributes.Tray getOutputTray();
     method public android.print.PrintAttributes.Resolution getResolution();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final int COLOR_MODE_COLOR = 2; // 0x2
     field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
     field public static final android.os.Parcelable.Creator CREATOR;
-    field public static final int DUPLEX_MODE_LONG_EDGE = 2; // 0x2
-    field public static final int DUPLEX_MODE_NONE = 1; // 0x1
-    field public static final int DUPLEX_MODE_SHORT_EDGE = 4; // 0x4
-    field public static final int FITTING_MODE_NONE = 1; // 0x1
-    field public static final int FITTING_MODE_SCALE_TO_FILL = 4; // 0x4
-    field public static final int FITTING_MODE_SCALE_TO_FIT = 2; // 0x2
-    field public static final int ORIENTATION_LANDSCAPE = 2; // 0x2
-    field public static final int ORIENTATION_PORTRAIT = 1; // 0x1
   }
 
   public static final class PrintAttributes.Builder {
     ctor public PrintAttributes.Builder();
     method public android.print.PrintAttributes create();
     method public android.print.PrintAttributes.Builder setColorMode(int);
-    method public android.print.PrintAttributes.Builder setDuplexMode(int);
-    method public android.print.PrintAttributes.Builder setFittingMode(int);
-    method public android.print.PrintAttributes.Builder setInputTray(android.print.PrintAttributes.Tray);
     method public android.print.PrintAttributes.Builder setMargins(android.print.PrintAttributes.Margins);
     method public android.print.PrintAttributes.Builder setMediaSize(android.print.PrintAttributes.MediaSize);
-    method public android.print.PrintAttributes.Builder setOrientation(int);
-    method public android.print.PrintAttributes.Builder setOutputTray(android.print.PrintAttributes.Tray);
     method public android.print.PrintAttributes.Builder setResolution(android.print.PrintAttributes.Resolution);
   }
 
@@ -19046,67 +19028,65 @@
   }
 
   public static final class PrintAttributes.MediaSize {
+    ctor public PrintAttributes.MediaSize(java.lang.String, java.lang.String, int, int, int);
     ctor public PrintAttributes.MediaSize(java.lang.String, java.lang.String, int, int);
-    method public static android.print.PrintAttributes.MediaSize createMediaSize(android.content.pm.PackageManager, int);
+    method public android.print.PrintAttributes.MediaSize asLandscape();
+    method public android.print.PrintAttributes.MediaSize asPortrait();
     method public int getHeightMils();
     method public java.lang.String getId();
-    method public java.lang.String getLabel();
+    method public java.lang.String getLabel(android.content.pm.PackageManager);
     method public int getWidthMils();
-    field public static final int ISO_A0 = 1; // 0x1
-    field public static final int ISO_A1 = 2; // 0x2
-    field public static final int ISO_A10 = 11; // 0xb
-    field public static final int ISO_A2 = 3; // 0x3
-    field public static final int ISO_A3 = 4; // 0x4
-    field public static final int ISO_A4 = 5; // 0x5
-    field public static final int ISO_A5 = 6; // 0x6
-    field public static final int ISO_A6 = 7; // 0x7
-    field public static final int ISO_A7 = 8; // 0x8
-    field public static final int ISO_A8 = 9; // 0x9
-    field public static final int ISO_A9 = 10; // 0xa
-    field public static final int ISO_B0 = 100; // 0x64
-    field public static final int ISO_B1 = 101; // 0x65
-    field public static final int ISO_B10 = 110; // 0x6e
-    field public static final int ISO_B2 = 102; // 0x66
-    field public static final int ISO_B3 = 103; // 0x67
-    field public static final int ISO_B4 = 104; // 0x68
-    field public static final int ISO_B5 = 105; // 0x69
-    field public static final int ISO_B6 = 106; // 0x6a
-    field public static final int ISO_B7 = 107; // 0x6b
-    field public static final int ISO_B8 = 108; // 0x6c
-    field public static final int ISO_B9 = 109; // 0x6d
-    field public static final int ISO_C0 = 200; // 0xc8
-    field public static final int ISO_C1 = 201; // 0xc9
-    field public static final int ISO_C10 = 210; // 0xd2
-    field public static final int ISO_C2 = 202; // 0xca
-    field public static final int ISO_C3 = 203; // 0xcb
-    field public static final int ISO_C4 = 204; // 0xcc
-    field public static final int ISO_C5 = 205; // 0xcd
-    field public static final int ISO_C6 = 206; // 0xce
-    field public static final int ISO_C7 = 207; // 0xcf
-    field public static final int ISO_C8 = 208; // 0xd0
-    field public static final int ISO_C9 = 209; // 0xd1
-    field public static final int NA_GOVT_LETTER = 301; // 0x12d
-    field public static final int NA_JUNIOR_LEGAL = 303; // 0x12f
-    field public static final int NA_LEDGER = 304; // 0x130
-    field public static final int NA_LEGAL = 302; // 0x12e
-    field public static final int NA_LETTER = 300; // 0x12c
-    field public static final int NA_TBLOID = 305; // 0x131
+    method public boolean isPortrait();
+    field public static final android.print.PrintAttributes.MediaSize ISO_A0;
+    field public static final android.print.PrintAttributes.MediaSize ISO_A1;
+    field public static final android.print.PrintAttributes.MediaSize ISO_A10;
+    field public static final android.print.PrintAttributes.MediaSize ISO_A2;
+    field public static final android.print.PrintAttributes.MediaSize ISO_A3;
+    field public static final android.print.PrintAttributes.MediaSize ISO_A4;
+    field public static final android.print.PrintAttributes.MediaSize ISO_A5;
+    field public static final android.print.PrintAttributes.MediaSize ISO_A6;
+    field public static final android.print.PrintAttributes.MediaSize ISO_A7;
+    field public static final android.print.PrintAttributes.MediaSize ISO_A8;
+    field public static final android.print.PrintAttributes.MediaSize ISO_A9;
+    field public static final android.print.PrintAttributes.MediaSize ISO_B0;
+    field public static final android.print.PrintAttributes.MediaSize ISO_B1;
+    field public static final android.print.PrintAttributes.MediaSize ISO_B10;
+    field public static final android.print.PrintAttributes.MediaSize ISO_B2;
+    field public static final android.print.PrintAttributes.MediaSize ISO_B3;
+    field public static final android.print.PrintAttributes.MediaSize ISO_B4;
+    field public static final android.print.PrintAttributes.MediaSize ISO_B5;
+    field public static final android.print.PrintAttributes.MediaSize ISO_B6;
+    field public static final android.print.PrintAttributes.MediaSize ISO_B7;
+    field public static final android.print.PrintAttributes.MediaSize ISO_B8;
+    field public static final android.print.PrintAttributes.MediaSize ISO_B9;
+    field public static final android.print.PrintAttributes.MediaSize ISO_C0;
+    field public static final android.print.PrintAttributes.MediaSize ISO_C1;
+    field public static final android.print.PrintAttributes.MediaSize ISO_C10;
+    field public static final android.print.PrintAttributes.MediaSize ISO_C2;
+    field public static final android.print.PrintAttributes.MediaSize ISO_C3;
+    field public static final android.print.PrintAttributes.MediaSize ISO_C4;
+    field public static final android.print.PrintAttributes.MediaSize ISO_C5;
+    field public static final android.print.PrintAttributes.MediaSize ISO_C6;
+    field public static final android.print.PrintAttributes.MediaSize ISO_C7;
+    field public static final android.print.PrintAttributes.MediaSize ISO_C8;
+    field public static final android.print.PrintAttributes.MediaSize ISO_C9;
+    field public static final android.print.PrintAttributes.MediaSize NA_GOVT_LETTER;
+    field public static final android.print.PrintAttributes.MediaSize NA_JUNIOR_LEGAL;
+    field public static final android.print.PrintAttributes.MediaSize NA_LEDGER;
+    field public static final android.print.PrintAttributes.MediaSize NA_LEGAL;
+    field public static final android.print.PrintAttributes.MediaSize NA_LETTER;
+    field public static final android.print.PrintAttributes.MediaSize NA_TBLOID;
   }
 
   public static final class PrintAttributes.Resolution {
+    ctor public PrintAttributes.Resolution(java.lang.String, java.lang.String, int, int, int);
     ctor public PrintAttributes.Resolution(java.lang.String, java.lang.String, int, int);
     method public int getHorizontalDpi();
     method public java.lang.String getId();
-    method public java.lang.String getLabel();
+    method public java.lang.String getLabel(android.content.pm.PackageManager);
     method public int getVerticalDpi();
   }
 
-  public static final class PrintAttributes.Tray {
-    ctor public PrintAttributes.Tray(java.lang.String, java.lang.String);
-    method public java.lang.String getId();
-    method public java.lang.String getLabel();
-  }
-
   public abstract class PrintDocumentAdapter {
     ctor public PrintDocumentAdapter();
     method public void onFinish();
@@ -19130,34 +19110,22 @@
 
   public final class PrintDocumentInfo implements android.os.Parcelable {
     method public int describeContents();
-    method public int getColorMode();
     method public int getContentType();
     method public long getDataSize();
-    method public int getFittingMode();
-    method public android.print.PrintAttributes.Margins getMargins();
-    method public android.print.PrintAttributes.MediaSize getMediaSize();
     method public java.lang.String getName();
-    method public int getOrientation();
     method public int getPageCount();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final int CONTENT_TYPE_DOCUMENT = 0; // 0x0
     field public static final int CONTENT_TYPE_PHOTO = 1; // 0x1
     field public static final int CONTENT_TYPE_UNKNOWN = -1; // 0xffffffff
     field public static final android.os.Parcelable.Creator CREATOR;
-    field public static final android.print.PrintAttributes.MediaSize MEDIA_SIZE_UNKNOWN;
     field public static final int PAGE_COUNT_UNKNOWN = -1; // 0xffffffff
   }
 
   public static final class PrintDocumentInfo.Builder {
-    ctor public PrintDocumentInfo.Builder(java.lang.String, android.print.PrintAttributes);
     ctor public PrintDocumentInfo.Builder(java.lang.String);
     method public android.print.PrintDocumentInfo create();
-    method public android.print.PrintDocumentInfo.Builder setColorMode(int);
     method public android.print.PrintDocumentInfo.Builder setContentType(int);
-    method public android.print.PrintDocumentInfo.Builder setFittingMode(int);
-    method public android.print.PrintDocumentInfo.Builder setMargins(android.print.PrintAttributes.Margins);
-    method public android.print.PrintDocumentInfo.Builder setMediaSize(android.print.PrintAttributes.MediaSize);
-    method public android.print.PrintDocumentInfo.Builder setOrientation(int);
     method public android.print.PrintDocumentInfo.Builder setPageCount(int);
   }
 
@@ -19204,13 +19172,8 @@
     method public int describeContents();
     method public int getColorModes();
     method public void getDefaults(android.print.PrintAttributes);
-    method public int getDuplexModes();
-    method public int getFittingModes();
-    method public java.util.List<android.print.PrintAttributes.Tray> getInputTrays();
     method public java.util.List<android.print.PrintAttributes.MediaSize> getMediaSizes();
     method public android.print.PrintAttributes.Margins getMinMargins();
-    method public int getOrientations();
-    method public java.util.List<android.print.PrintAttributes.Tray> getOutputTrays();
     method public java.util.List<android.print.PrintAttributes.Resolution> getResolutions();
     method public void writeToParcel(android.os.Parcel, int);
     field public static final android.os.Parcelable.Creator CREATOR;
@@ -19218,16 +19181,11 @@
 
   public static final class PrinterCapabilitiesInfo.Builder {
     ctor public PrinterCapabilitiesInfo.Builder(android.print.PrinterId);
-    method public android.print.PrinterCapabilitiesInfo.Builder addInputTray(android.print.PrintAttributes.Tray, boolean);
     method public android.print.PrinterCapabilitiesInfo.Builder addMediaSize(android.print.PrintAttributes.MediaSize, boolean);
-    method public android.print.PrinterCapabilitiesInfo.Builder addOutputTray(android.print.PrintAttributes.Tray, boolean);
     method public android.print.PrinterCapabilitiesInfo.Builder addResolution(android.print.PrintAttributes.Resolution, boolean);
     method public android.print.PrinterCapabilitiesInfo create();
     method public android.print.PrinterCapabilitiesInfo.Builder setColorModes(int, int);
-    method public android.print.PrinterCapabilitiesInfo.Builder setDuplexModes(int, int);
-    method public android.print.PrinterCapabilitiesInfo.Builder setFittingModes(int, int);
     method public android.print.PrinterCapabilitiesInfo.Builder setMinMargins(android.print.PrintAttributes.Margins, android.print.PrintAttributes.Margins);
-    method public android.print.PrinterCapabilitiesInfo.Builder setOrientations(int, int);
   }
 
   public final class PrinterId implements android.os.Parcelable {
@@ -19348,6 +19306,7 @@
     ctor public PrinterDiscoverySession();
     method public final void addPrinters(java.util.List<android.print.PrinterInfo>);
     method public final java.util.List<android.print.PrinterInfo> getPrinters();
+    method public final java.util.List<android.print.PrinterId> getTrackedPrinters();
     method public final boolean isDestroyed();
     method public final boolean isPrinterDiscoveryStarted();
     method public abstract void onDestroy();
@@ -19357,7 +19316,6 @@
     method public abstract void onStopPrinterStateTracking(android.print.PrinterId);
     method public abstract void onValidatePrinters(java.util.List<android.print.PrinterId>);
     method public final void removePrinters(java.util.List<android.print.PrinterId>);
-    method public final void updatePrinters(java.util.List<android.print.PrinterInfo>);
   }
 
 }
@@ -21239,6 +21197,7 @@
     field public static final java.lang.String ACTION_NFCSHARING_SETTINGS = "android.settings.NFCSHARING_SETTINGS";
     field public static final java.lang.String ACTION_NFC_PAYMENT_SETTINGS = "android.settings.NFC_PAYMENT_SETTINGS";
     field public static final java.lang.String ACTION_NFC_SETTINGS = "android.settings.NFC_SETTINGS";
+    field public static final java.lang.String ACTION_PRINT_SETTINGS = "android.settings.ACTION_PRINT_SETTINGS";
     field public static final java.lang.String ACTION_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS";
     field public static final java.lang.String ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS";
     field public static final java.lang.String ACTION_SEARCH_SETTINGS = "android.search.action.SEARCH_SETTINGS";
diff --git a/core/java/android/print/IPrinterDiscoveryObserver.aidl b/core/java/android/print/IPrinterDiscoveryObserver.aidl
index 625f383..71198f7 100644
--- a/core/java/android/print/IPrinterDiscoveryObserver.aidl
+++ b/core/java/android/print/IPrinterDiscoveryObserver.aidl
@@ -28,5 +28,4 @@
 oneway interface IPrinterDiscoveryObserver {
     void onPrintersAdded(in List<PrinterInfo> printers);
     void onPrintersRemoved(in List<PrinterId> printerIds);
-    void onPrintersUpdated(in List<PrinterInfo> printerIds);
 }
diff --git a/core/java/android/print/PrintAttributes.java b/core/java/android/print/PrintAttributes.java
index caa10ae..f975ebd 100644
--- a/core/java/android/print/PrintAttributes.java
+++ b/core/java/android/print/PrintAttributes.java
@@ -18,10 +18,11 @@
 
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.res.Resources;
+import android.content.res.Resources.NotFoundException;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.text.TextUtils;
+import android.util.Log;
 
 import com.android.internal.R;
 
@@ -29,60 +30,20 @@
  * This class represents the attributes of a print job.
  */
 public final class PrintAttributes implements Parcelable {
-    /** Duplex mode: No duplexing */
-    public static final int DUPLEX_MODE_NONE = 1 << 0;
-    /** Duplex mode: Turn a page along its long edge, e.g. like a book */
-    public static final int DUPLEX_MODE_LONG_EDGE = 1 << 1;
-    /** Duplex mode: Turn a page along its short edge, e.g. like a notepad */
-    public static final int DUPLEX_MODE_SHORT_EDGE = 1 << 2;
-
-
-    /** Orientation: Portrait page orientation. */
-    public static final int ORIENTATION_PORTRAIT = 1 << 0;
-    /** Orientation: Landscape page orientation. */
-    public static final int ORIENTATION_LANDSCAPE = 1 << 1;
-
 
     /** Color mode: Monochrome color scheme, e.g. one color is used. */
     public static final int COLOR_MODE_MONOCHROME = 1 << 0;
     /** Color mode: Color color scheme, e.g. many colors are used. */
     public static final int COLOR_MODE_COLOR = 1 << 1;
 
-
-    /** Fitting mode: No fitting. */
-    public static final int FITTING_MODE_NONE = 1 << 0;
-    /** Fitting mode: Scale the content to fit in the page
-     * without cropping it in any dimension. */
-    public static final int FITTING_MODE_SCALE_TO_FIT = 1 << 1;
-    /**
-     * Fitting mode: Uniformly scale the content to fill the entire page
-     * potentially cropping the content if it overflows in one dimension.
-     */
-    public static final int FITTING_MODE_SCALE_TO_FILL = 1 << 2;
-
-
-    private static final int VALID_DUPLEX_MODES =
-            DUPLEX_MODE_NONE | DUPLEX_MODE_LONG_EDGE | DUPLEX_MODE_SHORT_EDGE;
-
     private static final int VALID_COLOR_MODES =
             COLOR_MODE_MONOCHROME | COLOR_MODE_COLOR;
 
-    private static final int VALID_FITTING_MODES =
-            FITTING_MODE_NONE | FITTING_MODE_SCALE_TO_FIT | FITTING_MODE_SCALE_TO_FILL;
-
-    private static final int VALID_ORIENTATIONS =
-            ORIENTATION_PORTRAIT | ORIENTATION_LANDSCAPE;
-
     private MediaSize mMediaSize;
     private Resolution mResolution;
     private Margins mMargins;
-    private Tray mInputTray;
-    private Tray mOutputTray;
 
-    private int mDuplexMode;
     private int mColorMode;
-    private int mFittingMode;
-    private int mOrientation;
 
     PrintAttributes() {
         /* hide constructor */
@@ -92,12 +53,7 @@
         mMediaSize = (parcel.readInt() ==  1) ? MediaSize.createFromParcel(parcel) : null;
         mResolution = (parcel.readInt() ==  1) ? Resolution.createFromParcel(parcel) : null;
         mMargins = (parcel.readInt() ==  1) ? Margins.createFromParcel(parcel) : null;
-        mInputTray = (parcel.readInt() ==  1) ? Tray.createFromParcel(parcel) : null;
-        mOutputTray = (parcel.readInt() ==  1) ? Tray.createFromParcel(parcel) : null;
-        mDuplexMode = parcel.readInt();
         mColorMode = parcel.readInt();
-        mFittingMode = parcel.readInt();
-        mOrientation = parcel.readInt();
     }
 
     /**
@@ -161,71 +117,6 @@
     }
 
     /**
-     * Sets the input tray.
-     *
-     * @return The input tray or <code>null</code> if not set.
-     */
-    public Tray getInputTray() {
-        return mInputTray;
-    }
-
-    /**
-     * Gets the input tray.
-     *
-     * @param The input tray.
-     *
-     * @hide
-     */
-    public void setInputTray(Tray inputTray) {
-        mInputTray = inputTray;
-    }
-
-    /**
-     * Gets the output tray.
-     *
-     * @return The output tray or <code>null</code> if not set.
-     */
-    public Tray getOutputTray() {
-        return mOutputTray;
-    }
-
-    /**
-     * Sets the output tray.
-     *
-     * @param The output tray.
-     *
-     * @hide
-     */
-    public void setOutputTray(Tray outputTray) {
-        mOutputTray = outputTray;
-    }
-
-    /**
-     * Gets the duplex mode.
-     *
-     * @return The duplex mode or zero if not set.
-     *
-     * @see #DUPLEX_MODE_NONE
-     * @see #DUPLEX_MODE_SHORT_EDGE
-     * @see #DUPLEX_MODE_LONG_EDGE
-     */
-    public int getDuplexMode() {
-        return mDuplexMode;
-    }
-
-    /**
-     * Sets the duplex mode.
-     *
-     * @param The duplex mode.
-     *
-     * @hide
-     */
-    public void setDuplexMode(int duplexMode) {
-        enforceValidDuplexMode(duplexMode);
-        mDuplexMode = duplexMode;
-    }
-
-    /**
      * Gets the color mode.
      *
      * @return The color mode or zero if not set.
@@ -252,62 +143,6 @@
         mColorMode = colorMode;
     }
 
-    /**
-     * Gets the fitting mode.
-     *
-     * @return The fitting mode or zero if not set.
-     *
-     * @see #FITTING_MODE_NONE
-     * @see #FITTING_MODE_SCALE_TO_FILL
-     * @see #FITTING_MODE_SCALE_TO_FIT
-     */
-    public int getFittingMode() {
-        return mFittingMode;
-    }
-
-    /**
-     * Sets the fitting mode.
-     *
-     * @param The fitting mode.
-     *
-     * @see #FITTING_MODE_NONE
-     * @see #FITTING_MODE_SCALE_TO_FILL
-     * @see #FITTING_MODE_SCALE_TO_FIT
-     *
-     * @hide
-     */
-    public void setFittingMode(int fittingMode) {
-        enforceValidFittingMode(fittingMode);
-        mFittingMode = fittingMode;
-    }
-
-    /**
-     * Gets the orientation.
-     *
-     * @return The orientation or zero if not set.
-     *
-     * @see #ORIENTATION_PORTRAIT
-     * @see #ORIENTATION_LANDSCAPE
-     */
-    public int getOrientation() {
-        return mOrientation;
-    }
-
-    /**
-     * Sets the orientation.
-     *
-     * @param The orientation.
-     *
-     * @see #ORIENTATION_PORTRAIT
-     * @see #ORIENTATION_LANDSCAPE
-     *
-     * @hide
-     */
-    public void setOrientation(int orientation) {
-        enforceValidOrientation(orientation);
-        mOrientation = orientation;
-    }
-
     @Override
     public void writeToParcel(Parcel parcel, int flags) {
         if (mMediaSize != null) {
@@ -328,22 +163,7 @@
         } else {
             parcel.writeInt(0);
         }
-        if (mInputTray != null) {
-            parcel.writeInt(1);
-            mInputTray.writeToParcel(parcel);
-        } else {
-            parcel.writeInt(0);
-        }
-        if (mOutputTray != null) {
-            parcel.writeInt(1);
-            mOutputTray.writeToParcel(parcel);
-        } else {
-            parcel.writeInt(0);
-        }
-        parcel.writeInt(mDuplexMode);
         parcel.writeInt(mColorMode);
-        parcel.writeInt(mFittingMode);
-        parcel.writeInt(mOrientation);
     }
 
     @Override
@@ -356,13 +176,8 @@
         final int prime = 31;
         int result = 1;
         result = prime * result + mColorMode;
-        result = prime * result + mDuplexMode;
-        result = prime * result + mFittingMode;
-        result = prime * result + mOrientation;
-        result = prime * result + ((mInputTray == null) ? 0 : mInputTray.hashCode());
         result = prime * result + ((mMargins == null) ? 0 : mMargins.hashCode());
         result = prime * result + ((mMediaSize == null) ? 0 : mMediaSize.hashCode());
-        result = prime * result + ((mOutputTray == null) ? 0 : mOutputTray.hashCode());
         result = prime * result + ((mResolution == null) ? 0 : mResolution.hashCode());
         return result;
     }
@@ -382,29 +197,6 @@
         if (mColorMode != other.mColorMode) {
             return false;
         }
-        if (mDuplexMode != other.mDuplexMode) {
-            return false;
-        }
-        if (mFittingMode != other.mFittingMode) {
-            return false;
-        }
-        if (mOrientation != other.mOrientation) {
-            return false;
-        }
-        if (mInputTray == null) {
-            if (other.mInputTray != null) {
-                return false;
-            }
-        } else if (!mInputTray.equals(other.mInputTray)) {
-            return false;
-        }
-        if (mOutputTray == null) {
-            if (other.mOutputTray != null) {
-                return false;
-            }
-        } else if (!mOutputTray.equals(other.mOutputTray)) {
-            return false;
-        }
         if (mMargins == null) {
             if (other.mMargins != null) {
                 return false;
@@ -436,12 +228,7 @@
         builder.append("mediaSize: ").append(mMediaSize);
         builder.append(", resolution: ").append(mResolution);
         builder.append(", margins: ").append(mMargins);
-        builder.append(", inputTray: ").append(mInputTray);
-        builder.append(", outputTray: ").append(mOutputTray);
         builder.append(", colorMode: ").append(colorModeToString(mColorMode));
-        builder.append(", duplexMode: ").append(duplexModeToString(mDuplexMode));
-        builder.append(", fittingMode: ").append(fittingModeToString(mFittingMode));
-        builder.append(", orientation: ").append(orientationToString(mOrientation));
         builder.append("}");
         return builder.toString();
     }
@@ -451,12 +238,7 @@
         mMediaSize = null;
         mResolution = null;
         mMargins = null;
-        mInputTray = null;
-        mOutputTray = null;
-        mDuplexMode = 0;
         mColorMode = 0;
-        mFittingMode = 0;
-        mOrientation = 0;
     }
 
     /**
@@ -466,485 +248,201 @@
         mMediaSize = other.mMediaSize;
         mResolution = other.mResolution;
         mMargins = other.mMargins;
-        mInputTray = other.mInputTray;
-        mOutputTray = other.mOutputTray;
-        mDuplexMode = other.mDuplexMode;
         mColorMode = other.mColorMode;
-        mFittingMode = other.mFittingMode;
-        mOrientation = other.mOrientation;
     }
 
     /**
      * This class specifies a supported media size.
      */
     public static final class MediaSize {
+        private static final String LOG_TAG = "MediaSize";
 
         // TODO: Verify media sizes and add more standard ones.
 
         // ISO sizes
 
-        /**
-         * ISO A0 media size: 841mm x 1189mm (33.11" x 46.81")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_A0 = 1;
+        /** ISO A0 media size: 841mm x 1189mm (33.11" x 46.81") */
+        public static final MediaSize ISO_A0 =
+                new MediaSize("ISO_A0", "android", R.string.mediaSize_iso_a0, 33110, 46810);
+        /** ISO A1 media size: 594mm x 841mm (23.39" x 33.11") */
+        public static final MediaSize ISO_A1 =
+                new MediaSize("ISO_A1", "android", R.string.mediaSize_iso_a1, 23390, 33110);
+        /** ISO A2 media size: 420mm x 594mm (16.54" x 23.39") */
+        public static final MediaSize ISO_A2 =
+                new MediaSize("ISO_A2", "android", R.string.mediaSize_iso_a2, 16540, 23390);
+        /** ISO A3 media size: 297mm x 420mm (11.69" x 16.54") */
+        public static final MediaSize ISO_A3 =
+                new MediaSize("ISO_A3", "android", R.string.mediaSize_iso_a3, 11690, 16540);
+        /** ISO A4 media size: 210mm x 297mm (8.27" x 11.69") */
+        public static final MediaSize ISO_A4 =
+                new MediaSize("ISO_A4", "android", R.string.mediaSize_iso_a4, 8270, 11690);
+        /** ISO A5 media size: 148mm x 210mm (5.83" x 8.27") */
+        public static final MediaSize ISO_A5 =
+                new MediaSize("ISO_A5", "android", R.string.mediaSize_iso_a5, 5830, 8270);
+        /** ISO A6 media size: 105mm x 148mm (4.13" x 5.83") */
+        public static final MediaSize ISO_A6 =
+                new MediaSize("ISO_A6", "android", R.string.mediaSize_iso_a6, 4130, 5830);
+        /** ISO A7 media size: 74mm x 105mm (2.91" x 4.13") */
+        public static final MediaSize ISO_A7 =
+                new MediaSize("ISO_A7", "android", R.string.mediaSize_iso_a7, 2910, 4130);
+        /** ISO A8 media size: 52mm x 74mm (2.05" x 2.91") */
+        public static final MediaSize ISO_A8 =
+                new MediaSize("ISO_A8", "android", R.string.mediaSize_iso_a8, 2050, 2910);
+        /** ISO A9 media size: 37mm x 52mm (1.46" x 2.05") */
+        public static final MediaSize ISO_A9 =
+                new MediaSize("ISO_A9", "android", R.string.mediaSize_iso_a9, 1460, 2050);
+        /** ISO A10 media size: 26mm x 37mm (1.02" x 1.46") */
+        public static final MediaSize ISO_A10 =
+                new MediaSize("ISO_A10", "android", R.string.mediaSize_iso_a10, 1020, 1460);
 
-        /**
-         * ISO A1 media size: 594mm x 841mm (23.39" x 33.11")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_A1 = 2;
+        /** ISO B0 media size: 1000mm x 1414mm (39.37" x 55.67") */
+        public static final MediaSize ISO_B0 =
+                new MediaSize("ISO_B0", "android", R.string.mediaSize_iso_b0, 39370, 55670);
+        /** ISO B1 media size: 707mm x 1000mm (27.83" x 39.37") */
+        public static final MediaSize ISO_B1 =
+                new MediaSize("ISO_B1", "android", R.string.mediaSize_iso_b1, 27830, 39370);
+        /** ISO B2 media size: 500mm x 707mm (19.69" x 27.83") */
+        public static final MediaSize ISO_B2 =
+                new MediaSize("ISO_B2", "android", R.string.mediaSize_iso_b2, 19690, 27830);
+        /** ISO B3 media size: 353mm x 500mm (13.90" x 19.69") */
+        public static final MediaSize ISO_B3 =
+                new MediaSize("ISO_B3", "android", R.string.mediaSize_iso_b3, 13900, 19690);
+        /** ISO B4 media size: 250mm x 353mm (9.84" x 13.90") */
+        public static final MediaSize ISO_B4 =
+                new MediaSize("ISO_B4", "android", R.string.mediaSize_iso_b4, 9840, 13900);
+        /** ISO B5 media size: 176mm x 250mm (6.93" x 9.84") */
+        public static final MediaSize ISO_B5 =
+                new MediaSize("ISO_B5", "android", R.string.mediaSize_iso_b5, 6930, 9840);
+        /** ISO B6 media size: 125mm x 176mm (4.92" x 6.93") */
+        public static final MediaSize ISO_B6 =
+                new MediaSize("ISO_B6", "android", R.string.mediaSize_iso_b6, 4920, 6930);
+        /** ISO B7 media size: 88mm x 125mm (3.46" x 4.92") */
+        public static final MediaSize ISO_B7 =
+                new MediaSize("ISO_B7", "android", R.string.mediaSize_iso_b7, 3460, 4920);
+        /** ISO B8 media size: 62mm x 88mm (2.44" x 3.46") */
+        public static final MediaSize ISO_B8 =
+                new MediaSize("ISO_B8", "android", R.string.mediaSize_iso_b8, 2440, 3460);
+        /** ISO B9 media size: 44mm x 62mm (1.73" x 2.44") */
+        public static final MediaSize ISO_B9 =
+                new MediaSize("ISO_B9", "android", R.string.mediaSize_iso_b9, 1730, 2440);
+        /** ISO B10 media size: 31mm x 44mm (1.22" x 1.73") */
+        public static final MediaSize ISO_B10 =
+                new MediaSize("ISO_B10", "android", R.string.mediaSize_iso_b10, 1220, 1730);
 
-        /**
-         *
-         *ISO A2 media size: 420mm x 594mm (16.54" x 23.39")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_A2 = 3;
-
-        /**
-         * ISO A3 media size: 297mm x 420mm (11.69" x 16.54")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_A3 = 4;
-
-        /**
-         * ISO A4 media size: 210mm x 297mm (8.27" x 11.69")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_A4 = 5;
-
-        /**
-         * ISO A5 media size: 148mm x 210mm (5.83" x 8.27")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_A5 = 6;
-
-        /**
-         * ISO A6 media size: 105mm x 148mm (4.13" x 5.83")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_A6 = 7;
-
-        /**
-         * ISO A7 media size: 74mm x 105mm (2.91" x 4.13")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_A7 = 8;
-
-        /**
-         * ISO A8 media size: 52mm x 74mm (2.05" x 2.91")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_A8 = 9;
-
-        /**
-         * ISO A9 media size: 37mm x 52mm (1.46" x 2.05")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_A9 = 10;
-
-        /**
-         * ISO A10 media size: 26mm x 37mm (1.02" x 1.46")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_A10 = 11;
-
-
-        /**
-         * ISO B0 media size: 1000mm x 1414mm (39.37" x 55.67")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_B0 = 100;
-
-        /**
-         * ISO B1 media size: 707mm x 1000mm (27.83" x 39.37")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_B1 = 101;
-
-        /**
-         * ISO B2 media size: 500mm x 707mm (19.69" x 27.83")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_B2 = 102;
-
-        /**
-         * ISO B3 media size: 353mm x 500mm (13.90" x 19.69")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_B3 = 103;
-
-        /**
-         * ISO B4 media size: 250mm x 353mm (9.84" x 13.90")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_B4 = 104;
-
-        /**
-         * ISO B5 media size: 176mm x 250mm (6.93" x 9.84")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_B5 = 105;
-
-        /**
-         * ISO B6 media size: 125mm x 176mm (4.92" x 6.93")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_B6 = 106;
-
-        /**
-         * ISO B7 media size: 88mm x 125mm (3.46" x 4.92")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_B7 = 107;
-
-        /** ISO B8 media size: 62mm x 88mm (2.44" x 3.46")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_B8 = 108;
-
-        /**
-         * ISO B9 media size: 44mm x 62mm (1.73" x 2.44")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_B9 = 109;
-
-        /**
-         * ISO B10 media size: 31mm x 44mm (1.22" x 1.73")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_B10 = 110;
-
-
-        /**
-         * ISO C0 media size: 917mm x 1297mm (36.10" x 51.06")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_C0 = 200;
-
-        /**
-         * ISO C1 media size: 648mm x 917mm (25.51" x 36.10")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-
-        public static final int ISO_C1 = 201;
-        /**
-         * ISO C2 media size: 458mm x 648mm (18.03" x 25.51")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_C2 = 202;
-
-        /**
-         * ISO C3 media size: 324mm x 458mm (12.76" x 18.03")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_C3 = 203;
-
-        /**
-         * ISO C4 media size: 229mm x 324mm (9.02" x 12.76")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_C4 = 204;
-
-        /**
-         * ISO C5 media size: 162mm x 229mm (6.38" x 9.02")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_C5 = 205;
-
-        /**
-         * ISO C6 media size: 114mm x 162mm (4.49" x 6.38")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_C6 = 206;
-
-        /**
-         * ISO C7 media size: 81mm x 114mm (3.19" x 4.49")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_C7 = 207;
-
-        /**
-         * ISO C8 media size: 57mm x 81mm (2.24" x 3.19")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_C8 = 208;
-
-        /**
-         * ISO C9 media size: 40mm x 57mm (1.57" x 2.24")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_C9 = 209;
-
-        /**
-         * ISO C10 media size: 28mm x 40mm (1.10" x 1.57")
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int ISO_C10 = 210;
-
+        /** ISO C0 media size: 917mm x 1297mm (36.10" x 51.06") */
+        public static final MediaSize ISO_C0 =
+                new MediaSize("ISO_C0", "android", R.string.mediaSize_iso_c0, 36100, 51060);
+        /** ISO C1 media size: 648mm x 917mm (25.51" x 36.10") */
+        public static final MediaSize ISO_C1 =
+                new MediaSize("ISO_C1", "android", R.string.mediaSize_iso_c1, 25510, 36100);
+        /** ISO C2 media size: 458mm x 648mm (18.03" x 25.51") */
+        public static final MediaSize ISO_C2 =
+                new MediaSize("ISO_C2", "android", R.string.mediaSize_iso_c2, 18030, 25510);
+        /** ISO C3 media size: 324mm x 458mm (12.76" x 18.03") */
+        public static final MediaSize ISO_C3 =
+                new MediaSize("ISO_C3", "android", R.string.mediaSize_iso_c3, 12760, 18030);
+        /** ISO C4 media size: 229mm x 324mm (9.02" x 12.76") */
+        public static final MediaSize ISO_C4 =
+                new MediaSize("ISO_C4", "android", R.string.mediaSize_iso_c4, 9020, 12760);
+        /** ISO C5 media size: 162mm x 229mm (6.38" x 9.02") */
+        public static final MediaSize ISO_C5 =
+                new MediaSize("ISO_C5", "android", R.string.mediaSize_iso_c5, 6380, 9020);
+        /** ISO C6 media size: 114mm x 162mm (4.49" x 6.38") */
+        public static final MediaSize ISO_C6 =
+                new MediaSize("ISO_C6", "android", R.string.mediaSize_iso_c6, 4490, 6380);
+        /** ISO C7 media size: 81mm x 114mm (3.19" x 4.49") */
+        public static final MediaSize ISO_C7 =
+                new MediaSize("ISO_C7", "android", R.string.mediaSize_iso_c7, 3190, 4490);
+        /** ISO C8 media size: 57mm x 81mm (2.24" x 3.19") */
+        public static final MediaSize ISO_C8 =
+                new MediaSize("ISO_C8", "android", R.string.mediaSize_iso_c8, 2240, 3190);
+        /** ISO C9 media size: 40mm x 57mm (1.57" x 2.24") */
+        public static final MediaSize ISO_C9 =
+                new MediaSize("ISO_C9", "android", R.string.mediaSize_iso_c9, 1570, 2240);
+        /** ISO C10 media size: 28mm x 40mm (1.10" x 1.57") */
+        public static final MediaSize ISO_C10 =
+                new MediaSize("ISO_C10", "android", R.string.mediaSize_iso_c10, 1100, 1570);
 
         // North America
 
-        /**
-         * North America Letter media size: 8.5" x 11"
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int NA_LETTER = 300;
-
-        /**
-         * North America Government-Letter media size: 8.0" x 10.5"
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int NA_GOVT_LETTER = 301;
-
-        /**
-         * North America Legal media size: 8.5" x 14"
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int NA_LEGAL = 302;
-
-        /**
-         * North America Junior Legal media size: 8.0" x 5.0"
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int NA_JUNIOR_LEGAL = 303;
-
-        /**
-         * North America Ledger media size: 17" x 11"
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int NA_LEDGER = 304;
-
-        /**
-         * North America Tabloid media size: 11" x 17"
-         *
-         * @see #createMediaSize(PackageManager, int)
-         */
-        public static final int NA_TBLOID = 305;
-
-        /**
-         * Creates a standard media size with a localized label.
-         *
-         * @param pm Package manager used to load the label.
-         * @param mediaSize Media size constant.
-         * @return A {@link MediaSize} instance with a localized label.
-         */
-        public static MediaSize createMediaSize(PackageManager pm, int mediaSize) {
-            final Resources resources;
-            try {
-                resources = pm.getResourcesForApplication("android");
-            } catch (NameNotFoundException nnfe) {
-                return null;
-            }
-            switch (mediaSize) {
-                case ISO_A0: {
-                    return new MediaSize("ISO_A0", resources
-                            .getString(R.string.mediaSize_iso_a0), 33110, 46810);
-                }
-                case ISO_A1: {
-                    return new MediaSize("ISO_A1", resources
-                            .getString(R.string.mediaSize_iso_a1), 23390, 33110);
-                }
-                case ISO_A2: {
-                    return new MediaSize("ISO_A2", resources
-                            .getString(R.string.mediaSize_iso_a2), 16540, 23390);
-                }
-                case ISO_A3: {
-                    return new MediaSize("ISO_A3", resources
-                            .getString(R.string.mediaSize_iso_a3), 11690, 16540);
-                }
-                case ISO_A4: {
-                    return new MediaSize("ISO_A4", resources
-                            .getString(R.string.mediaSize_iso_a4), 8270, 11690);
-                }
-                case ISO_A5: {
-                    return new MediaSize("ISO_A5", resources
-                            .getString(R.string.mediaSize_iso_a5), 5830, 8270);
-                }
-                case ISO_A6: {
-                    return new MediaSize("ISO_A6", resources
-                            .getString(R.string.mediaSize_iso_a6), 4130, 5830);
-                }
-                case ISO_A7: {
-                    return new MediaSize("ISO_A7", resources
-                            .getString(R.string.mediaSize_iso_a7), 2910, 4130);
-                }
-                case ISO_A8: {
-                    return new MediaSize("ISO_A8", resources
-                            .getString(R.string.mediaSize_iso_a8), 2050, 2910);
-                }
-                case ISO_A9: {
-                    return new MediaSize("ISO_A9", resources
-                            .getString(R.string.mediaSize_iso_a9), 1460, 2050);
-                }
-                case ISO_A10: {
-                    return new MediaSize("ISO_A10", resources
-                            .getString(R.string.mediaSize_iso_a10), 1020, 1460);
-                }
-                case ISO_B0: {
-                    return new MediaSize("ISO_B0", resources
-                            .getString(R.string.mediaSize_iso_b0), 39370, 55670);
-                }
-                case ISO_B1: {
-                    return new MediaSize("ISO_B1", resources
-                            .getString(R.string.mediaSize_iso_b1), 27830, 39370);
-                }
-                case ISO_B2: {
-                    return new MediaSize("ISO_B2", resources
-                            .getString(R.string.mediaSize_iso_b2), 19690, 27830);
-                }
-                case ISO_B3: {
-                    return new MediaSize("ISO_B3", resources
-                            .getString(R.string.mediaSize_iso_b3), 13900, 19690);
-                }
-                case ISO_B4: {
-                    return new MediaSize("ISO_B4", resources
-                            .getString(R.string.mediaSize_iso_b4), 9840, 13900);
-                }
-                case ISO_B5: {
-                    return new MediaSize("ISO_B5", resources
-                            .getString(R.string.mediaSize_iso_b5), 6930, 9840);
-                }
-                case ISO_B6: {
-                    return new MediaSize("ISO_B6", resources
-                            .getString(R.string.mediaSize_iso_b6), 4920, 6930);
-                }
-                case ISO_B7: {
-                    return new MediaSize("ISO_B7", resources
-                            .getString(R.string.mediaSize_iso_b7), 3460, 4920);
-                }
-                case ISO_B8: {
-                    return new MediaSize("ISO_B8", resources
-                            .getString(R.string.mediaSize_iso_b8), 2440, 3460);
-                }
-                case ISO_B9: {
-                    return new MediaSize("ISO_B9", resources
-                            .getString(R.string.mediaSize_iso_b9), 1730, 2440);
-                }
-                case ISO_B10: {
-                    return new MediaSize("ISO_B10", resources
-                            .getString(R.string.mediaSize_iso_b10), 1220, 1730);
-                }
-                case ISO_C0: {
-                    return new MediaSize("ISO_C0", resources
-                            .getString(R.string.mediaSize_iso_c0), 36100, 51060);
-                }
-                case ISO_C1: {
-                    return new MediaSize("ISO_C1", resources
-                            .getString(R.string.mediaSize_iso_c1), 25510, 36100);
-                }
-                case ISO_C2: {
-                    return new MediaSize("ISO_C2", resources
-                            .getString(R.string.mediaSize_iso_c2), 18030, 25510);
-                }
-                case ISO_C3: {
-                    return new MediaSize("ISO_C3", resources
-                            .getString(R.string.mediaSize_iso_c3), 12760, 18030);
-                }
-                case ISO_C4: {
-                    return new MediaSize("ISO_C4", resources
-                            .getString(R.string.mediaSize_iso_c4), 9020, 12760);
-                }
-                case ISO_C5: {
-                    return new MediaSize("ISO_C5", resources
-                            .getString(R.string.mediaSize_iso_c5), 6380, 9020);
-                }
-                case ISO_C6: {
-                    return new MediaSize("ISO_C6", resources
-                            .getString(R.string.mediaSize_iso_c6), 4490, 6380);
-                }
-                case ISO_C7: {
-                    return new MediaSize("ISO_C7", resources
-                            .getString(R.string.mediaSize_iso_c7), 3190, 4490);
-                }
-                case ISO_C8: {
-                    return new MediaSize("ISO_C8", resources
-                            .getString(R.string.mediaSize_iso_c8), 2240, 3190);
-                }
-                case ISO_C9: {
-                    return new MediaSize("ISO_C9", resources
-                            .getString(R.string.mediaSize_iso_c9), 1570, 2240);
-                }
-                case ISO_C10: {
-                    return new MediaSize("ISO_C10", resources
-                            .getString(R.string.mediaSize_iso_c10), 1100, 1570);
-                }
-                case NA_LETTER: {
-                    return new MediaSize("NA_LETTER", resources
-                            .getString(R.string.mediaSize_na_letter), 8500, 11000);
-                }
-                case NA_GOVT_LETTER: {
-                    return new MediaSize("NA_GOVT_LETTER", resources
-                            .getString(R.string.mediaSize_na_gvrnmt_letter), 8000, 10500);
-                }
-                case NA_LEGAL: {
-                    return new MediaSize("NA_LEGAL", resources
-                            .getString(R.string.mediaSize_na_legal), 8500, 14000);
-                }
-                case NA_JUNIOR_LEGAL: {
-                    return new MediaSize("NA_JUNIOR_LEGAL", resources
-                            .getString(R.string.mediaSize_na_junior_legal), 8000, 5000);
-                }
-                case NA_LEDGER: {
-                    return new MediaSize("NA_LEDGER", resources
-                            .getString(R.string.mediaSize_na_ledger), 17000, 11000);
-                }
-                case NA_TBLOID: {
-                    return new MediaSize("NA_TABLOID", resources
-                            .getString(R.string.mediaSize_na_tabloid), 11000, 17000);
-                }
-                default: {
-                    throw new IllegalArgumentException("Unknown media size.");
-                }
-            }
-        }
+        /** North America Letter media size: 8.5" x 11" */
+        public static final MediaSize NA_LETTER =
+                new MediaSize("NA_LETTER", "android", R.string.mediaSize_na_letter, 8500, 11000);
+        /** North America Government-Letter media size: 8.0" x 10.5" */
+        public static final MediaSize NA_GOVT_LETTER =
+                new MediaSize("NA_GOVT_LETTER", "android",
+                        R.string.mediaSize_na_gvrnmt_letter, 8000, 10500);
+        /** North America Legal media size: 8.5" x 14" */
+        public static final MediaSize NA_LEGAL =
+                new MediaSize("NA_LEGAL", "android", R.string.mediaSize_na_legal, 8500, 14000);
+        /** North America Junior Legal media size: 8.0" x 5.0" */
+        public static final MediaSize NA_JUNIOR_LEGAL =
+                new MediaSize("NA_JUNIOR_LEGAL", "android",
+                        R.string.mediaSize_na_junior_legal, 8000, 5000);
+        /** North America Ledger media size: 17" x 11" */
+        public static final MediaSize NA_LEDGER =
+                new MediaSize("NA_LEDGER", "android", R.string.mediaSize_na_ledger, 17000, 11000);
+        /** North America Tabloid media size: 11" x 17" */
+        public static final MediaSize NA_TBLOID =
+                new MediaSize("NA_TABLOID", "android",
+                        R.string.mediaSize_na_tabloid, 11000, 17000);
 
         private final String mId;
-        private final String mLabel;
+        /**@hide */
+        public final String mLabel;
+        /**@hide */
+        public final String mPackageName;
+        /**@hide */
+        public final int mLabelResId;
         private final int mWidthMils;
         private final int mHeightMils;
 
         /**
-         * Creates a new instance.
+         * Creates a new instance. This is the preferred constructor since
+         * it enables the media size label to be shown in a localized fashion
+         * on a locale change.
+         *
+         * @param id The unique media size id.
+         * @param packageName The name of the creating package.
+         * @param labelResId The resource if of a human readable label.
+         * @param widthMils The width in mils (thousands of an inch).
+         * @param heightMils The height in mils (thousands of an inch).
+         *
+         * @throws IllegalArgumentException If the id is empty.
+         * @throws IllegalArgumentException If the label is empty.
+         * @throws IllegalArgumentException If the widthMils is less than or equal to zero.
+         * @throws IllegalArgumentException If the heightMils is less than or equal to zero.
+         */
+        public MediaSize(String id, String packageName, int labelResId,
+                int widthMils, int heightMils) {
+            if (TextUtils.isEmpty(id)) {
+                throw new IllegalArgumentException("id cannot be empty.");
+            }
+            if (TextUtils.isEmpty(packageName)) {
+                throw new IllegalArgumentException("packageName cannot be empty.");
+            }
+            if (labelResId <= 0) {
+                throw new IllegalArgumentException("labelResId must be greater than zero.");
+            }
+            if (widthMils <= 0) {
+                throw new IllegalArgumentException("widthMils "
+                        + "cannot be less than or equal to zero.");
+            }
+            if (heightMils <= 0) {
+                throw new IllegalArgumentException("heightMils "
+                       + "cannot be less than or euqual to zero.");
+            }
+            mPackageName = packageName;
+            mId = id;
+            mLabelResId = labelResId;
+            mWidthMils = widthMils;
+            mHeightMils = heightMils;
+            mLabel = null;
+        }
+
+        /**
+         * Creates a new instance. You should use this constructor as a fallback
+         * in cases when you do not have a localized string for the label.
          *
          * @param id The unique media size id.
          * @param label The <strong>internationalized</strong> human readable label.
@@ -975,6 +473,19 @@
             mLabel = label;
             mWidthMils = widthMils;
             mHeightMils = heightMils;
+            mLabelResId = 0;
+            mPackageName = null;
+        }
+
+        /** @hide */
+        public MediaSize(String id, String label, String packageName,
+                int widthMils, int heightMils, int labelResId) {
+            mPackageName = packageName;
+            mId = id;
+            mLabelResId = labelResId;
+            mWidthMils = widthMils;
+            mHeightMils = heightMils;
+            mLabel = label;
         }
 
         /**
@@ -989,9 +500,22 @@
         /**
          * Gets the human readable media size label.
          *
+         * @param packageManager The package manager for loading the label.
          * @return The human readable label.
          */
-        public String getLabel() {
+        public String getLabel(PackageManager packageManager) {
+            if (!TextUtils.isEmpty(mPackageName) && mLabelResId > 0) {
+                try {
+                    return packageManager.getResourcesForApplication(
+                            mPackageName).getString(mLabelResId);
+                } catch (NotFoundException nfe) {
+                    Log.w(LOG_TAG, "Could not load resouce" + mLabelResId
+                            + " from package " + mPackageName);
+                } catch (NameNotFoundException nnfee) {
+                    Log.w(LOG_TAG, "Could not load resouce" + mLabelResId
+                            + " from package " + mPackageName);
+                }
+            }
             return mLabel;
         }
 
@@ -1013,17 +537,62 @@
             return mHeightMils;
         }
 
+        /**
+         * Gets whether this media size is in portrait which is the
+         * height is greater or equal to the width.
+         *
+         * @return True if the media size is in portrait, false if
+         * it is in landscape.
+         */
+        public boolean isPortrait() {
+            return mHeightMils >= mWidthMils;
+        }
+
+        /**
+         * Returns a new media size in a portrait orientation
+         * which is the height is the lesser dimension.
+         *
+         * @return New instance in landscape orientation.
+         */
+        public MediaSize asPortrait() {
+            if (!TextUtils.isEmpty(mPackageName) && mLabelResId > 0) {
+                return new MediaSize(mId, mPackageName, mLabelResId,
+                        Math.min(mWidthMils, mHeightMils),
+                        Math.max(mWidthMils, mHeightMils));
+            } else {
+                return new MediaSize(mId, mLabel,
+                        Math.min(mWidthMils, mHeightMils),
+                        Math.max(mWidthMils, mHeightMils));
+            }
+        }
+
+        /**
+         * Returns a new media size in a landscape orientation
+         * which is the height is the greater dimension.
+         *
+         * @return New instance in landscape orientation.
+         */
+        public MediaSize asLandscape() {
+            return new MediaSize(mId, mLabel,
+                    Math.max(mWidthMils, mHeightMils),
+                    Math.min(mWidthMils, mHeightMils));
+        }
+
         void writeToParcel(Parcel parcel) {
             parcel.writeString(mId);
             parcel.writeString(mLabel);
+            parcel.writeString(mPackageName);
             parcel.writeInt(mWidthMils);
             parcel.writeInt(mHeightMils);
+            parcel.writeInt(mLabelResId);
         }
 
         static MediaSize createFromParcel(Parcel parcel) {
             return new MediaSize(
                     parcel.readString(),
                     parcel.readString(),
+                    parcel.readString(),
+                    parcel.readInt(),
                     parcel.readInt(),
                     parcel.readInt());
         }
@@ -1033,7 +602,6 @@
             final int prime = 31;
             int result = 1;
             result = prime * result + ((mId == null) ? 0 : mId.hashCode());
-            result = prime * result + ((mLabel == null) ? 0 : mLabel.hashCode());
             result = prime * result + mWidthMils;
             result = prime * result + mHeightMils;
             return result;
@@ -1054,9 +622,6 @@
             if (!TextUtils.equals(mId, other.mId)) {
                 return false;
             }
-            if (!TextUtils.equals(mLabel, other.mLabel)) {
-                return false;
-            }
             if (mWidthMils != other.mWidthMils) {
                 return false;
             }
@@ -1072,8 +637,10 @@
             builder.append("MediaSize{");
             builder.append("id: ").append(mId);
             builder.append(", label: ").append(mLabel);
+            builder.append(", packageName: ").append(mPackageName);
             builder.append(", heightMils: ").append(mHeightMils);
             builder.append(", widthMils: ").append(mWidthMils);
+            builder.append(", labelResId: ").append(mLabelResId);
             builder.append("}");
             return builder.toString();
         }
@@ -1083,13 +650,64 @@
      * This class specifies a supported resolution in dpi (dots per inch).
      */
     public static final class Resolution {
+        private static final String LOG_TAG = "Resolution";
+
         private final String mId;
-        private final String mLabel;
+        /**@hide */
+        public final String mLabel;
+        /**@hide */
+        public final String mPackageName;
+        /**@hide */
+        public final int mLabelResId;
         private final int mHorizontalDpi;
         private final int mVerticalDpi;
 
         /**
-         * Creates a new instance.
+         * Creates a new instance. This is the preferred constructor since
+         * it enables the resolution label to be shown in a localized fashion
+         * on a locale change.
+         *
+         * @param id The unique resolution id.
+         * @param packageName The name of the creating package.
+         * @param labelResId The resource id of a human readable label.
+         * @param horizontalDpi The horizontal resolution in dpi.
+         * @param verticalDpi The vertical resolution in dpi.
+         *
+         * @throws IllegalArgumentException If the id is empty.
+         * @throws IllegalArgumentException If the label is empty.
+         * @throws IllegalArgumentException If the horizontalDpi is less than or equal to zero.
+         * @throws IllegalArgumentException If the verticalDpi is less than or equal to zero.
+         */
+        public Resolution(String id, String packageName, int labelResId,
+                int horizontalDpi, int verticalDpi) {
+            if (TextUtils.isEmpty(id)) {
+                throw new IllegalArgumentException("id cannot be empty.");
+            }
+            if (TextUtils.isEmpty(packageName)) {
+                throw new IllegalArgumentException("packageName cannot be empty.");
+            }
+            if (labelResId <= 0) {
+                throw new IllegalArgumentException("labelResId must be greater than zero.");
+            }
+            if (horizontalDpi <= 0) {
+                throw new IllegalArgumentException("horizontalDpi "
+                        + "cannot be less than or equal to zero.");
+            }
+            if (verticalDpi <= 0) {
+                throw new IllegalArgumentException("verticalDpi"
+                       + " cannot be less than or equal to zero.");
+            }
+            mId = id;
+            mPackageName = packageName;
+            mLabelResId = labelResId;
+            mHorizontalDpi = horizontalDpi;
+            mVerticalDpi = verticalDpi;
+            mLabel = null;
+        }
+
+        /**
+         * Creates a new instance. You should use this constructor as a fallback
+         * in cases when you do not have a localized string for the label.
          *
          * @param id The unique resolution id.
          * @param label The <strong>internationalized</strong> human readable label.
@@ -1120,6 +738,19 @@
             mLabel = label;
             mHorizontalDpi = horizontalDpi;
             mVerticalDpi = verticalDpi;
+            mPackageName = null;
+            mLabelResId = 0;
+        }
+
+        /** @hide */
+        public Resolution(String id, String label, String packageName,
+                int horizontalDpi, int verticalDpi, int labelResId) {
+            mId = id;
+            mPackageName = packageName;
+            mLabelResId = labelResId;
+            mHorizontalDpi = horizontalDpi;
+            mVerticalDpi = verticalDpi;
+            mLabel = label;
         }
 
         /**
@@ -1134,14 +765,27 @@
         /**
          * Gets the resolution human readable label.
          *
+         * @param packageManager The package manager for loading the label.
          * @return The human readable label.
          */
-        public String getLabel() {
+        public String getLabel(PackageManager packageManager) {
+            if (!TextUtils.isEmpty(mPackageName) && mLabelResId > 0) {
+                try {
+                    return packageManager.getResourcesForApplication(
+                            mPackageName).getString(mLabelResId);
+                } catch (NotFoundException nfe) {
+                    Log.w(LOG_TAG, "Could not load resouce" + mLabelResId
+                            + " from package " + mPackageName);
+                } catch (NameNotFoundException nnfee) {
+                    Log.w(LOG_TAG, "Could not load resouce" + mLabelResId
+                            + " from package " + mPackageName);
+                }
+            }
             return mLabel;
         }
 
         /**
-         * Gets the horizontal resolution in dpi.
+         * Gets the vertical resolution in dpi.
          *
          * @return The horizontal resolution.
          */
@@ -1161,14 +805,18 @@
         void writeToParcel(Parcel parcel) {
             parcel.writeString(mId);
             parcel.writeString(mLabel);
+            parcel.writeString(mPackageName);
             parcel.writeInt(mHorizontalDpi);
             parcel.writeInt(mVerticalDpi);
+            parcel.writeInt(mLabelResId);
         }
 
         static Resolution createFromParcel(Parcel parcel) {
             return new Resolution(
                     parcel.readString(),
                     parcel.readString(),
+                    parcel.readString(),
+                    parcel.readInt(),
                     parcel.readInt(),
                     parcel.readInt());
         }
@@ -1178,7 +826,6 @@
             final int prime = 31;
             int result = 1;
             result = prime * result + ((mId == null) ? 0 : mId.hashCode());
-            result = prime * result + ((mLabel == null) ? 0 : mLabel.hashCode());
             result = prime * result + mHorizontalDpi;
             result = prime * result + mVerticalDpi;
             return result;
@@ -1199,9 +846,6 @@
             if (!TextUtils.equals(mId, other.mId)) {
                 return false;
             }
-            if (!TextUtils.equals(mLabel, other.mLabel)) {
-                return false;
-            }
             if (mHorizontalDpi != other.mHorizontalDpi) {
                 return false;
             }
@@ -1217,8 +861,10 @@
             builder.append("Resolution{");
             builder.append("id: ").append(mId);
             builder.append(", label: ").append(mLabel);
+            builder.append(", packageName: ").append(mPackageName);
             builder.append(", horizontalDpi: ").append(mHorizontalDpi);
             builder.append(", verticalDpi: ").append(mVerticalDpi);
+            builder.append(", labelResId: ").append(mLabelResId);
             builder.append("}");
             return builder.toString();
         }
@@ -1358,120 +1004,6 @@
         }
     }
 
-    /**
-     * Represents a printer tray.
-     */
-    public static final class Tray {
-        private final String mId;
-        private final String mLabel;
-
-        /**
-         * Creates a new instance.
-         *
-         * @param id The unique tray id.
-         * @param label The <strong>internationalized</strong> human readable label.
-         *
-         * @throws IllegalArgumentException If the id is empty.
-         * @throws IllegalArgumentException If the label is empty.
-         */
-        public Tray(String id, String label) {
-            if (TextUtils.isEmpty(id)) {
-                throw new IllegalArgumentException("id cannot be empty.");
-            }
-            if (TextUtils.isEmpty(label)) {
-                throw new IllegalArgumentException("label cannot be empty.");
-            }
-            mId = id;
-            mLabel = label;
-        }
-
-        /**
-         * Gets the unique tray id.
-         *
-         * @return The unique tray id.
-         */
-        public String getId() {
-            return mId;
-        }
-
-        /**
-         * Gets the tray human readable label.
-         *
-         * @return The human readable label.
-         */
-        public String getLabel() {
-            return mLabel;
-        }
-
-        void writeToParcel(Parcel parcel) {
-            parcel.writeString(mId);
-            parcel.writeString(mLabel);
-        }
-
-        static Tray createFromParcel(Parcel parcel) {
-            return new Tray(
-                    parcel.readString(),
-                    parcel.readString());
-        }
-
-        @Override
-        public int hashCode() {
-            final int prime = 31;
-            int result = 1;
-            result = prime * result + ((mId == null) ? 0 : mId.hashCode());
-            result = prime * result + ((mLabel == null) ? 0 : mLabel.hashCode());
-            return result;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj == null) {
-                return false;
-            }
-            if (getClass() != obj.getClass()) {
-                return false;
-            }
-            Tray other = (Tray) obj;
-            if (!TextUtils.equals(mId, other.mId)) {
-                return false;
-            }
-            if (!TextUtils.equals(mLabel, other.mLabel)) {
-                return false;
-            }
-            return true;
-        }
-
-        @Override
-        public String toString() {
-            StringBuilder builder = new StringBuilder();
-            builder.append("Tray{");
-            builder.append("id: ").append(mId);
-            builder.append("id: ").append(mId);
-            builder.append(", label: ").append(mLabel);
-            builder.append("}");
-            return builder.toString();
-        }
-    }
-
-    static String duplexModeToString(int duplexMode) {
-        switch (duplexMode) {
-            case DUPLEX_MODE_NONE: {
-                return "DUPLEX_MODE_NONE";
-            }
-            case DUPLEX_MODE_LONG_EDGE: {
-                return "DUPLEX_MODE_LONG_EDGE";
-            }
-            case DUPLEX_MODE_SHORT_EDGE: {
-                return "DUPLEX_MODE_SHORT_EDGE";
-            }
-            default:
-                return "DUPLEX_MODE_UNKNOWN";
-        }
-    }
-
     static String colorModeToString(int colorMode) {
         switch (colorMode) {
             case COLOR_MODE_MONOCHROME: {
@@ -1485,59 +1017,12 @@
         }
     }
 
-    static String orientationToString(int orientation) {
-        switch (orientation) {
-            case ORIENTATION_PORTRAIT: {
-                return "ORIENTATION_PORTRAIT";
-            }
-            case ORIENTATION_LANDSCAPE: {
-                return "ORIENTATION_LANDSCAPE";
-            }
-            default:
-                return "ORIENTATION_UNKNOWN";
-        }
-    }
-
-    static String fittingModeToString(int fittingMode) {
-        switch (fittingMode) {
-            case FITTING_MODE_NONE: {
-                return "FITTING_MODE_NONE";
-            }
-            case FITTING_MODE_SCALE_TO_FIT: {
-                return "FITTING_MODE_SCALE_TO_FIT";
-            }
-            case FITTING_MODE_SCALE_TO_FILL: {
-                return "FITTING_MODE_SCALE_TO_FILL";
-            }
-            default:
-                return "FITTING_MODE_UNKNOWN";
-        }
-    }
-
-    static void enforceValidDuplexMode(int duplexMode) {
-        if ((duplexMode & VALID_DUPLEX_MODES) == 0 && Integer.bitCount(duplexMode) == 1) {
-            throw new IllegalArgumentException("invalid duplex mode: " + duplexMode);
-        }
-    }
-
     static void enforceValidColorMode(int colorMode) {
         if ((colorMode & VALID_COLOR_MODES) == 0 && Integer.bitCount(colorMode) == 1) {
             throw new IllegalArgumentException("invalid color mode: " + colorMode);
         }
     }
 
-    static void enforceValidFittingMode(int fittingMode) {
-        if ((fittingMode & VALID_FITTING_MODES) == 0 && Integer.bitCount(fittingMode) == 1) {
-            throw new IllegalArgumentException("invalid fitting mode: " + fittingMode);
-        }
-    }
-
-    static void enforceValidOrientation(int orientation) {
-        if ((orientation & VALID_ORIENTATIONS) == 0 && Integer.bitCount(orientation) == 1) {
-            throw new IllegalArgumentException("invalid orientation: " + orientation);
-        }
-    }
-
     /**
      * Builder for creating {@link PrintAttributes}.
      */
@@ -1578,46 +1063,6 @@
         }
 
         /**
-         * Sets the input tray.
-         *
-         * @param inputTray The tray.
-         * @return This builder.
-         */
-        public Builder setInputTray(Tray inputTray) {
-            mAttributes.setInputTray(inputTray);
-            return this;
-        }
-
-        /**
-         * Sets the output tray.
-         *
-         * @param outputTray The tray.
-         * @return This builder.
-         */
-        public Builder setOutputTray(Tray outputTray) {
-            mAttributes.setOutputTray(outputTray);
-            return this;
-        }
-
-        /**
-         * Sets the duplex mode.
-         *
-         * @param duplexMode A valid duplex mode or zero.
-         * @return This builder.
-         *
-         * @see PrintAttributes#DUPLEX_MODE_NONE
-         * @see PrintAttributes#DUPLEX_MODE_SHORT_EDGE
-         * @see PrintAttributes#DUPLEX_MODE_LONG_EDGE
-         */
-        public Builder setDuplexMode(int duplexMode) {
-            if (Integer.bitCount(duplexMode) > 1) {
-                throw new IllegalArgumentException("can specify at most one duplexMode bit.");
-            }
-            mAttributes.setDuplexMode(duplexMode);
-            return this;
-        }
-
-        /**
          * Sets the color mode.
          *
          * @param colorMode A valid color mode or zero.
@@ -1635,40 +1080,6 @@
         }
 
         /**
-         * Sets the fitting mode.
-         *
-         * @param fittingMode A valid fitting mode or zero.
-         * @return This builder.
-         *
-         * @see PrintAttributes#FITTING_MODE_NONE
-         * @see PrintAttributes#FITTING_MODE_FIT_TO_PAGE
-         */
-        public Builder setFittingMode(int fittingMode) {
-            if (Integer.bitCount(fittingMode) > 1) {
-                throw new IllegalArgumentException("can specify at most one fittingMode bit.");
-            }
-            mAttributes.setFittingMode(fittingMode);
-            return this;
-        }
-
-        /**
-         * Sets the orientation.
-         *
-         * @param orientation A valid orientation or zero.
-         * @return This builder.
-         *
-         * @see PrintAttributes#ORIENTATION_PORTRAIT
-         * @see PrintAttributes#ORIENTATION_LANDSCAPE
-         */
-        public Builder setOrientation(int orientation) {
-            if (Integer.bitCount(orientation) > 1) {
-                throw new IllegalArgumentException("can specify at most one orientation bit.");
-            }
-            mAttributes.setOrientation(orientation);
-            return this;
-        }
-
-        /**
          * Creates a new {@link PrintAttributes} instance.
          *
          * @return The new instance.
diff --git a/core/java/android/print/PrintDocumentAdapter.java b/core/java/android/print/PrintDocumentAdapter.java
index 8a59b6b..c81ca95 100644
--- a/core/java/android/print/PrintDocumentAdapter.java
+++ b/core/java/android/print/PrintDocumentAdapter.java
@@ -102,28 +102,6 @@
      * Note that you must call one of the methods of the given callback.
      * </p>
      * <p>
-     * When doing a layout you may satisfy some of the constraints in the print
-     * attributes such as applying the appropriate fitting, emitting content in the
-     * requested orientation, using the specified margins, generating content with
-     * the desired color mode, producing output with the given media size. Ideally,
-     * you will satisfy all of these constraints. It is important that if you
-     * satisfy a given constraint, you update the {@link PrintDocumentInfo} that
-     * is returned in the given {@link LayoutResultCallback}. This way the printer
-     * will have more accurate information about the content, thus producing a
-     * better output. For example, assume that your application is printing
-     * an image and the print attributes request landscape and fitting mode scale
-     * to fill. The result of this operation should be the entire media is filled
-     * and the content is rotated ninety degrees. In this case it is beneficial
-     * you do the rotation and select a higher resolution image to utilize
-     * the wider media (the height is now the width), rather to use a lower
-     * resolution image that is later stretched by the printer. If you applied
-     * the rotation you have to update the returned print document info to
-     * reflect that the content is already in landscape by calling
-     * {@link PrintDocumentInfo.Builder#setOrientation(int)} with {@link
-     * PrintAttributes#ORIENTATION_LANDSCAPE}. In this case the printer does not
-     * have to rotate the content.
-     * </p>
-     * <p>
      * <strong>Note:</strong> If the content is large and a layout will be
      * performed, it is a good practice to schedule the work on a dedicated
      * thread and register an observer in the provided {@link
diff --git a/core/java/android/print/PrintDocumentInfo.java b/core/java/android/print/PrintDocumentInfo.java
index f2b91ae..7a96e69 100644
--- a/core/java/android/print/PrintDocumentInfo.java
+++ b/core/java/android/print/PrintDocumentInfo.java
@@ -18,8 +18,6 @@
 
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.print.PrintAttributes.Margins;
-import android.print.PrintAttributes.MediaSize;
 import android.text.TextUtils;
 
 /**
@@ -28,11 +26,6 @@
 public final class PrintDocumentInfo implements Parcelable {
 
     /**
-     * Constant for an unknown media size.
-     */
-    public static final MediaSize MEDIA_SIZE_UNKNOWN = new MediaSize("Unknown", "Unknown", 1, 1);
-
-    /**
      * Constant for unknown page count..
      */
     public static final int PAGE_COUNT_UNKNOWN = -1;
@@ -55,11 +48,6 @@
     private String mName;
     private int mPageCount;
     private int mContentType;
-    private int mOrientation;
-    private int mFittingMode;
-    private int mColorMode;
-    private Margins mMargins;
-    private MediaSize mMediaSize;
     private long mDataSize;
 
     /**
@@ -78,11 +66,6 @@
         mName = prototype.mName;
         mPageCount = prototype.mPageCount;
         mContentType = prototype.mContentType;
-        mOrientation = prototype.mOrientation;
-        mFittingMode = prototype.mFittingMode;
-        mColorMode = prototype.mColorMode;
-        mMargins = prototype.mMargins;
-        mMediaSize = prototype.mMediaSize;
         mDataSize = prototype.mDataSize;
     }
 
@@ -95,11 +78,6 @@
         mName = parcel.readString();
         mPageCount = parcel.readInt();
         mContentType = parcel.readInt();
-        mOrientation = parcel.readInt();
-        mFittingMode = parcel.readInt();
-        mColorMode = parcel.readInt();
-        mMargins = Margins.createFromParcel(parcel);
-        mMediaSize = MediaSize.createFromParcel(parcel);
         mDataSize = parcel.readLong();
     }
 
@@ -137,61 +115,6 @@
     }
 
     /**
-     * Gets the document orientation.
-     *
-     * @return The orientation.
-     *
-     * @see PrintAttributes#ORIENTATION_PORTRAIT PrintAttributes.ORIENTATION_PORTRAIT
-     * @see PrintAttributes#ORIENTATION_LANDSCAPE PrintAttributes.ORIENTATION_LANDSCAPE
-     */
-    public int getOrientation() {
-        return mOrientation;
-    }
-
-    /**
-     * Gets the document fitting mode.
-     *
-     * @return The fitting mode.
-     *
-     * @see PrintAttributes#FITTING_MODE_NONE PrintAttributes.FITTING_MODE_NONE
-     * @see PrintAttributes#FITTING_MODE_SCALE_TO_FILL PrintAttributes.FITTING_MODE_SCALE_TO_FILL
-     * @see PrintAttributes#FITTING_MODE_SCALE_TO_FIT PrintAttributes.FITTING_MODE_SCALE_TO_FIT
-     */
-    public int getFittingMode() {
-        return mFittingMode;
-    }
-
-    /**
-     * Gets document color mode.
-     *
-     * @return The color mode.
-     *
-     * @see PrintAttributes#COLOR_MODE_COLOR PrintAttributes.COLOR_MODE_COLOR
-     * @see PrintAttributes#COLOR_MODE_MONOCHROME PrintAttributes.COLOR_MODE_MONOCHROME
-     */
-    public int getColorMode() {
-        return mColorMode;
-    }
-
-    /**
-     * Gets the document margins.
-     *
-     * @return The margins.
-     */
-    public Margins getMargins() {
-        return mMargins;
-    }
-
-    /**
-     * Gets the media size.
-     *
-     * @return The media size.
-     */
-    public MediaSize getMediaSize() {
-        return mMediaSize;
-    }
-
-    /**
      * Gets the document data size in bytes.
      *
      * @return The data size.
@@ -221,11 +144,6 @@
         parcel.writeString(mName);
         parcel.writeInt(mPageCount);
         parcel.writeInt(mContentType);
-        parcel.writeInt(mOrientation);
-        parcel.writeInt(mFittingMode);
-        parcel.writeInt(mColorMode);
-        mMargins.writeToParcel(parcel);
-        mMediaSize.writeToParcel(parcel);
         parcel.writeLong(mDataSize);
     }
 
@@ -236,11 +154,6 @@
         result = prime * result + ((mName != null) ? mName.hashCode() : 0);
         result = prime * result + mContentType;
         result = prime * result + mPageCount;
-        result = prime * result + mOrientation;
-        result = prime * result + mFittingMode;
-        result = prime * result + mColorMode;
-        result = prime * result + (mMargins != null ? mMargins.hashCode() : 0);
-        result = prime * result + (mMediaSize != null ? mMediaSize.hashCode() : 0);
         result = prime * result + (int) mDataSize;
         result = prime * result + (int) mDataSize >> 32;
         return result;
@@ -267,29 +180,6 @@
         if (mPageCount != other.mPageCount) {
             return false;
         }
-        if (mOrientation != other.mOrientation) {
-            return false;
-        }
-        if (mFittingMode != other.mFittingMode) {
-            return false;
-        }
-        if (mColorMode != other.mColorMode) {
-            return false;
-        }
-        if (mMargins == null) {
-            if (other.mMargins != null) {
-                return false;
-            }
-        } else if (!mMargins.equals(other.mMargins)) {
-            return false;
-        }
-        if (mMediaSize == null) {
-            if (other.mMediaSize != null) {
-                return false;
-            }
-        } else if (!mMediaSize.equals(other.mMediaSize)) {
-            return false;
-        }
         if (mDataSize != other.mDataSize) {
             return false;
         }
@@ -303,11 +193,6 @@
         builder.append("name=").append(mName);
         builder.append(", pageCount=").append(mPageCount);
         builder.append(", contentType=").append(contentTyepToString(mContentType));
-        builder.append(", orientation=").append(PrintAttributes.orientationToString(mOrientation));
-        builder.append(", fittingMode=").append(PrintAttributes.fittingModeToString(mFittingMode));
-        builder.append(", colorMode=").append(PrintAttributes.colorModeToString(mColorMode));
-        builder.append(", margins=").append(mMargins);
-        builder.append(", mediaSize=").append(mMediaSize);
         builder.append(", size=").append(mDataSize);
         builder.append("}");
         return builder.toString();
@@ -336,36 +221,6 @@
         /**
          * Constructor.
          * <p>
-         * The values of the relevant properties are initialized from the
-         * provided print attributes. For example, the orientation is set
-         * to be the same as the orientation returned by calling {@link
-         * PrintAttributes#getOrientation() PrintAttributes.getOrientation()}.
-         * </p>
-         *
-         * @param name The document name. Cannot be empty.
-         * @param attributes Print attributes. Cannot be null.
-         *
-         * @throws IllegalArgumentException If the name is empty.
-         */
-        public Builder(String name, PrintAttributes attributes) {
-            if (TextUtils.isEmpty(name)) {
-                throw new IllegalArgumentException("name cannot be empty");
-            }
-            if (attributes == null) {
-                throw new IllegalArgumentException("attributes cannot be null");
-            }
-            mPrototype = new PrintDocumentInfo();
-            mPrototype.mName = name;
-            mPrototype.mOrientation = attributes.getOrientation();
-            mPrototype.mFittingMode = attributes.getFittingMode();
-            mPrototype.mColorMode = attributes.getColorMode();
-            mPrototype.mMargins = attributes.getMargins();
-            mPrototype.mMediaSize = attributes.getMediaSize();
-        }
-
-        /**
-         * Constructor.
-         * <p>
          * The values of the relevant properties are initialized with default
          * values. Please refer to the documentation of the individual setters
          * for information about the default values.
@@ -379,11 +234,6 @@
             }
             mPrototype = new PrintDocumentInfo();
             mPrototype.mName = name;
-            mPrototype.mOrientation = PrintAttributes.ORIENTATION_PORTRAIT;
-            mPrototype.mFittingMode = PrintAttributes.FITTING_MODE_NONE;
-            mPrototype.mColorMode = PrintAttributes.COLOR_MODE_COLOR;
-            mPrototype.mMargins = Margins.NO_MARGINS;
-            mPrototype.mMediaSize = MEDIA_SIZE_UNKNOWN;
         }
 
         /**
@@ -423,95 +273,6 @@
         }
 
         /**
-         * Sets the orientation.
-         * <p>
-         * <strong>Default: </strong> {@link PrintAttributes#ORIENTATION_PORTRAIT
-         * PrintAttributes.ORIENTATION_PORTRAIT}
-         * </p>
-         *
-         * @param orientation The orientation.
-         *
-         * @see PrintAttributes#ORIENTATION_PORTRAIT PrintAttributes.ORIENTATION_PORTRAIT
-         * @see PrintAttributes#ORIENTATION_LANDSCAPE PrintAttributes.ORIENTATION_LANDSCAPE
-         */
-        public Builder setOrientation(int orientation) {
-            PrintAttributes.enforceValidOrientation(orientation);
-            mPrototype.mOrientation = orientation;
-            return this;
-        }
-
-        /**
-         * Sets the content fitting mode.
-         * <p>
-         * <strong>Default: </strong> {@link PrintAttributes#FITTING_MODE_NONE
-         * PrintAttributes.FITTING_MODE_NONE}
-         * </p>
-         *
-         * @param fittingMode The fitting mode.
-         *
-         * @see PrintAttributes#FITTING_MODE_NONE PrintAttributes.FITTING_MODE_NONE
-         * @see PrintAttributes#FITTING_MODE_SCALE_TO_FILL PrintAttributes.FITTING_MODE_SCALE_TO_FILL
-         * @see PrintAttributes#FITTING_MODE_SCALE_TO_FIT PrintAttributes.FITTING_MODE_SCALE_TO_FIT
-         */
-        public Builder setFittingMode(int fittingMode) {
-            PrintAttributes.enforceValidFittingMode(fittingMode);
-            mPrototype.mFittingMode = fittingMode;
-            return this;
-        }
-
-        /**
-         * Sets the content color mode.
-         * <p>
-         * <strong>Default: </strong> {@link PrintAttributes#COLOR_MODE_COLOR
-         * PrintAttributes.COLOR_MODE_COLOR}
-         * </p>
-         *
-         * @param colorMode The color mode.
-         *
-         * @see PrintAttributes#COLOR_MODE_COLOR PrintAttributes.COLOR_MODE_COLOR
-         * @see PrintAttributes#COLOR_MODE_MONOCHROME PrintAttributes.COLOR_MODE_MONOCHROME
-         */
-        public Builder setColorMode(int colorMode) {
-            PrintAttributes.enforceValidColorMode(colorMode);
-            mPrototype.mColorMode = colorMode;
-            return this;
-        }
-
-        /**
-         * Sets the document margins.
-         * <p>
-         * <strong>Default: </strong> {@link PrintAttributes.Margins#NO_MARGINS Margins.NO_MARGINS}
-         * </p>
-         *
-         * @param margins The margins. Cannot be null.
-         */
-        public Builder setMargins(Margins margins) {
-            if (margins == null) {
-                throw new IllegalArgumentException("margins cannot be null");
-            }
-            mPrototype.mMargins = margins;
-            return this;
-        }
-
-        /**
-         * Sets the document media size.
-         * <p>
-         * <strong>Default: </strong>#MEDIA_SIZE_UNKNOWN
-         * </p>
-         *
-         * @param mediaSize The media size. Cannot be null.
-         *
-         * @see #MEDIA_SIZE_UNKNOWN
-         */
-        public Builder setMediaSize(MediaSize mediaSize) {
-            if (mediaSize == null) {
-                throw new IllegalArgumentException("media size cannot be null");
-            }
-            mPrototype.mMediaSize = mediaSize;
-            return this;
-        }
-
-        /**
          * Creates a new {@link PrintDocumentInfo} instance.
          *
          * @return The new instance.
diff --git a/core/java/android/print/PrinterCapabilitiesInfo.java b/core/java/android/print/PrinterCapabilitiesInfo.java
index 941e6e1..ea44c87 100644
--- a/core/java/android/print/PrinterCapabilitiesInfo.java
+++ b/core/java/android/print/PrinterCapabilitiesInfo.java
@@ -21,7 +21,6 @@
 import android.print.PrintAttributes.Margins;
 import android.print.PrintAttributes.MediaSize;
 import android.print.PrintAttributes.Resolution;
-import android.print.PrintAttributes.Tray;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -40,26 +39,16 @@
 
     private static final int PROPERTY_MEDIA_SIZE = 0;
     private static final int PROPERTY_RESOLUTION = 1;
-    private static final int PROPERTY_INPUT_TRAY = 2;
-    private static final int PROPERTY_OUTPUT_TRAY = 3;
-    private static final int PROPERTY_DUPLEX_MODE = 4;
-    private static final int PROPERTY_COLOR_MODE = 5;
-    private static final int PROPERTY_FITTING_MODE = 6;
-    private static final int PROPERTY_ORIENTATION = 7;
-    private static final int PROPERTY_COUNT = 8;
+    private static final int PROPERTY_COLOR_MODE = 2;
+    private static final int PROPERTY_COUNT = 3;
 
     private static final Margins DEFAULT_MARGINS = new Margins(0,  0,  0,  0);
 
     private Margins mMinMargins = DEFAULT_MARGINS;
     private List<MediaSize> mMediaSizes;
     private List<Resolution> mResolutions;
-    private List<Tray> mInputTrays;
-    private List<Tray> mOutputTrays;
 
-    private int mDuplexModes;
     private int mColorModes;
-    private int mFittingModes;
-    private int mOrientations;
 
     private final int[] mDefaults = new int[PROPERTY_COUNT];
     private Margins mDefaultMargins = DEFAULT_MARGINS;
@@ -106,32 +95,7 @@
             mResolutions = null;
         }
 
-        if (other.mInputTrays != null) {
-            if (mInputTrays != null) {
-                mInputTrays.clear();
-                mInputTrays.addAll(other.mInputTrays);
-            } else {
-                mInputTrays = new ArrayList<Tray>(other.mInputTrays);
-            }
-        } else {
-            mInputTrays = null;
-        }
-
-        if (other.mOutputTrays != null) {
-            if (mOutputTrays != null) {
-                mOutputTrays.clear();
-                mOutputTrays.addAll(other.mOutputTrays);
-            } else {
-                mOutputTrays = new ArrayList<Tray>(other.mOutputTrays);
-            }
-        } else {
-            mOutputTrays = null;
-        }
-
-        mDuplexModes = other.mDuplexModes;
         mColorModes = other.mColorModes;
-        mFittingModes = other.mFittingModes;
-        mOrientations = other.mOrientations;
 
         final int defaultCount = other.mDefaults.length;
         for (int i = 0; i < defaultCount; i++) {
@@ -169,37 +133,6 @@
     }
 
     /**
-     * Gets the available input trays.
-     *
-     * @return The input trays.
-     */
-    public List<Tray> getInputTrays() {
-        return mInputTrays;
-    }
-
-    /**
-     * Gets the available output trays.
-     *
-     * @return The output trays.
-     */
-    public List<Tray> getOutputTrays() {
-        return mOutputTrays;
-    }
-
-    /**
-     * Gets the supported duplex modes.
-     *
-     * @return The duplex modes.
-     *
-     * @see PrintAttributes#DUPLEX_MODE_NONE
-     * @see PrintAttributes#DUPLEX_MODE_LONG_EDGE
-     * @see PrintAttributes#DUPLEX_MODE_SHORT_EDGE
-     */
-    public int getDuplexModes() {
-        return mDuplexModes;
-    }
-
-    /**
      * Gets the supported color modes.
      *
      * @return The color modes.
@@ -212,30 +145,6 @@
     }
 
     /**
-     * Gets the supported fitting modes.
-     *
-     * @return The fitting modes.
-     *
-     * @see PrintAttributes#FITTING_MODE_NONE
-     * @see PrintAttributes#FITTING_MODE_FIT_TO_PAGE
-     */
-    public int getFittingModes() {
-        return mFittingModes;
-    }
-
-    /**
-     * Gets the supported orientations.
-     *
-     * @return The orientations.
-     *
-     * @see PrintAttributes#ORIENTATION_PORTRAIT
-     * @see PrintAttributes#ORIENTATION_LANDSCAPE
-     */
-    public int getOrientations() {
-        return mOrientations;
-    }
-
-    /**
      * Gets the default print attributes.
      *
      * @param outAttributes The attributes to populated.
@@ -255,48 +164,18 @@
             outAttributes.setResolution(mResolutions.get(resolutionIndex));
         }
 
-        final int inputTrayIndex = mDefaults[PROPERTY_INPUT_TRAY];
-        if (inputTrayIndex >= 0) {
-            outAttributes.setInputTray(mInputTrays.get(inputTrayIndex));
-        }
-
-        final int outputTrayIndex = mDefaults[PROPERTY_OUTPUT_TRAY];
-        if (outputTrayIndex >= 0) {
-            outAttributes.setOutputTray(mOutputTrays.get(outputTrayIndex));
-        }
-
-        final int duplexMode = mDefaults[PROPERTY_DUPLEX_MODE];
-        if (duplexMode > 0) {
-            outAttributes.setDuplexMode(duplexMode);
-        }
-
         final int colorMode = mDefaults[PROPERTY_COLOR_MODE];
         if (colorMode > 0) {
             outAttributes.setColorMode(colorMode);
         }
-
-        final int fittingMode = mDefaults[PROPERTY_FITTING_MODE];
-        if (fittingMode > 0) {
-            outAttributes.setFittingMode(fittingMode);
-        }
-
-        final int orientation = mDefaults[PROPERTY_ORIENTATION];
-        if (orientation > 0) {
-            outAttributes.setOrientation(orientation);
-        }
     }
 
     private PrinterCapabilitiesInfo(Parcel parcel) {
         mMinMargins = readMargins(parcel);
         readMediaSizes(parcel);
         readResolutions(parcel);
-        mInputTrays = readInputTrays(parcel);
-        mOutputTrays = readOutputTrays(parcel);
 
         mColorModes = parcel.readInt();
-        mDuplexModes = parcel.readInt();
-        mFittingModes = parcel.readInt();
-        mOrientations = parcel.readInt();
 
         readDefaults(parcel);
         mDefaultMargins = readMargins(parcel);
@@ -312,13 +191,8 @@
         writeMargins(mMinMargins, parcel);
         writeMediaSizes(parcel);
         writeResolutions(parcel);
-        writeInputTrays(parcel);
-        writeOutputTrays(parcel);
 
         parcel.writeInt(mColorModes);
-        parcel.writeInt(mDuplexModes);
-        parcel.writeInt(mFittingModes);
-        parcel.writeInt(mOrientations);
 
         writeDefaults(parcel);
         writeMargins(mDefaultMargins, parcel);
@@ -331,12 +205,7 @@
         result = prime * result + ((mMinMargins == null) ? 0 : mMinMargins.hashCode());
         result = prime * result + ((mMediaSizes == null) ? 0 : mMediaSizes.hashCode());
         result = prime * result + ((mResolutions == null) ? 0 : mResolutions.hashCode());
-        result = prime * result + ((mInputTrays == null) ? 0 : mInputTrays.hashCode());
-        result = prime * result + ((mOutputTrays == null) ? 0 : mOutputTrays.hashCode());
         result = prime * result + mColorModes;
-        result = prime * result + mDuplexModes;
-        result = prime * result + mFittingModes;
-        result = prime * result + mOrientations;
         result = prime * result + Arrays.hashCode(mDefaults);
         result = prime * result + ((mDefaultMargins == null) ? 0 : mDefaultMargins.hashCode());
         return result;
@@ -375,32 +244,9 @@
         } else if (!mResolutions.equals(other.mResolutions)) {
             return false;
         }
-        if (mInputTrays == null) {
-            if (other.mInputTrays != null) {
-                return false;
-            }
-        } else if (!mInputTrays.equals(other.mInputTrays)) {
-            return false;
-        }
-        if (mOutputTrays == null) {
-            if (other.mOutputTrays != null) {
-                return false;
-            }
-        } else if (!mOutputTrays.equals(other.mOutputTrays)) {
-            return false;
-        }
-        if (mDuplexModes != other.mDuplexModes) {
-            return false;
-        }
         if (mColorModes != other.mColorModes) {
             return false;
         }
-        if (mFittingModes != other.mFittingModes) {
-            return false;
-        }
-        if (mOrientations != other.mOrientations) {
-            return false;
-        }
         if (!Arrays.equals(mDefaults, other.mDefaults)) {
             return false;
         }
@@ -421,32 +267,11 @@
         builder.append("minMargins=").append(mMinMargins);
         builder.append(", mediaSizes=").append(mMediaSizes);
         builder.append(", resolutions=").append(mResolutions);
-        builder.append(", inputTrays=").append(mInputTrays);
-        builder.append(", outputTrays=").append(mOutputTrays);
-        builder.append(", duplexModes=").append(duplexModesToString());
         builder.append(", colorModes=").append(colorModesToString());
-        builder.append(", fittingModes=").append(fittingModesToString());
-        builder.append(", orientations=").append(orientationsToString());
         builder.append("\"}");
         return builder.toString();
     }
 
-    private String duplexModesToString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append('[');
-        int duplexModes = mDuplexModes;
-        while (duplexModes != 0) {
-            final int duplexMode = 1 << Integer.numberOfTrailingZeros(duplexModes);
-            duplexModes &= ~duplexMode;
-            if (builder.length() > 0) {
-                builder.append(", ");
-            }
-            builder.append(PrintAttributes.duplexModeToString(duplexMode));
-        }
-        builder.append(']');
-        return builder.toString();
-    }
-
     private String colorModesToString() {
         StringBuilder builder = new StringBuilder();
         builder.append('[');
@@ -463,38 +288,6 @@
         return builder.toString();
     }
 
-    private String fittingModesToString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append('[');
-        int fittingModes = mFittingModes;
-        while (fittingModes != 0) {
-            final int fittingMode = 1 << Integer.numberOfTrailingZeros(fittingModes);
-            fittingModes &= ~fittingMode;
-            if (builder.length() > 0) {
-                builder.append(", ");
-            }
-            builder.append(PrintAttributes.fittingModeToString(fittingMode));
-        }
-        builder.append(']');
-        return builder.toString();
-    }
-
-    private String orientationsToString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append('[');
-        int orientations = mOrientations;
-        while (orientations != 0) {
-            final int orientation = 1 << Integer.numberOfTrailingZeros(orientations);
-            orientations &= ~orientation;
-            if (builder.length() > 0) {
-                builder.append(", ");
-            }
-            builder.append(PrintAttributes.orientationToString(orientation));
-        }
-        builder.append(']');
-        return builder.toString();
-    }
-
     private void writeMediaSizes(Parcel parcel) {
         if (mMediaSizes == null) {
             parcel.writeInt(0);
@@ -552,54 +345,6 @@
         return (parcel.readInt() == 1) ? Margins.createFromParcel(parcel) : null;
     }
 
-    private void writeInputTrays(Parcel parcel) {
-        if (mInputTrays == null) {
-            parcel.writeInt(0);
-            return;
-        }
-        final int inputTrayCount = mInputTrays.size();
-        parcel.writeInt(inputTrayCount);
-        for (int i = 0; i < inputTrayCount; i++) {
-            mInputTrays.get(i).writeToParcel(parcel);
-        }
-    }
-
-    private List<Tray> readInputTrays(Parcel parcel) {
-        final int inputTrayCount = parcel.readInt();
-        if (inputTrayCount <= 0) {
-            return null;
-        }
-        List<Tray> inputTrays = new ArrayList<Tray>(inputTrayCount);
-        for (int i = 0; i < inputTrayCount; i++) {
-            inputTrays.add(Tray.createFromParcel(parcel));
-        }
-        return inputTrays;
-    }
-
-    private void writeOutputTrays(Parcel parcel) {
-        if (mOutputTrays == null) {
-            parcel.writeInt(0);
-            return;
-        }
-        final int outputTrayCount = mOutputTrays.size();
-        parcel.writeInt(outputTrayCount);
-        for (int i = 0; i < outputTrayCount; i++) {
-            mOutputTrays.get(i).writeToParcel(parcel);
-        }
-    }
-
-    private List<Tray> readOutputTrays(Parcel parcel) {
-        final int outputTrayCount = parcel.readInt();
-        if (outputTrayCount <= 0) {
-            return null;
-        }
-        List<Tray> outputTrays = new ArrayList<Tray>(outputTrayCount);
-        for (int i = 0; i < outputTrayCount; i++) {
-            outputTrays.add(Tray.createFromParcel(parcel));
-        }
-        return outputTrays;
-    }
-
     private void readDefaults(Parcel parcel) {
         final int defaultCount = parcel.readInt();
         for (int i = 0; i < defaultCount; i++) {
@@ -722,62 +467,6 @@
         }
 
         /**
-         * Adds an input tray.
-         * <p>
-         * <strong>Required:</strong> No
-         * </p>
-         *
-         * @param inputTray A tray.
-         * @param isDefault Whether this is the default.
-         * @return This builder.
-         *
-         * @throws IllegalArgumentException If set as default and there
-         *     is already a default.
-         *
-         * @see PrintAttributes.Tray
-         */
-        public Builder addInputTray(Tray inputTray, boolean isDefault) {
-            if (mPrototype.mInputTrays == null) {
-                mPrototype.mInputTrays = new ArrayList<Tray>();
-            }
-            final int insertionIndex = mPrototype.mInputTrays.size();
-            mPrototype.mInputTrays.add(inputTray);
-            if (isDefault) {
-                throwIfDefaultAlreadySpecified(PROPERTY_INPUT_TRAY);
-                mPrototype.mDefaults[PROPERTY_INPUT_TRAY] = insertionIndex;
-            }
-            return this;
-        }
-
-        /**
-         * Adds an output tray.
-         * <p>
-         * <strong>Required:</strong> No
-         * </p>
-         *
-         * @param outputTray A tray.
-         * @param isDefault Whether this is the default.
-         * @return This builder.
-         *
-         * @throws IllegalArgumentException If set as default and there
-         *     is already a default.
-         *
-         * @see PrintAttributes.Tray
-         */
-        public Builder addOutputTray(Tray outputTray, boolean isDefault) {
-            if (mPrototype.mOutputTrays == null) {
-                mPrototype.mOutputTrays = new ArrayList<Tray>();
-            }
-            final int insertionIndex = mPrototype.mOutputTrays.size();
-            mPrototype.mOutputTrays.add(outputTray);
-            if (isDefault) {
-                throwIfDefaultAlreadySpecified(PROPERTY_OUTPUT_TRAY);
-                mPrototype.mDefaults[PROPERTY_OUTPUT_TRAY] = insertionIndex;
-            }
-            return this;
-        }
-
-        /**
          * Sets the color modes.
          * <p>
          * <strong>Required:</strong> Yes
@@ -810,103 +499,6 @@
         }
 
         /**
-         * Set the duplex modes.
-         * <p>
-         * <strong>Required:</strong> No
-         * </p>
-         *
-         * @param duplexModes The duplex mode bit mask.
-         * @param defaultDuplexMode The default duplex mode.
-         * @return This builder.
-         *
-         * @throws IllegalArgumentException If duplex modes contains an invalid
-         *         mode bit or if the default duplex mode is invalid.
-         *
-         * @see PrintAttributes#DUPLEX_MODE_NONE
-         * @see PrintAttributes#DUPLEX_MODE_LONG_EDGE
-         * @see PrintAttributes#DUPLEX_MODE_SHORT_EDGE
-         */
-        public Builder setDuplexModes(int duplexModes, int defaultDuplexMode) {
-            int currentModes = duplexModes;
-            while (currentModes > 0) {
-                final int currentMode = (1 << Integer.numberOfTrailingZeros(currentModes));
-                currentModes &= ~currentMode;
-                PrintAttributes.enforceValidDuplexMode(currentMode);
-            }
-            if ((duplexModes & defaultDuplexMode) == 0) {
-                throw new IllegalArgumentException("Default duplex mode not in duplex modes.");
-            }
-            PrintAttributes.enforceValidDuplexMode(defaultDuplexMode);
-            mPrototype.mDuplexModes = duplexModes;
-            mPrototype.mDefaults[PROPERTY_DUPLEX_MODE] = defaultDuplexMode;
-            return this;
-        }
-
-        /**
-         * Sets the fitting modes.
-         * <p>
-         * <strong>Required:</strong> No
-         * </p>
-         *
-         * @param fittingModes The fitting mode bit mask.
-         * @param defaultFittingMode The default fitting mode.
-         * @return This builder.
-         *
-         * @throws IllegalArgumentException If fitting modes contains an invalid
-         *         mode bit or if the default fitting mode is invalid.
-         *
-         * @see PrintAttributes#FITTING_MODE_NONE
-         * @see PrintAttributes#FITTING_MODE_FIT_TO_PAGE
-         */
-        public Builder setFittingModes(int fittingModes, int defaultFittingMode) {
-            int currentModes = fittingModes;
-            while (currentModes > 0) {
-                final int currentMode = (1 << Integer.numberOfTrailingZeros(currentModes));
-                currentModes &= ~currentMode;
-                PrintAttributes.enforceValidFittingMode(currentMode);
-            }
-            if ((fittingModes & defaultFittingMode) == 0) {
-                throw new IllegalArgumentException("Default fitting mode not in fiting modes.");
-            }
-            PrintAttributes.enforceValidFittingMode(defaultFittingMode);
-            mPrototype.mFittingModes = fittingModes;
-            mPrototype.mDefaults[PROPERTY_FITTING_MODE] = defaultFittingMode;
-            return this;
-        }
-
-        /**
-         * Sets the orientations.
-         * <p>
-         * <strong>Required:</strong> Yes
-         * </p>
-         *
-         * @param orientations The orientation bit mask.
-         * @param defaultOrientation The default orientation.
-         * @return This builder.
-         *
-         * @throws IllegalArgumentException If orientations contains an invalid
-         *         mode bit or if the default orientation is invalid.
-         *
-         * @see PrintAttributes#ORIENTATION_PORTRAIT
-         * @see PrintAttributes#ORIENTATION_LANDSCAPE
-         */
-        public Builder setOrientations(int orientations, int defaultOrientation) {
-            int currentOrientaions = orientations;
-            while (currentOrientaions > 0) {
-                final int currentOrnt = (1 << Integer.numberOfTrailingZeros(currentOrientaions));
-                currentOrientaions &= ~currentOrnt;
-                PrintAttributes.enforceValidOrientation(currentOrnt);
-            }
-            if ((orientations & defaultOrientation) == 0) {
-                throw new IllegalArgumentException("Default orientation not in orientations.");
-            }
-            PrintAttributes.enforceValidOrientation(defaultOrientation);
-            mPrototype.mOrientations = orientations;
-            mPrototype.mDefaults[PROPERTY_ORIENTATION] = defaultOrientation;
-            return this;
-        }
-
-        /**
          * Crates a new {@link PrinterCapabilitiesInfo} enforcing that all
          * required properties have need specified. See individual methods
          * in this class for reference about required attributes.
@@ -934,12 +526,6 @@
             if (mPrototype.mDefaults[PROPERTY_COLOR_MODE] == DEFAULT_UNDEFINED) {
                 throw new IllegalStateException("No default color mode specified.");
             }
-            if (mPrototype.mOrientations == 0) {
-                throw new IllegalStateException("No oprientation specified.");
-            }
-            if (mPrototype.mDefaults[PROPERTY_ORIENTATION] == DEFAULT_UNDEFINED) {
-                throw new IllegalStateException("No default orientation specified.");
-            }
             if (mPrototype.mMinMargins == null) {
                 mPrototype.mMinMargins  = new Margins(0, 0, 0, 0);
             }
diff --git a/core/java/android/print/PrinterDiscoverySession.java b/core/java/android/print/PrinterDiscoverySession.java
index 46f0bef..64249b4 100644
--- a/core/java/android/print/PrinterDiscoverySession.java
+++ b/core/java/android/print/PrinterDiscoverySession.java
@@ -38,7 +38,6 @@
 
     private static final int MSG_PRINTERS_ADDED = 1;
     private static final int MSG_PRINTERS_REMOVED = 2;
-    private static final int MSG_PRINTERS_UPDATED = 3;
 
     private final ArrayMap<PrinterId, PrinterInfo> mPrinters =
             new ArrayMap<PrinterId, PrinterInfo>();
@@ -200,8 +199,8 @@
         final int addedPrinterCount = printers.size();
         for (int i = 0; i < addedPrinterCount; i++) {
             PrinterInfo addedPrinter = printers.get(i);
-            if (mPrinters.get(addedPrinter.getId()) == null) {
-                mPrinters.put(addedPrinter.getId(), addedPrinter);
+            PrinterInfo oldPrinter = mPrinters.put(addedPrinter.getId(), addedPrinter);
+            if (oldPrinter == null || !oldPrinter.equals(addedPrinter)) {
                 printersChanged = true;
             }
         }
@@ -227,25 +226,6 @@
         }
     }
 
-    private void handlePrintersUpdated(List<PrinterInfo> printers) {
-        if (isDestroyed()) {
-            return;
-        }
-        boolean printersChanged = false;
-        final int updatedPrinterCount = printers.size();
-        for (int i = 0; i < updatedPrinterCount; i++) {
-            PrinterInfo updatedPrinter = printers.get(i);
-            PrinterInfo oldPrinter = mPrinters.get(updatedPrinter.getId());
-            if (oldPrinter != null && !oldPrinter.equals(updatedPrinter)) {
-                mPrinters.put(updatedPrinter.getId(), updatedPrinter);
-                printersChanged = true;
-            }
-        }
-        if (printersChanged) {
-            notifyOnPrintersChanged();
-        }
-    }
-
     private void notifyOnPrintersChanged() {
         if (mListener != null) {
             mListener.onPrintersChanged();
@@ -277,11 +257,6 @@
                     List<PrinterId> printerIds = (List<PrinterId>) message.obj;
                     handlePrintersRemoved(printerIds);
                 } break;
-
-                case MSG_PRINTERS_UPDATED: {
-                    List<PrinterInfo> printers = (List<PrinterInfo>) message.obj;
-                    handlePrintersUpdated(printers);
-                } break;
             }
         }
     }
@@ -311,14 +286,5 @@
                         printerIds).sendToTarget();
             }
         }
-
-        @Override
-        public void onPrintersUpdated(List<PrinterInfo> printers) {
-            PrinterDiscoverySession session = mWeakSession.get();
-            if (session != null) {
-                session.mHandler.obtainMessage(MSG_PRINTERS_UPDATED,
-                        printers).sendToTarget();
-            }
-        }
     }
 }
diff --git a/core/java/android/printservice/IPrintServiceClient.aidl b/core/java/android/printservice/IPrintServiceClient.aidl
index 1e33fc0..ad3c04f 100644
--- a/core/java/android/printservice/IPrintServiceClient.aidl
+++ b/core/java/android/printservice/IPrintServiceClient.aidl
@@ -35,5 +35,4 @@
 
     void onPrintersAdded(in List<PrinterInfo> printers);
     void onPrintersRemoved(in List<PrinterId> printerIds);
-    void onPrintersUpdated(in List<PrinterInfo> printers);
 }
diff --git a/core/java/android/printservice/PrinterDiscoverySession.java b/core/java/android/printservice/PrinterDiscoverySession.java
index 7e32e66..b0bf3da 100644
--- a/core/java/android/printservice/PrinterDiscoverySession.java
+++ b/core/java/android/printservice/PrinterDiscoverySession.java
@@ -47,7 +47,7 @@
  * PrinterDiscoverySession#addPrinters(List)}. Added printers that disappeared are
  * removed by invoking {@link PrinterDiscoverySession#removePrinters(List)}. Added
  * printers whose properties or capabilities changed are updated through a call to
- * {@link PrinterDiscoverySession#updatePrinters(List)}. The printers added in this
+ * {@link PrinterDiscoverySession#addPrinters(List)}. The printers added in this
  * session can be acquired via {@link #getPrinters()} where the returned printers
  * will be an up-to-date snapshot of the printers that you reported during the
  * session. Printers are <strong>not</strong> persisted across sessions.
@@ -89,6 +89,9 @@
     private final ArrayMap<PrinterId, PrinterInfo> mPrinters =
             new ArrayMap<PrinterId, PrinterInfo>();
 
+    private final List<PrinterId> mTrackedPrinters =
+            new ArrayList<PrinterId>();
+
     private ArrayMap<PrinterId, PrinterInfo> mLastSentPrinters;
 
     private IPrintServiceClient mObserver;
@@ -130,7 +133,6 @@
      *
      * @see #addPrinters(List)
      * @see #removePrinters(List)
-     * @see #updatePrinters(List)
      * @see #isDestroyed()
      */
     public final List<PrinterInfo> getPrinters() {
@@ -142,7 +144,7 @@
     }
 
     /**
-     * Adds discovered printers. Adding an already added printer has no effect.
+     * Adds discovered printers. Adding an already added printer updates it.
      * Removed printers can be added again. You can call this method multiple
      * times during the life of this session. Duplicates will be ignored.
      * <p>
@@ -153,7 +155,6 @@
      * @param printers The printers to add.
      *
      * @see #removePrinters(List)
-     * @see #updatePrinters(List)
      * @see #getPrinters()
      * @see #isDestroyed()
      */
@@ -168,18 +169,21 @@
 
         if (mIsDiscoveryStarted) {
             // If during discovery, add the new printers and send them.
-            List<PrinterInfo> addedPrinters = new ArrayList<PrinterInfo>();
+            List<PrinterInfo> addedPrinters = null;
             final int addedPrinterCount = printers.size();
             for (int i = 0; i < addedPrinterCount; i++) {
                 PrinterInfo addedPrinter = printers.get(i);
-                if (mPrinters.get(addedPrinter.getId()) == null) {
-                    mPrinters.put(addedPrinter.getId(), addedPrinter);
+                PrinterInfo oldPrinter = mPrinters.put(addedPrinter.getId(), addedPrinter);
+                if (oldPrinter == null || !oldPrinter.equals(addedPrinter)) {
+                    if (addedPrinters == null) {
+                        addedPrinters = new ArrayList<PrinterInfo>();
+                    }
                     addedPrinters.add(addedPrinter);
                 }
             }
 
             // Send the added printers, if such.
-            if (!addedPrinters.isEmpty()) {
+            if (addedPrinters != null) {
                 sendAddedPrinters(mObserver, addedPrinters);
             }
         } else {
@@ -232,7 +236,6 @@
      * @param printerIds The ids of the removed printers.
      *
      * @see #addPrinters(List)
-     * @see #updatePrinters(List)
      * @see #getPrinters()
      * @see #isDestroyed()
      */
@@ -295,86 +298,6 @@
         }
     }
 
-    /**
-     * Updates added printers. Updating a printer that was not added or that
-     * was removed has no effect. You can call this method multiple times
-     * during the lifetime of this session.
-     * <p>
-     * <strong>Note: </strong> Calls to this method after the session is
-     * destroyed, that is after the {@link #onDestroy()} callback, will be ignored.
-     * </p>
-     *
-     * @param printers The printers to update.
-     *
-     * @see #addPrinters(List)
-     * @see #removePrinters(List)
-     * @see #getPrinters()
-     * @see #isDestroyed()
-     */
-    public final void updatePrinters(List<PrinterInfo> printers) {
-        PrintService.throwIfNotCalledOnMainThread();
-
-        // If the session is destroyed - nothing do to.
-        if (mIsDestroyed) {
-            Log.w(LOG_TAG, "Not updating printers - session destroyed.");
-            return;
-        }
-
-        if (mIsDiscoveryStarted) {
-            // If during discovery, update existing printers and send them.
-            List<PrinterInfo> updatedPrinters = new ArrayList<PrinterInfo>();
-            final int updatedPrinterCount = printers.size();
-            for (int i = 0; i < updatedPrinterCount; i++) {
-                PrinterInfo updatedPrinter = printers.get(i);
-                PrinterInfo oldPrinter = mPrinters.get(updatedPrinter.getId());
-                if (oldPrinter != null && !oldPrinter.equals(updatedPrinter)) {
-                    mPrinters.put(updatedPrinter.getId(), updatedPrinter);
-                    updatedPrinters.add(updatedPrinter);
-                }
-            }
-
-            // Send the updated printers, if such.
-            if (!updatedPrinters.isEmpty()) {
-                sendUpdatedPrinters(mObserver, updatedPrinters);
-            }
-        } else {
-            // Remember the last sent printers if needed.
-            if (mLastSentPrinters == null) {
-                mLastSentPrinters = new ArrayMap<PrinterId, PrinterInfo>(mPrinters);
-            }
-
-            // Update the printers.
-            final int updatedPrinterCount = printers.size();
-            for (int i = 0; i < updatedPrinterCount; i++) {
-                PrinterInfo updatedPrinter = printers.get(i);
-                PrinterInfo oldPrinter = mPrinters.get(updatedPrinter.getId());
-                if (oldPrinter != null && !oldPrinter.equals(updatedPrinter)) {
-                    mPrinters.put(updatedPrinter.getId(), updatedPrinter);
-                }
-            }
-        }
-    }
-
-    private static void sendUpdatedPrinters(IPrintServiceClient observer,
-            List<PrinterInfo> printers) {
-        try {
-            final int printerCount = printers.size();
-            if (printerCount <= MAX_ITEMS_PER_CALLBACK) {
-                observer.onPrintersUpdated(printers);
-            } else {
-                final int transactionCount = (printerCount / MAX_ITEMS_PER_CALLBACK) + 1;
-                for (int i = 0; i < transactionCount; i++) {
-                    final int start = i * MAX_ITEMS_PER_CALLBACK;
-                    final int end = Math.min(start + MAX_ITEMS_PER_CALLBACK, printerCount);
-                    List<PrinterInfo> subPrinters = printers.subList(start, end);
-                    observer.onPrintersUpdated(subPrinters);
-                }
-            }
-        } catch (RemoteException re) {
-            Log.e(LOG_TAG, "Error sending updated printers", re);
-        }
-    }
-
     private void sendOutOfDiscoveryPeriodPrinterChanges() {
         // Noting changed since the last discovery period - nothing to do.
         if (mLastSentPrinters == null || mLastSentPrinters.isEmpty()) {
@@ -382,21 +305,11 @@
             return;
         }
 
+        // Determine the added printers.
         List<PrinterInfo> addedPrinters = null;
-        List<PrinterInfo> updatedPrinters = null;
-        List<PrinterId> removedPrinterIds = null;
-
-        // Determine the added and updated printers.
         for (PrinterInfo printer : mPrinters.values()) {
             PrinterInfo sentPrinter = mLastSentPrinters.get(printer.getId());
-            if (sentPrinter != null) {
-                if (!sentPrinter.equals(printer)) {
-                    if (updatedPrinters == null) {
-                        updatedPrinters = new ArrayList<PrinterInfo>();
-                    }
-                    updatedPrinters.add(printer);
-                }
-            } else {
+            if (sentPrinter == null || !sentPrinter.equals(printer)) {
                 if (addedPrinters == null) {
                     addedPrinters = new ArrayList<PrinterInfo>();
                 }
@@ -409,12 +322,8 @@
             sendAddedPrinters(mObserver, addedPrinters);
         }
 
-        // Send the updated printers, if such.
-        if (updatedPrinters != null) {
-            sendUpdatedPrinters(mObserver, updatedPrinters);
-        }
-
         // Determine the removed printers.
+        List<PrinterId> removedPrinterIds = null;
         for (PrinterInfo sentPrinter : mLastSentPrinters.values()) {
             if (!mPrinters.containsKey(sentPrinter.getId())) {
                 if (removedPrinterIds == null) {
@@ -437,14 +346,15 @@
      * added via calling {@link #addPrinters(List)}. Added printers that disappeared
      * should be removed via calling {@link #removePrinters(List)}. Added printers
      * whose properties or capabilities changed should be updated via calling {@link
-     * #updatePrinters(List)}. You will receive a call to call to {@link
-     * #onStopPrinterDiscovery()} when you should stop printer discovery.
+     * #addPrinters(List)}. You will receive a call to {@link #onStopPrinterDiscovery()}
+     * when you should stop printer discovery.
      * <p>
      * During the lifetime of this session all printers that are known to your print
      * service have to be added. The system does not retain any printers across sessions.
      * However, if you were asked to start and then stop performing printer discovery
      * in this session, then a subsequent discovering should not re-discover already
-     * discovered printers.
+     * discovered printers. You can get the printers reported during this session by
+     * calling {@link #getPrinters()}.
      * </p>
      * <p>
      * <strong>Note: </strong>You are also given a list of printers whose availability
@@ -459,7 +369,6 @@
      * @see #onStopPrinterDiscovery()
      * @see #addPrinters(List)
      * @see #removePrinters(List)
-     * @see #updatePrinters(List)
      * @see #isPrinterDiscoveryStarted()
      */
     public abstract void onStartPrinterDiscovery(List<PrinterId> priorityList);
@@ -476,7 +385,7 @@
      * Callback asking you to validate that the given printers are valid, that
      * is they exist. You are responsible for checking whether these printers
      * exist and for the ones that do exist notify the system via calling
-     * {@link #updatePrinters(List)}.
+     * {@link #addPrinters(List)}.
      * <p>
      * <strong>Note: </strong> You are <strong>not required</strong> to provide
      * the printer capabilities when updating the printers that do exist.
@@ -484,7 +393,6 @@
      *
      * @param printerIds The printers to validate.
      *
-     * @see #updatePrinters(List)
      * @see PrinterInfo.Builder#setCapabilities(PrinterCapabilitiesInfo)
      *      PrinterInfo.Builder.setCapabilities(PrinterCapabilitiesInfo)
      */
@@ -494,7 +402,7 @@
      * Callback asking you to start tracking the state of a printer. Tracking
      * the state means that you should do a best effort to observe the state
      * of this printer and notify the system if that state changes via calling
-     * {@link #updatePrinters(List)}.
+     * {@link #addPrinters(List)}.
      * <p>
      * <strong>Note: </strong> A printer can be initially added without its
      * capabilities to avoid polling printers that the user will not select.
@@ -513,7 +421,6 @@
      * @param printerId The printer to start tracking.
      *
      * @see #onStopPrinterStateTracking(PrinterId)
-     * @see #updatePrinters(List)
      * @see PrinterInfo.Builder#setCapabilities(PrinterCapabilitiesInfo)
      *      PrinterInfo.Builder.setCapabilities(PrinterCapabilitiesInfo)
      */
@@ -531,6 +438,32 @@
     public abstract void onStopPrinterStateTracking(PrinterId printerId);
 
     /**
+     * Gets the printers that should be tracked. These are printers that are
+     * important to the user and for which you received a call to {@link
+     * #onStartPrinterStateTracking(PrinterId)} asking you to observer their
+     * state and reporting it to the system via {@link #addPrinters(List)}.
+     * You will receive a call to {@link #onStopPrinterStateTracking(PrinterId)}
+     * if you should stop tracking a printer.
+     * <p>
+     * <strong>Note: </strong> Calls to this method after the session is
+     * destroyed, that is after the {@link #onDestroy()} callback, will be ignored.
+     * </p>
+     *
+     * @return The printers.
+     *
+     * @see #onStartPrinterStateTracking(PrinterId)
+     * @see #onStopPrinterStateTracking(PrinterId)
+     * @see #isDestroyed()
+     */
+    public final List<PrinterId> getTrackedPrinters() {
+        PrintService.throwIfNotCalledOnMainThread();
+        if (mIsDestroyed) {
+            return Collections.emptyList();
+        }
+        return new ArrayList<PrinterId>(mTrackedPrinters);
+    }
+
+    /**
      * Notifies you that the session is destroyed. After this callback is invoked
      * any calls to the methods of this class will be ignored, {@link #isDestroyed()}
      * will return true and you will also no longer receive callbacks.
@@ -589,13 +522,16 @@
     }
 
     void startPrinterStateTracking(PrinterId printerId) {
-        if (!mIsDestroyed && mObserver != null) {
+        if (!mIsDestroyed && mObserver != null
+                && !mTrackedPrinters.contains(printerId)) {
+            mTrackedPrinters.add(printerId);
             onStartPrinterStateTracking(printerId);
         }
     }
 
     void stopPrinterStateTracking(PrinterId printerId) {
-        if (!mIsDestroyed && mObserver != null) {
+        if (!mIsDestroyed && mObserver != null
+                && mTrackedPrinters.remove(printerId)) {
             onStopPrinterStateTracking(printerId);
         }
     }
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index eb5430c..c3fcd62 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -703,6 +703,20 @@
     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
     public static final String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS";
 
+    /**
+     * Activity Action: Show the top level print settings.
+     * <p>
+     * In some cases, a matching Activity may not exist, so ensure you
+     * safeguard against this.
+     * <p>
+     * Input: Nothing.
+     * <p>
+     * Output: Nothing.
+     */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+    public static final String ACTION_PRINT_SETTINGS =
+            "android.settings.ACTION_PRINT_SETTINGS";
+
     // End of Intent actions for Settings
 
     /**
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
index 5361a1e..929a04e 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java
@@ -42,7 +42,6 @@
 import android.print.IWriteResultCallback;
 import android.print.PageRange;
 import android.print.PrintAttributes;
-import android.print.PrintAttributes.Margins;
 import android.print.PrintAttributes.MediaSize;
 import android.print.PrintAttributes.Resolution;
 import android.print.PrintDocumentAdapter;
@@ -75,8 +74,6 @@
 import android.widget.Spinner;
 import android.widget.TextView;
 
-import libcore.io.IoUtils;
-
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -92,6 +89,8 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import libcore.io.IoUtils;
+
 /**
  * Activity for configuring a print job.
  */
@@ -111,6 +110,9 @@
 
     private static final int LOADER_ID_PRINTERS_LOADER = 1;
 
+    private static final int ORIENTATION_PORTRAIT = 0;
+    private static final int ORIENTATION_LANDSCAPE = 1;
+
     private static final int DEST_ADAPTER_MAX_ITEM_COUNT = 9;
 
     private static final int DEST_ADAPTER_ITEM_ID_SAVE_AS_PDF = Integer.MAX_VALUE;
@@ -343,10 +345,11 @@
             if (!mController.hasStarted()) {
                 mController.start();
             }
-            if (!printAttributesChanged()) {
-                // If the attributes changed, then we do not do a layout but may
-                // have to ask the app to write some pages. Hence, pretend layout
-                // completed and nothing changed, so we handle writing as usual.
+            if (!printAttributesChanged() && mDocument.info != null) {
+                // If the attributes didn't change and we have done a layout, then
+                // we do not do a layout but may have to ask the app to write some
+                // pages. Hence, pretend layout completed and nothing changed, so
+                // we handle writing as usual.
                 handleOnLayoutFinished(mDocument.info, false, mRequestCounter.get());
             } else {
                 PrintSpoolerService.peekInstance().setPrintJobAttributesNoPersistence(
@@ -394,9 +397,6 @@
                         mPrintJobId, info);
             }
 
-            // Update the fitting mode based on the document type.
-            updateCurrentFittingMode(info);
-
             // If the document info or the layout changed, then
             // drop the pages since we have to fetch them again.
             if (infoChanged || layoutChanged) {
@@ -526,10 +526,6 @@
             }
 
             if (mEditor.isDone()) {
-                // Update the print attributes based on whether the application
-                // handled some of the print attribute constraints, e.g. rotation.
-                updateAndSaveCurrentPrintAttributes(mDocument.info);
-
                 if (mEditor.isPrintingToPdf()) {
                     PrintJobInfo printJob = PrintSpoolerService.peekInstance()
                             .getPrintJobInfo(mPrintJobId, PrintManager.APP_ID_ANY);
@@ -552,58 +548,6 @@
             PrintJobConfigActivity.this.finish();
         }
 
-        private void updateCurrentFittingMode(PrintDocumentInfo document) {
-            // Update the fitting mode based on content type.
-            switch (document.getContentType()) {
-                case PrintDocumentInfo.CONTENT_TYPE_DOCUMENT: {
-                    mCurrPrintAttributes.setFittingMode(
-                            PrintAttributes.FITTING_MODE_SCALE_TO_FIT);
-                } break;
-
-                case PrintDocumentInfo.CONTENT_TYPE_PHOTO: {
-                    mCurrPrintAttributes.setFittingMode(
-                            PrintAttributes.FITTING_MODE_SCALE_TO_FILL);
-                }
-            }
-        }
-
-        private void updateAndSaveCurrentPrintAttributes(PrintDocumentInfo document) {
-            PrintAttributes attributes = mTempPrintAttributes;
-            attributes.copyFrom(mCurrPrintAttributes);
-
-            // Update the orientation
-            if (document.getOrientation() == PrintAttributes.ORIENTATION_LANDSCAPE) {
-                if (attributes.getOrientation() == PrintAttributes.ORIENTATION_LANDSCAPE) {
-                    // If the document is in landscape and we want to print it in
-                    // landscape, then we do not need to rotate, so portrait.
-                    attributes.setOrientation(PrintAttributes.ORIENTATION_PORTRAIT);
-                } else {
-                    // If the document is in landscape and we want to print it in
-                    // portrait, then we have to rotate the content, so landscape.
-                    attributes.setOrientation(PrintAttributes.ORIENTATION_LANDSCAPE);
-                }
-            }
-
-            // Update margins.
-            Margins documentMargins = document.getMargins();
-            if (documentMargins.getLeftMils() != 0
-                    || documentMargins.getTopMils() != 0
-                    || documentMargins.getRightMils() != 0
-                    || documentMargins.getBottomMils() != 0) {
-                // If the application has applied some of the margins, then
-                // the printer should only apply the difference.
-                Margins oldMargins = attributes.getMargins();
-                attributes.setMargins(new Margins(
-                        oldMargins.getLeftMils() - documentMargins.getLeftMils(),
-                        oldMargins.getTopMils() - documentMargins.getTopMils(),
-                        oldMargins.getRightMils() - documentMargins.getRightMils(),
-                        oldMargins.getBottomMils() - documentMargins.getBottomMils()));
-            }
-
-            PrintSpoolerService.peekInstance().setPrintJobAttributesNoPersistence(
-                    mPrintJobId, attributes);
-        }
-
         private final class ControllerHandler extends Handler {
             public static final int MSG_ON_LAYOUT_FINISHED = 1;
             public static final int MSG_ON_LAYOUT_FAILED = 2;
@@ -878,7 +822,16 @@
                     }
                     SpinnerItem<Integer> orientationItem =
                             mOrientationSpinnerAdapter.getItem(position);
-                    mCurrPrintAttributes.setOrientation(orientationItem.value);
+                    MediaSize mediaSize = mCurrPrintAttributes.getMediaSize();
+                    if (orientationItem.value == ORIENTATION_PORTRAIT) {
+                        if (!mediaSize.isPortrait()) {
+                            mCurrPrintAttributes.setMediaSize(mediaSize.asPortrait());
+                        }
+                    } else {
+                        if (mediaSize.isPortrait()) {
+                            mCurrPrintAttributes.setMediaSize(mediaSize.asLandscape());
+                        }
+                    }
                     if (!hasErrors()) {
                         mController.update();
                     }
@@ -1108,6 +1061,12 @@
             mOrientationSpinnerAdapter = new ArrayAdapter<SpinnerItem<Integer>>(
                     PrintJobConfigActivity.this,
                     R.layout.spinner_dropdown_item, R.id.title);
+            String[] orientationLabels = getResources().getStringArray(
+                  R.array.orientation_labels);
+            mOrientationSpinnerAdapter.add(new SpinnerItem<Integer>(
+                    ORIENTATION_PORTRAIT, orientationLabels[0]));
+            mOrientationSpinnerAdapter.add(new SpinnerItem<Integer>(
+                    ORIENTATION_LANDSCAPE, orientationLabels[1]));
 
             // Range options
             mRangeOptionsSpinnerAdapter = new ArrayAdapter<SpinnerItem<Integer>>(
@@ -1604,7 +1563,7 @@
                             oldMediaSizeNewIndex = i;
                         }
                         mMediaSizeSpinnerAdapter.add(new SpinnerItem<MediaSize>(
-                                mediaSize, mediaSize.getLabel()));
+                                mediaSize, mediaSize.getLabel(getPackageManager())));
                     }
 
                     if (mediaSizeCount <= 0) {
@@ -1693,68 +1652,7 @@
                 }
                 mColorModeSpinner.setEnabled(true);
 
-                // Orientation.
-                final int orientations = capabilities.getOrientations();
-
-                // If the orientations changed, we update the adapter and the spinner.
-                boolean orientationsChanged = false;
-                if (Integer.bitCount(orientations) != mOrientationSpinnerAdapter.getCount()) {
-                    orientationsChanged = true;
-                } else {
-                    int remainingOrientations = orientations;
-                    int adapterIndex = 0;
-                    while (remainingOrientations != 0) {
-                        final int orientationBitOffset = Integer.numberOfTrailingZeros(
-                                remainingOrientations);
-                        final int orientation = 1 << orientationBitOffset;
-                        remainingOrientations &= ~orientation;
-                        if (orientation != mOrientationSpinnerAdapter.getItem(
-                                adapterIndex).value) {
-                            orientationsChanged = true;
-                            break;
-                        }
-                        adapterIndex++;
-                    }
-                }
-                if (orientationsChanged) {
-                    // Remember the old orientation to try selecting it again.
-                    int oldOrientationNewIndex = AdapterView.INVALID_POSITION;
-                    final int oldOrientation = mCurrPrintAttributes.getOrientation();
-
-                    mOrientationSpinnerAdapter.clear();
-                    String[] orientationLabels = getResources().getStringArray(
-                            R.array.orientation_labels);
-                    int remainingOrientations = orientations;
-                    while (remainingOrientations != 0) {
-                        final int orientationBitOffset = Integer.numberOfTrailingZeros(
-                                remainingOrientations);
-                        final int orientation = 1 << orientationBitOffset;
-                        if (orientation == oldOrientation) {
-                            // Update the index of the old selection.
-                            oldOrientationNewIndex = orientationBitOffset;
-                        }
-                        remainingOrientations &= ~orientation;
-                        mOrientationSpinnerAdapter.add(new SpinnerItem<Integer>(orientation,
-                                orientationLabels[orientationBitOffset]));
-                    }
-                    final int orientationCount = Integer.bitCount(orientations);
-                    if (orientationCount <= 0) {
-                        mOrientationSpinner.setEnabled(false);
-                        mOrientationSpinner.setSelection(AdapterView.INVALID_POSITION);
-                    } else {
-                        mOrientationSpinner.setEnabled(true);
-                        if (oldOrientationNewIndex != AdapterView.INVALID_POSITION) {
-                            // Select the old orientation - nothing really changed.
-                            setOrientationSpinnerSelectionNoCallback(oldOrientationNewIndex);
-                        } else {
-                            final int selectedOrientationIndex = Integer.numberOfTrailingZeros(
-                                    (orientations & defaultAttributes.getOrientation()));
-                            someAttributeSelectionChanged =
-                                    setOrientationSpinnerSelectionNoCallback(
-                                            selectedOrientationIndex);
-                        }
-                    }
-                }
+                // Orientation
                 mOrientationSpinner.setEnabled(true);
 
                 // Range options
@@ -1858,15 +1756,6 @@
             return false;
         }
 
-        private boolean setOrientationSpinnerSelectionNoCallback(int position) {
-            if (mOrientationSpinner.getSelectedItemPosition() != position) {
-                mIgnoreNextOrientationChange = true;
-                mOrientationSpinner.setSelection(position);
-                return true;
-            }
-            return false;
-        }
-
         private void updateUiForNewPrinterCapabilities() {
             // The printer changed so we want to start with a clean slate
             // for the print options and let them be populated from the
@@ -1881,7 +1770,7 @@
             }
             if (!mOrientationSpinnerAdapter.isEmpty()) {
                 mIgnoreNextOrientationChange = true;
-                mOrientationSpinnerAdapter.clear();
+                mOrientationSpinner.setSelection(0);
             }
             if (mRangeOptionsSpinner.getSelectedItemPosition() != 0) {
                 mIgnoreNextRangeOptionChange = true;
@@ -2102,18 +1991,13 @@
 
                 PrinterCapabilitiesInfo capabilities =
                         new PrinterCapabilitiesInfo.Builder(printerId)
-                    .addMediaSize(MediaSize.createMediaSize(getPackageManager(),
-                            MediaSize.ISO_A4), true)
-                    .addMediaSize(MediaSize.createMediaSize(getPackageManager(),
-                            MediaSize.NA_LETTER), false)
+                    .addMediaSize(MediaSize.ISO_A4, true)
+                    .addMediaSize(MediaSize.NA_LETTER, false)
                     .addResolution(new Resolution("PDF resolution", "PDF resolution",
                             300, 300), true)
                     .setColorModes(PrintAttributes.COLOR_MODE_COLOR
                             | PrintAttributes.COLOR_MODE_MONOCHROME,
                             PrintAttributes.COLOR_MODE_COLOR)
-                    .setOrientations(PrintAttributes.ORIENTATION_PORTRAIT
-                            | PrintAttributes.ORIENTATION_LANDSCAPE,
-                            PrintAttributes.ORIENTATION_PORTRAIT)
                     .create();
 
                 return new PrinterInfo.Builder(printerId, getString(R.string.save_as_pdf),
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
index dd2598c..00c9a68 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
@@ -36,7 +36,6 @@
 import android.print.PrintAttributes.Margins;
 import android.print.PrintAttributes.MediaSize;
 import android.print.PrintAttributes.Resolution;
-import android.print.PrintAttributes.Tray;
 import android.print.PrintDocumentInfo;
 import android.print.PrintJobInfo;
 import android.print.PrintManager;
@@ -51,8 +50,6 @@
 import com.android.internal.os.SomeArgs;
 import com.android.internal.util.FastXmlSerializer;
 
-import libcore.io.IoUtils;
-
 import org.xmlpull.v1.XmlPullParser;
 import org.xmlpull.v1.XmlPullParserException;
 import org.xmlpull.v1.XmlSerializer;
@@ -65,6 +62,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import libcore.io.IoUtils;
+
 /**
  * Service for exposing some of the {@link PrintSpooler} functionality to
  * another process.
@@ -676,6 +675,8 @@
 
         private static final String ATTR_ID = "id";
         private static final String ATTR_LABEL = "label";
+        private static final String ATTR_LABEL_RES_ID = "labelResId";
+        private static final String ATTR_PACKAGE_NAME = "packageName";
         private static final String ATTR_STATE = "state";
         private static final String ATTR_APP_ID = "appId";
         private static final String ATTR_USER_ID = "userId";
@@ -685,13 +686,8 @@
         private static final String TAG_MEDIA_SIZE = "mediaSize";
         private static final String TAG_RESOLUTION = "resolution";
         private static final String TAG_MARGINS = "margins";
-        private static final String TAG_INPUT_TRAY = "inputTray";
-        private static final String TAG_OUTPUT_TRAY = "outputTray";
 
-        private static final String ATTR_DUPLEX_MODE = "duplexMode";
         private static final String ATTR_COLOR_MODE = "colorMode";
-        private static final String ATTR_FITTING_MODE = "fittingMode";
-        private static final String ATTR_ORIENTATION = "orientation";
 
         private static final String ATTR_LOCAL_ID = "printerName";
         private static final String ATTR_SERVICE_NAME = "serviceName";
@@ -806,32 +802,31 @@
                     if (attributes != null) {
                         serializer.startTag(null, TAG_ATTRIBUTES);
 
-                        final int duplexMode = attributes.getDuplexMode();
-                        serializer.attribute(null, ATTR_DUPLEX_MODE,
-                                String.valueOf(duplexMode));
-
                         final int colorMode = attributes.getColorMode();
                         serializer.attribute(null, ATTR_COLOR_MODE,
                                 String.valueOf(colorMode));
 
-                        final int fittingMode = attributes.getFittingMode();
-                        serializer.attribute(null, ATTR_FITTING_MODE,
-                                String.valueOf(fittingMode));
-
-                        final int orientation = attributes.getOrientation();
-                        serializer.attribute(null, ATTR_ORIENTATION,
-                                String.valueOf(orientation));
-
                         MediaSize mediaSize = attributes.getMediaSize();
                         if (mediaSize != null) {
                             serializer.startTag(null, TAG_MEDIA_SIZE);
                             serializer.attribute(null, ATTR_ID, mediaSize.getId());
-                            serializer.attribute(null, ATTR_LABEL, mediaSize.getLabel()
-                                    .toString());
                             serializer.attribute(null, ATTR_WIDTH_MILS, String.valueOf(
                                     mediaSize.getWidthMils()));
                             serializer.attribute(null, ATTR_HEIGHT_MILS, String.valueOf(
                                     mediaSize.getHeightMils()));
+                            // Store only the platform localized versions of the label
+                            // since the resource ids for a print service are not stable 
+                            // across application versions.
+                            if ("android".equals(mediaSize.mPackageName)
+                                    && mediaSize.mLabelResId > 0) {
+                                serializer.attribute(null, ATTR_PACKAGE_NAME,
+                                        mediaSize.mPackageName);
+                                serializer.attribute(null, ATTR_LABEL_RES_ID,
+                                        String.valueOf(mediaSize.mLabelResId));
+                            } else {
+                                serializer.attribute(null, ATTR_LABEL,
+                                        mediaSize.getLabel(getPackageManager()));
+                            }
                             serializer.endTag(null, TAG_MEDIA_SIZE);
                         }
 
@@ -839,12 +834,23 @@
                         if (resolution != null) {
                             serializer.startTag(null, TAG_RESOLUTION);
                             serializer.attribute(null, ATTR_ID, resolution.getId());
-                            serializer.attribute(null, ATTR_LABEL, resolution.getLabel()
-                                    .toString());
                             serializer.attribute(null, ATTR_HORIZONTAL_DPI, String.valueOf(
                                     resolution.getHorizontalDpi()));
                             serializer.attribute(null, ATTR_VERTICAL_DPI, String.valueOf(
                                     resolution.getVerticalDpi()));
+                            // Store only the platform localized versions of the label
+                            // since the resource ids for a print service are not stable 
+                            // across application versions.
+                            if ("android".equals(resolution.mPackageName)
+                                    && resolution.mLabelResId > 0) {
+                                serializer.attribute(null, ATTR_PACKAGE_NAME,
+                                        resolution.mPackageName);
+                                serializer.attribute(null, ATTR_LABEL_RES_ID,
+                                        String.valueOf(resolution.mLabelResId));
+                            } else {
+                                serializer.attribute(null, ATTR_LABEL,
+                                        resolution.getLabel(getPackageManager()));
+                            }
                             serializer.endTag(null, TAG_RESOLUTION);
                         }
 
@@ -862,24 +868,6 @@
                             serializer.endTag(null, TAG_MARGINS);
                         }
 
-                        Tray inputTray = attributes.getInputTray();
-                        if (inputTray != null) {
-                            serializer.startTag(null, TAG_INPUT_TRAY);
-                            serializer.attribute(null, ATTR_ID, inputTray.getId());
-                            serializer.attribute(null, ATTR_LABEL, inputTray.getLabel()
-                                    .toString());
-                            serializer.endTag(null, TAG_INPUT_TRAY);
-                        }
-
-                        Tray outputTray = attributes.getOutputTray();
-                        if (outputTray != null) {
-                            serializer.startTag(null, TAG_OUTPUT_TRAY);
-                            serializer.attribute(null, ATTR_ID, outputTray.getId());
-                            serializer.attribute(null, ATTR_LABEL, outputTray.getLabel()
-                                    .toString());
-                            serializer.endTag(null, TAG_OUTPUT_TRAY);
-                        }
-
                         serializer.endTag(null, TAG_ATTRIBUTES);
                     }
 
@@ -1026,18 +1014,9 @@
 
                 PrintAttributes.Builder builder = new PrintAttributes.Builder();
 
-                String duplexMode = parser.getAttributeValue(null, ATTR_DUPLEX_MODE);
-                builder.setDuplexMode(Integer.parseInt(duplexMode));
-
                 String colorMode = parser.getAttributeValue(null, ATTR_COLOR_MODE);
                 builder.setColorMode(Integer.parseInt(colorMode));
 
-                String fittingMode = parser.getAttributeValue(null, ATTR_FITTING_MODE);
-                builder.setFittingMode(Integer.parseInt(fittingMode));
-
-                String orientation = parser.getAttributeValue(null, ATTR_ORIENTATION);
-                builder.setOrientation(Integer.parseInt(orientation));
-
                 parser.next();
 
                 skipEmptyTextTags(parser);
@@ -1048,7 +1027,12 @@
                             ATTR_WIDTH_MILS));
                     final int heightMils = Integer.parseInt(parser.getAttributeValue(null,
                             ATTR_HEIGHT_MILS));
-                    MediaSize mediaSize = new MediaSize(id, label, widthMils, heightMils);
+                    String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME);
+                    final int labelResId = Integer.parseInt(parser.getAttributeValue(null,
+                            ATTR_LABEL_RES_ID));
+                    label = parser.getAttributeValue(null, ATTR_LABEL);
+                    MediaSize mediaSize = new MediaSize(id, label, packageName, labelResId,
+                                widthMils, heightMils);
                     builder.setMediaSize(mediaSize);
                     parser.next();
                     skipEmptyTextTags(parser);
@@ -1064,7 +1048,11 @@
                             ATTR_HORIZONTAL_DPI));
                     final int verticalDpi = Integer.parseInt(parser.getAttributeValue(null,
                             ATTR_VERTICAL_DPI));
-                    Resolution resolution = new Resolution(id, label, horizontalDpi, verticalDpi);
+                    String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME);
+                    final int labelResId = Integer.parseInt(
+                            parser.getAttributeValue(null, ATTR_LABEL_RES_ID));
+                    Resolution resolution = new Resolution(id, label, packageName, labelResId,
+                                horizontalDpi, verticalDpi);
                     builder.setResolution(resolution);
                     parser.next();
                     skipEmptyTextTags(parser);
@@ -1090,30 +1078,6 @@
                     parser.next();
                 }
 
-                skipEmptyTextTags(parser);
-                if (accept(parser, XmlPullParser.START_TAG, TAG_INPUT_TRAY)) {
-                    String id = parser.getAttributeValue(null, ATTR_ID);
-                    label = parser.getAttributeValue(null, ATTR_LABEL);
-                    Tray tray = new Tray(id, label);
-                    builder.setInputTray(tray);
-                    parser.next();
-                    skipEmptyTextTags(parser);
-                    expect(parser, XmlPullParser.END_TAG, TAG_INPUT_TRAY);
-                    parser.next();
-                }
-
-                skipEmptyTextTags(parser);
-                if (accept(parser, XmlPullParser.START_TAG, TAG_OUTPUT_TRAY)) {
-                    String id = parser.getAttributeValue(null, ATTR_ID);
-                    label = parser.getAttributeValue(null, ATTR_LABEL);
-                    Tray tray = new Tray(id, label);
-                    builder.setOutputTray(tray);
-                    parser.next();
-                    skipEmptyTextTags(parser);
-                    expect(parser, XmlPullParser.END_TAG, TAG_OUTPUT_TRAY);
-                    parser.next();
-                }
-
                 printJob.setAttributes(builder.create());
 
                 skipEmptyTextTags(parser);
diff --git a/services/java/com/android/server/print/RemotePrintService.java b/services/java/com/android/server/print/RemotePrintService.java
index 3c67aa9..2ded202 100644
--- a/services/java/com/android/server/print/RemotePrintService.java
+++ b/services/java/com/android/server/print/RemotePrintService.java
@@ -684,20 +684,6 @@
             }
         }
 
-        @Override
-        public void onPrintersUpdated(List<PrinterInfo> printers) {
-            RemotePrintService service = mWeakService.get();
-            if (service != null) {
-                throwIfPrinterIdsForPrinterInfoTampered(service.mComponentName, printers);
-                final long identity = Binder.clearCallingIdentity();
-                try {
-                    service.mUserState.onPrintersUpdated(printers);
-                } finally {
-                    Binder.restoreCallingIdentity(identity);
-                }
-            }
-        }
-
         private void throwIfPrinterIdsForPrinterInfoTampered(ComponentName serviceName,
                 List<PrinterInfo> printerInfos) {
             final int printerInfoCount = printerInfos.size();
diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java
index b9c676d..8fe979b 100644
--- a/services/java/com/android/server/print/UserState.java
+++ b/services/java/com/android/server/print/UserState.java
@@ -276,22 +276,6 @@
         }
     }
 
-    public void onPrintersUpdated(List<PrinterInfo> printers) {
-        synchronized (mLock) {
-            throwIfDestroyedLocked();
-            // No services - nothing to do.
-            if (mActiveServices.isEmpty()) {
-                return;
-            }
-            // No session - nothing to do.
-            if (mPrinterDiscoverySession == null) {
-                return;
-            }
-            // Request an updated.
-            mPrinterDiscoverySession.onPrintersUpdatedLocked(printers);
-        }
-    }
-
     public void updateIfNeededLocked() {
         throwIfDestroyedLocked();
         if (readConfigurationLocked()) {
@@ -746,8 +730,8 @@
             final int addedPrinterCount = printers.size();
             for (int i = 0; i < addedPrinterCount; i++) {
                 PrinterInfo printer = printers.get(i);
-                if (!mPrinters.containsKey(printer.getId())) {
-                    mPrinters.put(printer.getId(), printer);
+                PrinterInfo oldPrinter = mPrinters.put(printer.getId(), printer);
+                if (oldPrinter == null || !oldPrinter.equals(printer)) {
                     if (addedPrinters == null) {
                         addedPrinters = new ArrayList<PrinterInfo>();
                     }
@@ -785,32 +769,6 @@
             }
         }
 
-        public void onPrintersUpdatedLocked(List<PrinterInfo> printers) {
-            if (DEBUG) {
-                Log.i(LOG_TAG, "onPrintersUpdatedLocked()");
-            }
-            if (mIsDestroyed) {
-                Log.w(LOG_TAG, "Not updating printers - session destroyed");
-                return;
-            }
-            List<PrinterInfo> updatedPrinters = null;
-            final int updatedPrinterCount = printers.size();
-            for (int i = 0; i < updatedPrinterCount; i++) {
-                PrinterInfo updatedPrinter = printers.get(i);
-                if (mPrinters.containsKey(updatedPrinter.getId())) {
-                    mPrinters.put(updatedPrinter.getId(), updatedPrinter);
-                    if (updatedPrinters == null) {
-                        updatedPrinters = new ArrayList<PrinterInfo>();
-                    }
-                    updatedPrinters.add(updatedPrinter);
-                }
-            }
-            if (updatedPrinters != null) {
-                mHandler.obtainMessage(SessionHandler.MSG_DISPATCH_PRINTERS_UPDATED,
-                        updatedPrinters).sendToTarget();
-            }
-        }
-
         public void onServiceRemovedLocked(ComponentName serviceName) {
             if (mIsDestroyed) {
                 Log.w(LOG_TAG, "Not updating removed service - session destroyed");
@@ -874,15 +832,6 @@
             mDiscoveryObservers.finishBroadcast();
         }
 
-        private void handleDispatchPrintersUpdated(List<PrinterInfo> updatedPrinters) {
-            final int observerCount = mDiscoveryObservers.beginBroadcast();
-            for (int i = 0; i < observerCount; i++) {
-                IPrinterDiscoveryObserver observer = mDiscoveryObservers.getBroadcastItem(i);
-                handlePrintersUpdated(observer, updatedPrinters);
-            }
-            mDiscoveryObservers.finishBroadcast();
-        }
-
         private void handleDispatchCreatePrinterDiscoverySession(
                 List<RemotePrintService> services) {
             final int serviceCount = services.size();
@@ -976,43 +925,21 @@
             }
         }
 
-        private void handlePrintersUpdated(IPrinterDiscoveryObserver observer,
-                List<PrinterInfo> updatedPrinters) {
-            try {
-                final int printerCount = updatedPrinters.size();
-                if (printerCount <= MAX_ITEMS_PER_CALLBACK) {
-                    observer.onPrintersUpdated(updatedPrinters);
-                } else {
-                    // Send the added printers in chunks avoiding the binder transaction limit.
-                    final int transactionCount = (printerCount / MAX_ITEMS_PER_CALLBACK) + 1;
-                    for (int i = 0; i < transactionCount; i++) {
-                        final int start = i * MAX_ITEMS_PER_CALLBACK;
-                        final int end = Math.min(start + MAX_ITEMS_PER_CALLBACK, printerCount);
-                        List<PrinterInfo> subPrinters = updatedPrinters.subList(start, end);
-                        observer.onPrintersUpdated(subPrinters); 
-                    }
-                }
-            } catch (RemoteException re) {
-                Log.e(LOG_TAG, "Error sending updated printers", re);
-            }
-        }
-
         private final class SessionHandler extends Handler {
             public static final int MSG_PRINTERS_ADDED = 1;
             public static final int MSG_PRINTERS_REMOVED = 2;
             public static final int MSG_DISPATCH_PRINTERS_ADDED = 3;
             public static final int MSG_DISPATCH_PRINTERS_REMOVED = 4;
-            public static final int MSG_DISPATCH_PRINTERS_UPDATED = 5;
 
-            public static final int MSG_CREATE_PRINTER_DISCOVERY_SESSION = 6;
-            public static final int MSG_START_PRINTER_DISCOVERY = 7;
-            public static final int MSG_DISPATCH_CREATE_PRINTER_DISCOVERY_SESSION = 8;
-            public static final int MSG_DISPATCH_DESTROY_PRINTER_DISCOVERY_SESSION = 9;
-            public static final int MSG_DISPATCH_START_PRINTER_DISCOVERY = 10;
-            public static final int MSG_DISPATCH_STOP_PRINTER_DISCOVERY = 11;
-            public static final int MSG_VALIDATE_PRINTERS = 12;
-            public static final int MSG_START_PRINTER_STATE_TRACKING = 13;
-            public static final int MSG_STOP_PRINTER_STATE_TRACKING = 14;
+            public static final int MSG_CREATE_PRINTER_DISCOVERY_SESSION = 5;
+            public static final int MSG_START_PRINTER_DISCOVERY = 6;
+            public static final int MSG_DISPATCH_CREATE_PRINTER_DISCOVERY_SESSION = 7;
+            public static final int MSG_DISPATCH_DESTROY_PRINTER_DISCOVERY_SESSION = 8;
+            public static final int MSG_DISPATCH_START_PRINTER_DISCOVERY = 9;
+            public static final int MSG_DISPATCH_STOP_PRINTER_DISCOVERY = 10;
+            public static final int MSG_VALIDATE_PRINTERS = 11;
+            public static final int MSG_START_PRINTER_STATE_TRACKING = 12;
+            public static final int MSG_STOP_PRINTER_STATE_TRACKING = 13;
 
             SessionHandler(Looper looper) {
                 super(looper, null, false);
@@ -1048,11 +975,6 @@
                         handleDispatchPrintersRemoved(removedPrinterIds);
                     } break;
 
-                    case MSG_DISPATCH_PRINTERS_UPDATED: {
-                        List<PrinterInfo> updatedPrinters = (List<PrinterInfo>) message.obj;
-                        handleDispatchPrintersUpdated(updatedPrinters);
-                    } break;
-
                     case MSG_CREATE_PRINTER_DISCOVERY_SESSION: {
                         RemotePrintService service = (RemotePrintService) message.obj;
                         service.createPrinterDiscoverySession();