diff --git a/src/wallet/api/address_book.cpp b/src/wallet/api/address_book.cpp
index 198ce17cd..edeb5bb46 100644
--- a/src/wallet/api/address_book.cpp
+++ b/src/wallet/api/address_book.cpp
@@ -79,16 +79,16 @@ void AddressBookImpl::refresh()
   LOG_PRINT_L2("Refreshing addressbook");
   
   clearRows();
+  
+  // Fetch from Wallet2 and create vector of AddressBookRow objects
+  std::vector<tools::wallet2::address_book_row> rows = m_wallet->m_wallet->get_address_book();
+  for (size_t i = 0; i < rows.size(); ++i) {
+    tools::wallet2::address_book_row * row = &rows.at(i);
+    
+    std::string payment_id = (row->m_payment_id == cryptonote::null_hash)? "" : epee::string_tools::pod_to_hex(row->m_payment_id);
+    std::string address = cryptonote::get_account_address_as_str(m_wallet->m_wallet->testnet(),row->m_address);
 
-  // Fetch from Wallet2 and create vector
-  for (auto const &a : m_wallet->m_wallet->get_address_book() ) {
-    auto row = a.second;
-    int rowId = a.first;
-
-    std::string payment_id = (row.m_payment_id == cryptonote::null_hash)? "" : epee::string_tools::pod_to_hex(row.m_payment_id);
-    std::string address = cryptonote::get_account_address_as_str(m_wallet->m_wallet->testnet(),row.m_address);
-
-    AddressBookRow * abr = new AddressBookRow(rowId, address, payment_id, row.m_description);
+    AddressBookRow * abr = new AddressBookRow(i, address, payment_id, row->m_description);
     m_rows.push_back(abr);
   }
   
@@ -98,7 +98,8 @@ bool AddressBookImpl::deleteRow(int rowId)
 {
   LOG_PRINT_L2("Deleting address book row " << rowId);
   bool r = m_wallet->m_wallet->delete_address_book_row(rowId);
-  refresh();
+  if (r)
+    refresh();
   return r;
 } 
 
diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp
index 0a2f0f680..5b7a3e286 100644
--- a/src/wallet/api/wallet.cpp
+++ b/src/wallet/api/wallet.cpp
@@ -248,7 +248,7 @@ bool WalletImpl::create(const std::string &path, const std::string &password, co
     if (keys_file_exists || wallet_file_exists) {
         m_errorString = "attempting to generate or restore wallet, but specified file(s) exist.  Exiting to not risk overwriting.";
         LOG_ERROR(m_errorString);
-        m_status = Status_Error;
+        m_status = Status_Critical;
         return false;
     }
     // TODO: validate language
@@ -260,7 +260,7 @@ bool WalletImpl::create(const std::string &path, const std::string &password, co
         m_status = Status_Ok;
     } catch (const std::exception &e) {
         LOG_ERROR("Error creating wallet: " << e.what());
-        m_status = Status_Error;
+        m_status = Status_Critical;
         m_errorString = e.what();
         return false;
     }
@@ -287,7 +287,7 @@ bool WalletImpl::open(const std::string &path, const std::string &password)
         m_password = password;
     } catch (const std::exception &e) {
         LOG_ERROR("Error opening wallet: " << e.what());
-        m_status = Status_Error;
+        m_status = Status_Critical;
         m_errorString = e.what();
     }
     return m_status == Status_Ok;
@@ -319,7 +319,7 @@ bool WalletImpl::recover(const std::string &path, const std::string &seed)
         // TODO: wallet->init(daemon_address);
 
     } catch (const std::exception &e) {
-        m_status = Status_Error;
+        m_status = Status_Critical;
         m_errorString = e.what();
     }
     return m_status == Status_Ok;
@@ -331,7 +331,12 @@ bool WalletImpl::close()
     bool result = false;
     LOG_PRINT_L3("closing wallet...");
     try {
-        m_wallet->store();
+        // Do not store wallet with invalid status
+        // Status Critical refers to errors on opening or creating wallets.
+        if (status() != Status_Critical)
+            m_wallet->store();
+        else
+            LOG_PRINT_L3("Status_Critical - not storing wallet");
         LOG_PRINT_L3("wallet::store done");
         LOG_PRINT_L3("Calling wallet::stop...");
         m_wallet->stop();
@@ -339,7 +344,7 @@ bool WalletImpl::close()
         result = true;
         clearStatus();
     } catch (const std::exception &e) {
-        m_status = Status_Error;
+        m_status = Status_Critical;
         m_errorString = e.what();
         LOG_ERROR("Error closing wallet: " << e.what());
     }
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp
index 3dafa56f0..60fa1d266 100644
--- a/src/wallet/wallet2.cpp
+++ b/src/wallet/wallet2.cpp
@@ -1569,13 +1569,20 @@ bool wallet2::add_address_book_row(const cryptonote::account_public_address &add
   a.m_payment_id = payment_id;
   a.m_description = description;
   
-  int key = (m_address_book.empty())? 0 : m_address_book.rbegin()->first;
-  bool r =  m_address_book.emplace(++key,a).second;
-  return r;
+  int old_size = m_address_book.size();
+  m_address_book.push_back(a);
+  if(m_address_book.size() == old_size+1)
+    return true;
+  return false;
 }
 
 bool wallet2::delete_address_book_row(int row_id) {
-  return (m_address_book.erase(row_id) > 0);
+  if(m_address_book.size() <= row_id)
+    return false;
+  
+  m_address_book.erase(m_address_book.begin()+row_id);
+
+  return true;
 }
 
 //----------------------------------------------------------------------------------------------------
diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h
index fc06864e2..36b9b3d1f 100644
--- a/src/wallet/wallet2.h
+++ b/src/wallet/wallet2.h
@@ -292,7 +292,7 @@ namespace tools
     {
       cryptonote::account_public_address m_address;
       crypto::hash m_payment_id;
-      std::string m_description;
+      std::string m_description;   
     };
 
     /*!
@@ -523,7 +523,7 @@ namespace tools
    /*!
     * \brief GUI Address book get/store
     */
-    std::map<int, address_book_row> get_address_book() const { return m_address_book; }
+    std::vector<address_book_row> get_address_book() const { return m_address_book; }
     bool add_address_book_row(const cryptonote::account_public_address &address, const crypto::hash &payment_id, const std::string &description);
     bool delete_address_book_row(int row_id);
         
@@ -641,7 +641,7 @@ namespace tools
     std::unordered_map<crypto::public_key, size_t> m_pub_keys;
     cryptonote::account_public_address m_account_public_address;
     std::unordered_map<crypto::hash, std::string> m_tx_notes;
-    std::map<int, tools::wallet2::address_book_row> m_address_book;
+    std::vector<tools::wallet2::address_book_row> m_address_book;
     uint64_t m_upper_transaction_size_limit; //TODO: auto-calc this value or request from daemon, now use some fixed value
 
     std::atomic<bool> m_run;
diff --git a/src/wallet/wallet2_api.h b/src/wallet/wallet2_api.h
index 86a24fa59..2e19f36cd 100644
--- a/src/wallet/wallet2_api.h
+++ b/src/wallet/wallet2_api.h
@@ -63,7 +63,8 @@ struct PendingTransaction
 {
     enum Status {
         Status_Ok,
-        Status_Error
+        Status_Error,
+        Status_Critical
     };
 
     enum Priority {
@@ -221,7 +222,8 @@ struct Wallet
 
     enum Status {
         Status_Ok,
-        Status_Error
+        Status_Error,
+        Status_Critical
     };
 
     enum ConnectionStatus {