diff --git a/src/org/fdroid/fdroid/AppDetails.java b/src/org/fdroid/fdroid/AppDetails.java
index 3b309e1cb..287ca5905 100644
--- a/src/org/fdroid/fdroid/AppDetails.java
+++ b/src/org/fdroid/fdroid/AppDetails.java
@@ -26,6 +26,7 @@ import java.util.Iterator;
 import java.util.List;
 
 import android.support.v4.view.MenuItemCompat;
+import org.fdroid.fdroid.compat.ActionBarCompat;
 import org.fdroid.fdroid.compat.MenuManager;
 import org.fdroid.fdroid.DB.CommaSeparatedList;
 import org.xml.sax.XMLReader;
@@ -182,10 +183,9 @@ public class AppDetails extends ListActivity {
     protected void onCreate(Bundle savedInstanceState) {
 
         super.onCreate(savedInstanceState);
-        if (Utils.hasApi(11)) {
-            getActionBar().setDisplayShowTitleEnabled(false);
-            getActionBar().setDisplayHomeAsUpEnabled(true);
-        }
+        ActionBarCompat abCompat = ActionBarCompat.create(this);
+        abCompat.setDisplayHomeAsUpEnabled(true);
+        abCompat.setDisplayShowTitleEnabled(false);
 
         setContentView(R.layout.appdetails);
 
diff --git a/src/org/fdroid/fdroid/DB.java b/src/org/fdroid/fdroid/DB.java
index da83f8994..37b35a783 100644
--- a/src/org/fdroid/fdroid/DB.java
+++ b/src/org/fdroid/fdroid/DB.java
@@ -45,6 +45,8 @@ import android.os.Environment;
 import android.preference.PreferenceManager;
 import android.text.TextUtils.SimpleStringSplitter;
 import android.util.Log;
+import org.fdroid.fdroid.compat.Compatibility;
+import org.fdroid.fdroid.compat.ContextCompat;
 
 public class DB {
 
@@ -275,25 +277,25 @@ public class DB {
 
         // Call isCompatible(apk) on an instance of this class to
         // check if an APK is compatible with the user's device.
-        public static abstract class CompatibilityChecker {
+        public static abstract class CompatibilityChecker extends Compatibility {
 
             public abstract boolean isCompatible(Apk apk);
 
             public static CompatibilityChecker getChecker(Context ctx) {
                 CompatibilityChecker checker;
-                if (Utils.hasApi(5))
+                if (hasApi(5))
                     checker = new EclairChecker(ctx);
                 else
                     checker = new BasicChecker();
                 Log.d("FDroid", "Compatibility checker for API level "
-                        + Utils.getApi() + ": " + checker.getClass().getName());
+                        + getApi() + ": " + checker.getClass().getName());
                 return checker;
             }
         }
 
         private static class BasicChecker extends CompatibilityChecker {
             public boolean isCompatible(Apk apk) {
-                return (apk.minSdkVersion <= Utils.getApi());
+                return hasApi(apk.minSdkVersion);
             }
         }
 
@@ -323,7 +325,7 @@ public class DB {
             }
 
             public boolean isCompatible(Apk apk) {
-                if (apk.minSdkVersion > Utils.getApi())
+                if (!hasApi(apk.minSdkVersion))
                     return false;
                 if (apk.features != null) {
                     for (String feat : apk.features) {
@@ -485,21 +487,12 @@ public class DB {
 
     }
 
-    // Get the local storage (cache) path. This will also create it if
-    // it doesn't exist. It can return null if it's currently unavailable.
+    /**
+     * Get the local storage (cache) path. This will also create it if
+     * it doesn't exist. It can return null if it's currently unavailable.
+     */
     public static File getDataPath(Context ctx) {
-        File f;
-        if (Utils.hasApi(8)) {
-            f = ctx.getExternalCacheDir();
-        } else {
-            f = new File(Environment.getExternalStorageDirectory(),
-                    "Android/data/org.fdroid.fdroid/cache");
-            if(f != null) {
-                if(!f.exists())
-                    f.mkdirs();
-            }
-        }
-        return f;
+        return ContextCompat.create(ctx).getExternalCacheDir();
     }
 
     public static File getIconsPath(Context ctx) {
diff --git a/src/org/fdroid/fdroid/Preferences.java b/src/org/fdroid/fdroid/Preferences.java
index 9e5083cd3..7098f8b98 100644
--- a/src/org/fdroid/fdroid/Preferences.java
+++ b/src/org/fdroid/fdroid/Preferences.java
@@ -27,6 +27,7 @@ import android.preference.Preference;
 import android.preference.PreferenceActivity;
 import android.preference.Preference.OnPreferenceClickListener;
 import android.widget.Toast;
+import org.fdroid.fdroid.compat.ActionBarCompat;
 
 public class Preferences extends PreferenceActivity implements
         OnPreferenceClickListener {
@@ -34,8 +35,7 @@ public class Preferences extends PreferenceActivity implements
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        if (Utils.hasApi(11))
-            getActionBar().setDisplayHomeAsUpEnabled(true);
+        ActionBarCompat.create(this).setDisplayHomeAsUpEnabled(true);
         addPreferencesFromResource(R.xml.preferences);
         for (String prefkey : new String[] { "reset", "ignoreTouchscreen",
                 "showIncompatible" }) {
diff --git a/src/org/fdroid/fdroid/SearchResults.java b/src/org/fdroid/fdroid/SearchResults.java
index 365181d06..2d9ef51e0 100644
--- a/src/org/fdroid/fdroid/SearchResults.java
+++ b/src/org/fdroid/fdroid/SearchResults.java
@@ -34,6 +34,7 @@ import android.view.MenuItem;
 import android.view.View;
 import android.widget.ListView;
 import android.widget.TextView;
+import org.fdroid.fdroid.compat.ActionBarCompat;
 import org.fdroid.fdroid.views.AppListAdapter;
 import org.fdroid.fdroid.views.AvailableAppListAdapter;
 
@@ -50,8 +51,7 @@ public class SearchResults extends ListActivity {
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        if (Utils.hasApi(11))
-            getActionBar().setDisplayHomeAsUpEnabled(true);
+        ActionBarCompat.create(this).setDisplayHomeAsUpEnabled(true);
         applist = new AvailableAppListAdapter(this);
         setContentView(R.layout.searchresults);
 
diff --git a/src/org/fdroid/fdroid/Utils.java b/src/org/fdroid/fdroid/Utils.java
index d1679cbce..4726e2f32 100644
--- a/src/org/fdroid/fdroid/Utils.java
+++ b/src/org/fdroid/fdroid/Utils.java
@@ -18,8 +18,6 @@
 
 package org.fdroid.fdroid;
 
-import android.os.Build;
-
 import java.io.BufferedReader;
 import java.io.Closeable;
 import java.io.File;
@@ -73,14 +71,6 @@ public final class Utils {
         }
     }
 
-    public static boolean hasApi(int apiLevel) {
-        return Build.VERSION.SDK_INT >= apiLevel;
-    }
-
-    public static int getApi() {
-        return Build.VERSION.SDK_INT;
-    }
-
     public static String getFriendlySize(int size) {
         double s = size;
         int i = 0;
diff --git a/src/org/fdroid/fdroid/compat/ActionBarCompat.java b/src/org/fdroid/fdroid/compat/ActionBarCompat.java
new file mode 100644
index 000000000..3360a7167
--- /dev/null
+++ b/src/org/fdroid/fdroid/compat/ActionBarCompat.java
@@ -0,0 +1,62 @@
+package org.fdroid.fdroid.compat;
+
+import android.app.ActionBar;
+import android.app.Activity;
+
+public abstract class ActionBarCompat extends Compatibility {
+
+    public static ActionBarCompat create(Activity activity) {
+        if (hasApi(11)) {
+            return new HoneycombActionBarCompatImpl(activity);
+        } else {
+            return new OldActionBarCompatImpl(activity);
+        }
+    }
+
+    protected final Activity activity;
+
+    public ActionBarCompat(Activity activity) {
+        this.activity = activity;
+    }
+
+    public abstract void setDisplayHomeAsUpEnabled(boolean value);
+    public abstract void setDisplayShowTitleEnabled(boolean value);
+
+}
+
+class OldActionBarCompatImpl extends ActionBarCompat {
+
+    public OldActionBarCompatImpl(Activity activity) {
+        super(activity);
+    }
+
+    @Override
+    public void setDisplayHomeAsUpEnabled(boolean value) {
+        // Do nothing...
+    }
+
+    @Override
+    public void setDisplayShowTitleEnabled(boolean value) {
+        // Do nothing...
+    }
+}
+
+class HoneycombActionBarCompatImpl extends ActionBarCompat {
+
+    private final ActionBar actionBar;
+
+    public HoneycombActionBarCompatImpl(Activity activity) {
+        super(activity);
+        this.actionBar = activity.getActionBar();
+    }
+
+    @Override
+    public void setDisplayHomeAsUpEnabled(boolean value) {
+        actionBar.setDisplayHomeAsUpEnabled(value);
+    }
+
+    @Override
+    public void setDisplayShowTitleEnabled(boolean value) {
+        actionBar.setDisplayShowTitleEnabled(value);
+    }
+}
diff --git a/src/org/fdroid/fdroid/compat/Compatibility.java b/src/org/fdroid/fdroid/compat/Compatibility.java
new file mode 100644
index 000000000..9cd8d1344
--- /dev/null
+++ b/src/org/fdroid/fdroid/compat/Compatibility.java
@@ -0,0 +1,16 @@
+package org.fdroid.fdroid.compat;
+
+import android.os.Build;
+import org.fdroid.fdroid.Utils;
+
+public abstract class Compatibility {
+
+    protected static boolean hasApi(int apiLevel) {
+        return getApi() >= apiLevel;
+    }
+
+    protected static int getApi() {
+        return Build.VERSION.SDK_INT;
+    }
+
+}
diff --git a/src/org/fdroid/fdroid/compat/ContextCompat.java b/src/org/fdroid/fdroid/compat/ContextCompat.java
new file mode 100644
index 000000000..fde80e365
--- /dev/null
+++ b/src/org/fdroid/fdroid/compat/ContextCompat.java
@@ -0,0 +1,59 @@
+package org.fdroid.fdroid.compat;
+
+import android.content.Context;
+import android.os.Environment;
+
+import java.io.File;
+
+public abstract class ContextCompat extends Compatibility {
+
+    public static ContextCompat create(Context context) {
+        if (hasApi(8)) {
+            return new FroyoContextCompatImpl(context);
+        } else {
+            return new OldContextCompatImpl(context);
+        }
+    }
+
+    protected final Context context;
+
+    public ContextCompat(Context context ) {
+        this.context = context;
+    }
+
+    /**
+     * @see android.content.Context#getExternalCacheDir()
+     */
+    public abstract File getExternalCacheDir();
+
+}
+
+class OldContextCompatImpl extends ContextCompat {
+
+    public OldContextCompatImpl(Context context) {
+        super(context);
+    }
+
+    @Override
+    public File getExternalCacheDir() {
+        File file = new File(Environment.getExternalStorageDirectory(),
+                "Android/data/org.fdroid.fdroid/cache");
+        if(!file.exists())
+            file.mkdirs();
+        return file;
+    }
+
+}
+
+class FroyoContextCompatImpl extends ContextCompat {
+
+    public FroyoContextCompatImpl(Context context) {
+        super(context);
+    }
+
+    @Override
+    public File getExternalCacheDir() {
+        return context.getExternalCacheDir();
+    }
+
+}
diff --git a/src/org/fdroid/fdroid/compat/LayoutCompat.java b/src/org/fdroid/fdroid/compat/LayoutCompat.java
new file mode 100644
index 000000000..ab02d8443
--- /dev/null
+++ b/src/org/fdroid/fdroid/compat/LayoutCompat.java
@@ -0,0 +1,39 @@
+package org.fdroid.fdroid.compat;
+
+import android.widget.RelativeLayout;
+
+public abstract class LayoutCompat extends Compatibility {
+
+    public static LayoutCompat create() {
+        if (hasApi(17)) {
+            return new JellyBeanMr1LayoutCompatImpl();
+        } else {
+            return new OldLayoutCompatImpl();
+        }
+    }
+
+    private static final LayoutCompat impl = LayoutCompat.create();
+
+    protected abstract int relativeLayoutEndOf();
+
+    public static class RelativeLayout {
+        public static final int END_OF = impl.relativeLayoutEndOf();
+    }
+
+}
+
+class OldLayoutCompatImpl extends LayoutCompat {
+
+    @Override
+    protected int relativeLayoutEndOf() {
+        return android.widget.RelativeLayout.RIGHT_OF;
+    }
+}
+
+class JellyBeanMr1LayoutCompatImpl extends LayoutCompat {
+
+    @Override
+    protected int relativeLayoutEndOf() {
+        return android.widget.RelativeLayout.END_OF;
+    }
+}
diff --git a/src/org/fdroid/fdroid/compat/MenuManager.java b/src/org/fdroid/fdroid/compat/MenuManager.java
index 9a60b595e..df8e9ddbd 100644
--- a/src/org/fdroid/fdroid/compat/MenuManager.java
+++ b/src/org/fdroid/fdroid/compat/MenuManager.java
@@ -3,10 +3,10 @@ package org.fdroid.fdroid.compat;
 import android.app.Activity;
 import org.fdroid.fdroid.Utils;
 
-abstract public class MenuManager {
+abstract public class MenuManager extends Compatibility {
 
     public static MenuManager create(Activity activity) {
-        if (Utils.hasApi(11)) {
+        if (hasApi(11)) {
             return new HoneycombMenuManagerImpl(activity);
         } else {
             return new OldMenuManagerImpl(activity);
diff --git a/src/org/fdroid/fdroid/compat/TabManager.java b/src/org/fdroid/fdroid/compat/TabManager.java
index fce2e2ce5..35b966545 100644
--- a/src/org/fdroid/fdroid/compat/TabManager.java
+++ b/src/org/fdroid/fdroid/compat/TabManager.java
@@ -14,14 +14,14 @@ import org.fdroid.fdroid.Utils;
 import java.util.ArrayList;
 import java.util.List;
 
-public abstract class TabManager {
+public abstract class TabManager extends Compatibility {
 
     public static final int INDEX_AVAILABLE  = 0;
     public static final int INDEX_INSTALLED  = 1;
     public static final int INDEX_CAN_UPDATE = 2;
 
     public static TabManager create(FDroid parent, ViewPager pager) {
-        if (Utils.hasApi(11)) {
+        if (hasApi(11)) {
             return new HoneycombTabManagerImpl(parent, pager);
         } else {
             return new OldTabManagerImpl(parent, pager);
diff --git a/src/org/fdroid/fdroid/views/AppListAdapter.java b/src/org/fdroid/fdroid/views/AppListAdapter.java
index 5842287d1..85c4e2d95 100644
--- a/src/org/fdroid/fdroid/views/AppListAdapter.java
+++ b/src/org/fdroid/fdroid/views/AppListAdapter.java
@@ -16,6 +16,7 @@ import android.view.ViewGroup;
 import android.widget.*;
 import org.fdroid.fdroid.DB;
 import org.fdroid.fdroid.R;
+import org.fdroid.fdroid.compat.LayoutCompat;
 
 abstract public class AppListAdapter extends BaseAdapter {
 
@@ -110,10 +111,7 @@ abstract public class AppListAdapter extends BaseAdapter {
                         RelativeLayout.LayoutParams.WRAP_CONTENT,
                         RelativeLayout.LayoutParams.WRAP_CONTENT);
                 summaryLayout.addRule(RelativeLayout.BELOW, R.id.name);
-                if (Utils.hasApi(17))
-                    summaryLayout.addRule(RelativeLayout.END_OF, R.id.icon);
-                else
-                    summaryLayout.addRule(RelativeLayout.RIGHT_OF, R.id.icon);
+                summaryLayout.addRule(LayoutCompat.RelativeLayout.END_OF, R.id.icon);
                 summary.setLayoutParams(summaryLayout);
                 summary.setPadding(0,0,0,0);