Repository: bitmaelum/bitmaelum-suite
Pull request #142 (2021-01-05 13:13:58)

implemented client config management

sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug.png' alt='Bug' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability.png' alt='Vulnerability' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot.png' alt='Security Hotspot' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell.png' alt='Code Smell' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL)

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo.png' alt='No Coverage information' width='16' height='16' />](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142) No Coverage information  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3.png' alt='0.0%' width='16' height='16' />](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug.png' alt='Bug' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability.png' alt='Vulnerability' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot.png' alt='Security Hotspot' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell.png' alt='Code Smell' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL)

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo.png' alt='No Coverage information' width='16' height='16' />](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142) No Coverage information  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3.png' alt='0.0%' width='16' height='16' />](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug.png' alt='Bug' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability.png' alt='Vulnerability' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot.png' alt='Security Hotspot' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell.png' alt='Code Smell' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL)

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo.png' alt='No Coverage information' width='16' height='16' />](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142) No Coverage information  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3.png' alt='0.0%' width='16' height='16' />](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug.png' alt='Bug' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability.png' alt='Vulnerability' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot.png' alt='Security Hotspot' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell.png' alt='Code Smell' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL)

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo.png' alt='No Coverage information' width='16' height='16' />](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142) No Coverage information  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3.png' alt='0.0%' width='16' height='16' />](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug.png' alt='Bug' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability.png' alt='Vulnerability' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot.png' alt='Security Hotspot' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell.png' alt='Code Smell' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL) [0 Code Smells](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL)

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo.png' alt='No Coverage information' width='16' height='16' />](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142) No Coverage information  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3.png' alt='0.0%' width='16' height='16' />](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142&metric=new_duplicated_lines_density&view=list)


codecov[bot]: # [Codecov](https://codecov.io/gh/bitmaelum/bitmaelum-suite/pull/142?src=pr&el=h1) Report
> Merging [#142](https://codecov.io/gh/bitmaelum/bitmaelum-suite/pull/142?src=pr&el=desc) (992169e) into [develop](https://codecov.io/gh/bitmaelum/bitmaelum-suite/commit/41d55d0b57907cb6b5b8a35c94127c88ad22ca93?el=desc) (41d55d0) will **decrease** coverage by `0.18%`.
> The diff coverage is `0.00%`.

[![Impacted file tree graph](https://codecov.io/gh/bitmaelum/bitmaelum-suite/pull/142/graphs/tree.svg?width=650&height=150&src=pr&token=8VR72NKYS0)](https://codecov.io/gh/bitmaelum/bitmaelum-suite/pull/142?src=pr&el=tree)

```diff
@@             Coverage Diff             @@
##           develop     #142      +/-   ##
===========================================
- Coverage    48.72%   48.53%   -0.19%     
===========================================
  Files          103      103              
  Lines         3953     3964      +11     
===========================================
- Hits          1926     1924       -2     
- Misses        1785     1798      +13     
  Partials       242      242              
```

| Flag | Coverage Δ | |
|---|---|---|
| unittests | `48.53% <0.00%> (-0.19%)` | :arrow_down: |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags#carryforward-flags-in-the-pull-request-comment) to find out more.

| [Impacted Files](https://codecov.io/gh/bitmaelum/bitmaelum-suite/pull/142?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [internal/editor.go](https://codecov.io/gh/bitmaelum/bitmaelum-suite/pull/142/diff?src=pr&el=tree#diff-aW50ZXJuYWwvZWRpdG9yLmdv) | `0.00% <0.00%> (ø)` | |
| [pkg/proofofwork/pow.go](https://codecov.io/gh/bitmaelum/bitmaelum-suite/pull/142/diff?src=pr&el=tree#diff-cGtnL3Byb29mb2Z3b3JrL3Bvdy5nbw==) | `92.68% <0.00%> (-2.44%)` | :arrow_down: |

sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug.png' alt='Bug' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability.png' alt='Vulnerability' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot.png' alt='Security Hotspot' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell.png' alt='Code Smell' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL) [2 Code Smells](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL)

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo.png' alt='No Coverage information' width='16' height='16' />](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142) No Coverage information  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3.png' alt='0.0%' width='16' height='16' />](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug.png' alt='Bug' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability.png' alt='Vulnerability' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot.png' alt='Security Hotspot' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell.png' alt='Code Smell' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL) [2 Code Smells](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL)

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo.png' alt='No Coverage information' width='16' height='16' />](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142) No Coverage information  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3.png' alt='0.0%' width='16' height='16' />](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug.png' alt='Bug' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability.png' alt='Vulnerability' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot.png' alt='Security Hotspot' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell.png' alt='Code Smell' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL) [2 Code Smells](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL)

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo.png' alt='No Coverage information' width='16' height='16' />](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142) No Coverage information  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3.png' alt='0.0%' width='16' height='16' />](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142&metric=new_duplicated_lines_density&view=list)


sonarcloud[bot]: Kudos, SonarCloud Quality Gate passed!

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/bug.png' alt='Bug' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG) [0 Bugs](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=BUG)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/vulnerability.png' alt='Vulnerability' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY) [0 Vulnerabilities](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=VULNERABILITY)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/security_hotspot.png' alt='Security Hotspot' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT) [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=SECURITY_HOTSPOT)  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/code_smell.png' alt='Code Smell' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL) [<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/RatingBadge/A.png' alt='A' width='16' height='16' />](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL) [2 Code Smells](https://sonarcloud.io/project/issues?id=bitmaelum_bitmaelum-suite&pullRequest=142&resolved=false&types=CODE_SMELL)

[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/CoverageChart/NoCoverageInfo.png' alt='No Coverage information' width='16' height='16' />](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142) No Coverage information  
[<img src='https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/Duplications/3.png' alt='0.0%' width='16' height='16' />](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142&metric=new_duplicated_lines_density&view=list) [0.0% Duplication](https://sonarcloud.io/component_measures?id=bitmaelum_bitmaelum-suite&pullRequest=142&metric=new_duplicated_lines_density&view=list)



Patch:
diff --git a/buildscripts/docker/Dockerfile.client b/buildscripts/docker/Dockerfile.client
index 77644a8..9282810 100644
--- a/buildscripts/docker/Dockerfile.client
+++ b/buildscripts/docker/Dockerfile.client
@@ -5,7 +5,7 @@ MAINTAINER jthijssen@bitmaelum.com
 RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates netbase && rm -rf /var/lib/apt/lists/*
 
 COPY bm-* /usr/local/bin/
-COPY client-config.yml /etc/bitmaelum/client-config.yml
+COPY bitmaelum-client-config.yml /etc/bitmaelum/bitmaelum-client-config.yml
 
 COPY docker-entrypoint-client.sh /usr/local/bin/docker-entrypoint.sh
 ENTRYPOINT ["docker-entrypoint.sh"]
diff --git a/buildscripts/docker/Dockerfile.server b/buildscripts/docker/Dockerfile.server
index ef06c4f..9c44bf7 100644
--- a/buildscripts/docker/Dockerfile.server
+++ b/buildscripts/docker/Dockerfile.server
@@ -5,7 +5,7 @@ MAINTAINER jthijssen@bitmaelum.com
 RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates netbase && rm -rf /var/lib/apt/lists/*
 
 COPY bm-* /usr/local/bin/
-COPY server-config.yml /etc/bitmaelum/server-config.yml
+COPY bitmaelum-server-config.yml /etc/bitmaelum/bitmaelum-server-config.yml
 
 COPY docker-entrypoint-server.sh /usr/local/bin/docker-entrypoint.sh
 ENTRYPOINT ["docker-entrypoint.sh"]
diff --git a/buildscripts/docker/client-config.yml b/buildscripts/docker/bitmaelum-client-config.yml
similarity index 98%
rename from buildscripts/docker/client-config.yml
rename to buildscripts/docker/bitmaelum-client-config.yml
index 5f432f4..12e62f0 100644
--- a/buildscripts/docker/client-config.yml
+++ b/buildscripts/docker/bitmaelum-client-config.yml
@@ -1,6 +1,6 @@
 # BitMaelum Client Configuration Template. Edit for your own needs.
 config:
-    accounts:
+    vault:
         # where are our accounts stored?
         path: "/bitmaelum/accounts.vault.json"
     composer:
diff --git a/buildscripts/docker/generate-client.sh b/buildscripts/docker/generate-client.sh
index aa9cbad..d060c50 100644
--- a/buildscripts/docker/generate-client.sh
+++ b/buildscripts/docker/generate-client.sh
@@ -12,7 +12,7 @@ fi
 TMPDIR="tmp-$$"
 mkdir $TMPDIR
 
-cp ./buildscripts/docker/client-config.yml $TMPDIR
+cp ./buildscripts/docker/bitmaelum-client-config.yml $TMPDIR
 cp ./buildscripts/docker/docker-entrypoint-client.sh $TMPDIR
 cp ./release/linux-amd64/bm-* $TMPDIR
 
diff --git a/buildscripts/docker/generate-server.sh b/buildscripts/docker/generate-server.sh
index 589ba09..1e65e75 100644
--- a/buildscripts/docker/generate-server.sh
+++ b/buildscripts/docker/generate-server.sh
@@ -12,7 +12,7 @@ fi
 TMPDIR="tmp-$$"
 mkdir $TMPDIR
 
-cp ./buildscripts/docker/server-config.yml $TMPDIR
+cp ./buildscripts/docker/bitmaelum-server-config.yml $TMPDIR
 cp ./buildscripts/docker/docker-entrypoint-server.sh $TMPDIR
 cp ./release/linux-amd64/bm-* $TMPDIR
 
diff --git a/buildscripts/docker/generate-suite.sh b/buildscripts/docker/generate-suite.sh
index edab9ca..6578767 100644
--- a/buildscripts/docker/generate-suite.sh
+++ b/buildscripts/docker/generate-suite.sh
@@ -12,7 +12,6 @@ fi
 TMPDIR="tmp-$$"
 mkdir $TMPDIR
 
-#cp ./buildscripts/docker/server-config.yml $TMPDIR
 cp ./buildscripts/docker/docker-entrypoint-suite.sh $TMPDIR
 cp ./release/linux-amd64/bm-* $TMPDIR
 
diff --git a/cmd/bm-client/README.md b/cmd/bm-client/README.md
index 07f6e54..ccded5c 100644
--- a/cmd/bm-client/README.md
+++ b/cmd/bm-client/README.md
@@ -1,11 +1,3 @@
 # bm-client
 
 A simple client to create / manage accounts and to read and send mail.
-
-Commands:
-
-    create-account
-    list-accounts
-    fetch-messages
-    read
-    compose
diff --git a/cmd/bm-client/cmd/config.go b/cmd/bm-client/cmd/config.go
new file mode 100644
index 0000000..33317dd
--- /dev/null
+++ b/cmd/bm-client/cmd/config.go
@@ -0,0 +1,34 @@
+// Copyright (c) 2021 BitMaelum Authors
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of
+// this software and associated documentation files (the "Software"), to deal in
+// the Software without restriction, including without limitation the rights to
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+// the Software, and to permit persons to whom the Software is furnished to do so,
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+package cmd
+
+import (
+	"github.com/spf13/cobra"
+)
+
+var configCmd = &cobra.Command{
+	Use:   "config",
+	Short: "Config management",
+	Long:  ``,
+}
+
+func init() {
+	rootCmd.AddCommand(configCmd)
+}
diff --git a/cmd/bm-client/cmd/config_edit.go b/cmd/bm-client/cmd/config_edit.go
new file mode 100644
index 0000000..9efd2c3
--- /dev/null
+++ b/cmd/bm-client/cmd/config_edit.go
@@ -0,0 +1,47 @@
+// Copyright (c) 2021 BitMaelum Authors
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of
+// this software and associated documentation files (the "Software"), to deal in
+// the Software without restriction, including without limitation the rights to
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+// the Software, and to permit persons to whom the Software is furnished to do so,
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+package cmd
+
+import (
+	"fmt"
+	"os"
+
+	bminternal "github.com/bitmaelum/bitmaelum-suite/internal"
+	"github.com/bitmaelum/bitmaelum-suite/internal/config"
+	"github.com/spf13/cobra"
+)
+
+var configEditCmd = &cobra.Command{
+	Use:   "edit",
+	Short: "Edits the current configuration file",
+	Long:  ``,
+	Run: func(cmd *cobra.Command, args []string) {
+
+		err := bminternal.EditFile(config.LoadedClientConfigPath)
+		if err != nil {
+			fmt.Println("cannot open editor. Please edit this file manually.")
+			os.Exit(1)
+		}
+	},
+}
+
+func init() {
+	configCmd.AddCommand(configEditCmd)
+}
diff --git a/cmd/bm-client/cmd/config_init.go b/cmd/bm-client/cmd/config_init.go
new file mode 100644
index 0000000..434df78
--- /dev/null
+++ b/cmd/bm-client/cmd/config_init.go
@@ -0,0 +1,77 @@
+// Copyright (c) 2021 BitMaelum Authors
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of
+// this software and associated documentation files (the "Software"), to deal in
+// the Software without restriction, including without limitation the rights to
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+// the Software, and to permit persons to whom the Software is furnished to do so,
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+package cmd
+
+import (
+	"fmt"
+	"os"
+
+	"github.com/bitmaelum/bitmaelum-suite/internal/config"
+	"github.com/spf13/cobra"
+)
+
+var configInitCmd = &cobra.Command{
+	Use:   "init",
+	Short: "Creates a new config file",
+	Long:  ``,
+	Run: func(cmd *cobra.Command, args []string) {
+
+		_, ok := os.Stat(*cFile)
+		if ok == nil {
+			fmt.Println("Configuration file already exist. Not overwriting the current one.")
+			os.Exit(1)
+		}
+
+		err := createConfigFile(*cFile)
+		if err != nil {
+			fmt.Println("Error while creating file: ", err)
+			os.Exit(1)
+		}
+
+		fmt.Printf("successfully created a new configuration file at %s\n", *cFile)
+	},
+	Annotations: map[string]string{
+		"dont_load_config": "true",
+	},
+}
+
+func createConfigFile(p string) error {
+	f, err := os.Create(p)
+	if err != nil {
+		return err
+	}
+
+	err = config.GenerateClientConfig(f)
+	if err != nil {
+		return err
+	}
+
+	return f.Close()
+}
+
+var (
+	cFile *string
+)
+
+func init() {
+	configCmd.AddCommand(configInitCmd)
+
+	cFile = configInitCmd.Flags().StringP("file", "f", "./bitmaelum-client-config.yml", "Path to configuration file")
+}
diff --git a/cmd/bm-client/cmd/config_show.go b/cmd/bm-client/cmd/config_show.go
new file mode 100644
index 0000000..012b357
--- /dev/null
+++ b/cmd/bm-client/cmd/config_show.go
@@ -0,0 +1,51 @@
+// Copyright (c) 2021 BitMaelum Authors
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of
+// this software and associated documentation files (the "Software"), to deal in
+// the Software without restriction, including without limitation the rights to
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+// the Software, and to permit persons to whom the Software is furnished to do so,
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+package cmd
+
+import (
+	"fmt"
+	"os"
+
+	"github.com/bitmaelum/bitmaelum-suite/internal/config"
+	"github.com/spf13/cobra"
+	"gopkg.in/yaml.v3"
+)
+
+var configShowCmd = &cobra.Command{
+	Use:   "show",
+	Short: "Displays the current configuration settings",
+	Long:  ``,
+	Run: func(cmd *cobra.Command, args []string) {
+		b, err := yaml.Marshal(config.Client)
+		if err != nil {
+			fmt.Println("cannot display configuration")
+			os.Exit(1)
+		}
+
+		fmt.Println(string(b))
+	},
+	Annotations: map[string]string{
+		"dont_display_logo": "true",
+	},
+}
+
+func init() {
+	configCmd.AddCommand(configShowCmd)
+}
diff --git a/cmd/bm-client/cmd/root.go b/cmd/bm-client/cmd/root.go
index 7bc0917..efda7ce 100644
--- a/cmd/bm-client/cmd/root.go
+++ b/cmd/bm-client/cmd/root.go
@@ -23,6 +23,10 @@ import (
 	"fmt"
 	"os"
 
+	"github.com/bitmaelum/bitmaelum-suite/cmd/bm-client/internal"
+	bminternal "github.com/bitmaelum/bitmaelum-suite/internal"
+	"github.com/bitmaelum/bitmaelum-suite/internal/config"
+	"github.com/bitmaelum/bitmaelum-suite/internal/vault"
 	"github.com/spf13/cobra"
 )
 
@@ -30,6 +34,25 @@ var rootCmd = &cobra.Command{
 	Use:   "bm-client",
 	Short: "BitMaelum client",
 	Long:  `This client allows you to manage accounts, read and compose mail.`,
+	PersistentPreRun: func(cmd *cobra.Command, args []string) {
+		// PersistentPreRun will be always called (first). We can actually use the annotations on the
+		// command we actually run to configure things.
+
+		// Display logo unless annotations tells us otherwise
+		if _, exist := cmd.Annotations["dont_display_logo"]; !exist {
+			fmt.Println(bminternal.GetASCIILogo())
+		}
+
+		// Load configuration unless annotations tells us otherwise
+		if _, exist := cmd.Annotations["dont_load_config"]; !exist {
+			config.LoadClientConfig(internal.Opts.Config)
+
+			// Set vault path if not already set
+			if vault.VaultPath == "" {
+				vault.VaultPath = config.Client.Vault.Path
+			}
+		}
+	},
 }
 
 // Execute runs the given command
diff --git a/cmd/bm-client/cmd/vault_init.go b/cmd/bm-client/cmd/vault_init.go
index 9f13963..1845500 100644
--- a/cmd/bm-client/cmd/vault_init.go
+++ b/cmd/bm-client/cmd/vault_init.go
@@ -38,7 +38,7 @@ var vaultInitCmd = &cobra.Command{
 		// Get either given path, or the default configuration vault path
 		vaultPath := *vpath
 		if vaultPath == "" {
-			vaultPath = config.Client.Accounts.Path
+			vaultPath = config.Client.Vault.Path
 		}
 
 		// Check if vault/path exists
diff --git a/cmd/bm-client/internal/options.go b/cmd/bm-client/internal/options.go
new file mode 100644
index 0000000..6c1caa5
--- /dev/null
+++ b/cmd/bm-client/internal/options.go
@@ -0,0 +1,30 @@
+// Copyright (c) 2021 BitMaelum Authors
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy of
+// this software and associated documentation files (the "Software"), to deal in
+// the Software without restriction, including without limitation the rights to
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+// the Software, and to permit persons to whom the Software is furnished to do so,
+// subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+package internal
+
+type options struct {
+	Config   string `short:"c" long:"config" description:"Path to your configuration file"`
+	Password string `short:"p" long:"password" description:"Vault password" default:""`
+	Vault    string `long:"vault" description:"Custom vault file" default:""`
+	Version  bool   `short:"v" long:"version" description:"Display version information"`
+}
+
+// Opts are the options set through the command line
+var Opts options
diff --git a/cmd/bm-client/main.go b/cmd/bm-client/main.go
index 46508fa..e9b1e8b 100644
--- a/cmd/bm-client/main.go
+++ b/cmd/bm-client/main.go
@@ -26,38 +26,25 @@ import (
 	"time"
 
 	"github.com/bitmaelum/bitmaelum-suite/cmd/bm-client/cmd"
-	"github.com/bitmaelum/bitmaelum-suite/internal"
-	"github.com/bitmaelum/bitmaelum-suite/internal/config"
+	"github.com/bitmaelum/bitmaelum-suite/cmd/bm-client/internal"
+	bminternal "github.com/bitmaelum/bitmaelum-suite/internal"
 	"github.com/bitmaelum/bitmaelum-suite/internal/vault"
 )
 
-type options struct {
-	Config   string `short:"c" long:"config" description:"Path to your configuration file"`
-	Password string `short:"p" long:"password" description:"Vault password" default:""`
-	Vault    string `long:"vault" description:"Custom vault file" default:""`
-	Version  bool   `short:"v" long:"version" description:"Display version information"`
-}
-
-var opts options
-
 func main() {
 	rand.Seed(time.Now().UnixNano())
 
-	internal.ParseOptions(&opts)
-	if opts.Version {
-		internal.WriteVersionInfo("BitMaelum Client", os.Stdout)
+	bminternal.ParseOptions(&internal.Opts)
+	if internal.Opts.Version {
+		bminternal.WriteVersionInfo("BitMaelum Client", os.Stdout)
 		fmt.Println()
 		os.Exit(1)
 	}
 
-	fmt.Println(internal.GetASCIILogo())
-	config.LoadClientConfig(opts.Config)
-
 	// Set default vault info if set in config
-	vault.VaultPassword = opts.Password
-	vault.VaultPath = config.Client.Accounts.Path
-	if opts.Vault != "" {
-		vault.VaultPath = opts.Vault
+	vault.VaultPassword = internal.Opts.Password
+	if internal.Opts.Vault != "" {
+		vault.VaultPath = internal.Opts.Vault
 	}
 
 	cmd.Execute()
diff --git a/cmd/bm-json/main.go b/cmd/bm-json/main.go
index eb50415..3e173c7 100644
--- a/cmd/bm-json/main.go
+++ b/cmd/bm-json/main.go
@@ -62,7 +62,7 @@ func main() {
 
 	// Set default vault info if set in config
 	vault.VaultPassword = opts.Password
-	vault.VaultPath = config.Client.Accounts.Path
+	vault.VaultPath = config.Client.Vault.Path
 	if opts.Vault != "" {
 		vault.VaultPath = opts.Vault
 	}
diff --git a/cmd/bm-mail/main.go b/cmd/bm-mail/main.go
index f144077..902e5d5 100644
--- a/cmd/bm-mail/main.go
+++ b/cmd/bm-mail/main.go
@@ -54,7 +54,7 @@ func main() {
 
 	// Set default vault info if set in config
 	vault.VaultPassword = opts.Password
-	vault.VaultPath = config.Client.Accounts.Path
+	vault.VaultPath = config.Client.Vault.Path
 	if opts.Vault != "" {
 		vault.VaultPath = opts.Vault
 	}
diff --git a/go.mod b/go.mod
index 9226aa6..5a88eca 100644
--- a/go.mod
+++ b/go.mod
@@ -47,4 +47,5 @@ require (
 	golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf
 	golang.org/x/text v0.3.4 // indirect
 	gopkg.in/yaml.v2 v2.4.0
+	gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c
 )
diff --git a/internal/config/config.go b/internal/config/config.go
index c340a4d..6e630f4 100644
--- a/internal/config/config.go
+++ b/internal/config/config.go
@@ -42,9 +42,15 @@ var triedPaths []string
 
 var (
 	// ClientConfigFile Filename of client configuration
-	ClientConfigFile string = "client-config.yml"
+	ClientConfigFile string = "bitmaelum-client-config.yml"
 	// ServerConfigFile Filename of server configuration
-	ServerConfigFile string = "server-config.yml"
+	ServerConfigFile string = "bitmaelum-server-config.yml"
+)
+
+// Absolute paths of the loaded configurations
+var (
+	LoadedClientConfigPath string
+	LoadedServerConfigPath string
 )
 
 // LoadClientConfig loads client configuration from given path or panic if cannot load
@@ -54,7 +60,7 @@ func LoadClientConfig(configPath string) {
 		for _, p := range triedPaths {
 			logrus.Errorf("Tried path: %s", p)
 		}
-		logrus.Fatalf("could not load client configuration")
+		logrus.Fatalf("could not load client configuration. You can generate a new configuration with: 'bm-client config init'")
 	}
 }
 
@@ -66,7 +72,7 @@ func LoadServerConfig(configPath string) {
 			logrus.Errorf("Tried path: %s", p)
 		}
 
-		logrus.Fatalf("could not load server configuration")
+		logrus.Fatalf("could not load server configuration. You can generate a new configuration with: 'bm-config init-config --server'")
 	}
 }
 
@@ -76,18 +82,18 @@ func LoadClientConfigOrPass(configPath string) error {
 
 	// Try custom path first
 	if configPath != "" {
-		return readConfigPath(configPath, "from commandline", Client.LoadConfig)
+		return readConfigPath(configPath, "from commandline", Client.LoadConfig, &LoadedClientConfigPath)
 	}
 
 	configPath = os.Getenv("BITMAELUM_CLIENT_CONFIG")
 	if configPath != "" {
-		return readConfigPath(configPath, "from BITMAELUM_CLIENT_CONFIG environment", Client.LoadConfig)
+		return readConfigPath(configPath, "from BITMAELUM_CLIENT_CONFIG environment", Client.LoadConfig, &LoadedClientConfigPath)
 	}
 
 	// try on our search paths
 	for _, p := range getSearchPaths() {
 		p = filepath.Join(p, ClientConfigFile)
-		err = readConfigPath(p, "from hardcoded search path", Client.LoadConfig)
+		err = readConfigPath(p, "from hardcoded search path", Client.LoadConfig, &LoadedClientConfigPath)
 		if err == nil || err != errConfigNotFound {
 			return err
 		}
@@ -102,18 +108,23 @@ func LoadServerConfigOrPass(configPath string) error {
 
 	// Try custom path first
 	if configPath != "" {
-		return readConfigPath(configPath, "from commandline", Server.LoadConfig)
+		return readConfigPath(configPath, "from commandline", Server.LoadConfig, &LoadedServerConfigPath)
 	}
 
 	configPath = os.Getenv("BITMAELUM_SERVER_CONFIG")
 	if configPath != "" {
-		return readConfigPath(configPath, "from BITMAELUM_SERVER_CONFIG environment", Server.LoadConfig)
+		return readConfigPath(configPath, "from BITMAELUM_SERVER_CONFIG environment", Server.LoadConfig, &LoadedServerConfigPath)
 	}
 
 	// try on our search paths
 	for _, p := range getSearchPaths() {
 		p = filepath.Join(p, ServerConfigFile)
-		err = readConfigPath(p, "from hardcoded search path", Server.LoadConfig)
+		err = readConfigPath(p, "from hardcoded search path", Server.LoadConfig, &LoadedServerConfigPath)
+
+		// Set config path if this is the one found
+		if err == nil {
+			LoadedServerConfigPath = p
+		}
 		if err == nil || err != errConfigNotFound {
 			return err
 		}
@@ -123,7 +134,7 @@ func LoadServerConfigOrPass(configPath string) error {
 }
 
 // Expands the given path and loads the configuration
-func readConfigPath(p, src string, loader func(r io.Reader) error) error {
+func readConfigPath(p, src string, loader func(r io.Reader) error, loadedPath *string) error {
 	p, _ = homedir.Expand(p)
 
 	triedPaths = append(triedPaths, p+" ("+src+")")
@@ -133,5 +144,10 @@ func readConfigPath(p, src string, loader func(r io.Reader) error) error {
 		return errConfigNotFound
 	}
 
-	return loader(f)
+	err = loader(f)
+	if err == nil {
+		*loadedPath = p
+	}
+
+	return err
 }
diff --git a/internal/config/config_client.go b/internal/config/config_client.go
index ecf2467..e3f4420 100644
--- a/internal/config/config_client.go
+++ b/internal/config/config_client.go
@@ -37,9 +37,9 @@ type wrappedClientConfig struct {
 
 // ClientConfig is the representation of the client configuration
 type ClientConfig struct {
-	Accounts struct {
+	Vault struct {
 		Path string `yaml:"path"`
-	} `yaml:"accounts"`
+	} `yaml:"vault"`
 
 	Composer struct {
 		Editor string `yaml:"editor"`
@@ -77,7 +77,7 @@ func (c *ClientConfig) LoadConfig(r io.Reader) error {
 	*c = lc.Cfg
 
 	// Expand homedirs in configuration
-	c.Accounts.Path, _ = homedir.Expand(c.Accounts.Path)
+	c.Vault.Path, _ = homedir.Expand(c.Vault.Path)
 
 	return nil
 }
diff --git a/internal/config/config_templates.go b/internal/config/config_templates.go
index bb51cb7..4b56827 100644
--- a/internal/config/config_templates.go
+++ b/internal/config/config_templates.go
@@ -23,7 +23,7 @@ import "io"
 
 const clientConfigTemplate string = `# BitMaelum Client Configuration Template. Edit for your own needs.
 config:
-    accounts:
+    vault:
         # where are our accounts stored?
         path: "~/.bitmaelum/accounts.vault.json"
     composer:
diff --git a/internal/config/paths_unix.go b/internal/config/paths_unix.go
index 06af749..4ef1136 100644
--- a/internal/config/paths_unix.go
+++ b/internal/config/paths_unix.go
@@ -24,6 +24,7 @@ package config
 func getSearchPaths() []string {
 	return []string{
 		"./",
+		"~/",
 		"/etc/bitmaelum/",
 	}
 }
diff --git a/internal/config/paths_windows.go b/internal/config/paths_windows.go
index 502ff45..8ba8107 100644
--- a/internal/config/paths_windows.go
+++ b/internal/config/paths_windows.go
@@ -24,6 +24,7 @@ package config
 func getSearchPaths() []string {
 	return []string{
 		"./",
+		"~/",
 		"%ProgramData%/BitMaelum/etc/bitmaelum/",
 	}
 }
diff --git a/internal/editor.go b/internal/editor.go
index 37ec7c8..2970047 100644
--- a/internal/editor.go
+++ b/internal/editor.go
@@ -82,7 +82,32 @@ func JSONFileEditor(src interface{}, dst interface{}) error {
 	}
 }
 
-// Get default editor
+// EditFile allows you to inplace edit a file until the editor returns success status
+func EditFile(file string) error {
+	editor, err := getEditor()
+	if err != nil {
+		return err
+	}
+
+	for {
+		// Execute editor
+		c := exec.Command(editor, file)
+		c.Stdin = os.Stdin
+		c.Stdout = os.Stdout
+		err := c.Run()
+		if err != nil {
+			return err
+		}
+
+		// Editor successfully ended?
+		if c.ProcessState.Success() {
+			// All is good, return
+			return nil
+		}
+	}
+}
+
+// getEditor Get default editor
 func getEditor() (string, error) {
 	if os.Getenv("EDITOR") != "" {
 		return os.Getenv("EDITOR"), nil
diff --git a/tools/jwt/main.go b/tools/jwt/main.go
index f204228..f3d6f81 100644
--- a/tools/jwt/main.go
+++ b/tools/jwt/main.go
@@ -49,7 +49,7 @@ func main() {
 	}
 
 	// Load account
-	accountVault, err := vault.Open(config.Client.Accounts.Path, opts.Password)
+	accountVault, err := vault.Open(config.Client.Vault.Path, opts.Password)
 	if err != nil {
 		logrus.Fatal(err)
 	}
diff --git a/tools/readmail/main.go b/tools/readmail/main.go
index da7370d..65e53af 100644
--- a/tools/readmail/main.go
+++ b/tools/readmail/main.go
@@ -49,7 +49,7 @@ func main() {
 	fmt.Println(internal.GetASCIILogo())
 
 	// Unlock vault
-	accountVault, err := vault.Open(config.Client.Accounts.Path, opts.Password)
+	accountVault, err := vault.Open(config.Client.Vault.Path, opts.Password)
 	if err != nil {
 		fmt.Printf("Error while opening vault: %s", err)
 		fmt.Println("")
diff --git a/tools/vault-edit/main.go b/tools/vault-edit/main.go
index 22bb5c8..3a5f7e2 100644
--- a/tools/vault-edit/main.go
+++ b/tools/vault-edit/main.go
@@ -39,7 +39,7 @@ func main() {
 	internal.ParseOptions(&opts)
 	config.LoadClientConfig(opts.Config)
 
-	v, err := vault.Open(config.Client.Accounts.Path, opts.Password)
+	v, err := vault.Open(config.Client.Vault.Path, opts.Password)
 	if err != nil {
 		panic(err)
 	}


Test patch:
diff --git a/internal/config/config_test.go b/internal/config/config_test.go
index ca281f5..6e54417 100644
--- a/internal/config/config_test.go
+++ b/internal/config/config_test.go
@@ -44,14 +44,14 @@ func TestClientConfig(t *testing.T) {
 	err := LoadClientConfigOrPass("")
 	assert.Error(t, err)
 
-	f, err := fs.Create("/etc/bitmaelum/client-config.yml")
+	f, err := fs.Create("/etc/bitmaelum/bitmaelum-client-config.yml")
 	assert.NoError(t, err)
 	err = GenerateClientConfig(f)
 	assert.NoError(t, err)
 	_ = f.Close()
 
 	Client.Resolver.Remote.URL = ""
-	err = LoadClientConfigOrPass("/etc/bitmaelum/client-config.yml")
+	err = LoadClientConfigOrPass("/etc/bitmaelum/bitmaelum-client-config.yml")
 	assert.NoError(t, err)
 	assert.Equal(t, "https://resolver.bitmaelum.com", Client.Resolver.Remote.URL)
 
@@ -61,7 +61,7 @@ func TestClientConfig(t *testing.T) {
 	assert.Equal(t, "", Client.Resolver.Remote.URL)
 
 	Client.Resolver.Remote.URL = ""
-	err = LoadClientConfigOrPass("/etc/bitmaelum/client-config.yml")
+	err = LoadClientConfigOrPass("/etc/bitmaelum/bitmaelum-client-config.yml")
 	assert.NoError(t, err)
 	assert.Equal(t, "https://resolver.bitmaelum.com", Client.Resolver.Remote.URL)
 
@@ -84,7 +84,7 @@ func TestClientConfig(t *testing.T) {
 
 	// Read from existing env
 	Client.Resolver.Remote.URL = ""
-	_ = os.Setenv("BITMAELUM_CLIENT_CONFIG", "/etc/bitmaelum/client-config.yml")
+	_ = os.Setenv("BITMAELUM_CLIENT_CONFIG", "/etc/bitmaelum/bitmaelum-client-config.yml")
 	err = LoadClientConfigOrPass("")
 	assert.NoError(t, err)
 	assert.Equal(t, "https://resolver.bitmaelum.com", Client.Resolver.Remote.URL)
@@ -97,7 +97,7 @@ func TestServerConfig(t *testing.T) {
 	assert.Error(t, err)
 
 	fs = afero.NewMemMapFs()
-	f, err := fs.Create("/etc/bitmaelum/server-config.yml")
+	f, err := fs.Create("/etc/bitmaelum/bitmaelum-server-config.yml")
 	assert.NoError(t, err)
 	err = GenerateServerConfig(f)
 	assert.NoError(t, err)
@@ -105,7 +105,7 @@ func TestServerConfig(t *testing.T) {
 
 	// Load direct
 	Server.Work.Pow.Bits = 0
-	err = LoadServerConfigOrPass("/etc/bitmaelum/server-config.yml")
+	err = LoadServerConfigOrPass("/etc/bitmaelum/bitmaelum-server-config.yml")
 	assert.NoError(t, err)
 	assert.Equal(t, 25, Server.Work.Pow.Bits)
 
@@ -117,7 +117,7 @@ func TestServerConfig(t *testing.T) {
 
 	// Load direct
 	Server.Work.Pow.Bits = 0
-	err = LoadServerConfigOrPass("/etc/bitmaelum/server-config.yml")
+	err = LoadServerConfigOrPass("/etc/bitmaelum/bitmaelum-server-config.yml")
 	assert.NoError(t, err)
 	assert.Equal(t, 25, Server.Work.Pow.Bits)
 
@@ -141,7 +141,7 @@ func TestServerConfig(t *testing.T) {
 
 	// Read from existing env
 	Server.Work.Pow.Bits = 0
-	_ = os.Setenv("BITMAELUM_SERVER_CONFIG", "/etc/bitmaelum/server-config.yml")
+	_ = os.Setenv("BITMAELUM_SERVER_CONFIG", "/etc/bitmaelum/bitmaelum-server-config.yml")
 	err = LoadServerConfigOrPass("")
 	assert.NoError(t, err)
 	assert.Equal(t, 25, Server.Work.Pow.Bits)
@@ -149,7 +149,7 @@ func TestServerConfig(t *testing.T) {
 
 func TestLoadClientConfig(t *testing.T) {
 	// Failed loading
-	err := readConfigPath("/foo/bar", "", Client.LoadConfig)
+	err := readConfigPath("/foo/bar", "", Client.LoadConfig, &LoadedClientConfigPath)
 	assert.Error(t, err)
 }