diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7f68460d8b38ac04e3a3224d7c79ef719b1991a9
--- /dev/null
+++ b/.idea/runConfigurations.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RunConfigurationProducerService">
+    <option name="ignoredProducers">
+      <set>
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
+        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
+      </set>
+    </option>
+  </component>
+</project>
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 80ea4e5287b30e73f869f9f23e2bae4b43396d3d..e5b305e1f9010b5a271e09032e3b5a0e88e6a8f2 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -26,17 +26,13 @@
 
         <activity
             android:name=".ReportActivity"
-            android:label="@string/app_name"
-            android:theme="@style/AppTheme" />
-
-        <activity
-            android:name=".DialogPolicyDetailActivity"
-            android:theme="@style/AppTheme" />
+            android:label="Report Information"
+            android:parentActivityName=".MainActivity" />
 
         <activity
             android:name=".DialogDeviceInfoActivity"
-            android:label="@string/message_device_information"
-            android:theme="@style/AppTheme" />
+            android:theme="@style/AppDialogTheme"
+            android:label="Device Information" />
 
         <provider
             android:name=".storage.PrivacyPolicyProvider"
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/DeviceOperatorActivity.java b/app/src/main/java/org/prlab/idic/privacypolicy/DeviceOperatorActivity.java
index 14f76dad0d4e283b4ea6a571f191f5f85dbf8d88..61fcdaa4928ffc704f1ed656e707634c61a48c14 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/DeviceOperatorActivity.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/DeviceOperatorActivity.java
@@ -16,13 +16,12 @@ import org.prlab.idic.privacypolicy.adapter.MessageRecyclerViewAdapter;
 import org.prlab.idic.privacypolicy.ble.BLECustomScript;
 import org.prlab.idic.privacypolicy.pojo.Message;
 import org.prlab.idic.privacypolicy.schedule.Scheduled;
+import org.prlab.idic.privacypolicy.storage.PrivacyPolicyContract;
 import org.prlab.idic.privacypolicy.storage.PrivacyPolicyStorageImpl;
 import org.prlab.idic.privacypolicy.tool.BaseUtils;
 
-import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Set;
 import java.util.UUID;
 
 import static android.bluetooth.BluetoothGatt.GATT_SUCCESS;
@@ -200,45 +199,12 @@ public class DeviceOperatorActivity extends AppCompatActivity {
             actionCharacteristic = permissionService.getCharacteristic(PRIVACY_ACTION_UUID);
             preferenceCharacteristic = permissionService.getCharacteristic(PRIVACY_PREFERENCE_UUID);
 
-            Set<Integer> acceptList = new HashSet<>();
-            List<List<Integer>> subAcceptList = new LinkedList<>();
-
             setMessageBar("Enable privacy policy setting.");
-            for (BluetoothGattService service : gatt.getServices()) {
-                if (PRIVACY_NEGOTIATION_UUID.equals(service.getUuid()))
-                    continue;
-                List<String> layerUUIDs = new LinkedList<>();
-                layerUUIDs.add(String.valueOf(service.getUuid()));
-
-                List<Integer> selections = mPolicyStorage.get(layerUUIDs);
-                for (int selection : selections) {
-                    acceptList.add(selection);
-                }
-
-                for (BluetoothGattCharacteristic characteristic : service.getCharacteristics()) {
-                    layerUUIDs.add(String.valueOf(characteristic.getUuid()));
-                    selections = mPolicyStorage.get(layerUUIDs);
-                    if (selections.size() > 0) {
-                        List<Integer> list = new LinkedList<>();
-                        for (int selection : selections) {
-                            list.add(selection);
-                        }
-                        subAcceptList.add(list);
-                    }
-                    layerUUIDs.remove(layerUUIDs.size() - 1);
-                }
-            }
-            if (subAcceptList.size() > 0) {
-                acceptList.clear();
-                for (List<Integer> list : subAcceptList) {
-                    acceptList.addAll(list);
-                }
-            }
-            for (int selection = SELECTION_LOWER_BOUND; selection < SELECTION_UPPER_BOUND; selection++) {
-                if (acceptList.contains(selection)) {
-                    addPreference(selection);
+            for (int i = 0; i < 2; i++) {
+                if (PrivacyPolicyContract.ACCEPT.equals(mPolicyStorage.get(i + 1))) {
+                    addPreference(i + 1);
                 } else {
-                    removePreference(selection);
+                    removePreference(i + 1);
                 }
             }
             continueNegotiating();
@@ -500,7 +466,7 @@ public class DeviceOperatorActivity extends AppCompatActivity {
         int connectionState = mBluetoothManager.getConnectionState(device, BluetoothProfile.GATT);
         Log.i(TAG, "Device connection status is " + connectionState + ".");
 
-        if (device != null && connectionState == BluetoothProfile.STATE_DISCONNECTED) {
+        if (device != null) {
             mBluetoothGatt = device.connectGatt(this, false, mBluetoothGattCallback);
             return mBluetoothGatt != null;
         } else {
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/DialogDeviceInfoActivity.java b/app/src/main/java/org/prlab/idic/privacypolicy/DialogDeviceInfoActivity.java
index d8602418c555b9c7ad27d237006bd3a1b5035efe..91c6c6bb5ccd358decb4fbb6b55eceb0e8c54072 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/DialogDeviceInfoActivity.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/DialogDeviceInfoActivity.java
@@ -1,9 +1,12 @@
 package org.prlab.idic.privacypolicy;
 
-import android.app.Activity;
 import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.RecyclerView;
+import android.view.MenuItem;
 import android.view.View;
+
+import org.prlab.idic.privacypolicy.adapter.IconItemRecyclerViewAdapter;
 import org.prlab.idic.privacypolicy.adapter.InfoItemRecyclerViewAdapter;
 import org.prlab.idic.privacypolicy.pojo.report.InfoItem;
 import org.prlab.idic.privacypolicy.pojo.report.device.Device;
@@ -14,7 +17,7 @@ import java.util.List;
 /**
  * Created by IDIC on 2017/2/22.
  */
-public class DialogDeviceInfoActivity extends Activity {
+public class DialogDeviceInfoActivity extends AppCompatActivity {
 
     private Device mDevice;
     private List<InfoItem> items = new LinkedList<>();
@@ -67,7 +70,10 @@ public class DialogDeviceInfoActivity extends Activity {
 
     private void initView() {
         RecyclerView mInfoRecyclerView = (RecyclerView) findViewById(R.id.layout_device_info);
-        RecyclerView.Adapter mInfoRecyclerViewAdapter = new InfoItemRecyclerViewAdapter(items, false);
+        RecyclerView.Adapter mInfoRecyclerViewAdapter = new InfoItemRecyclerViewAdapter(items,
+                R.layout.recycler_view_item_horizontally,
+                android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M ?
+                        getColor(R.color.colorAnother) : getResources().getColor(R.color.colorAnother));
         mInfoRecyclerView.setAdapter(mInfoRecyclerViewAdapter);
 
 //        RecyclerView mIconRecyclerView = (RecyclerView) findViewById(R.id.layout_device_icon);
@@ -79,8 +85,4 @@ public class DialogDeviceInfoActivity extends Activity {
 //        }
     }
 
-    public void onBackButtonClick(View view) {
-        finish();
-    }
-
 }
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/DialogPolicyDetailActivity.java b/app/src/main/java/org/prlab/idic/privacypolicy/DialogPolicyDetailActivity.java
deleted file mode 100644
index 83ced956df9e4b1da0d1d719363fec6450075bfd..0000000000000000000000000000000000000000
--- a/app/src/main/java/org/prlab/idic/privacypolicy/DialogPolicyDetailActivity.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.prlab.idic.privacypolicy;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.v7.widget.RecyclerView;
-import android.view.View;
-import android.widget.TextView;
-import org.prlab.idic.privacypolicy.adapter.InfoItemRecyclerViewAdapter;
-import org.prlab.idic.privacypolicy.adapter.StatementRecyclerViewAdapter;
-import org.prlab.idic.privacypolicy.pojo.report.InfoItem;
-import org.prlab.idic.privacypolicy.pojo.report.PrivacyPolicy;
-import org.prlab.idic.privacypolicy.tool.BaseUtils;
-
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Created by IDIC on 2017/2/17.
- */
-public class DialogPolicyDetailActivity extends Activity {
-
-    private PrivacyPolicy mPrivacyPolicy;
-    private RecyclerView mCollectorRecyclerView;
-    private TextView mAccessTextView;
-    private RecyclerView mDisputeRecyclerView;
-    private RecyclerView mStatementsRecyclerView;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_dialog_policy);
-        mPrivacyPolicy = getIntent().getParcelableExtra(getString(R.string.intent_policy_info_key));
-        setTitle(getString(R.string.message_policy_title) + mPrivacyPolicy.getId());
-        initView();
-    }
-
-    private void initView() {
-        initCollector();
-        initAccess();
-        initDispute();
-        initStatements();
-    }
-
-    private void initCollector() {
-        mCollectorRecyclerView = (RecyclerView) findViewById(R.id.recycler_view_statement_collector);
-        List<InfoItem> collector = new LinkedList<>();
-        collector.add(new InfoItem()
-                .setKey(getString(R.string.policy_statement_collector_name))
-                .setValue(mPrivacyPolicy.getCollector().getName()));
-        collector.add(new InfoItem()
-                .setKey(getString(R.string.policy_statement_collector_email))
-                .setValue(mPrivacyPolicy.getCollector().getEmail()));
-        collector.add(new InfoItem()
-                .setKey(getString(R.string.policy_statement_collector_phone))
-                .setValue(mPrivacyPolicy.getCollector().getPhone()));
-        mCollectorRecyclerView.setAdapter(new InfoItemRecyclerViewAdapter(collector));
-    }
-
-    private void initAccess() {
-        mAccessTextView = (TextView) findViewById(R.id.recycler_view_statement_access);
-        mAccessTextView.setText(BaseUtils.fixTypeName(mPrivacyPolicy.getAccess().name()));
-    }
-
-    private void initDispute() {
-        mDisputeRecyclerView = (RecyclerView) findViewById(R.id.recycler_view_statement_dispute);
-        List<InfoItem> dispute = new LinkedList<>();
-        dispute.add(new InfoItem()
-                .setKey(getString(R.string.policy_statement_dispute_resolution_type))
-                .setValue(getString(R.string.policy_statement_dispute_related_organization)));
-        dispute.add(new InfoItem()
-                .setKey(BaseUtils.fixTypeName(mPrivacyPolicy.getDispute().getType().name()))
-                .setValue(mPrivacyPolicy.getDispute().getRelatedOrganization()));
-        mDisputeRecyclerView.setAdapter(new InfoItemRecyclerViewAdapter(dispute));
-    }
-
-    private void initStatements() {
-        mStatementsRecyclerView = (RecyclerView) findViewById(R.id.recycler_view_statement_content);
-        mStatementsRecyclerView.setAdapter(new StatementRecyclerViewAdapter(getResources(), mPrivacyPolicy.getStatements()));
-    }
-
-    public void onAgreeButtonClick(View view) {
-        Intent intent = new Intent();
-        intent.putExtra(getString(R.string.intent_policy_response_selection_key), mPrivacyPolicy.getId());
-        setResult(RESULT_OK, intent);
-        finish();
-    }
-
-    public void onDenyButtonClick(View view) {
-        finish();
-    }
-
-}
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/ReportActivity.java b/app/src/main/java/org/prlab/idic/privacypolicy/ReportActivity.java
index 7c10282ea6a6bf7f41c4a5063b9c8abf82a5de85..4ab756f5a1f52fb5f1d95771b5ac835699937d59 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/ReportActivity.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/ReportActivity.java
@@ -1,72 +1,53 @@
 package org.prlab.idic.privacypolicy;
 
-import android.app.Activity;
 import android.app.LoaderManager;
 import android.content.AsyncTaskLoader;
 import android.content.Intent;
 import android.content.Loader;
 import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.RecyclerView;
-import android.util.Log;
 import android.view.View;
-import android.widget.Button;
-import android.widget.LinearLayout;
-import android.widget.TextView;
 import android.widget.Toast;
 
 import com.google.gson.Gson;
+import com.google.gson.JsonSyntaxException;
 
 import okhttp3.FormBody;
 import okhttp3.OkHttpClient;
 import okhttp3.Request;
 
-import org.prlab.idic.privacypolicy.adapter.IntegerButtonRecyclerViewAdapter;
-import org.prlab.idic.privacypolicy.adapter.StringButtonRecyclerViewAdapter;
-import org.prlab.idic.privacypolicy.pojo.report.Layer;
+import org.prlab.idic.privacypolicy.adapter.InfoItemRecyclerViewAdapter;
+import org.prlab.idic.privacypolicy.adapter.PolicyRecyclerViewAdapter;
+import org.prlab.idic.privacypolicy.pojo.report.InfoItem;
+import org.prlab.idic.privacypolicy.pojo.report.PrivacyPolicy;
 import org.prlab.idic.privacypolicy.pojo.report.PrivacyPolicyReport;
 import org.prlab.idic.privacypolicy.storage.PrivacyPolicyStorageImpl;
-import org.prlab.idic.privacypolicy.tool.BaseUtils;
 
 import java.io.IOException;
 import java.util.LinkedList;
 import java.util.List;
 
-import static org.prlab.idic.privacypolicy.tool.NegotiatorConstants.ACTIVITY_SELECTION_RESULT_ID;
+import static org.prlab.idic.privacypolicy.storage.PrivacyPolicyContract.ACCEPT;
 
 /**
  * Created by IDIC on 2017/2/16.
  */
-public class ReportActivity extends Activity implements LoaderManager.LoaderCallbacks<PrivacyPolicyReport> {
+public class ReportActivity extends AppCompatActivity implements
+        LoaderManager.LoaderCallbacks<PrivacyPolicyReport>,
+        PolicyRecyclerViewAdapter.ItemCheckedChangedListener {
 
     private static final String TAG = ReportActivity.class.getSimpleName();
 
-    private LinearLayout mReportLayout;
-    private TextView mReportTitleTextView;
-    private TextView mVersionTextView;
-    private TextView mDescriptionTextView;
-    private Button mDeviceInfoButton;
-
-    private Button mResetButton;
-    private TextView mSelectionTitleTextView;
-    private RecyclerView mSelectionRecyclerView;
-    private IntegerButtonRecyclerViewAdapter mSelectionRecyclerViewAdapter;
-
-    private TextView mLayerTitleTextView;
-    private RecyclerView mLayerRecyclerView;
-    private StringButtonRecyclerViewAdapter mLayerRecyclerViewAdapter;
-
-    private Button mBackButton;
+    private RecyclerView mDescriptionRecyclerView;
+    private RecyclerView mPoliciesRecyclerView;
 
     private Gson gson = new Gson();
 
     private PrivacyPolicyStorageImpl mPolicyStorage;
-    private List<String> mLayerIDs;
     private PrivacyPolicyReport mPrivacyPolicyReport;
     private String mReportId;
 
-    private List<Integer> mPolicyIDs;
-    private List<String> mChildLayerIDs;
-
     private static final int PRIVACY_POLICY_LOADER_ID = 87;
 
     @Override
@@ -78,8 +59,6 @@ public class ReportActivity extends Activity implements LoaderManager.LoaderCall
     }
 
     private void resolveData() {
-        mLayerIDs = new LinkedList<>();
-
         Intent intent = getIntent();
         mReportId = intent.getStringExtra(getString(R.string.intent_report_id_key));
         mPolicyStorage = new PrivacyPolicyStorageImpl(getContentResolver(), intent.getStringExtra(getString(R.string.intent_report_mac_key)));
@@ -87,80 +66,29 @@ public class ReportActivity extends Activity implements LoaderManager.LoaderCall
     }
 
     private void initView() {
-        mReportLayout = (LinearLayout) findViewById(R.id.layout_report_info);
-        mReportTitleTextView = (TextView) findViewById(R.id.text_report_title);
-
-        View mVersionView = findViewById(R.id.item_report_version);
-        ((TextView) mVersionView.findViewById(R.id.text_key)).setText(getString(R.string.policy_report_version_title));
-        mVersionTextView = (TextView) mVersionView.findViewById(R.id.text_value);
-
-        View mDescriptionView = findViewById(R.id.item_report_description);
-        ((TextView) mDescriptionView.findViewById(R.id.text_key)).setText(getString(R.string.policy_report_description_title));
-        mDescriptionTextView = (TextView) mDescriptionView.findViewById(R.id.text_value);
-
-        mDeviceInfoButton = (Button) findViewById(R.id.button_report_device);
-        mBackButton = (Button) findViewById(R.id.button_report_back);
-
-        mResetButton = (Button) findViewById(R.id.button_report_reset);
-        mResetButton.setOnClickListener(mResetButtonClickListener);
-
-        mSelectionTitleTextView = (TextView) findViewById(R.id.text_report_policies_title);
-        mSelectionRecyclerViewAdapter = new IntegerButtonRecyclerViewAdapter(getResources(), mSelectionClickListener);
-        mSelectionRecyclerView = (RecyclerView) findViewById(R.id.recycler_view_report_policies);
-        mSelectionRecyclerView.setAdapter(mSelectionRecyclerViewAdapter);
-
-        mLayerTitleTextView = (TextView) findViewById(R.id.text_report_child_layers_title);
-        mLayerRecyclerViewAdapter = new StringButtonRecyclerViewAdapter(mChildLayersClickListener);
-        mLayerRecyclerView = (RecyclerView) findViewById(R.id.recycler_view_report_child_layers);
-        mLayerRecyclerView.setAdapter(mLayerRecyclerViewAdapter);
+        mDescriptionRecyclerView = (RecyclerView) findViewById(R.id.recycler_view_report_description);
+        mPoliciesRecyclerView = (RecyclerView) findViewById(R.id.recycler_view_report_policies);
     }
 
-    private IntegerButtonRecyclerViewAdapter.ListItemClickListener mSelectionClickListener = new IntegerButtonRecyclerViewAdapter.ListItemClickListener() {
-        @Override
-        public void onListItemClick(int clickedItemIndex) {
-            Intent intent = new Intent();
-            intent.setClass(ReportActivity.this, DialogPolicyDetailActivity.class);
-            int policyId = mPolicyIDs.get(clickedItemIndex);
-            intent.putExtra(getString(R.string.intent_policy_info_key), mPrivacyPolicyReport.getPolicies().get(policyId));
-            startActivityForResult(intent, ACTIVITY_SELECTION_RESULT_ID);
-        }
-    };
-
-    private StringButtonRecyclerViewAdapter.ListItemClickListener mChildLayersClickListener = new StringButtonRecyclerViewAdapter.ListItemClickListener() {
-        @Override
-        public void onListItemClick(int clickedItemIndex) {
-            String layerID = mChildLayerIDs.get(clickedItemIndex);
-            mLayerIDs.add(layerID);
-            setView();
-        }
-    };
-
-    private View.OnClickListener mResetButtonClickListener = new View.OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            mPolicyStorage.remove(mLayerIDs);
-            mResetButton.setEnabled(false);
-            mSelectionRecyclerViewAdapter.resetTarget();
-        }
-    };
-
-    @Override
-    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        super.onActivityResult(requestCode, resultCode, data);
-        if (ACTIVITY_SELECTION_RESULT_ID == requestCode) {
-            if (RESULT_OK == resultCode) {
-                int selection = data.getIntExtra(getString(R.string.intent_policy_response_selection_key), -1);
-                List<Integer> selections = mPolicyStorage.get(mLayerIDs);
-                selections.add(selection);
-                mPolicyStorage.remove(mLayerIDs);
-                mPolicyStorage.put(selections, mLayerIDs);
-                mResetButton.setEnabled(true);
-                mSelectionRecyclerViewAdapter.addTarget(selection);
-            }
-        }
+    private void setDescriptionRecyclerView(String version, String description) {
+        List<InfoItem> items = new LinkedList<>();
+        items.add(new InfoItem()
+                .setKey(getString(R.string.policy_report_version_title))
+                .setValue(version));
+        items.add(new InfoItem()
+                .setKey(getString(R.string.policy_report_description_title))
+                .setValue(description));
+        mDescriptionRecyclerView.setAdapter(new InfoItemRecyclerViewAdapter(items, R.layout.recycler_view_item_horizontally));
     }
 
-    private long startTime;
+    private void setContentRecyclerView(List<PrivacyPolicy> policies,
+                                        List<Integer> selections,
+                                        PolicyRecyclerViewAdapter.ItemCheckedChangedListener itemCheckedChangedListener) {
+        mPoliciesRecyclerView.setAdapter(new PolicyRecyclerViewAdapter(
+                getResources(), policies, selections, itemCheckedChangedListener
+                /*, android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M ?
+                        getColor(R.color.colorAnother) : getResources().getColor(R.color.colorAnother)*/));
+    }
 
     @Override
     public Loader<PrivacyPolicyReport> onCreateLoader(int id, Bundle args) {
@@ -175,7 +103,6 @@ public class ReportActivity extends Activity implements LoaderManager.LoaderCall
 
             @Override
             public PrivacyPolicyReport loadInBackground() {
-                startTime = System.currentTimeMillis();
                 OkHttpClient client = new OkHttpClient();
                 Request request = new Request.Builder()
                         .url(getString(R.string.get_policy_url))
@@ -185,7 +112,7 @@ public class ReportActivity extends Activity implements LoaderManager.LoaderCall
                         .build();
                 try {
                     return gson.fromJson(client.newCall(request).execute().body().string(), PrivacyPolicyReport.class);
-                } catch (IOException e) {
+                } catch (IOException | JsonSyntaxException e) {
                     e.printStackTrace();
                     return null;
                 }
@@ -196,76 +123,29 @@ public class ReportActivity extends Activity implements LoaderManager.LoaderCall
 
     @Override
     public void onLoadFinished(Loader<PrivacyPolicyReport> loader, PrivacyPolicyReport report) {
-        Log.i(TAG, String.valueOf(System.currentTimeMillis() - startTime));
         if (null != report) {
             mPrivacyPolicyReport = report;
-            mLayerIDs.add(report.getRoot().getUUID());
-            setView();
+            setDescriptionRecyclerView(report.getVersion(), report.getDescription());
+            setContentRecyclerView(report.getPolicies(), getSelections(report.getPolicies()), this);
         } else {
             Toast.makeText(this, R.string.message_report_not_found, Toast.LENGTH_LONG).show();
             finish();
         }
     }
 
-    @Override
-    public void onLoaderReset(Loader<PrivacyPolicyReport> loader) {
-
-    }
-
-    private void setView() {
-        Layer currentLayer = currentLayer();
-        String title;
-        if (mPrivacyPolicyReport.getRoot().equals(currentLayer)) {
-            mVersionTextView.setText(mPrivacyPolicyReport.getVersion());
-            mDescriptionTextView.setText(mPrivacyPolicyReport.getDescription());
-//            mReportLayout.setVisibility(View.VISIBLE);
-//            mDeviceInfoButton.setVisibility(View.VISIBLE);
-            mBackButton.setVisibility(View.GONE);
-            title = getString(R.string.policy_information_title);
-        } else {
-            title = currentLayer.getUUID();
-//            mReportLayout.setVisibility(View.GONE);
-//            mDeviceInfoButton.setVisibility(View.GONE);
-            mBackButton.setVisibility(View.VISIBLE);
-        }
-        mReportTitleTextView.setText(title);
-        mPolicyIDs = currentLayer.getPolicies();
-        mSelectionRecyclerViewAdapter.setItems(mPolicyIDs);
-        List<Integer> targets = mPolicyStorage.get(mLayerIDs);
-        mResetButton.setEnabled(targets.size() != 0);
-        mSelectionRecyclerViewAdapter.resetTarget();
-        for (Integer target : targets)
-            mSelectionRecyclerViewAdapter.addTarget(target);
-        checkEmpty(mPolicyIDs, mSelectionTitleTextView, mSelectionRecyclerView, mResetButton);
-
-        mChildLayerIDs = BaseUtils.layer2UUID(currentLayer.getSubLayers());
-        mLayerRecyclerViewAdapter.setItems(mChildLayerIDs);
-        checkEmpty(mChildLayerIDs, mLayerTitleTextView, mLayerRecyclerView);
-    }
-
-    private void checkEmpty(List list, View title, View... views) {
-        if (list.isEmpty()) {
-            title.setVisibility(View.GONE);
-            for (View view : views)
-                view.setVisibility(View.GONE);
-        } else {
-            title.setVisibility(View.VISIBLE);
-            for (View view : views)
-                view.setVisibility(View.VISIBLE);
+    private List<Integer> getSelections(List<PrivacyPolicy> policies) {
+        List<Integer> selections = new LinkedList<>();
+        for (PrivacyPolicy policy : policies) {
+            if (ACCEPT.equals(mPolicyStorage.get(policy.getId()))) {
+                selections.add(policy.getId());
+            }
         }
+        return selections;
     }
 
-    private Layer currentLayer() {
-        return currentLayer(mPrivacyPolicyReport.getRoot(), 0);
-    }
+    @Override
+    public void onLoaderReset(Loader<PrivacyPolicyReport> loader) {
 
-    private Layer currentLayer(Layer root, int counter) {
-        if (mLayerIDs.size() - 1 == counter) return root;
-        for (Layer subLayer : root.getSubLayers()) {
-            if (subLayer.getUUID().equals(mLayerIDs.get(counter + 1)))
-                return currentLayer(subLayer, counter + 1);
-        }
-        return root;
     }
 
     public void onDeviceInfoButtonClicked(View view) {
@@ -275,9 +155,13 @@ public class ReportActivity extends Activity implements LoaderManager.LoaderCall
         startActivity(intent);
     }
 
-    public void onBackButtonClicked(View view) {
-        mLayerIDs.remove(mLayerIDs.size() - 1);
-        setView();
+    @Override
+    public void onItemCheckedChanged(PrivacyPolicy policy, boolean isChecked) {
+        if (isChecked) {
+            mPolicyStorage.accept(policy.getId());
+        } else {
+            mPolicyStorage.decline(policy.getId());
+        }
     }
 
 }
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/adapter/IconItemRecyclerViewAdapter.java b/app/src/main/java/org/prlab/idic/privacypolicy/adapter/IconItemRecyclerViewAdapter.java
index 34cbfd4a4a44ba250e88428ad2420b9e5feca179..b5ceb15b2136d324ff49b2523a1a2dde52d474e5 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/adapter/IconItemRecyclerViewAdapter.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/adapter/IconItemRecyclerViewAdapter.java
@@ -10,6 +10,7 @@ import android.widget.ImageView;
 import org.prlab.idic.privacypolicy.R;
 import org.prlab.idic.privacypolicy.pojo.report.device.Icon;
 
+import java.util.Arrays;
 import java.util.List;
 
 /**
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/adapter/InfoItemRecyclerViewAdapter.java b/app/src/main/java/org/prlab/idic/privacypolicy/adapter/InfoItemRecyclerViewAdapter.java
index ba7cacdcfc6dabbdeabb8a4b67dcc4087f7dfa17..822dcd1f6bf89c934a090c9f4f4f5b7c79fbd823 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/adapter/InfoItemRecyclerViewAdapter.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/adapter/InfoItemRecyclerViewAdapter.java
@@ -1,11 +1,14 @@
 package org.prlab.idic.privacypolicy.adapter;
 
+import android.content.res.Resources;
+import android.graphics.Color;
 import android.support.v7.widget.RecyclerView;
 import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.TextView;
+
 import org.prlab.idic.privacypolicy.R;
 import org.prlab.idic.privacypolicy.pojo.report.InfoItem;
 
@@ -17,27 +20,35 @@ import java.util.List;
 public class InfoItemRecyclerViewAdapter extends RecyclerView.Adapter<InfoItemRecyclerViewAdapter.ViewHolder> {
 
     private List<InfoItem> items;
-    private boolean isVertical;
+    private int layout;
+    private int separatedColor;
 
-    public InfoItemRecyclerViewAdapter(List<InfoItem> items) {
-        this.isVertical = true;
-        this.items = items;
+    public InfoItemRecyclerViewAdapter(List<InfoItem> items, int layout) {
+        this(items, layout, -1);
     }
 
-    public InfoItemRecyclerViewAdapter(List<InfoItem> items, boolean isVertical) {
-        this.isVertical = isVertical;
+    public InfoItemRecyclerViewAdapter(List<InfoItem> items, int layout, int separatedColor) {
         this.items = items;
+        this.layout = layout;
+        this.separatedColor = separatedColor;
     }
 
     @Override
     public InfoItemRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_item_horizontally, parent, false);
+        View view = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
         return new InfoItemRecyclerViewAdapter.ViewHolder(view);
     }
 
     @Override
     public void onBindViewHolder(ViewHolder holder, int position) {
-        holder.bind(position);
+        InfoItem item = items.get(position);
+        holder.mKeyTextView.setText(item.getKey());
+        holder.mValueTextView.setText(item.getValue());
+        if (separatedColor != -1) {
+            if (position % 2 == 0) {
+                holder.itemView.setBackgroundColor(separatedColor);
+            }
+        }
     }
 
     @Override
@@ -52,19 +63,10 @@ public class InfoItemRecyclerViewAdapter extends RecyclerView.Adapter<InfoItemRe
 
         ViewHolder(View itemView) {
             super(itemView);
-            View view = itemView.findViewById(R.id.item_info);
-            mKeyTextView = (TextView) view.findViewById(R.id.text_key);
-            mValueTextView = (TextView) view.findViewById(R.id.text_value);
+            mKeyTextView = (TextView) itemView.findViewById(R.id.text_key);
+            mValueTextView = (TextView) itemView.findViewById(R.id.text_value);
         }
 
-        void bind(int listIndex) {
-            InfoItem item = items.get(listIndex);
-            mKeyTextView.setText(item.getKey());
-            mValueTextView.setText(item.getValue());
-            if (isVertical && listIndex == 0) {
-                // title box
-            }
-        }
 
     }
 
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/adapter/IntegerButtonRecyclerViewAdapter.java b/app/src/main/java/org/prlab/idic/privacypolicy/adapter/IntegerButtonRecyclerViewAdapter.java
deleted file mode 100644
index 963aebb0cfc961367b09ea9dd3abcc45f286488c..0000000000000000000000000000000000000000
--- a/app/src/main/java/org/prlab/idic/privacypolicy/adapter/IntegerButtonRecyclerViewAdapter.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.prlab.idic.privacypolicy.adapter;
-
-import android.content.res.Resources;
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
-
-import org.prlab.idic.privacypolicy.R;
-
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Created by IDIC on 2017/2/16.
- */
-public class IntegerButtonRecyclerViewAdapter extends RecyclerView.Adapter<IntegerButtonRecyclerViewAdapter.ViewHolder> {
-
-    private final String PRIVACY_POLICY_TITLE;
-    private ListItemClickListener listItemClickListener;
-    private List<Integer> items;
-    private List<Integer> target = new LinkedList<>();
-
-    public IntegerButtonRecyclerViewAdapter(Resources resources, ListItemClickListener listItemClickListener) {
-        this.PRIVACY_POLICY_TITLE = resources.getString(R.string.message_policy_title);
-        this.listItemClickListener = listItemClickListener;
-    }
-
-    public void setItems(List<Integer> items) {
-        this.items = items;
-        notifyDataSetChanged();
-    }
-
-    public void addTarget(Integer target) {
-        this.target.add(target);
-        notifyDataSetChanged();
-    }
-
-    public void resetTarget() {
-        this.target.clear();
-        notifyDataSetChanged();
-    }
-
-    public interface ListItemClickListener {
-        void onListItemClick(int clickedItemIndex);
-    }
-
-    @Override
-    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_item, parent, false);
-        return new IntegerButtonRecyclerViewAdapter.ViewHolder(view);
-    }
-
-    @Override
-    public void onBindViewHolder(ViewHolder holder, int position) {
-        holder.bind(position);
-    }
-
-    @Override
-    public int getItemCount() {
-        return null != items ? items.size() : 0;
-    }
-
-    class ViewHolder extends RecyclerView.ViewHolder {
-
-        private Button button;
-
-        ViewHolder(View itemView) {
-            super(itemView);
-            button = (Button) itemView.findViewById(R.id.button_item);
-            button.setOnClickListener(new View.OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    IntegerButtonRecyclerViewAdapter.this.listItemClickListener.onListItemClick(getAdapterPosition());
-                }
-            });
-        }
-
-        void bind(int listIndex) {
-            int item = items.get(listIndex);
-            String message = IntegerButtonRecyclerViewAdapter.this.PRIVACY_POLICY_TITLE + String.valueOf(item);
-            button.setText(message);
-            button.setEnabled(!target.contains(item));
-        }
-
-    }
-}
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/adapter/PolicyRecyclerViewAdapter.java b/app/src/main/java/org/prlab/idic/privacypolicy/adapter/PolicyRecyclerViewAdapter.java
new file mode 100644
index 0000000000000000000000000000000000000000..c388a68f06a20c0fa4dd8aa9274dad060241cee5
--- /dev/null
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/adapter/PolicyRecyclerViewAdapter.java
@@ -0,0 +1,201 @@
+package org.prlab.idic.privacypolicy.adapter;
+
+import android.content.res.Resources;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.ImageView;
+import android.widget.Switch;
+import android.widget.TextView;
+
+import org.prlab.idic.privacypolicy.R;
+import org.prlab.idic.privacypolicy.pojo.report.InfoItem;
+import org.prlab.idic.privacypolicy.pojo.report.PrivacyPolicy;
+import org.prlab.idic.privacypolicy.pojo.report.p3p.Datum;
+import org.prlab.idic.privacypolicy.pojo.report.p3p.Purpose;
+import org.prlab.idic.privacypolicy.pojo.report.p3p.Recipient;
+import org.prlab.idic.privacypolicy.pojo.report.p3p.Remedy;
+import org.prlab.idic.privacypolicy.pojo.report.p3p.Statement;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class PolicyRecyclerViewAdapter
+        extends RecyclerView.Adapter<PolicyRecyclerViewAdapter.ViewHolder> {
+
+    private static final String POLICY_PREFIX = "Policy ";
+
+    private List<PrivacyPolicy> policies;
+    private List<Integer> selections;
+    private ItemCheckedChangedListener itemCheckedChangedListener;
+    private int separatedColor;
+
+    private final String SEPARATOR;
+
+    //BASE
+    private final String COLLECTOR_NAME;
+    private final String COLLECTOR_PHONE;
+    private final String COLLECTOR_EMAIL;
+    private final String DISPUTE_RELATED_ORGANIZATION;
+    private final String DISPUTE_RESOLUTION_TYPE;
+    private final String ACCESS;
+
+    //Statement
+    private final String CONSEQUENCE;
+    private final String PURPOSE_TYPE;
+    private final String PURPOSE_DESCRIPTION;
+    private final String DATUM_TYPE;
+    private final String DATUM_DESCRIPTION;
+    private final String RECIPIENT_TYPE;
+    private final String RECIPIENT_DESCRIPTION;
+    private final String REMEDIES;
+    private final String RETENTION;
+
+    public PolicyRecyclerViewAdapter(Resources resources,
+                                     List<PrivacyPolicy> policies,
+                                     List<Integer> selections,
+                                     ItemCheckedChangedListener itemCheckedChangedListener){
+        this(resources, policies, selections, itemCheckedChangedListener, -1);
+    }
+
+    public PolicyRecyclerViewAdapter(Resources resources,
+                                     List<PrivacyPolicy> policies,
+                                     List<Integer> selections,
+                                     ItemCheckedChangedListener itemCheckedChangedListener,
+                                     int separatedColor) {
+        SEPARATOR = resources.getString(R.string.policy_separator);
+
+        //BASE
+        String COLLECTOR = resources.getString(R.string.policy_collector_title);
+        COLLECTOR_NAME = COLLECTOR + SEPARATOR + resources.getString(R.string.policy_collector_name);
+        COLLECTOR_PHONE = COLLECTOR + SEPARATOR + resources.getString(R.string.policy_collector_phone);
+        COLLECTOR_EMAIL = COLLECTOR + SEPARATOR + resources.getString(R.string.policy_collector_email);
+        String DISPUTES = resources.getString(R.string.policy_dispute_title);
+        DISPUTE_RESOLUTION_TYPE = DISPUTES + SEPARATOR + resources.getString(R.string.policy_dispute_resolution_type);
+        DISPUTE_RELATED_ORGANIZATION = DISPUTES + SEPARATOR + resources.getString(R.string.policy_dispute_related_organization);
+        ACCESS = resources.getString(R.string.policy_access_title);
+
+        //Statement
+        CONSEQUENCE = resources.getString(R.string.policy_statement_consequence_title);
+        String PURPOSES = resources.getString(R.string.policy_statement_purpose_title);
+        PURPOSE_TYPE = PURPOSES + SEPARATOR + resources.getString(R.string.policy_statement_purpose_type);
+        PURPOSE_DESCRIPTION = PURPOSES + SEPARATOR + resources.getString(R.string.policy_statement_purpose_description);
+        String DATA = resources.getString(R.string.policy_statement_data_title);
+        DATUM_TYPE = DATA + SEPARATOR + resources.getString(R.string.policy_statement_data_type);
+        DATUM_DESCRIPTION = DATA + SEPARATOR + resources.getString(R.string.policy_statement_data_description);
+        String RECIPIENTS = resources.getString(R.string.policy_statement_recipient_title);
+        RECIPIENT_TYPE = RECIPIENTS + SEPARATOR + resources.getString(R.string.policy_statement_recipient_type);
+        RECIPIENT_DESCRIPTION = RECIPIENTS + SEPARATOR + resources.getString(R.string.policy_statement_recipient_description);
+        REMEDIES = resources.getString(R.string.policy_statement_remedies);
+        RETENTION = resources.getString(R.string.policy_statement_retention);
+
+        this.policies = policies;
+        this.selections = selections;
+        this.itemCheckedChangedListener = itemCheckedChangedListener;
+        this.separatedColor = separatedColor;
+    }
+
+    @Override
+    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+        return new ViewHolder(LayoutInflater.from(parent.getContext())
+                .inflate(R.layout.recycler_view_policy, parent, false));
+    }
+
+    @Override
+    public void onBindViewHolder(ViewHolder holder, int position) {
+        PrivacyPolicy policy = policies.get(position);
+        String title = POLICY_PREFIX + policy.getId();
+        holder.mPolicyTitleTextView.setText(title);
+        holder.mPolicyDescriptionTextView.setText(policy.getDescription());
+        holder.mPolicyCheckBox.setChecked(selections.contains(policy.getId()));
+        List<InfoItem> items = new LinkedList<>();
+        addItem(items, COLLECTOR_NAME, policy.getCollector().getName());
+        addItem(items, COLLECTOR_EMAIL, policy.getCollector().getEmail());
+        addItem(items, COLLECTOR_PHONE, policy.getCollector().getPhone());
+        addItem(items, DISPUTE_RESOLUTION_TYPE, policy.getDispute().getType().name());
+        addItem(items, DISPUTE_RELATED_ORGANIZATION, policy.getDispute().getRelatedOrganization());
+        addItem(items, ACCESS, policy.getAccess().name());
+
+        StringBuilder remedies = new StringBuilder();
+        for (Remedy remedy : policy.getRemedies()) {
+            remedies.append(remedy.getType()).append(SEPARATOR);
+        }
+        if (remedies.length() > 0)
+            addItem(items, REMEDIES, remedies.toString());
+
+        for (Statement statement : policy.getStatements()) {
+//            addItem(items, CONSEQUENCE, statement.getConsequence());
+            for (Purpose purpose : statement.getPurposes()) {
+                addItem(items, PURPOSE_TYPE, purpose.getType().name());
+                addItem(items, PURPOSE_DESCRIPTION, purpose.getDescription());
+            }
+            for (Datum datum : statement.getData()) {
+                addItem(items, DATUM_TYPE, datum.getType().name());
+                addItem(items, DATUM_DESCRIPTION, datum.getDescription());
+            }
+            for (Recipient recipient : statement.getRecipients()) {
+                addItem(items, RECIPIENT_TYPE, recipient.getType().name());
+                addItem(items, RECIPIENT_DESCRIPTION, recipient.getDescription());
+            }
+            addItem(items, RETENTION, statement.getRetention().name());
+
+        }
+        holder.mPolicyContentRecyclerView.setAdapter(new InfoItemRecyclerViewAdapter(items, R.layout.recycler_view_policy_content, separatedColor));
+    }
+
+    private void addItem(List<InfoItem> items, String key, String value) {
+        items.add(new InfoItem()
+                .setKey(key)
+                .setValue(value));
+    }
+
+    @Override
+    public int getItemCount() {
+        return policies != null ? policies.size() : 0;
+    }
+
+    class ViewHolder extends RecyclerView.ViewHolder {
+
+        private TextView mPolicyTitleTextView;
+        private TextView mPolicyDescriptionTextView;
+        private Switch mPolicyCheckBox;
+        private ImageView mPolicyScaledImageView;
+        private RecyclerView mPolicyContentRecyclerView;
+
+        ViewHolder(View itemView) {
+            super(itemView);
+            mPolicyTitleTextView = (TextView) itemView.findViewById(R.id.text_policy_title);
+            mPolicyDescriptionTextView = (TextView) itemView.findViewById(R.id.text_policy_description);
+            mPolicyCheckBox = (Switch) itemView.findViewById(R.id.switch_policy_accept);
+            mPolicyScaledImageView = (ImageView) itemView.findViewById(R.id.image_view_policy_scaled);
+            mPolicyContentRecyclerView = (RecyclerView) itemView.findViewById(R.id.recycler_view_policy_content);
+            itemView.setOnClickListener(new View.OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    if (mPolicyContentRecyclerView.getVisibility() == View.VISIBLE) {
+                        mPolicyContentRecyclerView.setVisibility(View.GONE);
+                        mPolicyScaledImageView.setImageResource(R.drawable.ic_arrow_drop_up_black_24dp);
+                    } else {
+                        mPolicyContentRecyclerView.setVisibility(View.VISIBLE);
+                        mPolicyScaledImageView.setImageResource(R.drawable.ic_arrow_drop_down_black_24dp);
+                    }
+                }
+            });
+            mPolicyCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+                @Override
+                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                    itemCheckedChangedListener.onItemCheckedChanged(policies.get(getAdapterPosition()), isChecked);
+                }
+            });
+        }
+
+    }
+
+    public interface ItemCheckedChangedListener {
+        void onItemCheckedChanged(PrivacyPolicy policy, boolean isChecked);
+    }
+
+}
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/adapter/ScanResultRecyclerViewAdapter.java b/app/src/main/java/org/prlab/idic/privacypolicy/adapter/ScanResultRecyclerViewAdapter.java
index 7a3974dd68925b0c34a9185772f00a035493cda5..5bf9628725b4f63fa0c6cf15f0c165723f244dec 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/adapter/ScanResultRecyclerViewAdapter.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/adapter/ScanResultRecyclerViewAdapter.java
@@ -16,7 +16,8 @@ import java.util.List;
 /**
  * Created by IDIC on 2017/1/20.
  */
-public class ScanResultRecyclerViewAdapter extends RecyclerView.Adapter<ScanResultRecyclerViewAdapter.ViewHolder> {
+public class ScanResultRecyclerViewAdapter
+        extends RecyclerView.Adapter<ScanResultRecyclerViewAdapter.ViewHolder> {
 
     private static final String TAG = ScanResultRecyclerViewAdapter.class.getSimpleName();
 
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/adapter/StatementRecyclerViewAdapter.java b/app/src/main/java/org/prlab/idic/privacypolicy/adapter/StatementRecyclerViewAdapter.java
deleted file mode 100644
index c9366d04f7b482eea930c54cebb64e24c872637c..0000000000000000000000000000000000000000
--- a/app/src/main/java/org/prlab/idic/privacypolicy/adapter/StatementRecyclerViewAdapter.java
+++ /dev/null
@@ -1,154 +0,0 @@
-package org.prlab.idic.privacypolicy.adapter;
-
-import android.content.res.Resources;
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.TextView;
-import org.prlab.idic.privacypolicy.R;
-import org.prlab.idic.privacypolicy.pojo.report.InfoItem;
-import org.prlab.idic.privacypolicy.pojo.report.p3p.*;
-import org.prlab.idic.privacypolicy.tool.BaseUtils;
-
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Created by IDIC on 2017/2/23.
- */
-public class StatementRecyclerViewAdapter extends RecyclerView.Adapter<StatementRecyclerViewAdapter.ViewHolder> {
-
-    private final String CONSEQUENCE_TITLE;
-    private final String PURPOSE_TYPE_TITLE;
-    private final String PURPOSE_DESCRIPTION_TITLE;
-    private final String DATUM_TYPE_TITLE;
-    private final String DATUM_DESCRIPTION_TITLE;
-    private final String REMEDIES_TITLE;
-    private final String RECIPIENT_TYPE_TITLE;
-    private final String RECIPIENT_DESCRIPTION_TITLE;
-    private final String RETENTION_TITLE;
-
-    private List<Statement> statements;
-
-    public StatementRecyclerViewAdapter(Resources resources, List<Statement> statements) {
-        CONSEQUENCE_TITLE = resources.getString(R.string.policy_statement_consequence_title);
-
-        PURPOSE_TYPE_TITLE = resources.getString(R.string.policy_statement_purpose_type);
-        PURPOSE_DESCRIPTION_TITLE = resources.getString(R.string.policy_statement_purpose_description);
-
-        DATUM_TYPE_TITLE = resources.getString(R.string.policy_statement_data_type);
-        DATUM_DESCRIPTION_TITLE = resources.getString(R.string.policy_statement_data_description);
-
-        REMEDIES_TITLE = resources.getString(R.string.policy_statement_remedies);
-
-        RECIPIENT_TYPE_TITLE = resources.getString(R.string.policy_statement_recipient_type);
-        RECIPIENT_DESCRIPTION_TITLE = resources.getString(R.string.policy_statement_recipient_description);
-
-        RETENTION_TITLE = resources.getString(R.string.policy_statement_retention);
-        this.statements = statements;
-    }
-
-    @Override
-    public StatementRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_statement, parent, false);
-        return new StatementRecyclerViewAdapter.ViewHolder(view);
-    }
-
-    @Override
-    public void onBindViewHolder(ViewHolder holder, int position) {
-        holder.bind(position);
-    }
-
-    @Override
-    public int getItemCount() {
-        return null == statements ? 0 : statements.size();
-    }
-
-    class ViewHolder extends RecyclerView.ViewHolder {
-
-        private TextView mConsequenceTextView;
-        private RecyclerView mPurposesRecyclerView;
-        private RecyclerView mDataRecyclerView;
-        private TextView mRemediesTextView;
-        private RecyclerView mRecipientsRecyclerView;
-        private TextView mRetentionTextView;
-
-        ViewHolder(View itemView) {
-            super(itemView);
-            mConsequenceTextView = (TextView) itemView.findViewById(R.id.recycler_view_statement_related_uuid);
-            mPurposesRecyclerView = (RecyclerView) itemView.findViewById(R.id.recycler_view_statement_purposes);
-            mDataRecyclerView = (RecyclerView) itemView.findViewById(R.id.recycler_view_statement_data);
-            mRemediesTextView = (TextView) itemView.findViewById(R.id.text_statement_remedies);
-            mRecipientsRecyclerView = (RecyclerView) itemView.findViewById(R.id.recycler_view_statement_recipients);
-            mRetentionTextView = (TextView) itemView.findViewById(R.id.text_statement_retention);
-        }
-
-        private void bindRelatedUUID(String consequence) {
-            mConsequenceTextView.setText(consequence);
-        }
-
-        private void bindPurposes(List<Purpose> purposes) {
-            List<InfoItem> infoItems = new LinkedList<>();
-            infoItems.add(new InfoItem()
-                    .setKey(PURPOSE_TYPE_TITLE)
-                    .setValue(PURPOSE_DESCRIPTION_TITLE));
-            for (Purpose purpose : purposes) {
-                infoItems.add(new InfoItem()
-                        .setKey(BaseUtils.fixTypeName(purpose.getType().name()))
-                        .setValue(purpose.getDescription()));
-            }
-            mPurposesRecyclerView.setAdapter(new InfoItemRecyclerViewAdapter(infoItems));
-        }
-
-        private void bindData(List<Datum> data) {
-            List<InfoItem> infoItems = new LinkedList<>();
-            infoItems.add(new InfoItem()
-                    .setKey(DATUM_TYPE_TITLE)
-                    .setValue(DATUM_DESCRIPTION_TITLE));
-            for (Datum datum : data) {
-                infoItems.add(new InfoItem()
-                        .setKey(BaseUtils.fixTypeName(datum.getType().name()))
-                        .setValue(datum.getDescription()));
-            }
-            mDataRecyclerView.setAdapter(new InfoItemRecyclerViewAdapter(infoItems));
-        }
-
-        private void bindRemedies(List<Remedy> remedies) {
-            StringBuilder builder = new StringBuilder();
-            for (Remedy remedy : remedies) {
-                builder.append(BaseUtils.fixTypeName(remedy.name())).append(", ");
-            }
-            builder.delete(builder.length() - 2, builder.length());
-            mRemediesTextView.setText(builder.toString());
-        }
-
-        private void bindRecipients(List<Recipient> recipients) {
-            List<InfoItem> infoItems = new LinkedList<>();
-            infoItems.add(new InfoItem()
-                    .setKey(RECIPIENT_TYPE_TITLE)
-                    .setValue(RECIPIENT_DESCRIPTION_TITLE));
-            for (Recipient recipient : recipients) {
-                infoItems.add(new InfoItem()
-                        .setKey(BaseUtils.fixTypeName(recipient.getType().name()))
-                        .setValue(recipient.getDescription()));
-            }
-            mRecipientsRecyclerView.setAdapter(new InfoItemRecyclerViewAdapter(infoItems));
-        }
-
-        private void bindRetention(Retention retention) {
-            mRetentionTextView.setText(BaseUtils.fixTypeName(retention.name()));
-        }
-
-        void bind(int listIndex) {
-            Statement statement = statements.get(listIndex);
-            bindRelatedUUID(statement.getConsequence());
-            bindPurposes(statement.getPurposes());
-            bindData(statement.getData());
-            bindRemedies(statement.getRemedies());
-            bindRecipients(statement.getRecipients());
-            bindRetention(statement.getRetention());
-        }
-
-    }
-}
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/adapter/StringButtonRecyclerViewAdapter.java b/app/src/main/java/org/prlab/idic/privacypolicy/adapter/StringButtonRecyclerViewAdapter.java
deleted file mode 100644
index 8151435aeb123bd1126f0330ee10951150c578bd..0000000000000000000000000000000000000000
--- a/app/src/main/java/org/prlab/idic/privacypolicy/adapter/StringButtonRecyclerViewAdapter.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.prlab.idic.privacypolicy.adapter;
-
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.Button;
-import org.prlab.idic.privacypolicy.R;
-
-import java.util.List;
-
-/**
- * Created by IDIC on 2017/2/16.
- */
-public class StringButtonRecyclerViewAdapter extends RecyclerView.Adapter<StringButtonRecyclerViewAdapter.ViewHolder> {
-
-    private ListItemClickListener listItemClickListener;
-    private List<String> items;
-    private String target;
-
-    public StringButtonRecyclerViewAdapter(ListItemClickListener listItemClickListener) {
-        this.listItemClickListener = listItemClickListener;
-    }
-
-    public void setItems(List<String> items) {
-        this.items = items;
-        notifyDataSetChanged();
-    }
-
-    public void setTarget(String target) {
-        this.target = target;
-        notifyItemChanged(items.indexOf(target));
-    }
-
-    public interface ListItemClickListener {
-        void onListItemClick(int clickedItemIndex);
-    }
-
-    @Override
-    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_item, parent, false);
-        return new StringButtonRecyclerViewAdapter.ViewHolder(view);
-    }
-
-    @Override
-    public void onBindViewHolder(ViewHolder holder, int position) {
-        holder.bind(position);
-    }
-
-    @Override
-    public int getItemCount() {
-        return null != items ? items.size() : 0;
-    }
-
-    class ViewHolder extends RecyclerView.ViewHolder {
-
-        private Button button;
-
-        ViewHolder(View itemView) {
-            super(itemView);
-            button = (Button) itemView.findViewById(R.id.button_item);
-            button.setOnClickListener(new View.OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    StringButtonRecyclerViewAdapter.this.listItemClickListener.onListItemClick(getAdapterPosition());
-                }
-            });
-        }
-
-        void bind(int listIndex) {
-            String item = items.get(listIndex);
-            button.setText(item);
-            button.setEnabled(!item.equals(target));
-        }
-
-    }
-}
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/Layer.java b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/Layer.java
deleted file mode 100644
index 06eece9ea60b87f9e39fb42b5c4a6b18d16953bf..0000000000000000000000000000000000000000
--- a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/Layer.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package org.prlab.idic.privacypolicy.pojo.report;
-
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Created by IDIC on 2017/2/22.
- */
-public class Layer {
-
-    private String UUID;
-    private List<Integer> policies = new LinkedList<>();
-    private List<Layer> subLayers = new LinkedList<>();
-
-    public String getUUID() {
-        return UUID;
-    }
-
-    public Layer setUUID(String UUID) {
-        this.UUID = UUID;
-        return this;
-    }
-
-    public List<Integer> getPolicies() {
-        return policies;
-    }
-
-    public Layer setPolicies(List<Integer> policies) {
-        this.policies = policies;
-        return this;
-    }
-
-    public List<Layer> getSubLayers() {
-        return subLayers;
-    }
-
-    public Layer setSubLayers(List<Layer> subLayers) {
-        this.subLayers = subLayers;
-        return this;
-    }
-
-    public Layer addPrivacyPolicy(Integer policy) {
-        if (null != policies) this.policies.add(policy);
-        return this;
-    }
-
-    public Layer addSubLayer(Layer layer) {
-        if (null != subLayers) this.subLayers.add(layer);
-        return this;
-    }
-
-    public int getLayerLevel() {
-        if (null == subLayers || subLayers.isEmpty()) return 0;
-        List<Integer> counter = new LinkedList<>();
-        for (Layer layer : subLayers) {
-            counter.add(1 + layer.getLayerLevel());
-        }
-        return Collections.max(counter);
-    }
-
-}
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/PrivacyPolicy.java b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/PrivacyPolicy.java
index 4ea51889511bd935896403d57c66bb3a3ba2fcb2..07dd0cece46e73eb381c3c7a5feca85e6ade65b4 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/PrivacyPolicy.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/PrivacyPolicy.java
@@ -18,6 +18,7 @@ public class PrivacyPolicy implements Parcelable {
     private Collector collector;
     private Dispute dispute;
     private Access access;
+    private List<Remedy> remedies = new LinkedList<>();
     private List<Statement> statements = new LinkedList<>();
 
     public PrivacyPolicy() {
@@ -29,6 +30,7 @@ public class PrivacyPolicy implements Parcelable {
         collector = in.readParcelable(Collector.class.getClassLoader());
         dispute = in.readParcelable(Dispute.class.getClassLoader());
         access = in.readParcelable(Access.class.getClassLoader());
+        remedies = in.createTypedArrayList(Remedy.CREATOR);
         statements = in.createTypedArrayList(Statement.CREATOR);
     }
 
@@ -56,6 +58,7 @@ public class PrivacyPolicy implements Parcelable {
         dest.writeParcelable(collector, flags);
         dest.writeParcelable(dispute, flags);
         dest.writeParcelable(access, flags);
+        dest.writeTypedList(remedies);
         dest.writeTypedList(statements);
     }
 
@@ -104,6 +107,20 @@ public class PrivacyPolicy implements Parcelable {
         return this;
     }
 
+    public List<Remedy> getRemedies() {
+        return remedies;
+    }
+
+    public PrivacyPolicy setRemedies(List<Remedy> remedies) {
+        this.remedies = remedies;
+        return this;
+    }
+
+    public PrivacyPolicy addRemedy(Remedy remedy) {
+        if (null != this.remedies) this.remedies.add(remedy);
+        return this;
+    }
+
     public List<Statement> getStatements() {
         return statements;
     }
@@ -117,4 +134,5 @@ public class PrivacyPolicy implements Parcelable {
         if (null != this.statements) this.statements.add(statement);
         return this;
     }
+
 }
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/PrivacyPolicyReport.java b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/PrivacyPolicyReport.java
index 6be84b011d528903f2eebdbf60e8fa4555f89121..0b6de4be8e92bbf985c81c428b38d4f31a016948 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/PrivacyPolicyReport.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/PrivacyPolicyReport.java
@@ -4,6 +4,8 @@ package org.prlab.idic.privacypolicy.pojo.report;
 import org.prlab.idic.privacypolicy.pojo.report.device.Device;
 
 import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -11,11 +13,20 @@ import java.util.Map;
  */
 public class PrivacyPolicyReport {
 
+    private String id;
     private String version;
     private String description;
     private Device device;
-    private Map<Integer, PrivacyPolicy> policies = new HashMap<>();
-    private Layer root;
+    private List<PrivacyPolicy> policies = new LinkedList<>();
+
+    public String getId() {
+        return id;
+    }
+
+    public PrivacyPolicyReport setId(String id) {
+        this.id = id;
+        return this;
+    }
 
     public String getVersion() {
         return version;
@@ -43,27 +54,18 @@ public class PrivacyPolicyReport {
         this.device = device;
         return this;
     }
-
-    public Map<Integer, PrivacyPolicy> getPolicies() {
+    public List<PrivacyPolicy> getPolicies() {
         return policies;
     }
 
-    public PrivacyPolicyReport setPolicies(Map<Integer, PrivacyPolicy> policies) {
+    public PrivacyPolicyReport setPolicies(List<PrivacyPolicy> policies) {
         this.policies = policies;
         return this;
     }
 
     public PrivacyPolicyReport addPrivacyPolicy(PrivacyPolicy policy) {
-        if (null != policies) this.policies.put(policy.getId(), policy);
+        if (null != policies) this.policies.add(policy);
         return this;
     }
 
-    public Layer getRoot() {
-        return root;
-    }
-
-    public PrivacyPolicyReport setRoot(Layer root) {
-        this.root = root;
-        return this;
-    }
 }
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/device/Manufacturer.java b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/device/Manufacturer.java
index 6189333cb6cf1f64541d94b48332d211edf7ae64..70839cecf99ab1c28c27d08a482c6f0bb6f979d9 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/device/Manufacturer.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/device/Manufacturer.java
@@ -8,6 +8,7 @@ import android.os.Parcelable;
  */
 public class Manufacturer implements Parcelable {
 
+    private long id;
     private String name;
     private String url;
     private String serialNumber;
@@ -16,6 +17,7 @@ public class Manufacturer implements Parcelable {
     }
 
     private Manufacturer(Parcel in) {
+        id = in.readLong();
         name = in.readString();
         url = in.readString();
         serialNumber = in.readString();
@@ -28,6 +30,7 @@ public class Manufacturer implements Parcelable {
 
     @Override
     public void writeToParcel(Parcel dest, int flags) {
+        dest.writeLong(id);
         dest.writeString(name);
         dest.writeString(url);
         dest.writeString(serialNumber);
@@ -45,6 +48,15 @@ public class Manufacturer implements Parcelable {
         }
     };
 
+    public long getId() {
+        return id;
+    }
+
+    public Manufacturer setId(long id) {
+        this.id = id;
+        return this;
+    }
+
     public String getName() {
         return name;
     }
@@ -79,16 +91,20 @@ public class Manufacturer implements Parcelable {
 
         Manufacturer that = (Manufacturer) o;
 
+        if (id != that.id) return false;
         if (name != null ? !name.equals(that.name) : that.name != null) return false;
         if (url != null ? !url.equals(that.url) : that.url != null) return false;
         return serialNumber != null ? serialNumber.equals(that.serialNumber) : that.serialNumber == null;
+
     }
 
     @Override
     public int hashCode() {
-        int result = name != null ? name.hashCode() : 0;
+        int result = (int) (id ^ (id >>> 32));
+        result = 31 * result + (name != null ? name.hashCode() : 0);
         result = 31 * result + (url != null ? url.hashCode() : 0);
         result = 31 * result + (serialNumber != null ? serialNumber.hashCode() : 0);
         return result;
     }
+
 }
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/device/Model.java b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/device/Model.java
index 4e3470187e81937b1cb6fed74d914431063f7aa5..83a1b5a73cfedf198b5eeef5a859f10d6e9041bb 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/device/Model.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/device/Model.java
@@ -8,6 +8,7 @@ import android.os.Parcelable;
  */
 public class Model implements Parcelable{
 
+    private long id;
     private String name;
     private String url;
     private String description;
@@ -16,6 +17,7 @@ public class Model implements Parcelable{
     }
 
     private Model(Parcel in) {
+        id = in.readLong();
         name = in.readString();
         url = in.readString();
         description = in.readString();
@@ -28,6 +30,7 @@ public class Model implements Parcelable{
 
     @Override
     public void writeToParcel(Parcel dest, int flags) {
+        dest.writeLong(id);
         dest.writeString(name);
         dest.writeString(url);
         dest.writeString(description);
@@ -45,6 +48,15 @@ public class Model implements Parcelable{
         }
     };
 
+    public long getId() {
+        return id;
+    }
+
+    public Model setId(long id) {
+        this.id = id;
+        return this;
+    }
+
     public String getName() {
         return name;
     }
@@ -79,16 +91,20 @@ public class Model implements Parcelable{
 
         Model model = (Model) o;
 
+        if (id != model.id) return false;
         if (name != null ? !name.equals(model.name) : model.name != null) return false;
         if (url != null ? !url.equals(model.url) : model.url != null) return false;
         return description != null ? description.equals(model.description) : model.description == null;
+
     }
 
     @Override
     public int hashCode() {
-        int result = name != null ? name.hashCode() : 0;
+        int result = (int) (id ^ (id >>> 32));
+        result = 31 * result + (name != null ? name.hashCode() : 0);
         result = 31 * result + (url != null ? url.hashCode() : 0);
         result = 31 * result + (description != null ? description.hashCode() : 0);
         return result;
     }
+
 }
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Collector.java b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Collector.java
index e3f5e313c6cc5cda0d4bcb298550bab84746bb12..2b3e037f06b0db99134b0235c9f927ac6be87c03 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Collector.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Collector.java
@@ -8,6 +8,7 @@ import android.os.Parcelable;
  */
 public class Collector implements Parcelable {
 
+    private long id;
     private String name;
     private String phone;
     private String email;
@@ -16,6 +17,7 @@ public class Collector implements Parcelable {
     }
 
     protected Collector(Parcel in) {
+        id = in.readLong();
         name = in.readString();
         phone = in.readString();
         email = in.readString();
@@ -33,6 +35,28 @@ public class Collector implements Parcelable {
         }
     };
 
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeLong(id);
+        dest.writeString(name);
+        dest.writeString(phone);
+        dest.writeString(email);
+    }
+
+    public long getId() {
+        return id;
+    }
+
+    public Collector setId(long id) {
+        this.id = id;
+        return this;
+    }
+
     public String getName() {
         return name;
     }
@@ -67,28 +91,19 @@ public class Collector implements Parcelable {
 
         Collector collector = (Collector) o;
 
+        if (id != collector.id) return false;
         if (name != null ? !name.equals(collector.name) : collector.name != null) return false;
         if (phone != null ? !phone.equals(collector.phone) : collector.phone != null) return false;
         return email != null ? email.equals(collector.email) : collector.email == null;
+
     }
 
     @Override
     public int hashCode() {
-        int result = name != null ? name.hashCode() : 0;
+        int result = (int) (id ^ (id >>> 32));
+        result = 31 * result + (name != null ? name.hashCode() : 0);
         result = 31 * result + (phone != null ? phone.hashCode() : 0);
         result = 31 * result + (email != null ? email.hashCode() : 0);
         return result;
     }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString(name);
-        dest.writeString(phone);
-        dest.writeString(email);
-    }
 }
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Datum.java b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Datum.java
index 3541d035d553838b0cdcc710b32291b8666564bc..d1867fb8fda9bdab450c26c9cb893842f05aa71a 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Datum.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Datum.java
@@ -3,11 +3,14 @@ package org.prlab.idic.privacypolicy.pojo.report.p3p;
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import org.prlab.idic.privacypolicy.pojo.report.device.Model;
+
 /**
  * Created by IDIC on 2017/2/16.
  */
 public class Datum implements Parcelable {
 
+    private long id;
     private Type type;
     private String description;
 
@@ -15,6 +18,7 @@ public class Datum implements Parcelable {
     }
 
     private Datum(Parcel in) {
+        id = in.readLong();
         description = in.readString();
         type = Type.valueOf(in.readString());
     }
@@ -38,10 +42,20 @@ public class Datum implements Parcelable {
 
     @Override
     public void writeToParcel(Parcel dest, int flags) {
+        dest.writeLong(id);
         dest.writeString(description);
         dest.writeString(type.name());
     }
 
+    public long getId() {
+        return id;
+    }
+
+    public Datum setId(long id) {
+        this.id = id;
+        return this;
+    }
+
     public Type getType() {
         return type;
     }
@@ -74,14 +88,18 @@ public class Datum implements Parcelable {
 
         Datum datum = (Datum) o;
 
+        if (id != datum.id) return false;
         if (type != datum.type) return false;
         return description != null ? description.equals(datum.description) : datum.description == null;
+
     }
 
     @Override
     public int hashCode() {
-        int result = type != null ? type.hashCode() : 0;
+        int result = (int) (id ^ (id >>> 32));
+        result = 31 * result + (type != null ? type.hashCode() : 0);
         result = 31 * result + (description != null ? description.hashCode() : 0);
         return result;
     }
+
 }
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Dispute.java b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Dispute.java
index 397d162de80accd286e73f6241316bffe231b9dc..43b9fd761177f83175564adee7be46e6e7b8f078 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Dispute.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Dispute.java
@@ -8,6 +8,7 @@ import android.os.Parcelable;
  */
 public class Dispute implements Parcelable {
 
+    private long id;
     private String relatedOrganization;
     private Type type;
 
@@ -15,6 +16,7 @@ public class Dispute implements Parcelable {
     }
 
     protected Dispute(Parcel in) {
+        id = in.readLong();
         relatedOrganization = in.readString();
         type = Type.valueOf(in.readString());
     }
@@ -26,6 +28,7 @@ public class Dispute implements Parcelable {
 
     @Override
     public void writeToParcel(Parcel dest, int flags) {
+        dest.writeLong(id);
         dest.writeString(relatedOrganization);
         dest.writeString(type.name());
     }
@@ -42,6 +45,14 @@ public class Dispute implements Parcelable {
         }
     };
 
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
     public String getRelatedOrganization() {
         return relatedOrganization;
     }
@@ -71,14 +82,17 @@ public class Dispute implements Parcelable {
 
         Dispute dispute = (Dispute) o;
 
+        if (id != dispute.id) return false;
         if (relatedOrganization != null ? !relatedOrganization.equals(dispute.relatedOrganization) : dispute.relatedOrganization != null)
             return false;
         return type == dispute.type;
+
     }
 
     @Override
     public int hashCode() {
-        int result = relatedOrganization != null ? relatedOrganization.hashCode() : 0;
+        int result = (int) (id ^ (id >>> 32));
+        result = 31 * result + (relatedOrganization != null ? relatedOrganization.hashCode() : 0);
         result = 31 * result + (type != null ? type.hashCode() : 0);
         return result;
     }
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Purpose.java b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Purpose.java
index 8f58fcba78ce55703042ba09cd38e4e12f6e88f0..98abe616ee9a810d5ddcab0a56907bd6f34fda45 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Purpose.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Purpose.java
@@ -8,6 +8,7 @@ import android.os.Parcelable;
  */
 public class Purpose implements Parcelable {
 
+    private long id;
     private Type type;
     private String description;
 
@@ -15,6 +16,7 @@ public class Purpose implements Parcelable {
     }
 
     protected Purpose(Parcel in) {
+        id = in.readLong();
         description = in.readString();
         type = Type.valueOf(in.readString());
     }
@@ -38,10 +40,19 @@ public class Purpose implements Parcelable {
 
     @Override
     public void writeToParcel(Parcel dest, int flags) {
+        dest.writeLong(id);
         dest.writeString(description);
         dest.writeString(type.name());
     }
 
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
     public Type getType() {
         return type;
     }
@@ -73,14 +84,18 @@ public class Purpose implements Parcelable {
 
         Purpose purpose = (Purpose) o;
 
+        if (id != purpose.id) return false;
         if (type != purpose.type) return false;
         return description != null ? description.equals(purpose.description) : purpose.description == null;
+
     }
 
     @Override
     public int hashCode() {
-        int result = type != null ? type.hashCode() : 0;
+        int result = (int) (id ^ (id >>> 32));
+        result = 31 * result + (type != null ? type.hashCode() : 0);
         result = 31 * result + (description != null ? description.hashCode() : 0);
         return result;
     }
+
 }
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Recipient.java b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Recipient.java
index 83a30fe1e152c407a5df0cf6955619a639ff3294..00228b9121687830174fcef08a92fdb9ad2b0859 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Recipient.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Recipient.java
@@ -3,11 +3,14 @@ package org.prlab.idic.privacypolicy.pojo.report.p3p;
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import org.prlab.idic.privacypolicy.pojo.report.device.Model;
+
 /**
  * Created by IDIC on 2017/2/16.
  */
 public class Recipient implements Parcelable {
 
+    private long id;
     private Type type;
     private String description;
 
@@ -15,6 +18,7 @@ public class Recipient implements Parcelable {
     }
 
     private Recipient(Parcel in) {
+        id = in.readLong();
         description = in.readString();
         type = Type.valueOf(in.readString());
     }
@@ -38,10 +42,20 @@ public class Recipient implements Parcelable {
 
     @Override
     public void writeToParcel(Parcel dest, int flags) {
+        dest.writeLong(id);
         dest.writeString(description);
         dest.writeString(type.name());
     }
 
+    public long getId() {
+        return id;
+    }
+
+    public Recipient setId(long id) {
+        this.id = id;
+        return this;
+    }
+
     public Type getType() {
         return type;
     }
@@ -71,13 +85,16 @@ public class Recipient implements Parcelable {
 
         Recipient recipient = (Recipient) o;
 
+        if (id != recipient.id) return false;
         if (type != recipient.type) return false;
         return description != null ? description.equals(recipient.description) : recipient.description == null;
+
     }
 
     @Override
     public int hashCode() {
-        int result = type != null ? type.hashCode() : 0;
+        int result = (int) (id ^ (id >>> 32));
+        result = 31 * result + (type != null ? type.hashCode() : 0);
         result = 31 * result + (description != null ? description.hashCode() : 0);
         return result;
     }
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Remedy.java b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Remedy.java
index 51841d2e47de24245f11564d2892edcdf560f89e..0317ffabe123b2b86b38f13eb66f84b7623fd80e 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Remedy.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Remedy.java
@@ -6,15 +6,23 @@ import android.os.Parcelable;
 /**
  * Created by IDIC on 2017/2/16.
  */
-public enum Remedy implements Parcelable {
-    CORRECT, MONEY, LAW;
+public class Remedy implements Parcelable {
 
-    Remedy() {
+    private long id;
+    private Type type;
+
+    public Remedy() {
+    }
+
+    private Remedy(Parcel in) {
+        id = in.readLong();
+        type = Type.valueOf(in.readString());
     }
 
     @Override
     public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString(name());
+        dest.writeLong(id);
+        dest.writeString(type.name());
     }
 
     @Override
@@ -25,7 +33,7 @@ public enum Remedy implements Parcelable {
     public static final Creator<Remedy> CREATOR = new Creator<Remedy>() {
         @Override
         public Remedy createFromParcel(Parcel in) {
-            return Remedy.valueOf(in.readString());
+            return new Remedy(in);
         }
 
         @Override
@@ -33,4 +41,27 @@ public enum Remedy implements Parcelable {
             return new Remedy[size];
         }
     };
+
+    public long getId() {
+        return id;
+    }
+
+    public Remedy setId(long id) {
+        this.id = id;
+        return this;
+    }
+
+    public Type getType() {
+        return type;
+    }
+
+    public Remedy setType(Type type) {
+        this.type = type;
+        return this;
+    }
+
+    public enum Type {
+        CORRECT, MONEY, LAW
+    }
+
 }
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Statement.java b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Statement.java
index 9edf445e2aca5a9f14f800e5e49e7d105d1ba856..8847cb991bf6dac94ff86f335cf7559290607ab5 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Statement.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/pojo/report/p3p/Statement.java
@@ -11,22 +11,20 @@ import java.util.List;
  */
 public class Statement implements Parcelable {
 
+    private long id;
     private String consequence;
     private List<Purpose> purposes = new LinkedList<>();
     private List<Datum> data = new LinkedList<>();
     private List<Recipient> recipients = new LinkedList<>();
-    private List<Remedy> remedies = new LinkedList<>();
     private Retention retention;
 
-    public Statement() {
-    }
 
     private Statement(Parcel in) {
+        id = in.readLong();
         consequence = in.readString();
         purposes = in.createTypedArrayList(Purpose.CREATOR);
         data = in.createTypedArrayList(Datum.CREATOR);
         recipients = in.createTypedArrayList(Recipient.CREATOR);
-        remedies = in.createTypedArrayList(Remedy.CREATOR);
         retention = in.readParcelable(Retention.class.getClassLoader());
     }
 
@@ -49,14 +47,23 @@ public class Statement implements Parcelable {
 
     @Override
     public void writeToParcel(Parcel dest, int flags) {
+        dest.writeLong(id);
         dest.writeString(consequence);
         dest.writeTypedList(purposes);
         dest.writeTypedList(data);
         dest.writeTypedList(recipients);
-        dest.writeTypedList(remedies);
         dest.writeParcelable(retention, flags);
     }
 
+    public long getId() {
+        return id;
+    }
+
+    public Statement setId(long id) {
+        this.id = id;
+        return this;
+    }
+
     public String getConsequence() {
         return consequence;
     }
@@ -108,20 +115,6 @@ public class Statement implements Parcelable {
         return this;
     }
 
-    public List<Remedy> getRemedies() {
-        return remedies;
-    }
-
-    public Statement setRemedies(List<Remedy> remedies) {
-        this.remedies = remedies;
-        return this;
-    }
-
-    public Statement addRemedy(Remedy remedy) {
-        if (null != this.remedies) this.remedies.add(remedy);
-        return this;
-    }
-
     public Retention getRetention() {
         return retention;
     }
@@ -143,7 +136,6 @@ public class Statement implements Parcelable {
         if (purposes != null ? !purposes.equals(statement.purposes) : statement.purposes != null) return false;
         if (data != null ? !data.equals(statement.data) : statement.data != null) return false;
         if (recipients != null ? !recipients.equals(statement.recipients) : statement.recipients != null) return false;
-        if (remedies != null ? !remedies.equals(statement.remedies) : statement.remedies != null) return false;
         return retention == statement.retention;
     }
 
@@ -153,7 +145,6 @@ public class Statement implements Parcelable {
         result = 31 * result + (purposes != null ? purposes.hashCode() : 0);
         result = 31 * result + (data != null ? data.hashCode() : 0);
         result = 31 * result + (recipients != null ? recipients.hashCode() : 0);
-        result = 31 * result + (remedies != null ? remedies.hashCode() : 0);
         result = 31 * result + (retention != null ? retention.hashCode() : 0);
         return result;
     }
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/storage/PrivacyPolicyContract.java b/app/src/main/java/org/prlab/idic/privacypolicy/storage/PrivacyPolicyContract.java
index c0414c48c4f2426805abbad52c3dced45feaa50d..1cce3eb913b8e15cbd09ad77a4cfaaec5884a40d 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/storage/PrivacyPolicyContract.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/storage/PrivacyPolicyContract.java
@@ -14,6 +14,9 @@ public class PrivacyPolicyContract {
 
     public static final String PATH_PRIVACY_POLICY = "privacy_policy";
 
+    public static final String DECLINE = "decline";
+    public static final String ACCEPT = "accept";
+
     public static final class PolicyEntry implements BaseColumns {
 
         public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon()
@@ -23,19 +26,9 @@ public class PrivacyPolicyContract {
         public static final String TABLE_NAME = "policies";
 
         public static final String COLUMN_MAC = "mac";
-        public static final String COLUMN_UUIDs = "uuid";
+        public static final String COLUMN_POLICY = "policy";
         public static final String COLUMN_PREFERENCE = "preference";
 
     }
 
-    public static String getSqlSelectForMACAndUUIDsOnwards() {
-        return PolicyEntry.COLUMN_MAC + " = ? " + " AND " +
-                PolicyEntry.COLUMN_UUIDs + " = ? ";
-    }
-
-    public static String getSqlSelectForMACAndRelatedUUIDsOnwards() {
-        return PolicyEntry.COLUMN_MAC + " = ? " + " AND " +
-                PolicyEntry.COLUMN_UUIDs + " LIKE ? ";
-    }
-
 }
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/storage/PrivacyPolicyDbHelper.java b/app/src/main/java/org/prlab/idic/privacypolicy/storage/PrivacyPolicyDbHelper.java
index 5a679fe51b6c03a556fd7df5309db89fbbeb59a9..d7360a4a8db93e268b0c66ae565f9e8b3943ba90 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/storage/PrivacyPolicyDbHelper.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/storage/PrivacyPolicyDbHelper.java
@@ -20,8 +20,10 @@ class PrivacyPolicyDbHelper extends SQLiteOpenHelper {
     public void onCreate(SQLiteDatabase db) {
         db.execSQL("CREATE TABLE " + PrivacyPolicyContract.PolicyEntry.TABLE_NAME + " (" +
                 PrivacyPolicyContract.PolicyEntry.COLUMN_MAC + " CHAR(12) NOT NULL, " +
-                PrivacyPolicyContract.PolicyEntry.COLUMN_UUIDs + " TEXT NOT NULL, " +
-                PrivacyPolicyContract.PolicyEntry.COLUMN_PREFERENCE + " TEXT);");
+                PrivacyPolicyContract.PolicyEntry.COLUMN_POLICY + " TEXT NOT NULL, " +
+                PrivacyPolicyContract.PolicyEntry.COLUMN_PREFERENCE + " INTEGER, " +
+                "PRIMARY KEY(" + PrivacyPolicyContract.PolicyEntry.COLUMN_MAC + ", " +
+                PrivacyPolicyContract.PolicyEntry.COLUMN_POLICY + "));");
     }
 
     @Override
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/storage/PrivacyPolicyProvider.java b/app/src/main/java/org/prlab/idic/privacypolicy/storage/PrivacyPolicyProvider.java
index d1e0743b7c1cd5934294e309557c7fbc046a1a92..f0fa0f53db305eeb2a5c9594178999d8ababe189 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/storage/PrivacyPolicyProvider.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/storage/PrivacyPolicyProvider.java
@@ -51,7 +51,8 @@ public class PrivacyPolicyProvider extends ContentProvider {
             default:
                 throw new UnsupportedOperationException("Unknown uri: " + uri);
         }
-        cursor.setNotificationUri(getContext().getContentResolver(), uri);
+        if (getContext() != null)
+            cursor.setNotificationUri(getContext().getContentResolver(), uri);
         return cursor;
     }
 
@@ -72,7 +73,8 @@ public class PrivacyPolicyProvider extends ContentProvider {
                     db.setTransactionSuccessful();
                     Uri curr = ContentUris.withAppendedId(PrivacyPolicyContract.PolicyEntry.CONTENT_URI, _id);
                     //將新插入的資料uri進行通知,以便獲取最新的資料
-                    getContext().getContentResolver().notifyChange(curr, null);
+                    if (getContext() != null)
+                        getContext().getContentResolver().notifyChange(curr, null);
                     return curr;
                 } finally {
                     db.endTransaction();
@@ -112,7 +114,7 @@ public class PrivacyPolicyProvider extends ContentProvider {
 
         db.endTransaction();
         /* If we actually deleted any rows, notify that a change has occurred to this URI */
-        if (numRowsDeleted != 0) {
+        if (numRowsDeleted != 0 && getContext() != null) {
             getContext().getContentResolver().notifyChange(uri, null);
         }
 
@@ -136,7 +138,8 @@ public class PrivacyPolicyProvider extends ContentProvider {
             default:
                 throw new UnsupportedOperationException("Unknown uri: " + uri);
         }
-        getContext().getContentResolver().notifyChange(uri, null);
+        if (getContext() != null)
+            getContext().getContentResolver().notifyChange(uri, null);
         return count;
     }
 
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/storage/PrivacyPolicyStorageImpl.java b/app/src/main/java/org/prlab/idic/privacypolicy/storage/PrivacyPolicyStorageImpl.java
index 3bdb51013fbfbef57f0df156c01b742a47b2c06c..adedbf15df477a0826528887c1ba9ea0e5ee8b01 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/storage/PrivacyPolicyStorageImpl.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/storage/PrivacyPolicyStorageImpl.java
@@ -13,6 +13,9 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
 
+import static org.prlab.idic.privacypolicy.storage.PrivacyPolicyContract.ACCEPT;
+import static org.prlab.idic.privacypolicy.storage.PrivacyPolicyContract.DECLINE;
+
 /**
  * Created by IDIC on 2017/2/15.
  */
@@ -25,12 +28,12 @@ public class PrivacyPolicyStorageImpl implements StorageInterface<Integer, Strin
 
     private static final String[] PRIVACY_POLICY_PROJECTION = {
             PrivacyPolicyContract.PolicyEntry.COLUMN_MAC,
-            PrivacyPolicyContract.PolicyEntry.COLUMN_UUIDs,
+            PrivacyPolicyContract.PolicyEntry.COLUMN_POLICY,
             PrivacyPolicyContract.PolicyEntry.COLUMN_PREFERENCE
     };
 
     public static final int INDEX_POLICY_MAC = 0;
-    public static final int INDEX_POLICY_UUIDs = 1;
+    public static final int INDEX_POLICY_POLICY = 1;
     public static final int INDEX_POLICY_PREFERENCE = 2;
 
     public PrivacyPolicyStorageImpl(ContentResolver contentResolver, String targetDeviceMAC) {
@@ -39,139 +42,60 @@ public class PrivacyPolicyStorageImpl implements StorageInterface<Integer, Strin
     }
 
     @Override
-    public StorageInterface remove(List<String> layerUUIDs) {
-        remove(BaseUtils.stringList2ArrayString(layerUUIDs));
+    public StorageInterface decline(Integer id) {
+        choose(id, DECLINE);
         return this;
     }
 
-    private void remove(String layerUUIDs) {
-        int impactRow = mContentResolver.delete(
-                PrivacyPolicyContract.PolicyEntry.CONTENT_URI,
-                PrivacyPolicyContract.getSqlSelectForMACAndUUIDsOnwards(),
-                new String[]{mTargetDeviceMAC, layerUUIDs}
-        );
-        removeChildLayerPolicies(layerUUIDs);
-        Log.i(TAG, "Remove [" + layerUUIDs + "] " + (impactRow == 1 ? "success" : "failure") + ".");
-    }
-
-    private void removeChildLayerPolicies(String layerUUIDs) {
-        List<String> subUUIDs = getRelatedUUIDs(true, layerUUIDs);
-        for (String subUUID : subUUIDs) {
-            remove(subUUID);
-        }
-    }
-
     @Override
-    public StorageInterface put(List<Integer> selection, List<String> layerUUIDs) {
-        put(selection, BaseUtils.stringList2ArrayString(layerUUIDs));
+    public StorageInterface accept(Integer id) {
+        choose(id, ACCEPT);
         return this;
     }
 
-    private void put(List<Integer> selection, String layerUUIDs) {
-        for (int s : selection) {
+    private void choose(Integer id, String choice) {
+        ContentValues insertContentValues = new ContentValues();
+        insertContentValues.put(PrivacyPolicyContract.PolicyEntry.COLUMN_MAC, mTargetDeviceMAC);
+        insertContentValues.put(PrivacyPolicyContract.PolicyEntry.COLUMN_POLICY, id);
+        insertContentValues.put(PrivacyPolicyContract.PolicyEntry.COLUMN_PREFERENCE, choice);
+        Uri newUri = mContentResolver.insert(
+                PrivacyPolicyContract.PolicyEntry.CONTENT_URI,
+                insertContentValues
+        );
+
+        if (newUri == null) {
             ContentValues updateContentValues = new ContentValues();
-            updateContentValues.put(PrivacyPolicyContract.PolicyEntry.COLUMN_PREFERENCE, s);
+            updateContentValues.put(PrivacyPolicyContract.PolicyEntry.COLUMN_PREFERENCE, choice);
 
-            ContentValues insertContentValues = new ContentValues(updateContentValues);
-            insertContentValues.put(PrivacyPolicyContract.PolicyEntry.COLUMN_MAC, mTargetDeviceMAC);
-            insertContentValues.put(PrivacyPolicyContract.PolicyEntry.COLUMN_UUIDs, layerUUIDs);
-            Uri mNewUri = mContentResolver.insert(
+            int count = mContentResolver.update(
                     PrivacyPolicyContract.PolicyEntry.CONTENT_URI,
-                    insertContentValues
+                    updateContentValues,
+                    PrivacyPolicyContract.PolicyEntry.COLUMN_MAC + " = ? " + " AND " +
+                            PrivacyPolicyContract.PolicyEntry.COLUMN_POLICY + " = ? " + " AND " +
+                            PrivacyPolicyContract.PolicyEntry.COLUMN_PREFERENCE + " = ? ",
+                    new String[]{mTargetDeviceMAC, String.valueOf(id), choice}
             );
-            if (mNewUri == null) {
-                int count = mContentResolver.update(
-                        PrivacyPolicyContract.PolicyEntry.CONTENT_URI,
-                        updateContentValues,
-                        PrivacyPolicyContract.getSqlSelectForMACAndUUIDsOnwards(),
-                        new String[]{mTargetDeviceMAC, layerUUIDs}
-                );
-                Log.i(TAG, "Update " + String.valueOf(s) + " to [" + layerUUIDs + "] " + (count == 1 ? "success" : "failure") + ".");
-            } else {
-                Log.i(TAG, "Put " + String.valueOf(s) + " to [" + layerUUIDs + "] success.");
-            }
-
-            removeChildLayerPolicies(layerUUIDs);
+            Log.i(TAG, "Update " + String.valueOf(choice) + " to [" + id + "] " + (count == 1 ? "success" : "failure") + ".");
+        } else {
+            Log.i(TAG, "Put " + String.valueOf(choice) + " to [" + id + "] success.");
         }
     }
 
     @Override
-    public List<Integer> get(List<String> layerUUIDs) {
-        return get(BaseUtils.stringList2ArrayString(layerUUIDs));
-    }
-
-    private List<Integer> get(String UUIDs) {
-        try (Cursor cursor = mContentResolver.query(
-                PrivacyPolicyContract.PolicyEntry.CONTENT_URI,
+    public String get(Integer id) {
+        String result = null;
+        try (Cursor cursor = mContentResolver.query(PrivacyPolicyContract.PolicyEntry.CONTENT_URI,
                 PRIVACY_POLICY_PROJECTION,
-                PrivacyPolicyContract.getSqlSelectForMACAndUUIDsOnwards(),
-                new String[]{mTargetDeviceMAC, UUIDs},
-                PrivacyPolicyContract.PolicyEntry.COLUMN_UUIDs + " ASC")) {
-
-            List<Integer> targets = new LinkedList<>();
-            Set<Integer> targetSet = new HashSet<>();
-            if (cursor != null && cursor.getCount() > 0) {
+                PrivacyPolicyContract.PolicyEntry.COLUMN_MAC + " = ? " + " AND " +
+                        PrivacyPolicyContract.PolicyEntry.COLUMN_POLICY + " = ? ",
+                new String[]{mTargetDeviceMAC, String.valueOf(id)},
+                null)) {
+            if (cursor != null && cursor.getCount() == 1) {
                 cursor.moveToFirst();
-                do {
-                    String target = cursor.getString(INDEX_POLICY_PREFERENCE);
-                    Log.i(TAG, "Get [" + UUIDs + "] -> [" + String.valueOf(target) + "]");
-                    if (target == null) return null;
-                    targetSet.add(Integer.valueOf(target));
-                } while (cursor.moveToNext());
-            }
-            targetSet.addAll(getChildLayerPolicies(UUIDs));
-            targets.addAll(targetSet);
-            Log.i(TAG, "Get [" + UUIDs + "] -> null");
-            return targets;
-        }
-    }
-
-    private List<Integer> getChildLayerPolicies(String layerUUIDs) {
-        List<Integer> selections = new LinkedList<>();
-        List<Integer> selectionSet = new LinkedList<>();
-        List<String> subUUIDs = getRelatedUUIDs(true, layerUUIDs);
-        for (String subUUID : subUUIDs) {
-            List<Integer> subSelections = get(subUUID);
-            if (subSelections != null)
-                selectionSet.addAll(subSelections);
-        }
-        selections.addAll(selectionSet);
-        return selections;
-    }
-
-    private List<String> getRelatedUUIDs(boolean isLower, String UUIDs) {
-        List<String> UUIDList = new LinkedList<>();
-        if (isLower) {
-            try (Cursor cursor = mContentResolver.query(
-                    PrivacyPolicyContract.PolicyEntry.CONTENT_URI,
-                    PRIVACY_POLICY_PROJECTION,
-                    PrivacyPolicyContract.getSqlSelectForMACAndRelatedUUIDsOnwards(),
-                    new String[]{mTargetDeviceMAC, UUIDs + "_%"},
-                    PrivacyPolicyContract.PolicyEntry.COLUMN_UUIDs + " ASC")) {
-                if (cursor != null)
-                    while (cursor.moveToNext()) {
-                        String targetUUIDs = cursor.getString(INDEX_POLICY_UUIDs);
-                        UUIDList.add(targetUUIDs);
-                    }
-            }
-        } else {
-            if (UUIDs.contains(", ")) {
-                UUIDs = UUIDs.substring(0, UUIDs.lastIndexOf(", "));
-                try (Cursor cursor = mContentResolver.query(
-                        PrivacyPolicyContract.PolicyEntry.CONTENT_URI,
-                        PRIVACY_POLICY_PROJECTION,
-                        PrivacyPolicyContract.getSqlSelectForMACAndRelatedUUIDsOnwards(),
-                        new String[]{mTargetDeviceMAC, "%" + UUIDs},
-                        PrivacyPolicyContract.PolicyEntry.COLUMN_UUIDs + " ASC")) {
-                    if (cursor != null)
-                        while (cursor.moveToNext()) {
-                            String targetUUIDs = cursor.getString(INDEX_POLICY_UUIDs);
-                            UUIDList.add(targetUUIDs);
-                        }
-                }
+                result = cursor.getString(INDEX_POLICY_PREFERENCE);
             }
         }
-        return UUIDList;
+        return result;
     }
 
 }
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/storage/StorageInterface.java b/app/src/main/java/org/prlab/idic/privacypolicy/storage/StorageInterface.java
index 47431291fc8fde7ddab261fd7bca8ecf97a25c13..1321fdac284ce76644c27c4ae064b1cf2894c5d2 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/storage/StorageInterface.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/storage/StorageInterface.java
@@ -5,12 +5,12 @@ import java.util.List;
 /**
  * Created by IDIC on 2017/2/15.
  */
-interface StorageInterface<Result, Key> {
+interface StorageInterface<Key, Result> {
 
-    StorageInterface remove(List<Key> layerUUIDs);
+    StorageInterface decline(Key id);
 
-    StorageInterface put(List<Result> choices, List<Key> layerUUIDs);
+    StorageInterface accept(Key id);
 
-    List<Result> get(List<Key> layerUUIDs);
+    Result get(Key id);
 
 }
diff --git a/app/src/main/java/org/prlab/idic/privacypolicy/tool/BaseUtils.java b/app/src/main/java/org/prlab/idic/privacypolicy/tool/BaseUtils.java
index 998e4b707d0d40110f1227f3ec0ce263dd2bcb1e..0c8b0b2045f685fe8ebd921f201ed048387ce481 100644
--- a/app/src/main/java/org/prlab/idic/privacypolicy/tool/BaseUtils.java
+++ b/app/src/main/java/org/prlab/idic/privacypolicy/tool/BaseUtils.java
@@ -1,11 +1,9 @@
 package org.prlab.idic.privacypolicy.tool;
 
-import org.prlab.idic.privacypolicy.pojo.report.Layer;
 import org.prlab.idic.privacypolicy.pojo.report.p3p.Remedy;
 
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
-import java.util.LinkedList;
 import java.util.List;
 
 /**
@@ -41,18 +39,18 @@ public class BaseUtils {
         return bite & 0xFF;
     }
 
-    public static String convertRemedies2String(List<Remedy> enums) {
-        if (enums.size() <= 0) return "";
+    private static final String SPLIT_STRING = ", ";
+
+    public static String convertRemedies2String(List<Remedy> remedies) {
+        if (remedies.size() <= 0) return "";
         StringBuilder builder = new StringBuilder();
-        for (Enum e : enums) {
-            builder.append(e.name()).append(", ");
+        for (Remedy remedy : remedies) {
+            builder.append(remedy.getType().name()).append(SPLIT_STRING);
         }
         builder.delete(builder.length() - 2, builder.length());
         return builder.toString();
     }
 
-    private static final String SPLIT_STRING = ", ";
-
     public static List<String> arrayString2stringArray(String arrayString) {
         return BaseUtils.arrayString2objectArray(arrayString, new BaseUtils.ObjectConverter<String>() {
                     @Override
@@ -116,14 +114,6 @@ public class BaseUtils {
         return builder.toString();
     }
 
-    public static List<String> layer2UUID(List<Layer> layers) {
-        List<String> UUIDs = new LinkedList<>();
-        if (null == layers || layers.isEmpty()) return UUIDs;
-        for (Layer layer : layers)
-            UUIDs.add(layer.getUUID());
-        return UUIDs;
-    }
-
     public static byte[] int2Bytes(int i) {
         return ByteBuffer.allocate(4).putInt(i).array();
     }
diff --git a/app/src/main/res/drawable/ic_arrow_drop_down_black_24dp.xml b/app/src/main/res/drawable/ic_arrow_drop_down_black_24dp.xml
new file mode 100644
index 0000000000000000000000000000000000000000..079927edd6fe24b79bfc0f32436a448501697819
--- /dev/null
+++ b/app/src/main/res/drawable/ic_arrow_drop_down_black_24dp.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="@color/colorPrimaryDark"
+        android:pathData="M7,10l5,5 5,-5z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_arrow_drop_up_black_24dp.xml b/app/src/main/res/drawable/ic_arrow_drop_up_black_24dp.xml
new file mode 100644
index 0000000000000000000000000000000000000000..50f8b94c78feb12d52ff54dbbc10c25eb68dd0fb
--- /dev/null
+++ b/app/src/main/res/drawable/ic_arrow_drop_up_black_24dp.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="24dp"
+        android:height="24dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:fillColor="@color/colorPrimaryDark"
+        android:pathData="M7,14l5,-5 5,5z"/>
+</vector>
diff --git a/app/src/main/res/layout/actiivty_dialog_device_info.xml b/app/src/main/res/layout/actiivty_dialog_device_info.xml
index 1d06b1c4c47321cfe1419e2e10d1fbd028624edd..c0b575131e05d0990b2623020848abf27de8e02c 100644
--- a/app/src/main/res/layout/actiivty_dialog_device_info.xml
+++ b/app/src/main/res/layout/actiivty_dialog_device_info.xml
@@ -4,36 +4,21 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:layout_margin="@dimen/activity_horizontal_margin"
     android:orientation="vertical">
 
-    <Button
-        android:layout_centerHorizontal="true"
-        android:layout_alignParentBottom="true"
-        android:id="@+id/button_device_back"
-        android:layout_width="@dimen/button_width_size"
-        android:layout_height="@dimen/item_size"
-        android:layout_gravity="center"
-        android:layout_marginBottom="@dimen/median_size"
-        android:layout_marginTop="@dimen/median_size"
-        android:onClick="onBackButtonClick"
-        android:text="@string/message_back"
-        android:textSize="@dimen/font_bigger_size" />
-
-
     <android.support.v7.widget.RecyclerView
-        android:layout_above="@id/button_device_back"
         android:id="@+id/layout_device_info"
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
+        android:layout_height="wrap_content"
         app:layoutManager="android.support.v7.widget.LinearLayoutManager"
         tools:listitem="@layout/recycler_view_item_horizontally" />
 
     <android.support.v7.widget.RecyclerView
-        android:layout_above="@id/button_device_back"
         android:id="@+id/layout_device_icon"
+        android:layout_below="@+id/layout_device_info"
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:visibility="gone"
+        android:layout_height="wrap_content"
         app:layoutManager="android.support.v7.widget.LinearLayoutManager"
         tools:listitem="@layout/recycler_view_icon" />
 
diff --git a/app/src/main/res/layout/activity_dialog_policy.xml b/app/src/main/res/layout/activity_dialog_policy.xml
deleted file mode 100644
index b67ffcf6ba5c1b98bc8d240f7463c147b02289ba..0000000000000000000000000000000000000000
--- a/app/src/main/res/layout/activity_dialog_policy.xml
+++ /dev/null
@@ -1,127 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:tools="http://schemas.android.com/tools"
-        xmlns:app="http://schemas.android.com/apk/res-auto"
-        android:layout_marginStart="@dimen/activity_horizontal_margin"
-        android:layout_marginEnd="@dimen/activity_horizontal_margin"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent">
-
-    <LinearLayout
-            android:layout_alignParentBottom="true"
-            android:id="@+id/layout_policy_choose_buttons"
-            android:gravity="center"
-            android:orientation="horizontal"
-            android:paddingTop="@dimen/small_size"
-            android:paddingBottom="@dimen/small_size"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content">
-
-        <Button
-                android:text="@string/message_agree"
-                android:layout_marginStart="@dimen/activity_horizontal_margin"
-                android:layout_marginEnd="@dimen/activity_horizontal_margin"
-                android:onClick="onAgreeButtonClick"
-                android:textSize="@dimen/font_bigger_size"
-                android:layout_width="@dimen/button_width_size"
-                android:layout_height="@dimen/item_size"/>
-
-        <Button
-                android:text="@string/message_deny"
-                android:layout_marginStart="@dimen/activity_horizontal_margin"
-                android:layout_marginEnd="@dimen/activity_horizontal_margin"
-                android:onClick="onDenyButtonClick"
-                android:textSize="@dimen/font_bigger_size"
-                android:layout_width="@dimen/button_width_size"
-                android:layout_height="@dimen/item_size"/>
-
-    </LinearLayout>
-
-    <ScrollView
-            android:layout_alignParentTop="true"
-            android:layout_above="@id/layout_policy_choose_buttons"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content">
-
-        <LinearLayout
-                android:orientation="vertical"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content">
-
-            <TextView
-                    android:text="@string/policy_statement_collector_title"
-                    android:gravity="center_vertical"
-                    android:textSize="@dimen/font_bigger_size"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"/>
-
-            <android.support.v7.widget.RecyclerView
-                    android:id="@+id/recycler_view_statement_collector"
-                    app:layoutManager="android.support.v7.widget.LinearLayoutManager"
-                    tools:listitem="@layout/recycler_view_item_horizontally"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"/>
-
-            <View
-                    android:background="@color/colorSeparator"
-                    android:layout_width="match_parent"
-                    android:layout_height="1dp"/>
-
-            <TextView
-                    android:text="@string/policy_statement_access_title"
-                    android:gravity="center_vertical"
-                    android:textSize="@dimen/font_bigger_size"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"/>
-
-            <TextView
-                    android:layout_marginTop="@dimen/small_size"
-                    android:id="@+id/recycler_view_statement_access"
-                    android:gravity="center"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"/>
-
-            <View
-                    android:background="@color/colorSeparator"
-                    android:layout_width="match_parent"
-                    android:layout_height="1dp"/>
-
-            <TextView
-                    android:text="@string/policy_statement_dispute_title"
-                    android:gravity="center_vertical"
-                    android:textSize="@dimen/font_bigger_size"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"/>
-
-            <android.support.v7.widget.RecyclerView
-                    android:id="@+id/recycler_view_statement_dispute"
-                    app:layoutManager="android.support.v7.widget.LinearLayoutManager"
-                    tools:listitem="@layout/recycler_view_item_horizontally"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"/>
-
-            <View
-                    android:background="@color/colorSeparator"
-                    android:layout_width="match_parent"
-                    android:layout_height="1dp"/>
-
-            <TextView
-                    android:text="@string/policy_statement_title"
-                    android:gravity="center_vertical"
-                    android:textSize="@dimen/font_bigger_size"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"/>
-
-            <android.support.v7.widget.RecyclerView
-                    app:layoutManager="android.support.v7.widget.LinearLayoutManager"
-                    tools:listitem="@layout/recycler_view_statement"
-                    android:id="@+id/recycler_view_statement_content"
-                    android:layout_width="match_parent"
-                    android:layout_height="wrap_content"/>
-
-        </LinearLayout>
-
-    </ScrollView>
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_report.xml b/app/src/main/res/layout/activity_report.xml
index a67d6bbbc88d030de76e73f341587715852cd9c9..f104bf43a839b516e2276e9c7cf1b825540ae1a8 100644
--- a/app/src/main/res/layout/activity_report.xml
+++ b/app/src/main/res/layout/activity_report.xml
@@ -1,109 +1,57 @@
 <?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout
-        xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"
-        android:layout_margin="@dimen/activity_horizontal_margin"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        xmlns:tools="http://schemas.android.com/tools">
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_margin="@dimen/activity_horizontal_margin"
+    android:orientation="vertical">
 
     <TextView
-            android:id="@+id/text_report_title"
-            android:text="@string/policy_information_title"
-            android:gravity="center_vertical"
-            android:textSize="@dimen/font_bigger_size"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"/>
-
-    <LinearLayout
-            android:layout_below="@id/text_report_title"
-            android:id="@+id/layout_report_info"
-            android:orientation="vertical"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content">
-
-        <include
-                android:id="@+id/item_report_version"
-                layout="@layout/item_key_value_horizontally"/>
-
-        <include
-                android:id="@+id/item_report_description"
-                layout="@layout/item_key_value_horizontally"/>
-
-    </LinearLayout>
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center_vertical"
+        android:text="@string/policy_information_title"
+        android:textSize="@dimen/font_bigger_size" />
 
-    <Button
-            android:id="@+id/button_report_device"
-            android:onClick="onDeviceInfoButtonClicked"
-            android:layout_below="@id/layout_report_info"
-            android:text="@string/policy_report_device_information"
-            android:textSize="@dimen/font_middle_size"
-            android:layout_marginStart="@dimen/activity_horizontal_margin"
-            android:layout_marginEnd="@dimen/activity_horizontal_margin"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"/>
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/recycler_view_report_description"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:layoutManager="android.support.v7.widget.LinearLayoutManager"
+        tools:listitem="@layout/recycler_view_item_horizontally" />
 
     <Button
-            android:id="@+id/button_report_back"
-            android:onClick="onBackButtonClicked"
-            android:visibility="gone"
-            android:layout_alignParentBottom="true"
-            android:text="@string/message_back"
-            android:layout_marginStart="@dimen/activity_horizontal_margin"
-            android:layout_marginEnd="@dimen/activity_horizontal_margin"
-            android:textSize="@dimen/font_bigger_size"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"/>
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginEnd="@dimen/activity_horizontal_margin"
+        android:layout_marginStart="@dimen/activity_horizontal_margin"
+        android:onClick="onDeviceInfoButtonClicked"
+        android:text="@string/policy_report_device_information"
+        android:textSize="@dimen/font_middle_size" />
 
     <LinearLayout
-            android:orientation="vertical"
-            android:layout_below="@id/button_report_device"
-            android:layout_above="@id/button_report_back"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content">
-
-        <TextView
-                android:layout_marginTop="@dimen/median_size"
-                android:text="@string/message_collect_data"
-                android:id="@+id/text_report_policies_title"
-                android:gravity="center_vertical"
-                android:textSize="@dimen/font_bigger_size"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"/>
-
-        <Button
-                android:id="@+id/button_report_reset"
-                android:text="@string/message_reset"
-                android:textSize="@dimen/font_middle_size"
-                android:layout_marginStart="@dimen/activity_horizontal_margin"
-                android:layout_marginEnd="@dimen/activity_horizontal_margin"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"/>
-
-        <android.support.v7.widget.RecyclerView
-                tools:listitem="@layout/recycler_view_item"
-                app:layoutManager="android.support.v7.widget.LinearLayoutManager"
-                android:id="@+id/recycler_view_report_policies"
-                android:layout_width="match_parent"
-                android:layout_weight="1"
-                android:layout_height="0dp"/>
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
 
         <TextView
-                android:layout_marginTop="@dimen/median_size"
-                android:text="@string/message_more_detail"
-                android:id="@+id/text_report_child_layers_title"
-                android:gravity="center_vertical"
-                android:textSize="@dimen/font_bigger_size"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"/>
+            android:id="@+id/text_report_policies_title"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/median_size"
+            android:gravity="center_vertical"
+            android:text="@string/message_collect_data"
+            android:textSize="@dimen/font_bigger_size" />
 
         <android.support.v7.widget.RecyclerView
-                tools:listitem="@layout/recycler_view_item"
-                app:layoutManager="android.support.v7.widget.LinearLayoutManager"
-                android:id="@+id/recycler_view_report_child_layers"
-                android:layout_weight="1"
-                android:layout_width="match_parent"
-                android:layout_height="0dp"/>
+            android:id="@+id/recycler_view_report_policies"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="1"
+            app:layoutManager="android.support.v7.widget.LinearLayoutManager"
+            tools:listitem="@layout/recycler_view_policy" />
 
     </LinearLayout>
 
-</RelativeLayout>
\ No newline at end of file
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_key_value_horizontally.xml b/app/src/main/res/layout/item_key_value_horizontally.xml
deleted file mode 100644
index 9ad5a69de9cc281be1a48a19dc2c91d4b1b43d33..0000000000000000000000000000000000000000
--- a/app/src/main/res/layout/item_key_value_horizontally.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:tools="http://schemas.android.com/tools"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content">
-
-    <TextView
-            tools:text="key"
-            android:gravity="center"
-            android:layout_alignParentStart="true"
-            android:layout_centerVertical="true"
-            android:id="@+id/text_key"
-            android:textSize="@dimen/font_middle_size"
-            android:minHeight="@dimen/small_item_size"
-            android:layout_width="@dimen/text_key_size"
-            android:layout_height="wrap_content"/>
-
-    <TextView
-            tools:text="value"
-            android:layout_centerVertical="true"
-            android:gravity="center_vertical"
-            android:id="@+id/text_value"
-            android:layout_marginStart="@dimen/median_size"
-            android:layout_toEndOf="@id/text_key"
-            android:layout_alignParentEnd="true"
-            android:textSize="@dimen/font_middle_size"
-            android:minHeight="@dimen/small_item_size"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"/>
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_key_value_horizontally_left.xml b/app/src/main/res/layout/item_key_value_horizontally_left.xml
deleted file mode 100644
index c63ab6d17e595888b877a35f8dd8ae60306750c3..0000000000000000000000000000000000000000
--- a/app/src/main/res/layout/item_key_value_horizontally_left.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-                xmlns:tools="http://schemas.android.com/tools"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content">
-
-    <TextView
-            android:layout_marginStart="@dimen/activity_vertical_margin"
-            android:layout_marginEnd="@dimen/activity_vertical_margin"
-            tools:text="key"
-            android:gravity="center_vertical"
-            android:layout_alignParentStart="true"
-            android:id="@+id/text_key"
-            android:textSize="@dimen/font_normal_size"
-            android:minHeight="@dimen/small_item_size"
-            android:layout_width="@dimen/text_key_size"
-            android:layout_height="wrap_content"/>
-
-    <TextView
-            tools:text="value"
-            android:gravity="center_vertical"
-            android:id="@+id/text_value"
-            android:layout_marginStart="@dimen/median_size"
-            android:layout_toEndOf="@id/text_key"
-            android:layout_alignParentEnd="true"
-            android:textSize="@dimen/font_normal_size"
-            android:minHeight="@dimen/small_item_size"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"/>
-
-</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/recycler_view_child_policies.xml b/app/src/main/res/layout/recycler_view_child_policies.xml
deleted file mode 100644
index 82757b7ee1dc5818f436bec2497b4f858fabe13b..0000000000000000000000000000000000000000
--- a/app/src/main/res/layout/recycler_view_child_policies.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
-              android:orientation="vertical"
-              android:layout_width="match_parent"
-              android:layout_height="wrap_content">
-
-    <Button
-            tools:text="12345678-1234-1234-1234-12345678"
-            android:layout_marginStart="@dimen/activity_horizontal_margin"
-            android:layout_marginEnd="@dimen/activity_horizontal_margin"
-            android:id="@+id/button_child_policy"
-            android:textSize="@dimen/font_normal_size"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"/>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/recycler_view_item.xml b/app/src/main/res/layout/recycler_view_item.xml
deleted file mode 100644
index 6dd135971f52bc3e036a16ef8eb40fb187effc77..0000000000000000000000000000000000000000
--- a/app/src/main/res/layout/recycler_view_item.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
-              android:orientation="vertical"
-              android:layout_marginStart="@dimen/activity_horizontal_margin"
-              android:layout_marginEnd="@dimen/activity_horizontal_margin"
-              android:layout_width="match_parent"
-              android:layout_height="wrap_content">
-
-    <Button
-            tools:text="111111111111-1111-1111-1111-111111111111111111"
-            android:gravity="center"
-            android:id="@+id/button_item"
-            android:textSize="@dimen/font_middle_size"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"/>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/recycler_view_item_horizontally.xml b/app/src/main/res/layout/recycler_view_item_horizontally.xml
index 5672e74b329750b04d2263ce3c21793511d0bad1..479e6300c070be1453bd3545042b468bf417c3c6 100644
--- a/app/src/main/res/layout/recycler_view_item_horizontally.xml
+++ b/app/src/main/res/layout/recycler_view_item_horizontally.xml
@@ -1,11 +1,34 @@
 <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-                android:layout_marginTop="@dimen/small_size"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content">
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
 
-    <include
-            android:id="@+id/item_info"
-            layout="@layout/item_key_value_horizontally"/>
+    <TextView
+        android:id="@+id/text_key"
+        android:layout_width="@dimen/text_key_size"
+        android:layout_height="wrap_content"
+        android:layout_alignParentStart="true"
+        android:layout_centerVertical="true"
+        android:layout_marginEnd="@dimen/activity_empty_margin"
+        android:layout_marginStart="@dimen/activity_horizontal_margin"
+        android:gravity="center_vertical|start"
+        android:minHeight="@dimen/small_item_size"
+        android:textSize="@dimen/font_middle_size"
+        tools:text="key" />
+
+    <TextView
+        android:id="@+id/text_value"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentEnd="true"
+        android:layout_centerVertical="true"
+        android:layout_marginEnd="@dimen/activity_horizontal_margin"
+        android:layout_marginStart="@dimen/activity_horizontal_margin"
+        android:layout_toEndOf="@id/text_key"
+        android:gravity="center_vertical"
+        android:minHeight="@dimen/small_item_size"
+        android:textSize="@dimen/font_middle_size"
+        tools:text="value" />
 
 </RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/recycler_view_policy.xml b/app/src/main/res/layout/recycler_view_policy.xml
new file mode 100644
index 0000000000000000000000000000000000000000..81f1b51ad491b742fa50f73d3cded1bbd073526e
--- /dev/null
+++ b/app/src/main/res/layout/recycler_view_policy.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical">
+
+    <RelativeLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="@dimen/median_size"
+        android:layout_marginEnd="@dimen/activity_horizontal_margin"
+        android:layout_marginStart="@dimen/activity_horizontal_margin"
+        android:layout_marginTop="@dimen/median_size">
+
+        <Switch
+            android:id="@+id/switch_policy_accept"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentEnd="true"
+            android:gravity="center" />
+
+        <ImageView
+            android:src="@drawable/ic_arrow_drop_up_black_24dp"
+            android:id="@+id/image_view_policy_scaled"
+            android:layout_width="@dimen/small_item_size"
+            android:layout_height="@dimen/small_item_size"
+            android:layout_alignParentEnd="true"
+            android:layout_alignParentBottom="true"
+            android:layout_below="@id/switch_policy_accept"/>
+
+        <TextView
+            android:id="@+id/text_policy_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentStart="true"
+            android:layout_toStartOf="@id/switch_policy_accept"
+            android:textColor="@color/colorText"
+            android:textSize="@dimen/font_bigger_size"
+            android:textStyle="bold"
+            tools:text="Policy1" />
+
+        <TextView
+            android:id="@+id/text_policy_description"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@id/text_policy_title"
+            android:layout_toStartOf="@id/switch_policy_accept"
+            android:textSize="@dimen/font_middle_size"
+            tools:text="Description" />
+
+    </RelativeLayout>
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/recycler_view_policy_content"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="@dimen/median_size"
+        android:layout_marginEnd="@dimen/activity_horizontal_margin"
+        android:layout_marginStart="@dimen/activity_horizontal_margin"
+        android:layout_marginTop="@dimen/activity_empty_margin"
+        android:visibility="gone"
+        app:layoutManager="android.support.v7.widget.LinearLayoutManager"
+        tools:listitem="@layout/recycler_view_item_horizontally" />
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="@dimen/line_size"
+        android:background="@color/colorSeparator" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/recycler_view_policy_content.xml b/app/src/main/res/layout/recycler_view_policy_content.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a0580f053e9dd0efe0bc22c85f6bccfe278de32b
--- /dev/null
+++ b/app/src/main/res/layout/recycler_view_policy_content.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginTop="@dimen/activity_empty_margin">
+
+    <TextView
+        android:id="@+id/text_key"
+        android:layout_width="@dimen/text_key_size"
+        android:layout_height="wrap_content"
+        android:layout_alignParentStart="true"
+        android:layout_centerVertical="true"
+        android:gravity="center_vertical|start"
+        android:textSize="@dimen/font_normal_size"
+        tools:text="key" />
+
+    <TextView
+        android:id="@+id/text_value"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentEnd="true"
+        android:layout_centerVertical="true"
+        android:layout_marginStart="@dimen/median_size"
+        android:layout_marginEnd="@dimen/activity_empty_margin"
+        android:layout_toEndOf="@id/text_key"
+        android:gravity="center_vertical"
+        android:textSize="@dimen/font_normal_size"
+        tools:text="value" />
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/recycler_view_statement.xml b/app/src/main/res/layout/recycler_view_statement.xml
deleted file mode 100644
index f749f3b152255338be78b628bf463fae536e1d2b..0000000000000000000000000000000000000000
--- a/app/src/main/res/layout/recycler_view_statement.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<ScrollView
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:tools="http://schemas.android.com/tools"
-        xmlns:app="http://schemas.android.com/apk/res-auto"
-        android:layout_marginStart="@dimen/activity_horizontal_margin"
-        android:layout_marginEnd="@dimen/activity_horizontal_margin"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content">
-
-    <LinearLayout
-            android:orientation="vertical"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content">
-
-        <TextView
-                android:text="@string/policy_statement_consequence_title"
-                android:gravity="center_vertical"
-                android:textSize="@dimen/font_middle_size"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"/>
-
-        <TextView
-                android:layout_marginTop="@dimen/small_size"
-                android:layout_marginStart="@dimen/activity_horizontal_margin"
-                android:layout_marginEnd="@dimen/activity_horizontal_margin"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:id="@+id/recycler_view_statement_related_uuid"/>
-
-        <View
-                android:background="@color/colorSeparator"
-                android:layout_width="match_parent"
-                android:layout_height="1dp"/>
-
-        <TextView
-                android:text="@string/policy_statement_purpose_title"
-                android:gravity="center_vertical"
-                android:textSize="@dimen/font_middle_size"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"/>
-
-        <android.support.v7.widget.RecyclerView
-                android:id="@+id/recycler_view_statement_purposes"
-                app:layoutManager="android.support.v7.widget.LinearLayoutManager"
-                tools:listitem="@layout/recycler_view_item_horizontally"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"/>
-
-        <View
-                android:background="@color/colorSeparator"
-                android:layout_width="match_parent"
-                android:layout_height="1dp"/>
-
-        <TextView
-                android:text="@string/policy_statement_data_title"
-                android:gravity="center_vertical"
-                android:textSize="@dimen/font_middle_size"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"/>
-
-        <android.support.v7.widget.RecyclerView
-                android:id="@+id/recycler_view_statement_data"
-                app:layoutManager="android.support.v7.widget.LinearLayoutManager"
-                tools:listitem="@layout/recycler_view_item_horizontally"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"/>
-
-        <View
-                android:background="@color/colorSeparator"
-                android:layout_width="match_parent"
-                android:layout_height="1dp"/>
-
-        <TextView
-                android:text="@string/policy_statement_remedies"
-                android:gravity="center_vertical"
-                android:textSize="@dimen/font_middle_size"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"/>
-
-        <TextView
-                tools:text="123"
-                android:gravity="center"
-                android:layout_marginStart="@dimen/activity_horizontal_margin"
-                android:layout_marginEnd="@dimen/activity_horizontal_margin"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:id="@+id/text_statement_remedies"/>
-
-        <View
-                android:background="@color/colorSeparator"
-                android:layout_width="match_parent"
-                android:layout_height="1dp"/>
-
-        <TextView
-                android:text="@string/policy_statement_recipient_title"
-                android:gravity="center_vertical"
-                android:textSize="@dimen/font_middle_size"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"/>
-
-        <android.support.v7.widget.RecyclerView
-                android:id="@+id/recycler_view_statement_recipients"
-                app:layoutManager="android.support.v7.widget.LinearLayoutManager"
-                tools:listitem="@layout/recycler_view_item_horizontally"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"/>
-
-        <View
-                android:background="@color/colorSeparator"
-                android:layout_width="match_parent"
-                android:layout_height="1dp"/>
-
-        <TextView
-                android:text="@string/policy_statement_retention"
-                android:gravity="center_vertical"
-                android:textSize="@dimen/font_middle_size"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"/>
-
-        <TextView
-                android:layout_marginTop="@dimen/small_size"
-                android:gravity="center"
-                android:layout_marginStart="@dimen/activity_horizontal_margin"
-                android:layout_marginEnd="@dimen/activity_horizontal_margin"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:id="@+id/text_statement_retention"/>
-
-        <View
-                android:background="@color/colorSeparator"
-                android:layout_width="match_parent"
-                android:layout_height="1dp"/>
-
-    </LinearLayout>
-
-</ScrollView>
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index c19ceeaf756d87df67819f947fa9aa7560c3922c..583aa4204f05363474bb59174f06dba1273090ec 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -5,6 +5,7 @@
     <color name="colorPrimaryLight">#7484ea</color>
     <color name="colorAccent">#FF4081</color>
     <color name="colorSeparator">#898989</color>
+    <color name="colorAnother">#e5eaff</color>
     <color name="colorImplicit">#4c9737</color>
     <color name="colorObvious">#ffffff</color>
     <color name="colorText">#000000</color>
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 2026a966e465fe3bfad20c85ccda50a25bff6ef9..d7cfaa6d25aea1074d413e5f850be8912c525053 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -1,11 +1,14 @@
 <resources>
     <!-- Default screen margins, per the Android Design guidelines. -->
+    <dimen name="activity_empty_margin">0dp</dimen>
     <dimen name="activity_horizontal_margin">16dp</dimen>
     <dimen name="activity_vertical_margin">16dp</dimen>
+    <dimen name="line_size">1dp</dimen>
     <dimen name="small_size">5dp</dimen>
     <dimen name="median_size">8dp</dimen>
     <dimen name="item_size">50sp</dimen>
     <dimen name="item_double_size">60sp</dimen>
+    <dimen name="middle_item_size">40sp</dimen>
     <dimen name="small_item_size">30sp</dimen>
     <dimen name="font_bigger_size">20sp</dimen>
     <dimen name="font_middle_size">16sp</dimen>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e0963d62b8feb44aad241110fd1e118d46bf1718..b43ebb2b0a9b07391a9376ec3ae49b59ed0b9726 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -37,7 +37,7 @@
     <string name="bluetooth_not_bonded">NOT BONDED</string>
 
     <string name="get_policy_url"
-        translatable="false">http://192.168.0.157:4567/policy.json</string>
+        translatable="false">http://192.168.0.157:8080/policy.json</string>
     <string name="get_policy_id_parameter_key"
         translatable="false">id</string>
 
@@ -71,15 +71,21 @@
     <string name="device_upc_key"
         translatable="false">UPC</string>
 
-    <string name="policy_statement_collector_title">Collector</string>
-    <string name="policy_statement_dispute_title">Dispute</string>
+    <string name="policy_separator">&#160;</string>
+
+    <string name="policy_collector_title">Collector</string>
+    <string name="policy_dispute_title">Dispute</string>
+
     <string name="policy_statement_recipient_title">Recipient</string>
     <string name="policy_statement_purpose_title">Purpose</string>
     <string name="policy_statement_data_title">Data</string>
 
-    <string name="policy_statement_collector_name">Name</string>
-    <string name="policy_statement_collector_phone">Phone</string>
-    <string name="policy_statement_collector_email">Email</string>
+    <string name="policy_dispute_related_organization">Organization</string>
+    <string name="policy_dispute_resolution_type">Type</string>
+
+    <string name="policy_collector_name">Name</string>
+    <string name="policy_collector_phone">Phone</string>
+    <string name="policy_collector_email">Email</string>
 
     <string name="policy_statement_data_type">Type</string>
     <string name="policy_statement_data_description">Description</string>
@@ -90,11 +96,8 @@
     <string name="policy_statement_recipient_type">Type</string>
     <string name="policy_statement_recipient_description">Description</string>
 
-    <string name="policy_statement_dispute_related_organization">Organization</string>
-    <string name="policy_statement_dispute_resolution_type">Type</string>
-
     <string name="policy_statement_consequence_title">Consequence</string>
-    <string name="policy_statement_access_title">Access</string>
+    <string name="policy_access_title">Access</string>
     <string name="policy_statement_remedies">Remedies</string>
     <string name="policy_statement_title">Statement</string>
     <string name="policy_statement_retention">Retention</string>
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 5885930df6d10edf3d6df40d6556297d11f953da..934ba37abf4bce8a044a44a4ec2216ef4579bef5 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -8,4 +8,6 @@
         <item name="colorAccent">@color/colorAccent</item>
     </style>
 
+    <style name="AppDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert"/>
+
 </resources>