diff --git a/storaged/include/storaged.h b/storaged/include/storaged.h
index edaa32f..e5dd70d 100644
--- a/storaged/include/storaged.h
+++ b/storaged/include/storaged.h
@@ -84,12 +84,11 @@
     sp<android::hardware::health::V2_0::IHealth> health;
     unique_ptr<storage_info_t> storage_info;
     static const uint32_t crc_init;
-    unordered_map<int, storaged_proto::StoragedProto> protos;
-    Mutex proto_mutex;
-    void load_proto_locked(userid_t user_id);
-    void prepare_proto(StoragedProto* proto, userid_t user_id);
-    void flush_proto_locked(userid_t user_id);
-    void flush_proto_user_system_locked(StoragedProto* proto);
+    unordered_map<userid_t, bool> proto_loaded;
+    void load_proto(userid_t user_id);
+    void prepare_proto(userid_t user_id, StoragedProto* proto);
+    void flush_proto(userid_t user_id, StoragedProto* proto);
+    void flush_proto_user_system(StoragedProto* proto);
     string proto_path(userid_t user_id) {
         return string("/data/misc_ce/") + to_string(user_id) +
                "/storaged/storaged.proto";
@@ -116,7 +115,7 @@
 
     map<uint64_t, struct uid_records> get_uid_records(
             double hours, uint64_t threshold, bool force_report) {
-        return mUidm.dump(hours, threshold, force_report, &protos);
+        return mUidm.dump(hours, threshold, force_report);
     }
 
     void update_uid_io_interval(int interval) {
@@ -135,7 +134,7 @@
 
     void report_storage_info();
 
-    void flush_protos();
+    void flush_protos(unordered_map<int, StoragedProto>* protos);
 };
 
 // Eventlog tag
diff --git a/storaged/include/storaged_uid_monitor.h b/storaged/include/storaged_uid_monitor.h
index 6310ae4..3a718fa 100644
--- a/storaged/include/storaged_uid_monitor.h
+++ b/storaged/include/storaged_uid_monitor.h
@@ -111,8 +111,7 @@
     unordered_map<uint32_t, uid_info> get_uid_io_stats();
     // called by dumpsys
     map<uint64_t, struct uid_records> dump(
-        double hours, uint64_t threshold, bool force_report,
-        unordered_map<int, StoragedProto>* protos);
+        double hours, uint64_t threshold, bool force_report);
     // called by battery properties listener
     void set_charger_state(charger_stat_t stat);
     // called by storaged periodic_chore or dump with force_report
@@ -120,6 +119,7 @@
     void report(unordered_map<int, StoragedProto>* protos);
     // restores io_history from protobuf
     void load_uid_io_proto(const UidIOUsage& proto);
+    void clear_user_history(userid_t user_id);
 };
 
 #endif /* _STORAGED_UID_MONITOR_H_ */
diff --git a/storaged/storaged.cpp b/storaged/storaged.cpp
index e5130c3..915c095 100644
--- a/storaged/storaged.cpp
+++ b/storaged/storaged.cpp
@@ -165,19 +165,17 @@
 }
 
 void storaged_t::add_user_ce(userid_t user_id) {
-    Mutex::Autolock _l(proto_mutex);
-    protos.insert({user_id, {}});
-    load_proto_locked(user_id);
-    protos[user_id].set_loaded(1);
+    load_proto(user_id);
+    proto_loaded[user_id] = true;
 }
 
 void storaged_t::remove_user_ce(userid_t user_id) {
-    Mutex::Autolock _l(proto_mutex);
-    protos.erase(user_id);
+    proto_loaded[user_id] = false;
+    mUidm.clear_user_history(user_id);
     RemoveFileIfExists(proto_path(user_id), nullptr);
 }
 
-void storaged_t::load_proto_locked(userid_t user_id) {
+void storaged_t::load_proto(userid_t user_id) {
     string proto_file = proto_path(user_id);
     ifstream in(proto_file, ofstream::in | ofstream::binary);
 
@@ -185,32 +183,30 @@
 
     stringstream ss;
     ss << in.rdbuf();
-    StoragedProto* proto = &protos[user_id];
-    proto->Clear();
-    proto->ParseFromString(ss.str());
+    StoragedProto proto;
+    proto.ParseFromString(ss.str());
 
-    uint32_t crc = proto->crc();
-    proto->set_crc(crc_init);
-    string proto_str = proto->SerializeAsString();
+    uint32_t crc = proto.crc();
+    proto.set_crc(crc_init);
+    string proto_str = proto.SerializeAsString();
     uint32_t computed_crc = crc32(crc_init,
         reinterpret_cast<const Bytef*>(proto_str.c_str()),
         proto_str.size());
 
     if (crc != computed_crc) {
         LOG_TO(SYSTEM, WARNING) << "CRC mismatch in " << proto_file;
-        proto->Clear();
         return;
     }
 
-    mUidm.load_uid_io_proto(proto->uid_io_usage());
+    mUidm.load_uid_io_proto(proto.uid_io_usage());
 
     if (user_id == USER_SYSTEM) {
-        storage_info->load_perf_history_proto(proto->perf_history());
+        storage_info->load_perf_history_proto(proto.perf_history());
     }
 }
 
-void storaged_t:: prepare_proto(StoragedProto* proto, userid_t user_id) {
-    proto->set_version(2);
+void storaged_t:: prepare_proto(userid_t user_id, StoragedProto* proto) {
+    proto->set_version(3);
     proto->set_crc(crc_init);
 
     if (user_id == USER_SYSTEM) {
@@ -225,7 +221,7 @@
         proto_str.size()));
 }
 
-void storaged_t::flush_proto_user_system_locked(StoragedProto* proto) {
+void storaged_t::flush_proto_user_system(StoragedProto* proto) {
     string proto_str = proto->SerializeAsString();
     const char* data = proto_str.data();
     uint32_t size = proto_str.size();
@@ -274,11 +270,11 @@
     rename(tmp_file.c_str(), proto_file.c_str());
 }
 
-void storaged_t::flush_proto_locked(userid_t user_id) {
-    StoragedProto* proto = &protos[user_id];
-    prepare_proto(proto, user_id);
+void storaged_t::flush_proto(userid_t user_id, StoragedProto* proto) {
+    prepare_proto(user_id, proto);
+
     if (user_id == USER_SYSTEM) {
-        flush_proto_user_system_locked(proto);
+        flush_proto_user_system(proto);
         return;
     }
 
@@ -293,21 +289,20 @@
     rename(tmp_file.c_str(), proto_file.c_str());
 }
 
-void storaged_t::flush_protos() {
-    Mutex::Autolock _l(proto_mutex);
-    for (const auto& it : protos) {
+void storaged_t::flush_protos(unordered_map<int, StoragedProto>* protos) {
+    for (auto& it : *protos) {
         /*
-         * Don't flush proto if we haven't loaded it from file and combined
-         * with data in memory.
+         * Don't flush proto if we haven't attempted to load it from file.
          */
-        if (it.second.loaded() != 1) {
-            continue;
+        if (proto_loaded[it.first]) {
+            flush_proto(it.first, &it.second);
         }
-        flush_proto_locked(it.first);
     }
 }
 
 void storaged_t::event(void) {
+    unordered_map<int, StoragedProto> protos;
+
     if (mDsm.enabled()) {
         mDsm.update();
         if (!(mTimer % mConfig.periodic_chores_interval_disk_stats_publish)) {
@@ -316,17 +311,15 @@
     }
 
     if (!(mTimer % mConfig.periodic_chores_interval_uid_io)) {
-        Mutex::Autolock _l(proto_mutex);
         mUidm.report(&protos);
     }
 
     if (storage_info) {
-        Mutex::Autolock _l(proto_mutex);
         storage_info->refresh(protos[USER_SYSTEM].mutable_perf_history());
     }
 
     if (!(mTimer % mConfig.periodic_chores_interval_flush_proto)) {
-        flush_protos();
+        flush_protos(&protos);
     }
 
     mTimer += mConfig.periodic_chores_interval_unit;
diff --git a/storaged/storaged.proto b/storaged/storaged.proto
index 18869fa..9dcd79e 100644
--- a/storaged/storaged.proto
+++ b/storaged/storaged.proto
@@ -54,8 +54,7 @@
 message StoragedProto {
   optional uint32 crc = 1;
   optional uint32 version = 2;
-  optional uint32 loaded = 3;
-  optional UidIOUsage uid_io_usage = 4;
-  optional IOPerfHistory perf_history = 5;
-  repeated uint32 padding = 6;
+  optional UidIOUsage uid_io_usage = 3;
+  optional IOPerfHistory perf_history = 4;
+  repeated uint32 padding = 5;
 }
diff --git a/storaged/storaged_info.cpp b/storaged/storaged_info.cpp
index 3b5edbb..036d7e1 100644
--- a/storaged/storaged_info.cpp
+++ b/storaged/storaged_info.cpp
@@ -68,6 +68,8 @@
 
 void storage_info_t::load_perf_history_proto(const IOPerfHistory& perf_history)
 {
+    Mutex::Autolock _l(si_mutex);
+
     if (!perf_history.has_day_start_sec() ||
         perf_history.daily_perf_size() > (int)daily_perf.size() ||
         perf_history.weekly_perf_size() > (int)weekly_perf.size()) {
diff --git a/storaged/storaged_uid_monitor.cpp b/storaged/storaged_uid_monitor.cpp
index ab1c16e..5745782 100644
--- a/storaged/storaged_uid_monitor.cpp
+++ b/storaged/storaged_uid_monitor.cpp
@@ -257,11 +257,10 @@
 }
 
 std::map<uint64_t, struct uid_records> uid_monitor::dump(
-    double hours, uint64_t threshold, bool force_report,
-    unordered_map<int, StoragedProto>* protos)
+    double hours, uint64_t threshold, bool force_report)
 {
     if (force_report) {
-        report(protos);
+        report(nullptr);
     }
 
     Mutex::Autolock _l(uidm_mutex);
@@ -374,7 +373,9 @@
     update_curr_io_stats_locked();
     add_records_locked(time(NULL));
 
-    update_uid_io_proto(protos);
+    if (protos) {
+        update_uid_io_proto(protos);
+    }
 }
 
 namespace {
@@ -407,10 +408,6 @@
 
 void uid_monitor::update_uid_io_proto(unordered_map<int, StoragedProto>* protos)
 {
-    for (auto& it : *protos) {
-        it.second.mutable_uid_io_usage()->Clear();
-    }
-
     for (const auto& item : io_history) {
         const uint64_t& end_ts = item.first;
         const struct uid_records& recs = item.second;
@@ -449,10 +446,34 @@
     }
 }
 
+void uid_monitor::clear_user_history(userid_t user_id)
+{
+    Mutex::Autolock _l(uidm_mutex);
+
+    for (auto& item : io_history) {
+        vector<uid_record>* entries = &item.second.entries;
+        entries->erase(
+            remove_if(entries->begin(), entries->end(),
+                [user_id](const uid_record& rec) {
+                    return rec.ios.user_id == user_id;}),
+            entries->end());
+    }
+
+    for (auto it = io_history.begin(); it != io_history.end(); ) {
+        if (it->second.entries.empty()) {
+            it = io_history.erase(it);
+        } else {
+            it++;
+        }
+    }
+}
+
 void uid_monitor::load_uid_io_proto(const UidIOUsage& uid_io_proto)
 {
     if (!enabled()) return;
 
+    Mutex::Autolock _l(uidm_mutex);
+
     for (const auto& item_proto : uid_io_proto.uid_io_items()) {
         const UidIORecords& records_proto = item_proto.records();
         struct uid_records* recs = &io_history[item_proto.end_ts()];
diff --git a/storaged/tests/storaged_test.cpp b/storaged/tests/storaged_test.cpp
index 9281193..6a5fc61 100644
--- a/storaged/tests/storaged_test.cpp
+++ b/storaged/tests/storaged_test.cpp
@@ -449,17 +449,7 @@
         },
     };
 
-    StoragedProto proto_0;
-    UidIOItem* item = proto_0.mutable_uid_io_usage()->add_uid_io_items();
-    item->set_end_ts(200);
-    item->mutable_records()->set_start_ts(100);
-    UidRecord* rec = item->mutable_records()->add_entries();
-    rec->set_uid_name("app1");
-    rec->set_user_id(0);
-    rec->mutable_uid_io()->set_wr_fg_chg_on(1000);
-
     unordered_map<int, StoragedProto> protos;
-    protos[0] = proto_0;
 
     uidm.update_uid_io_proto(&protos);
 
@@ -589,4 +579,17 @@
     EXPECT_EQ(merged_entries_2.size(), 1UL);
     EXPECT_EQ(merged_entries_2.count("app1"), 1UL);
     EXPECT_EQ(merged_entries_2["app1"].bytes[WRITE][FOREGROUND][CHARGER_ON], 1000UL);
+
+    uidm.clear_user_history(0);
+
+    EXPECT_EQ(uidm.io_history.size(), 2UL);
+    EXPECT_EQ(uidm.io_history.count(200), 1UL);
+    EXPECT_EQ(uidm.io_history.count(300), 1UL);
+
+    EXPECT_EQ(uidm.io_history[200].entries.size(), 1UL);
+    EXPECT_EQ(uidm.io_history[300].entries.size(), 1UL);
+
+    uidm.clear_user_history(1);
+
+    EXPECT_EQ(uidm.io_history.size(), 0UL);
 }
