diff --git a/src/com/android/settings/print/PrintServiceSettingsFragment.java b/src/com/android/settings/print/PrintServiceSettingsFragment.java
index 722be0e..5d20f65 100644
--- a/src/com/android/settings/print/PrintServiceSettingsFragment.java
+++ b/src/com/android/settings/print/PrintServiceSettingsFragment.java
@@ -191,13 +191,13 @@
 
     private void onPreferenceToggled(String preferenceKey, boolean enabled) {
         ComponentName service = ComponentName.unflattenFromString(preferenceKey);
-        List<ComponentName> services = PrintSettingsUtils.readEnabledPrintServices(getActivity());
+        List<ComponentName> services = PrintSettingsUtils.readDisabledPrintServices(getActivity());
         if (enabled) {
-            services.add(service);
-        } else {
             services.remove(service);
+        } else {
+            services.add(service);
         }
-        PrintSettingsUtils.writeEnabledPrintServices(getActivity(), services);
+        PrintSettingsUtils.writeDisabledPrintServices(getActivity(), services);
     }
 
     private ListView getBackupListView() {
@@ -253,8 +253,9 @@
     }
 
     private void updateUiForServiceState() {
-        List<ComponentName> services = PrintSettingsUtils.readEnabledPrintServices(getActivity());
-        mServiceEnabled = services.contains(mComponentName);
+        List<ComponentName> disabledServices = PrintSettingsUtils
+                .readDisabledPrintServices(getActivity());
+        mServiceEnabled = !disabledServices.contains(mComponentName);
         if (mServiceEnabled) {
             mSwitchBar.setCheckedInternal(true);
             mPrintersAdapter.enable();
@@ -431,7 +432,7 @@
 
         public void register(ContentResolver contentResolver) {
             contentResolver.registerContentObserver(android.provider.Settings.Secure.getUriFor(
-                    android.provider.Settings.Secure.ENABLED_PRINT_SERVICES), false, this);
+                    android.provider.Settings.Secure.DISABLED_PRINT_SERVICES), false, this);
         }
 
         public void unregister(ContentResolver contentResolver) {
diff --git a/src/com/android/settings/print/PrintSettingsFragment.java b/src/com/android/settings/print/PrintSettingsFragment.java
index a526022..405b239 100644
--- a/src/com/android/settings/print/PrintSettingsFragment.java
+++ b/src/com/android/settings/print/PrintSettingsFragment.java
@@ -207,8 +207,8 @@
             mPrintServicesCategory.removeAll();
         }
 
-        List<ComponentName> enabledServices = PrintSettingsUtils
-                .readEnabledPrintServices(getActivity());
+        List<ComponentName> disabledServices = PrintSettingsUtils
+                .readDisabledPrintServices(getActivity());
 
         final PackageManager pm = getActivity().getPackageManager();
 
@@ -236,7 +236,7 @@
             preference.setFragment(PrintServiceSettingsFragment.class.getName());
             preference.setPersistent(false);
 
-            final boolean serviceEnabled = enabledServices.contains(componentName);
+            final boolean serviceEnabled = !disabledServices.contains(componentName);
             if (serviceEnabled) {
                 preference.setSummary(getString(R.string.print_feature_state_on));
             } else {
@@ -388,7 +388,7 @@
 
         public void register(ContentResolver contentResolver) {
             contentResolver.registerContentObserver(Settings.Secure.getUriFor(
-                    Settings.Secure.ENABLED_PRINT_SERVICES), false, this);
+                    Settings.Secure.DISABLED_PRINT_SERVICES), false, this);
         }
 
         public void unregister(ContentResolver contentResolver) {
diff --git a/src/com/android/settings/print/PrintSettingsUtils.java b/src/com/android/settings/print/PrintSettingsUtils.java
index d09f345..87f26be 100644
--- a/src/com/android/settings/print/PrintSettingsUtils.java
+++ b/src/com/android/settings/print/PrintSettingsUtils.java
@@ -30,50 +30,50 @@
  */
 public class PrintSettingsUtils {
 
-    private static final char ENABLED_PRINT_SERVICES_SEPARATOR = ':';
+    private static final char DISABLED_PRINT_SERVICES_SEPARATOR = ':';
 
     private PrintSettingsUtils() {
         /* do nothing */
     }
 
-    public static List<ComponentName> readEnabledPrintServices(Context context) {
-        List<ComponentName> enabledServices = new ArrayList<ComponentName>();
+    public static List<ComponentName> readDisabledPrintServices(Context context) {
+        List<ComponentName> disabledServices = new ArrayList<ComponentName>();
 
-        String enabledServicesSetting = Settings.Secure.getString(context
-                .getContentResolver(), Settings.Secure.ENABLED_PRINT_SERVICES);
-        if (TextUtils.isEmpty(enabledServicesSetting)) {
-            return enabledServices;
+        String disabledServicesSetting = Settings.Secure.getString(context
+                .getContentResolver(), Settings.Secure.DISABLED_PRINT_SERVICES);
+        if (TextUtils.isEmpty(disabledServicesSetting)) {
+            return disabledServices;
         }
 
         SimpleStringSplitter colonSplitter = new SimpleStringSplitter(
-                ENABLED_PRINT_SERVICES_SEPARATOR);
-        colonSplitter.setString(enabledServicesSetting);
+                DISABLED_PRINT_SERVICES_SEPARATOR);
+        colonSplitter.setString(disabledServicesSetting);
 
         while (colonSplitter.hasNext()) {
             String componentNameString = colonSplitter.next();
-            ComponentName enabledService = ComponentName.unflattenFromString(
+            ComponentName disabledService = ComponentName.unflattenFromString(
                     componentNameString);
-            if (enabledService != null) {
-                enabledServices.add(enabledService);
+            if (disabledService != null) {
+                disabledServices.add(disabledService);
             }
         }
 
-        return enabledServices;
+        return disabledServices;
     }
 
-    public static void writeEnabledPrintServices(Context context,
+    public static void writeDisabledPrintServices(Context context,
             List<ComponentName> services) {
         StringBuilder builder = new StringBuilder();
         final int serviceCount = services.size();
         for (int i = 0; i < serviceCount; i++) {
             ComponentName service = services.get(i);
             if (builder.length() > 0) {
-                builder.append(ENABLED_PRINT_SERVICES_SEPARATOR);
+                builder.append(DISABLED_PRINT_SERVICES_SEPARATOR);
             }
             builder.append(service.flattenToString());
         }
         Settings.Secure.putString(context.getContentResolver(),
-                Settings.Secure.ENABLED_PRINT_SERVICES,
+                Settings.Secure.DISABLED_PRINT_SERVICES,
                 builder.toString());
     }
 }
