-import android.os.RemoteException;
-import android.util.Log;
-
-public class OCFile {
-  private static String TAG = "OCFile";
-
-  private long id_;
-  private long parent_id_;
-  private long length_;
-  private long creation_timestamp_;
-  private long modified_timestamp_;
-  private String path_;
-  private String storage_path_;
-  private String mimetype_;
-
-  private ContentResolver cr_;
-  private ContentProviderClient cp_;
-  private Account account_;
-
-  public static OCFile createNewFile(ContentProviderClient cr, Account account,
-      String path, long length, long creation_timestamp,
-      long modified_timestamp, String mimetype, long parent_id) {
-    OCFile new_file = new OCFile(cr, account);
-
-    try {
-      Cursor c = new_file.cp_.query(ProviderTableMeta.CONTENT_URI_FILE, null,
-          ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND "
-              + ProviderTableMeta.FILE_PATH + "=?", new String[]{new_file.account_.name,
-              path}, null);
-      if (c.moveToFirst())
-        new_file.setFileData(c);
-      c.close();
-    } catch (RemoteException e) {
-      Log.e(TAG, e.getMessage());
-    }
-
-    new_file.path_ = path;
-    new_file.length_ = length;
-    new_file.creation_timestamp_ = creation_timestamp;
-    new_file.modified_timestamp_ = modified_timestamp;
-    new_file.mimetype_ = mimetype;
-    new_file.parent_id_ = parent_id;
-
-    return new_file;
-  }
-
-  public static OCFile createNewFile(ContentResolver contentResolver, Account a,
-      String path, int length, int creation_timestamp, int modified_timestamp,
-      String mimetype, long parent_id) {
-    OCFile new_file = new OCFile(contentResolver, a);
-    Cursor c = new_file.cr_.query(ProviderTableMeta.CONTENT_URI_FILE, null,
-          ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND "
-              + ProviderTableMeta.FILE_PATH + "=?", new String[]{new_file.account_.name,
-              path}, null);
-      if (c.moveToFirst())
-        new_file.setFileData(c);
-      c.close();
-
-    new_file.path_ = path;
-    new_file.length_ = length;
-    new_file.creation_timestamp_ = creation_timestamp;
-    new_file.modified_timestamp_ = modified_timestamp;
-    new_file.mimetype_ = mimetype;
-    new_file.parent_id_ = parent_id;
-
-    return new_file;
-  }
-  
-  public OCFile(ContentResolver cr, Account account, long id) {
-    cr_ = cr;
-    account_ = account;
-    Cursor c = cr_.query(ProviderTableMeta.CONTENT_URI_FILE, null,
-        ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND "
-            + ProviderTableMeta._ID + "=?",
-        new String[]{account_.name, String.valueOf(id)}, null);
-    if (c.moveToFirst())
-      setFileData(c);
-  }
-
-  public OCFile(ContentResolver cr, Account account, String path) {
-    cr_ = cr;
-    account_ = account;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class OCFile implements Parcelable, Comparable<OCFile> {
+
+    public static final Parcelable.Creator<OCFile> CREATOR = new Parcelable.Creator<OCFile>() {
+        @Override
+        public OCFile createFromParcel(Parcel source) {
+            return new OCFile(source);
+        }
+
+        @Override
+        public OCFile[] newArray(int size) {
+            return new OCFile[size];
+        }
+    };
+
+    private long mId;
+    private long mParentId;
+    private long mLength;
+    private long mCreationTimestamp;
+    private long mModifiedTimestamp;
+    private String mRemotePath;
+    private String mLocalPath;
+    private String mMimeType;
+    private boolean mNeedsUpdating;
+    private long mLastSyncDate;
+    private boolean mKeepInSync;
+
+    /**
+     * Create new {@link OCFile} with given path
+     * 
+     * @param path The remote path of the file
+     * @throws MalformedURLException 
+     */
+    public OCFile(String path) {
+        resetData();
+        mNeedsUpdating = false;
+        /// dvelasco: the encoding / decoding problem should be completely translated to WebdavClient & WebdavEntry, but at this moment we are in a little hurry
+        if (path != null && path.length() > 0) {
+            try {
+                new URL("http://silly.test.com:8888" + path);
+            } catch (MalformedURLException e) {
+                throw new RuntimeException("Trying to create a OCFile with a non valid remote path: " + path , e);
+            }
+        } else throw new RuntimeException("Trying to create a OCFile with a non valid remote path: " + path);
+        // save encoded paths have a problem: normalization; this is a quick&dirty fix to avoid duplications
+        mRemotePath = Uri.encode(Uri.decode(path), "/");
+    }
+
+    /**
+     * Reconstruct from parcel
+     * 
+     * @param source The source parcel
+     */
+    private OCFile(Parcel source) {
+        mId = source.readLong();
+        mParentId = source.readLong();
+        mLength = source.readLong();
+        mCreationTimestamp = source.readLong();
+        mModifiedTimestamp = source.readLong();
+        mRemotePath = source.readString();
+        mLocalPath = source.readString();
+        mMimeType = source.readString();
+        mNeedsUpdating = source.readInt() == 0;
+        mKeepInSync = source.readInt() == 1;
+        mLastSyncDate = source.readLong();
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeLong(mId);
+        dest.writeLong(mParentId);
+        dest.writeLong(mLength);
+        dest.writeLong(mCreationTimestamp);
+        dest.writeLong(mModifiedTimestamp);
+        dest.writeString(mRemotePath);
+        dest.writeString(mLocalPath);
+        dest.writeString(mMimeType);
+        dest.writeInt(mNeedsUpdating ? 1 : 0);
+        dest.writeInt(mKeepInSync ? 1 : 0);
+        dest.writeLong(mLastSyncDate);
+    }