diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp
index 3aa4406a2..4586c3530 100644
--- a/src/wallet/wallet2.cpp
+++ b/src/wallet/wallet2.cpp
@@ -3077,6 +3077,11 @@ std::string wallet2::get_tx_note(const crypto::hash &txid) const
   return i->second;
 }
 
+std::string wallet2::get_daemon_address() const
+{
+  return m_daemon_address;
+}
+
 //----------------------------------------------------------------------------------------------------
 void wallet2::generate_genesis(cryptonote::block& b) {
   if (m_testnet)
diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h
index c2d387acd..6763fbee9 100644
--- a/src/wallet/wallet2.h
+++ b/src/wallet/wallet2.h
@@ -382,6 +382,7 @@ namespace tools
     void set_tx_note(const crypto::hash &txid, const std::string &note);
     std::string get_tx_note(const crypto::hash &txid) const;
 
+    std::string get_daemon_address() const;
   private:
     /*!
      * \brief  Stores wallet information to wallet file.
diff --git a/src/wallet/wallet2_api.cpp b/src/wallet/wallet2_api.cpp
index cf1a2bf24..31015b355 100644
--- a/src/wallet/wallet2_api.cpp
+++ b/src/wallet/wallet2_api.cpp
@@ -54,7 +54,7 @@ Wallet::~Wallet() {}
 class WalletImpl : public Wallet
 {
 public:
-    WalletImpl();
+    WalletImpl(bool testnet = false);
     ~WalletImpl();
     bool create(const std::string &path, const std::string &password,
                 const std::string &language);
@@ -70,6 +70,9 @@ public:
     bool setPassword(const std::string &password);
     std::string address() const;
     bool store(const std::string &path);
+    bool init(const std::string &daemon_address, uint64_t upper_transaction_size_limit);
+    uint64_t balance() const;
+    bool connectToDaemon();
 
 private:
     void clearStatus();
@@ -82,10 +85,10 @@ private:
     std::string m_password;
 };
 
-WalletImpl::WalletImpl()
+WalletImpl::WalletImpl(bool testnet)
     :m_wallet(nullptr), m_status(Wallet::Status_Ok)
 {
-    m_wallet = new tools::wallet2();
+    m_wallet = new tools::wallet2(testnet);
 }
 
 WalletImpl::~WalletImpl()
@@ -257,6 +260,35 @@ bool WalletImpl::store(const std::string &path)
     return m_status == Status_Ok;
 }
 
+bool WalletImpl::init(const std::string &daemon_address, uint64_t upper_transaction_size_limit)
+{
+    clearStatus();
+    try {
+        m_wallet->init(daemon_address, upper_transaction_size_limit);
+    } catch (const std::exception &e) {
+        LOG_ERROR("Error initializing wallet: " << e.what());
+        m_status = Status_Error;
+        m_errorString = e.what();
+    }
+
+    return m_status == Status_Ok;
+}
+
+uint64_t WalletImpl::balance() const
+{
+    return m_wallet->balance();
+}
+
+bool WalletImpl::connectToDaemon()
+{
+    bool result = m_wallet->check_connection();
+    m_status = result ? Status_Ok : Status_Error;
+    if (!result) {
+        m_errorString = "Error connecting to daemon at " + m_wallet->get_daemon_address();
+    }
+    return result;
+}
+
 void WalletImpl::clearStatus()
 {
     m_status = Status_Ok;
@@ -270,8 +302,8 @@ class WalletManagerImpl : public WalletManager
 {
 public:
     Wallet * createWallet(const std::string &path, const std::string &password,
-                          const std::string &language);
-    Wallet * openWallet(const std::string &path, const std::string &password);
+                          const std::string &language, bool testnet);
+    Wallet * openWallet(const std::string &path, const std::string &password, bool testnet);
     virtual Wallet * recoveryWallet(const std::string &path, const std::string &memo);
     virtual bool closeWallet(Wallet *wallet);
     bool walletExists(const std::string &path);
@@ -287,16 +319,16 @@ private:
 };
 
 Wallet *WalletManagerImpl::createWallet(const std::string &path, const std::string &password,
-                                    const std::string &language)
+                                    const std::string &language, bool testnet)
 {
-    WalletImpl * wallet = new WalletImpl();
+    WalletImpl * wallet = new WalletImpl(testnet);
     wallet->create(path, password, language);
     return wallet;
 }
 
-Wallet *WalletManagerImpl::openWallet(const std::string &path, const std::string &password)
+Wallet *WalletManagerImpl::openWallet(const std::string &path, const std::string &password, bool testnet)
 {
-    WalletImpl * wallet = new WalletImpl();
+    WalletImpl * wallet = new WalletImpl(testnet);
     wallet->open(path, password);
     return wallet;
 }
diff --git a/src/wallet/wallet2_api.h b/src/wallet/wallet2_api.h
index 013a260b7..ad1e08fe3 100644
--- a/src/wallet/wallet2_api.h
+++ b/src/wallet/wallet2_api.h
@@ -67,6 +67,9 @@ struct Wallet
     virtual bool setPassword(const std::string &password) = 0;
     virtual std::string address() const = 0;
     virtual bool store(const std::string &path) = 0;
+    virtual bool init(const std::string &daemon_address, uint64_t upper_transaction_size_limit) = 0;
+    virtual bool connectToDaemon() = 0;
+    virtual uint64_t balance() const = 0;
 };
 
 /**
@@ -82,7 +85,7 @@ struct WalletManager
      * \param  language       Language to be used to generate electrum seed memo
      * \return                Wallet instance (Wallet::status() needs to be called to check if created successfully)
      */
-    virtual Wallet * createWallet(const std::string &path, const std::string &password, const std::string &language) = 0;
+    virtual Wallet * createWallet(const std::string &path, const std::string &password, const std::string &language, bool testnet) = 0;
 
     /*!
      * \brief  Opens existing wallet
@@ -90,7 +93,7 @@ struct WalletManager
      * \param  password       Password of wallet file
      * \return                Wallet instance (Wallet::status() needs to be called to check if opened successfully)
      */
-    virtual Wallet * openWallet(const std::string &path, const std::string &password) = 0;
+    virtual Wallet * openWallet(const std::string &path, const std::string &password, bool testnet) = 0;
 
     /*!
      * \brief  recovers existing wallet using memo (electrum seed)
@@ -111,8 +114,8 @@ struct WalletManager
     virtual bool walletExists(const std::string &path) = 0;
 
     virtual std::string errorString() const = 0;
-
-    virtual void setDaemonHost(const std::string &hostname) = 0;
+//    //! set
+//    virtual void setDaemonAddress(const std::string &address) = 0;
 
 
 };
diff --git a/tests/libwallet_api_tests/main.cpp b/tests/libwallet_api_tests/main.cpp
index da2624387..841b5df27 100644
--- a/tests/libwallet_api_tests/main.cpp
+++ b/tests/libwallet_api_tests/main.cpp
@@ -41,6 +41,23 @@ using namespace std;
 //unsigned int epee::g_test_dbg_lock_sleep = 0;
 
 
+struct Utils
+{
+    static void deleteWallet(const std::string & walletname)
+    {
+        std::cout << "** deleting wallet: " << walletname << std::endl;
+        boost::filesystem::remove(walletname);
+        boost::filesystem::remove(walletname + ".address.txt");
+        boost::filesystem::remove(walletname + ".keys");
+    }
+
+    static void deleteDir(const std::string &path)
+    {
+        std::cout << "** removing dir recursively: " << path  << std::endl;
+        boost::filesystem::remove_all(path);
+    }
+};
+
 
 struct WalletManagerTest : public testing::Test
 {
@@ -54,12 +71,16 @@ struct WalletManagerTest : public testing::Test
     const char * WALLET_PASS2 = "password22";
     const char * WALLET_LANG = "English";
 
+    // TODO: add test wallets to the source tree (as they have some balance mined)?
+    const char * TESTNET_WALLET_NAME = "/home/mbg033/dev/monero/testnet/wallet_01.bin";
+    const char * TESTNET_WALLET_PASS = "";
+
     WalletManagerTest()
     {
         std::cout << __FUNCTION__ << std::endl;
         wmgr = Bitmonero::WalletManagerFactory::getWalletManager();
-        deleteWallet(WALLET_NAME);
-        deleteDir(boost::filesystem::path(WALLET_NAME_WITH_DIR).parent_path().string());
+        Utils::deleteWallet(WALLET_NAME);
+        Utils::deleteDir(boost::filesystem::path(WALLET_NAME_WITH_DIR).parent_path().string());
     }
 
 
@@ -68,29 +89,13 @@ struct WalletManagerTest : public testing::Test
         std::cout << __FUNCTION__ << std::endl;
         //deleteWallet(WALLET_NAME);
     }
-
-
-    void deleteWallet(const std::string & walletname)
-    {
-        std::cout << "** deleting wallet: " << walletname << std::endl;
-        boost::filesystem::remove(walletname);
-        boost::filesystem::remove(walletname + ".address.txt");
-        boost::filesystem::remove(walletname + ".keys");
-    }
-
-    void deleteDir(const std::string &path)
-    {
-        std::cout << "** removing dir recursively: " << path  << std::endl;
-        boost::filesystem::remove_all(path);
-    }
-
 };
 
 
 TEST_F(WalletManagerTest, WalletManagerCreatesWallet)
 {
 
-    Bitmonero::Wallet * wallet = wmgr->createWallet(WALLET_NAME, WALLET_PASS, WALLET_LANG);
+    Bitmonero::Wallet * wallet = wmgr->createWallet(WALLET_NAME, WALLET_PASS, WALLET_LANG, true);
     ASSERT_TRUE(wallet->status() == Bitmonero::Wallet::Status_Ok);
     ASSERT_TRUE(!wallet->seed().empty());
     std::vector<std::string> words;
@@ -107,16 +112,16 @@ TEST_F(WalletManagerTest, WalletManagerCreatesWallet)
 TEST_F(WalletManagerTest, WalletManagerOpensWallet)
 {
 
-    Bitmonero::Wallet * wallet1 = wmgr->createWallet(WALLET_NAME, WALLET_PASS, WALLET_LANG);
+    Bitmonero::Wallet * wallet1 = wmgr->createWallet(WALLET_NAME, WALLET_PASS, WALLET_LANG, true);
     std::string seed1 = wallet1->seed();
     ASSERT_TRUE(wmgr->closeWallet(wallet1));
-    Bitmonero::Wallet * wallet2 = wmgr->openWallet(WALLET_NAME, WALLET_PASS);
+    Bitmonero::Wallet * wallet2 = wmgr->openWallet(WALLET_NAME, WALLET_PASS, true);
     ASSERT_TRUE(wallet2->status() == Bitmonero::Wallet::Status_Ok);
     ASSERT_TRUE(wallet2->seed() == seed1);
     std::cout << "** seed: " << wallet2->seed() << std::endl;
 }
 
-
+/*
 TEST_F(WalletManagerTest, WalletManagerChangesPassword)
 {
     Bitmonero::Wallet * wallet1 = wmgr->createWallet(WALLET_NAME, WALLET_PASS, WALLET_LANG);
@@ -182,7 +187,6 @@ TEST_F(WalletManagerTest, WalletManagerStoresWallet2)
     ASSERT_TRUE(wmgr->closeWallet(wallet1));
 }
 
-
 TEST_F(WalletManagerTest, WalletManagerStoresWallet3)
 {
     Bitmonero::Wallet * wallet1 = wmgr->createWallet(WALLET_NAME, WALLET_PASS, WALLET_LANG);
@@ -205,7 +209,6 @@ TEST_F(WalletManagerTest, WalletManagerStoresWallet3)
 
 }
 
-
 TEST_F(WalletManagerTest, WalletManagerStoresWallet4)
 {
     Bitmonero::Wallet * wallet1 = wmgr->createWallet(WALLET_NAME, WALLET_PASS, WALLET_LANG);
@@ -225,7 +228,24 @@ TEST_F(WalletManagerTest, WalletManagerStoresWallet4)
     ASSERT_TRUE(wallet1->seed() == seed1);
     ASSERT_TRUE(wallet1->address() == address1);
     ASSERT_TRUE(wmgr->closeWallet(wallet1));
+}
+*/
 
+TEST_F(WalletManagerTest, WalletShowsBalance)
+{
+    Bitmonero::Wallet * wallet1 = wmgr->openWallet(TESTNET_WALLET_NAME, TESTNET_WALLET_PASS, true);
+    std::string seed1 = wallet1->seed();
+    std::string address1 = wallet1->address();
+    ASSERT_TRUE(wallet1->balance() > 0);
+
+    uint64_t balance1 = wallet1->balance();
+    ASSERT_TRUE(wmgr->closeWallet(wallet1));
+
+    Bitmonero::Wallet * wallet2 = wmgr->openWallet(TESTNET_WALLET_NAME, TESTNET_WALLET_PASS, true);
+    ASSERT_TRUE(seed1 == wallet2->seed());
+    ASSERT_TRUE(address1 == wallet2->address());
+    ASSERT_TRUE(balance1 == wallet2->balance());
+    ASSERT_TRUE(wmgr->closeWallet(wallet2));
 }