diff --git a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
index 1c44630..9c5e2ae 100644
--- a/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
+++ b/src/com/android/gallery3d/filtershow/presets/ImagePreset.java
@@ -49,39 +49,20 @@
 
     private static final String LOGTAG = "ImagePreset";
 
-    public static final int STYLE_ICON = 3;
-    public static final String PRESET_NAME = "PresetName";
-
     private ImageLoader mImageLoader = null;
 
     private Vector<FilterRepresentation> mFilters = new Vector<FilterRepresentation>();
 
-    protected String mName = "Original";
-    private String mHistoryName = "Original";
-    protected boolean mIsFxPreset = false;
-
     private boolean mDoApplyGeometry = true;
     private boolean mDoApplyFilters = true;
 
     private boolean mPartialRendering = false;
     private Rect mPartialRenderingBounds;
     private static final boolean DEBUG = false;
-    private Bitmap mPreviewImage;
 
     public ImagePreset() {
     }
 
-    public ImagePreset(String historyName) {
-        setHistoryName(historyName);
-    }
-
-    public ImagePreset(ImagePreset source, String historyName) {
-        this(source);
-        if (historyName != null) {
-            setHistoryName(historyName);
-        }
-    }
-
     public ImagePreset(ImagePreset source) {
         try {
             for (int i = 0; i < source.mFilters.size(); i++) {
@@ -101,11 +82,7 @@
         } catch (java.lang.CloneNotSupportedException e) {
             Log.v(LOGTAG, "Exception trying to clone: " + e);
         }
-        mName = source.name();
-        mHistoryName = source.name();
-        mIsFxPreset = source.isFx();
         mImageLoader = source.getImageLoader();
-        mPreviewImage = source.getPreviewImage();
     }
 
     public FilterRepresentation getFilterRepresentation(int position) {
@@ -244,23 +221,6 @@
         }
     }
 
-    public boolean isFx() {
-        return mIsFxPreset;
-    }
-
-    public void setIsFx(boolean value) {
-        mIsFxPreset = value;
-    }
-
-    public void setName(String name) {
-        mName = name;
-        mHistoryName = name;
-    }
-
-    public void setHistoryName(String name) {
-        mHistoryName = name;
-    }
-
     public ImageLoader getImageLoader() {
         return mImageLoader;
     }
@@ -294,10 +254,6 @@
             return false;
         }
 
-        if (!mName.equalsIgnoreCase(preset.name())) {
-            return false;
-        }
-
         if (mDoApplyGeometry != preset.mDoApplyGeometry) {
             return false;
         }
@@ -351,14 +307,6 @@
         return preset.mFilters.size();
     }
 
-    public String name() {
-        return mName;
-    }
-
-    public String historyName() {
-        return mHistoryName;
-    }
-
     public void showFilters() {
         Log.v(LOGTAG, "\\\\\\ showFilters -- " + mFilters.size() + " filters");
         int n = 0;
@@ -394,7 +342,6 @@
                 }
             }
         }
-        setHistoryName("Remove");
     }
 
     public void addFilter(FilterRepresentation representation) {
@@ -405,7 +352,6 @@
         if (representation.getFilterType() == FilterRepresentation.TYPE_BORDER) {
             removeFilter(representation);
             mFilters.add(representation);
-            setHistoryName(representation.getName());
         } else if (representation.getFilterType() == FilterRepresentation.TYPE_FX) {
             boolean found = false;
             for (int i = 0; i < mFilters.size(); i++) {
@@ -419,17 +365,14 @@
                 if (type == FilterRepresentation.TYPE_FX) {
                     mFilters.remove(i);
                     mFilters.add(i, representation);
-                    setHistoryName(representation.getName());
                     found = true;
                 }
             }
             if (!found) {
                 mFilters.add(representation);
-                setHistoryName(representation.getName());
             }
         } else {
             mFilters.add(representation);
-            setHistoryName(representation.getName());
         }
     }
 
@@ -618,14 +561,6 @@
         return mPartialRenderingBounds;
     }
 
-    public Bitmap getPreviewImage() {
-        return mPreviewImage;
-    }
-
-    public void setPreviewImage(Bitmap previewImage) {
-        mPreviewImage = previewImage;
-    }
-
     public Vector<ImageFilter> getUsedFilters(BaseFiltersManager filtersManager) {
         Vector<ImageFilter> usedFilters = new Vector<ImageFilter>();
         for (int i = 0; i < mFilters.size(); i++) {
@@ -652,7 +587,6 @@
         int numFilters =  mFilters.size();
         try {
             writer.beginObject();
-            writer.name(PRESET_NAME).value(name);
             GeometryMetadata geoData = getGeometry();
             writer.name(geoData.getSerializationName());
             writer.beginObject();
@@ -719,8 +653,6 @@
      */
     public boolean readJson(JsonReader sreader) throws IOException {
         sreader.beginObject();
-        sreader.nextName();
-        mName = sreader.nextString();
 
         while (sreader.hasNext()) {
             String name = sreader.nextName();
