diff --git a/res/values/custom_strings.xml b/res/values/custom_strings.xml
index a126e29..7b69681 100644
--- a/res/values/custom_strings.xml
+++ b/res/values/custom_strings.xml
@@ -246,4 +246,11 @@
     <string name="recents_search_bar_summary"></string>
     <string name="recents_fullscreen_title">Fullscreen</string>
     <string name="recents_fullscreen_summary"></string>
+
+    <string name="weather_title">Weather</string>
+    <string name="weather_config_title">Service settings</string>
+    <string name="weather_config_summary"></string>
+    <string name="header_weather_title">Header view weather</string>
+    <string name="header_weather_summary">Enable notification panel header weather display</string>
+    <string name="weather_icon_pack_title">Condition icon pack</string>
 </resources>
diff --git a/res/xml/more_interface_settings.xml b/res/xml/more_interface_settings.xml
index a2ebb64..186c7cb 100644
--- a/res/xml/more_interface_settings.xml
+++ b/res/xml/more_interface_settings.xml
@@ -36,5 +36,30 @@
                     android:summary="@string/recents_fullscreen_summary"
                     android:defaultValue="false"/>
     </PreferenceCategory>
+
+        <PreferenceCategory
+            android:key="weather_category"
+            android:title="@string/weather_title" >
+
+            <PreferenceScreen
+                android:title="@string/weather_config_title"
+                android:summary="@string/weather_config_summary" >
+                <intent android:action="android.intent.action.MAIN"
+                        android:targetPackage="org.omnirom.omnijaws"
+                        android:targetClass="org.omnirom.omnijaws.SettingsActivity" />
+            </PreferenceScreen>
+
+            <com.android.settings.preference.SystemCheckBoxPreference
+                android:key="status_bar_header_weather"
+                android:title="@string/header_weather_title"
+                android:summary="@string/header_weather_summary"
+                android:defaultValue="false" />
+
+            <ListPreference
+                android:key="weather_icon_pack"
+                android:title="@string/weather_icon_pack_title"
+                android:persistent="false" />
+
+        </PreferenceCategory>
 </PreferenceScreen>
 
diff --git a/src/org/omnirom/omnigears/interfacesettings/MoreInterfaceSettings.java b/src/org/omnirom/omnigears/interfacesettings/MoreInterfaceSettings.java
index 958d8a6..f670529 100644
--- a/src/org/omnirom/omnigears/interfacesettings/MoreInterfaceSettings.java
+++ b/src/org/omnirom/omnigears/interfacesettings/MoreInterfaceSettings.java
@@ -22,6 +22,10 @@
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.database.Cursor;
+import android.net.Uri;
 import android.os.Bundle;
 import android.preference.CheckBoxPreference;
 import android.preference.ListPreference;
@@ -34,6 +38,15 @@
 import android.util.Log;
 
 import com.android.internal.logging.MetricsLogger;
+import com.android.internal.util.omni.PackageUtils;
+
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settings.search.Indexable;
+
+import java.util.List;
+import java.util.ArrayList;
 
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
@@ -47,6 +60,17 @@
         Preference.OnPreferenceChangeListener, Indexable {
     private static final String TAG = "MoreInterfaceSettings";
 
+    private static final String CATEGORY_WEATHER = "weather_category";
+    private static final String WEATHER_ICON_PACK = "weather_icon_pack";
+    private static final String STATUS_BAR_HEADER_WEATHER = "status_bar_header_weather";
+    private static final String DEFAULT_WEATHER_ICON_PACKAGE = "org.omnirom.omnijaws";
+    private static final String WEATHER_SERVICE_PACKAGE = "org.omnirom.omnijaws";
+    private static final String LOCK_CLOCK_PACKAGE="com.cyanogenmod.lockclock";
+
+    private PreferenceCategory mWeatherCategory;
+    private ListPreference mWeatherIconPack;
+    private CheckBoxPreference mHeaderWeather;
+
     @Override
     protected int getMetricsCategory() {
         return MetricsLogger.OMNI_SETTINGS;
@@ -56,6 +80,42 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         addPreferencesFromResource(R.xml.more_interface_settings);
+
+        final PreferenceScreen prefScreen = getPreferenceScreen();
+
+        mWeatherCategory = (PreferenceCategory) prefScreen.findPreference(CATEGORY_WEATHER);
+        if (mWeatherCategory != null && !isOmniJawsServiceInstalled()) {
+            prefScreen.removePreference(mWeatherCategory);
+        } else {
+            String settingHeaderPackage = Settings.System.getString(getContentResolver(),
+                    Settings.System.STATUS_BAR_WEATHER_ICON_PACK);
+            if (settingHeaderPackage == null) {
+                settingHeaderPackage = DEFAULT_WEATHER_ICON_PACKAGE;
+            }
+            mWeatherIconPack = (ListPreference) findPreference(WEATHER_ICON_PACK);
+            mWeatherIconPack.setEntries(getAvailableWeatherIconPacksEntries());
+            mWeatherIconPack.setEntryValues(getAvailableWeatherIconPacksValues());
+
+            int valueIndex = mWeatherIconPack.findIndexOfValue(settingHeaderPackage);
+            if (valueIndex == -1) {
+                // no longer found
+                settingHeaderPackage = DEFAULT_WEATHER_ICON_PACKAGE;
+                Settings.System.putString(getContentResolver(),
+                        Settings.System.STATUS_BAR_WEATHER_ICON_PACK, settingHeaderPackage);
+                valueIndex = mWeatherIconPack.findIndexOfValue(settingHeaderPackage);
+            }
+            mWeatherIconPack.setValueIndex(valueIndex >= 0 ? valueIndex : 0);
+            mWeatherIconPack.setSummary(mWeatherIconPack.getEntry());
+            mWeatherIconPack.setOnPreferenceChangeListener(this);
+
+            mHeaderWeather = (CheckBoxPreference) findPreference(STATUS_BAR_HEADER_WEATHER);
+        }
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        updateWeatherSettings();
     }
 
     @Override
@@ -65,6 +125,100 @@
 
     @Override
     public boolean onPreferenceChange(Preference preference, Object objValue) {
+        if (preference == mWeatherIconPack) {
+            String value = (String) objValue;
+            Settings.System.putString(getContentResolver(),
+                    Settings.System.STATUS_BAR_WEATHER_ICON_PACK, value);
+            int valueIndex = mWeatherIconPack.findIndexOfValue(value);
+            mWeatherIconPack.setSummary(mWeatherIconPack.getEntries()[valueIndex]);
+        }
+
+        return true;
+    }
+
+    private boolean isOmniJawsServiceInstalled() {
+        return PackageUtils.isAvailableApp(WEATHER_SERVICE_PACKAGE, getActivity());
+    }
+
+    private boolean isLockClockInstalled() {
+        return PackageUtils.isAvailableApp(LOCK_CLOCK_PACKAGE, getActivity());
+    }
+
+    private String[] getAvailableWeatherIconPacksValues() {
+        List<String> headerPacks = new ArrayList<String>();
+        Intent i = new Intent();
+        PackageManager packageManager = getPackageManager();
+        i.setAction("org.omnirom.WeatherIconPack");
+        for (ResolveInfo r : packageManager.queryIntentActivities(i, 0)) {
+            String packageName = r.activityInfo.packageName;
+            if (packageName.equals(DEFAULT_WEATHER_ICON_PACKAGE)) {
+                headerPacks.add(0, r.activityInfo.name);
+            } else {
+                headerPacks.add(r.activityInfo.name);
+            }
+        }
+        if (isLockClockInstalled()) {
+            headerPacks.add(LOCK_CLOCK_PACKAGE + ".weather");
+            headerPacks.add(LOCK_CLOCK_PACKAGE + ".weather_color");
+            headerPacks.add(LOCK_CLOCK_PACKAGE + ".weather_vclouds");
+        }
+        return headerPacks.toArray(new String[headerPacks.size()]);
+    }
+
+    private String[] getAvailableWeatherIconPacksEntries() {
+        List<String> headerPacks = new ArrayList<String>();
+        Intent i = new Intent();
+        PackageManager packageManager = getPackageManager();
+        i.setAction("org.omnirom.WeatherIconPack");
+        for (ResolveInfo r : packageManager.queryIntentActivities(i, 0)) {
+            String packageName = r.activityInfo.packageName;
+            String label = r.activityInfo.loadLabel(getPackageManager()).toString();
+            if (label == null) {
+                label = r.activityInfo.packageName;
+            }
+            if (packageName.equals(DEFAULT_WEATHER_ICON_PACKAGE)) {
+                headerPacks.add(0, label);
+            } else {
+                headerPacks.add(label);
+            }
+        }
+        if (isLockClockInstalled()) {
+            headerPacks.add("LockClock (white)");
+            headerPacks.add("LockClock (color)");
+            headerPacks.add("LockClock (vclouds)");
+        }
+        return headerPacks.toArray(new String[headerPacks.size()]);
+    }
+
+    private void updateWeatherSettings() {
+        final boolean weatherEnabled = isOmniJawsEnabled();
+        if (mHeaderWeather.isChecked() && !weatherEnabled) {
+            // disable if service got disabled
+            Settings.System.putInt(getContentResolver(), Settings.System.STATUS_BAR_HEADER_WEATHER, 0);
+            mHeaderWeather.setChecked(false);
+        }
+        mHeaderWeather.setEnabled(weatherEnabled);
+        mWeatherIconPack.setEnabled(weatherEnabled);
+    }
+
+    private boolean isOmniJawsEnabled() {
+        final Uri SETTINGS_URI
+            = Uri.parse("content://org.omnirom.omnijaws.provider/settings");
+
+        final String[] SETTINGS_PROJECTION = new String[] {
+            "enabled"
+        };
+
+        final Cursor c = getContentResolver().query(SETTINGS_URI, SETTINGS_PROJECTION,
+                null, null, null);
+        if (c != null) {
+            int count = c.getCount();
+            if (count == 1) {
+                c.moveToPosition(0);
+                boolean enabled = c.getInt(0) == 1;
+                return enabled;
+            }
+        }
         return true;
     }
 
