gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-kotlin] branch master updated: Make the wallet lib actuall


From: gnunet
Subject: [taler-wallet-kotlin] branch master updated: Make the wallet lib actually use the common lib
Date: Fri, 14 Aug 2020 22:38:26 +0200

This is an automated email from the git hooks/post-receive script.

torsten-grote pushed a commit to branch master
in repository wallet-kotlin.

The following commit(s) were added to refs/heads/master by this push:
     new a307a49  Make the wallet lib actually use the common lib
a307a49 is described below

commit a307a498dc8a42df129e8eaff591e9144ed96298
Author: Torsten Grote <t@grobox.de>
AuthorDate: Fri Aug 14 17:33:22 2020 -0300

    Make the wallet lib actually use the common lib
---
 .idea/.gitignore                                   |   4 +-
 .idea/compiler.xml                                 |  14 --
 .idea/jarRepositories.xml                          |   5 -
 .idea/misc.xml                                     |  78 +-----
 .idea/wallet-kotlin.iml                            |  19 --
 common/.gradle/5.5.1/fileChanges/last-build.bin    | Bin 1 -> 0 bytes
 common/.gradle/5.5.1/fileHashes/fileHashes.lock    | Bin 17 -> 0 bytes
 common/.gradle/5.5.1/gc.properties                 |   0
 .../buildOutputCleanup/buildOutputCleanup.lock     | Bin 17 -> 0 bytes
 common/.gradle/buildOutputCleanup/cache.properties |   2 -
 common/.gradle/vcs-1/gc.properties                 |   0
 common/build.gradle                                |   1 +
 .../kotlin/net/taler/{ => lib}/common/Amount.kt    |   2 +-
 .../kotlin/net/taler/{ => lib}/common/TalerUri.kt  |   4 +-
 .../kotlin/net/taler/{ => lib}/common/Time.kt      |   9 +-
 .../kotlin/net/taler/{ => lib}/common/Version.kt   |   2 +-
 .../net/taler/{ => lib}/common/AmountTest.kt       |  15 +-
 .../net/taler/{ => lib}/common/TalerUriTest.kt     |   6 +-
 .../kotlin/net/taler/{ => lib}/common/TestUtils.kt |  16 +-
 .../kotlin/net/taler/{ => lib}/common/TimeTest.kt  |   4 +-
 .../net/taler/{ => lib}/common/VersionTest.kt      |   2 +-
 gradle.properties                                  |   5 +
 wallet/build.gradle                                |   6 +-
 wallet/src/androidMain/AndroidManifest.xml         |   2 +-
 .../net/taler/{wallet/kotlin => lib/wallet}/Db.kt  |   2 +-
 .../kotlin => lib/wallet}/crypto/CryptoFactory.kt  |   2 +-
 .../kotlin => lib/wallet}/crypto/RsaBlinding.kt    |   2 +-
 .../kotlin => lib/wallet}/TestUtilsAndroid.kt      |   2 +-
 .../kotlin => lib/wallet}/crypto/PlanchetTest.kt   |  10 +-
 .../kotlin => lib/wallet}/crypto/RefreshTest.kt    |  26 +-
 .../wallet}/crypto/RsaBlindingTest.kt              |   4 +-
 .../kotlin/net/taler/lib/wallet/Amount.kt          |  11 +-
 .../kotlin => lib/wallet}/Base32Crockford.kt       |   2 +-
 .../net/taler/{wallet/kotlin => lib/wallet}/Db.kt  |   6 +-
 .../{wallet/kotlin => lib/wallet}/PaytoUri.kt      |   2 +-
 .../kotlin/net/taler/lib/wallet}/Time.kt           |   9 +-
 .../taler/{wallet/kotlin => lib/wallet}/Types.kt   |   3 +-
 .../taler/{wallet/kotlin => lib/wallet}/Utils.kt   |   2 +-
 .../kotlin/net/taler/lib/wallet/Version.kt         |  13 +-
 .../{wallet/kotlin => lib/wallet}/WalletApi.kt     |  23 +-
 .../{wallet/kotlin => lib/wallet}/crypto/Crypto.kt |   2 +-
 .../kotlin => lib/wallet}/crypto/CryptoImpl.kt     |   4 +-
 .../kotlin => lib/wallet}/crypto/Deposit.kt        |  12 +-
 .../{wallet/kotlin => lib/wallet}/crypto/Kdf.kt    |   2 +-
 .../kotlin => lib/wallet}/crypto/Planchet.kt       |   7 +-
 .../{wallet/kotlin => lib/wallet}/crypto/Recoup.kt |  10 +-
 .../kotlin => lib/wallet}/crypto/Refresh.kt        |  23 +-
 .../kotlin => lib/wallet}/crypto/Signature.kt      |  12 +-
 .../kotlin => lib/wallet}/exchange/Auditor.kt      |   2 +-
 .../kotlin => lib/wallet}/exchange/Denomination.kt |  14 +-
 .../kotlin => lib/wallet}/exchange/Exchange.kt     |  40 +--
 .../wallet}/exchange/ExchangeRecord.kt             |   4 +-
 .../{wallet/kotlin => lib/wallet}/exchange/Keys.kt |   4 +-
 .../{wallet/kotlin => lib/wallet}/exchange/Wire.kt |   6 +-
 .../kotlin => lib/wallet}/operations/Withdraw.kt   |  43 ++--
 .../kotlin/net/taler/wallet/kotlin/Amount.kt       | 210 ----------------
 .../kotlin/net/taler/wallet/kotlin/TalerUri.kt     |  60 -----
 .../kotlin/net/taler/wallet/kotlin/Time.kt         |  85 -------
 .../kotlin/net/taler/wallet/kotlin/Version.kt      |  78 ------
 .../kotlin/net/taler/lib/wallet/AmountTest.kt      |  64 +++++
 .../kotlin => lib/wallet}/Base32CrockfordTest.kt   |   2 +-
 .../taler/{wallet/kotlin => lib/wallet}/DbTest.kt  |  17 +-
 .../{wallet/kotlin => lib/wallet}/PaytoUriTest.kt  |   2 +-
 .../{wallet/kotlin => lib/wallet}/TestUtils.kt     |   2 +-
 .../{wallet/kotlin => lib/wallet}/TimestampTest.kt |   3 +-
 .../{wallet/kotlin => lib/wallet}/WalletApiTest.kt |   3 +-
 .../kotlin => lib/wallet}/crypto/DepositTest.kt    |  10 +-
 .../wallet}/crypto/EllipticCurveTest.kt            |   4 +-
 .../kotlin => lib/wallet}/crypto/KdfTest.kt        |   8 +-
 .../kotlin => lib/wallet}/crypto/RecoupTest.kt     |  14 +-
 .../wallet}/crypto/RefreshPlanchetTest.kt          |   4 +-
 .../kotlin => lib/wallet}/crypto/Sha256Test.kt     |   3 +-
 .../kotlin => lib/wallet}/crypto/Sha512Test.kt     |   4 +-
 .../kotlin => lib/wallet}/crypto/SignatureTest.kt  |  18 +-
 .../wallet}/exchange/DenominationTest.kt           |  20 +-
 .../wallet}/exchange/Denominations.kt              |  10 +-
 .../kotlin => lib/wallet}/exchange/KeysTest.kt     |  12 +-
 .../kotlin => lib/wallet}/exchange/UpdateTest.kt   |   4 +-
 .../kotlin => lib/wallet}/exchange/WireTest.kt     |  12 +-
 .../wallet}/operations/WithdrawTest.kt             |  32 +--
 .../kotlin/net/taler/wallet/kotlin/AmountTest.kt   | 276 ---------------------
 .../kotlin/net/taler/wallet/kotlin/TalerUriTest.kt |  65 -----
 .../kotlin/net/taler/wallet/kotlin/VersionTest.kt  |  57 -----
 .../kotlin/net/taler/lib/wallet}/Db.kt             |   2 +-
 .../kotlin => lib/wallet}/crypto/CryptoFactory.kt  |   2 +-
 .../{wallet/kotlin => lib/wallet}/TestUtils.kt     |   2 +-
 .../kotlin/net/taler/lib/wallet}/Db.kt             |   2 +-
 .../kotlin => lib/wallet}/crypto/CryptoFactory.kt  |   2 +-
 .../{wallet/kotlin => lib/wallet}/TestUtils.kt     |   2 +-
 89 files changed, 368 insertions(+), 1223 deletions(-)

diff --git a/.idea/.gitignore b/.idea/.gitignore
index 8eae92b..e7afc6a 100644
--- a/.idea/.gitignore
+++ b/.idea/.gitignore
@@ -1,6 +1,7 @@
 # Default ignored files
 /shelf/
 /artifacts
+/caches
 /modules*
 /workspace.xml
 /gradle.xml
@@ -11,4 +12,5 @@
 /vcs.xml
 /compiler.xml
 /jarRepositories.xml
-/misc.xml
\ No newline at end of file
+/misc.xml
+/$CACHE_FILE$
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 72e41ea..7c0bb6d 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -1,23 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="CompilerConfiguration">
-    <wildcardResourcePatterns>
-      <entry name="!?*.java" />
-      <entry name="!?*.form" />
-      <entry name="!?*.class" />
-      <entry name="!?*.groovy" />
-      <entry name="!?*.scala" />
-      <entry name="!?*.flex" />
-      <entry name="!?*.kt" />
-      <entry name="!?*.clj" />
-    </wildcardResourcePatterns>
     <bytecodeTargetLevel target="1.8">
       <module name="wallet-kotlin.common.jvmMain" target="1.6" />
-      <module name="wallet-kotlin.common.jvmMain~1" target="1.6" />
       <module name="wallet-kotlin.common.jvmTest" target="1.6" />
-      <module name="wallet-kotlin.common.jvmTest~1" target="1.6" />
-      <module name="wallet-kotlin_androidMain" target="1.6" />
-      <module name="wallet-kotlin_androidTest" target="1.6" />
     </bytecodeTargetLevel>
   </component>
 </project>
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index 59912a9..e9f6aa8 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -26,11 +26,6 @@
       <option name="name" value="maven" />
       <option name="url" value="https://dl.bintray.com/terl/lazysodium-maven"; 
/>
     </remote-repository>
-    <remote-repository>
-      <option name="id" value="MavenLocal" />
-      <option name="name" value="MavenLocal" />
-      <option name="url" value="file:$MAVEN_REPOSITORY$/" />
-    </remote-repository>
     <remote-repository>
       <option name="id" value="Google" />
       <option name="name" value="Google" />
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 21353ae..b0051c8 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,79 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
-  <component name="CMakeSettings">
-    <configurations>
-      <configuration PROFILE_NAME="Debug" CONFIG_NAME="Debug" />
-    </configurations>
-  </component>
-  <component name="MarkdownProjectSettings">
-    <PreviewSettings splitEditorLayout="SPLIT" splitEditorPreview="PREVIEW" 
useGrayscaleRendering="false" zoomFactor="1.0" maxImageWidth="0" 
showGitHubPageIfSynced="false" allowBrowsingInPreview="false" 
synchronizePreviewPosition="true" highlightPreviewType="NONE" 
highlightFadeOut="5" highlightOnTyping="true" synchronizeSourcePosition="true">
-      <PanelProvider>
-        <provider 
providerId="com.vladsch.idea.multimarkdown.editor.swing.html.panel" 
providerName="Default - Swing" />
-      </PanelProvider>
-    </PreviewSettings>
-    <ParserSettings>
-      <PegdownExtensions>
-        <option name="ABBREVIATIONS" value="false" />
-        <option name="ANCHORLINKS" value="true" />
-        <option name="ATXHEADERSPACE" value="true" />
-        <option name="AUTOLINKS" value="true" />
-        <option name="DEFINITIONS" value="false" />
-        <option name="FENCED_CODE_BLOCKS" value="true" />
-        <option name="FOOTNOTES" value="false" />
-        <option name="HARDWRAPS" value="false" />
-        <option name="INSERTED" value="false" />
-        <option name="QUOTES" value="false" />
-        <option name="RELAXEDHRULES" value="true" />
-        <option name="SMARTS" value="false" />
-        <option name="STRIKETHROUGH" value="true" />
-        <option name="SUBSCRIPT" value="false" />
-        <option name="SUPERSCRIPT" value="false" />
-        <option name="SUPPRESS_HTML_BLOCKS" value="false" />
-        <option name="SUPPRESS_INLINE_HTML" value="false" />
-        <option name="TABLES" value="true" />
-        <option name="TASKLISTITEMS" value="true" />
-        <option name="TOC" value="false" />
-        <option name="WIKILINKS" value="true" />
-      </PegdownExtensions>
-      <ParserOptions>
-        <option name="COMMONMARK_LISTS" value="false" />
-        <option name="DUMMY" value="false" />
-        <option name="EMOJI_SHORTCUTS" value="true" />
-        <option name="FLEXMARK_FRONT_MATTER" value="false" />
-        <option name="GFM_TABLE_RENDERING" value="true" />
-        <option name="GITBOOK_URL_ENCODING" value="false" />
-        <option name="GITHUB_EMOJI_URL" value="false" />
-        <option name="GITHUB_LISTS" value="true" />
-        <option name="GITHUB_WIKI_LINKS" value="true" />
-        <option name="JEKYLL_FRONT_MATTER" value="false" />
-        <option name="SIM_TOC_BLANK_LINE_SPACER" value="true" />
-      </ParserOptions>
-    </ParserSettings>
-    <HtmlSettings headerTopEnabled="false" headerBottomEnabled="false" 
bodyTopEnabled="false" bodyBottomEnabled="false" embedUrlContent="false" 
addPageHeader="true">
-      <GeneratorProvider>
-        <provider 
providerId="com.vladsch.idea.multimarkdown.editor.swing.html.generator" 
providerName="Default Swing HTML Generator" />
-      </GeneratorProvider>
-      <headerTop />
-      <headerBottom />
-      <bodyTop />
-      <bodyBottom />
-    </HtmlSettings>
-    <CssSettings previewScheme="UI_SCHEME" cssUri="" isCssUriEnabled="false" 
isCssTextEnabled="false" isDynamicPageWidth="true">
-      <StylesheetProvider>
-        <provider 
providerId="com.vladsch.idea.multimarkdown.editor.swing.html.css" 
providerName="Default Swing Stylesheet" />
-      </StylesheetProvider>
-      <ScriptProviders />
-      <cssText />
-    </CssSettings>
-    <HtmlExportSettings updateOnSave="false" parentDir="$ProjectFileDir$" 
targetDir="$ProjectFileDir$" cssDir="" scriptDir="" plainHtml="false" 
imageDir="" copyLinkedImages="false" imageUniquifyType="0" targetExt="" 
useTargetExt="false" noCssNoScripts="false" linkToExportedHtml="true" 
exportOnSettingsChange="true" regenerateOnProjectOpen="false" />
-    <LinkMapSettings>
-      <textMaps />
-    </LinkMapSettings>
-  </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" 
default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
-    <output url="file://$PROJECT_DIR$/build/classes" />
-  </component>
-  <component name="ProjectType">
-    <option name="id" value="Android" />
-  </component>
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" 
default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
 </project>
\ No newline at end of file
diff --git a/.idea/wallet-kotlin.iml b/.idea/wallet-kotlin.iml
deleted file mode 100644
index 57eb384..0000000
--- a/.idea/wallet-kotlin.iml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module external.linked.project.id="wallet-kotlin" 
external.linked.project.path="$MODULE_DIR$" 
external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" 
external.system.module.group="" external.system.module.version="unspecified" 
type="JAVA_MODULE" version="4">
-  <component name="FacetManager">
-    <facet type="java-gradle" name="Java-Gradle">
-      <configuration>
-        <option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
-        <option name="BUILDABLE" value="false" />
-      </configuration>
-    </facet>
-  </component>
-  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" 
inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$">
-      <excludeFolder url="file://$MODULE_DIR$/.gradle" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="sourceFolder" forTests="false" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/common/.gradle/5.5.1/fileChanges/last-build.bin 
b/common/.gradle/5.5.1/fileChanges/last-build.bin
deleted file mode 100644
index f76dd23..0000000
Binary files a/common/.gradle/5.5.1/fileChanges/last-build.bin and /dev/null 
differ
diff --git a/common/.gradle/5.5.1/fileHashes/fileHashes.lock 
b/common/.gradle/5.5.1/fileHashes/fileHashes.lock
deleted file mode 100644
index 34525bf..0000000
Binary files a/common/.gradle/5.5.1/fileHashes/fileHashes.lock and /dev/null 
differ
diff --git a/common/.gradle/5.5.1/gc.properties 
b/common/.gradle/5.5.1/gc.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/common/.gradle/buildOutputCleanup/buildOutputCleanup.lock 
b/common/.gradle/buildOutputCleanup/buildOutputCleanup.lock
deleted file mode 100644
index 04431dd..0000000
Binary files a/common/.gradle/buildOutputCleanup/buildOutputCleanup.lock and 
/dev/null differ
diff --git a/common/.gradle/buildOutputCleanup/cache.properties 
b/common/.gradle/buildOutputCleanup/cache.properties
deleted file mode 100644
index df9e847..0000000
--- a/common/.gradle/buildOutputCleanup/cache.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-#Thu Jul 30 09:16:47 BRT 2020
-gradle.version=5.5.1
diff --git a/common/.gradle/vcs-1/gc.properties 
b/common/.gradle/vcs-1/gc.properties
deleted file mode 100644
index e69de29..0000000
diff --git a/common/build.gradle b/common/build.gradle
index efc1fe0..9ceffc4 100644
--- a/common/build.gradle
+++ b/common/build.gradle
@@ -47,6 +47,7 @@ kotlin {
             dependencies {
                 implementation kotlin('stdlib-common')
                 implementation 
"org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:$serialization_version"
+                implementation "com.soywiz.korlibs.klock:klock:1.11.12"
             }
         }
         commonTest {
diff --git a/common/src/commonMain/kotlin/net/taler/common/Amount.kt 
b/common/src/commonMain/kotlin/net/taler/lib/common/Amount.kt
similarity index 99%
rename from common/src/commonMain/kotlin/net/taler/common/Amount.kt
rename to common/src/commonMain/kotlin/net/taler/lib/common/Amount.kt
index 84d10c5..213abb3 100644
--- a/common/src/commonMain/kotlin/net/taler/common/Amount.kt
+++ b/common/src/commonMain/kotlin/net/taler/lib/common/Amount.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.common
+package net.taler.lib.common
 
 import kotlinx.serialization.Decoder
 import kotlinx.serialization.Encoder
diff --git a/common/src/commonMain/kotlin/net/taler/common/TalerUri.kt 
b/common/src/commonMain/kotlin/net/taler/lib/common/TalerUri.kt
similarity index 97%
rename from common/src/commonMain/kotlin/net/taler/common/TalerUri.kt
rename to common/src/commonMain/kotlin/net/taler/lib/common/TalerUri.kt
index 9f121d3..8255dc0 100644
--- a/common/src/commonMain/kotlin/net/taler/common/TalerUri.kt
+++ b/common/src/commonMain/kotlin/net/taler/lib/common/TalerUri.kt
@@ -14,9 +14,9 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.common
+package net.taler.lib.common
 
-internal object TalerUri {
+object TalerUri {
 
     private const val SCHEME = "taler://"
     private const val SCHEME_INSECURE = "taler+http://";
diff --git a/common/src/commonMain/kotlin/net/taler/common/Time.kt 
b/common/src/commonMain/kotlin/net/taler/lib/common/Time.kt
similarity index 94%
rename from common/src/commonMain/kotlin/net/taler/common/Time.kt
rename to common/src/commonMain/kotlin/net/taler/lib/common/Time.kt
index 37b6606..0e5e07c 100644
--- a/common/src/commonMain/kotlin/net/taler/common/Time.kt
+++ b/common/src/commonMain/kotlin/net/taler/lib/common/Time.kt
@@ -14,8 +14,9 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.common
+package net.taler.lib.common
 
+import com.soywiz.klock.DateTime
 import kotlinx.serialization.SerialName
 import kotlinx.serialization.Serializable
 import kotlinx.serialization.builtins.serializer
@@ -24,11 +25,9 @@ import kotlinx.serialization.json.JsonPrimitive
 import kotlinx.serialization.json.JsonTransformingSerializer
 import kotlinx.serialization.json.contentOrNull
 import kotlinx.serialization.json.longOrNull
-import net.taler.common.Duration.Companion.FOREVER
+import net.taler.lib.common.Duration.Companion.FOREVER
 import kotlin.math.max
 
-expect fun nowMillis(): Long
-
 @Serializable
 data class Timestamp(
     @SerialName("t_ms")
@@ -38,7 +37,7 @@ data class Timestamp(
 
     companion object {
         const val NEVER: Long = -1
-        fun now(): Timestamp = Timestamp(nowMillis())
+        fun now(): Timestamp = Timestamp(DateTime.nowUnixLong())
     }
 
     /**
diff --git a/common/src/commonMain/kotlin/net/taler/common/Version.kt 
b/common/src/commonMain/kotlin/net/taler/lib/common/Version.kt
similarity index 98%
rename from common/src/commonMain/kotlin/net/taler/common/Version.kt
rename to common/src/commonMain/kotlin/net/taler/lib/common/Version.kt
index 8774115..d3f0ad2 100644
--- a/common/src/commonMain/kotlin/net/taler/common/Version.kt
+++ b/common/src/commonMain/kotlin/net/taler/lib/common/Version.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.common
+package net.taler.lib.common
 
 import kotlin.math.sign
 
diff --git a/common/src/commonTest/kotlin/net/taler/common/AmountTest.kt 
b/common/src/commonTest/kotlin/net/taler/lib/common/AmountTest.kt
similarity index 96%
rename from common/src/commonTest/kotlin/net/taler/common/AmountTest.kt
rename to common/src/commonTest/kotlin/net/taler/lib/common/AmountTest.kt
index e184307..90b0569 100644
--- a/common/src/commonTest/kotlin/net/taler/common/AmountTest.kt
+++ b/common/src/commonTest/kotlin/net/taler/lib/common/AmountTest.kt
@@ -14,14 +14,13 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.common
+package net.taler.lib.common
 
 import kotlin.random.Random
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertFalse
 import kotlin.test.assertTrue
-import kotlin.test.fail
 
 class AmountTest {
 
@@ -219,16 +218,4 @@ class AmountTest {
         }
     }
 
-    private inline fun <reified T : Throwable> assertThrows(
-        msg: String? = null,
-        function: () -> Any
-    ) {
-        try {
-            function.invoke()
-            fail(msg)
-        } catch (e: Exception) {
-            assertTrue(e is T)
-        }
-    }
-
 }
diff --git a/common/src/commonTest/kotlin/net/taler/common/TalerUriTest.kt 
b/common/src/commonTest/kotlin/net/taler/lib/common/TalerUriTest.kt
similarity index 94%
rename from common/src/commonTest/kotlin/net/taler/common/TalerUriTest.kt
rename to common/src/commonTest/kotlin/net/taler/lib/common/TalerUriTest.kt
index f996fa9..ca3430d 100644
--- a/common/src/commonTest/kotlin/net/taler/common/TalerUriTest.kt
+++ b/common/src/commonTest/kotlin/net/taler/lib/common/TalerUriTest.kt
@@ -14,10 +14,10 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.common
+package net.taler.lib.common
 
-import net.taler.common.TalerUri.WithdrawUriResult
-import net.taler.common.TalerUri.parseWithdrawUri
+import net.taler.lib.common.TalerUri.WithdrawUriResult
+import net.taler.lib.common.TalerUri.parseWithdrawUri
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertNull
diff --git a/common/src/commonTest/kotlin/net/taler/common/TestUtils.kt 
b/common/src/commonTest/kotlin/net/taler/lib/common/TestUtils.kt
similarity index 77%
rename from common/src/commonTest/kotlin/net/taler/common/TestUtils.kt
rename to common/src/commonTest/kotlin/net/taler/lib/common/TestUtils.kt
index e3a6c17..837de27 100644
--- a/common/src/commonTest/kotlin/net/taler/common/TestUtils.kt
+++ b/common/src/commonTest/kotlin/net/taler/lib/common/TestUtils.kt
@@ -14,9 +14,11 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.common
+package net.taler.lib.common
 
 import kotlin.random.Random
+import kotlin.test.assertTrue
+import kotlin.test.fail
 
 private val charPool: List<Char> = ('a'..'z') + ('A'..'Z') + ('0'..'9')
 fun getRandomString(minLength: Int = 1, maxLength: Int = Random.nextInt(0, 
1337)) =
@@ -24,3 +26,15 @@ fun getRandomString(minLength: Int = 1, maxLength: Int = 
Random.nextInt(0, 1337)
         .map { Random.nextInt(0, charPool.size) }
         .map(charPool::get)
         .joinToString("")
+
+inline fun <reified T : Throwable> assertThrows(
+    msg: String? = null,
+    function: () -> Any
+) {
+    try {
+        function.invoke()
+        fail(msg)
+    } catch (e: Exception) {
+        assertTrue(e is T)
+    }
+}
diff --git a/common/src/commonTest/kotlin/net/taler/common/TimeTest.kt 
b/common/src/commonTest/kotlin/net/taler/lib/common/TimeTest.kt
similarity index 95%
rename from common/src/commonTest/kotlin/net/taler/common/TimeTest.kt
rename to common/src/commonTest/kotlin/net/taler/lib/common/TimeTest.kt
index 3ee0a99..647e439 100644
--- a/common/src/commonTest/kotlin/net/taler/common/TimeTest.kt
+++ b/common/src/commonTest/kotlin/net/taler/lib/common/TimeTest.kt
@@ -14,12 +14,12 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.common
+package net.taler.lib.common
 
 import kotlinx.serialization.UnstableDefault
 import kotlinx.serialization.json.Json.Default.parse
 import kotlinx.serialization.json.Json.Default.stringify
-import net.taler.common.Timestamp.Companion.NEVER
+import net.taler.lib.common.Timestamp.Companion.NEVER
 import kotlin.random.Random
 import kotlin.test.Test
 import kotlin.test.assertEquals
diff --git a/common/src/commonTest/kotlin/net/taler/common/VersionTest.kt 
b/common/src/commonTest/kotlin/net/taler/lib/common/VersionTest.kt
similarity index 98%
rename from common/src/commonTest/kotlin/net/taler/common/VersionTest.kt
rename to common/src/commonTest/kotlin/net/taler/lib/common/VersionTest.kt
index f4f17ea..b10b4bf 100644
--- a/common/src/commonTest/kotlin/net/taler/common/VersionTest.kt
+++ b/common/src/commonTest/kotlin/net/taler/lib/common/VersionTest.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.common
+package net.taler.lib.common
 
 import kotlin.test.Test
 import kotlin.test.assertEquals
diff --git a/gradle.properties b/gradle.properties
index aaf152a..1b92c41 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,4 +1,9 @@
+org.gradle.caching=true
+
 kotlin.code.style=official
 
 # prevent parallel execution of several compiler instances
 kotlin.native.disableCompilerDaemon=true
+
+kotlin.parallel.tasks.in.project=true
+kotlin.incremental.multiplatform=true
diff --git a/wallet/build.gradle b/wallet/build.gradle
index aacd0b3..2e58d15 100644
--- a/wallet/build.gradle
+++ b/wallet/build.gradle
@@ -68,21 +68,19 @@ kotlin {
         def ktor_version = "1.3.2"
         all {
             languageSettings {
+                progressiveMode = true
                 useExperimentalAnnotation('kotlin.ExperimentalStdlibApi')
             }
-            dependencies {
-            }
         }
         commonMain {
             dependencies {
                 implementation kotlin('stdlib-common')
-                implementation project(":common")
+                api project(path: ":common")
 
                 implementation 
"org.jetbrains.kotlinx:kotlinx-coroutines-core-common:$coroutines_version"
                 implementation "io.ktor:ktor-client-core:$ktor_version"
                 implementation "io.ktor:ktor-client-logging:$ktor_version"
                 implementation 
"io.ktor:ktor-client-serialization:$ktor_version"
-                implementation "com.soywiz.korlibs.klock:klock:1.11.12"
             }
         }
         commonTest {
diff --git a/wallet/src/androidMain/AndroidManifest.xml 
b/wallet/src/androidMain/AndroidManifest.xml
index 77fbf4a..6873320 100644
--- a/wallet/src/androidMain/AndroidManifest.xml
+++ b/wallet/src/androidMain/AndroidManifest.xml
@@ -15,7 +15,7 @@
   -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android";
-    package="net.taler.wallet.kotlin">
+    package="net.taler.lib.wallet">
 
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
     <uses-permission android:name="android.permission.INTERNET" />
diff --git a/wallet/src/androidMain/kotlin/net/taler/wallet/kotlin/Db.kt 
b/wallet/src/androidMain/kotlin/net/taler/lib/wallet/Db.kt
similarity index 96%
rename from wallet/src/androidMain/kotlin/net/taler/wallet/kotlin/Db.kt
rename to wallet/src/androidMain/kotlin/net/taler/lib/wallet/Db.kt
index 45cbfc3..39394b8 100644
--- a/wallet/src/androidMain/kotlin/net/taler/wallet/kotlin/Db.kt
+++ b/wallet/src/androidMain/kotlin/net/taler/lib/wallet/Db.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.lib.wallet
 
 internal actual class DbFactory {
     actual fun openDb(): Db {
diff --git 
a/wallet/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt 
b/wallet/src/androidMain/kotlin/net/taler/lib/wallet/crypto/CryptoFactory.kt
similarity index 99%
rename from 
wallet/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
rename to 
wallet/src/androidMain/kotlin/net/taler/lib/wallet/crypto/CryptoFactory.kt
index 502b8a0..1f6c7a8 100644
--- 
a/wallet/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
+++ b/wallet/src/androidMain/kotlin/net/taler/lib/wallet/crypto/CryptoFactory.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
 import com.goterl.lazycode.lazysodium.LazySodiumJava
 import com.goterl.lazycode.lazysodium.SodiumJava
diff --git 
a/wallet/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/RsaBlinding.kt 
b/wallet/src/androidMain/kotlin/net/taler/lib/wallet/crypto/RsaBlinding.kt
similarity index 99%
rename from 
wallet/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/RsaBlinding.kt
rename to 
wallet/src/androidMain/kotlin/net/taler/lib/wallet/crypto/RsaBlinding.kt
index 458a089..70c7c78 100644
--- 
a/wallet/src/androidMain/kotlin/net/taler/wallet/kotlin/crypto/RsaBlinding.kt
+++ b/wallet/src/androidMain/kotlin/net/taler/lib/wallet/crypto/RsaBlinding.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
 import java.math.BigInteger
 import kotlin.math.abs
diff --git 
a/wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/TestUtilsAndroid.kt 
b/wallet/src/androidTest/kotlin/net/taler/lib/wallet/TestUtilsAndroid.kt
similarity index 96%
rename from 
wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/TestUtilsAndroid.kt
rename to wallet/src/androidTest/kotlin/net/taler/lib/wallet/TestUtilsAndroid.kt
index a362874..58e04ce 100644
--- a/wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/TestUtilsAndroid.kt
+++ b/wallet/src/androidTest/kotlin/net/taler/lib/wallet/TestUtilsAndroid.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.lib.wallet
 
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.runBlocking
diff --git 
a/wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/PlanchetTest.kt 
b/wallet/src/androidTest/kotlin/net/taler/lib/wallet/crypto/PlanchetTest.kt
similarity index 97%
rename from 
wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/PlanchetTest.kt
rename to 
wallet/src/androidTest/kotlin/net/taler/lib/wallet/crypto/PlanchetTest.kt
index d7f1dae..c58d40d 100644
--- 
a/wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/PlanchetTest.kt
+++ b/wallet/src/androidTest/kotlin/net/taler/lib/wallet/crypto/PlanchetTest.kt
@@ -14,12 +14,12 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
-import net.taler.wallet.kotlin.Amount
-import net.taler.wallet.kotlin.Base32Crockford
-import net.taler.wallet.kotlin.crypto.Planchet.CreationRequest
-import net.taler.wallet.kotlin.crypto.Planchet.CreationResult
+import net.taler.lib.common.Amount
+import net.taler.lib.wallet.Base32Crockford
+import net.taler.lib.wallet.crypto.Planchet.CreationRequest
+import net.taler.lib.wallet.crypto.Planchet.CreationResult
 import kotlin.random.Random
 import kotlin.test.Test
 import kotlin.test.assertEquals
diff --git 
a/wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/RefreshTest.kt 
b/wallet/src/androidTest/kotlin/net/taler/lib/wallet/crypto/RefreshTest.kt
similarity index 98%
rename from 
wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/RefreshTest.kt
rename to 
wallet/src/androidTest/kotlin/net/taler/lib/wallet/crypto/RefreshTest.kt
index 6cdad75..981c978 100644
--- 
a/wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/RefreshTest.kt
+++ b/wallet/src/androidTest/kotlin/net/taler/lib/wallet/crypto/RefreshTest.kt
@@ -14,20 +14,20 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
-import net.taler.wallet.kotlin.Amount
-import net.taler.wallet.kotlin.Base32Crockford
-import net.taler.wallet.kotlin.CoinRecord
-import net.taler.wallet.kotlin.CoinSourceType.WITHDRAW
-import net.taler.wallet.kotlin.CoinStatus.DORMANT
-import net.taler.wallet.kotlin.Timestamp
-import net.taler.wallet.kotlin.crypto.Refresh.RefreshPlanchetRecord
-import net.taler.wallet.kotlin.crypto.Refresh.RefreshSessionRecord
-import net.taler.wallet.kotlin.exchange.DenominationRecord
-import net.taler.wallet.kotlin.exchange.DenominationSelectionInfo
-import net.taler.wallet.kotlin.exchange.DenominationStatus.VerifiedGood
-import net.taler.wallet.kotlin.exchange.SelectedDenomination
+import net.taler.lib.common.Amount
+import net.taler.lib.common.Timestamp
+import net.taler.lib.wallet.Base32Crockford
+import net.taler.lib.wallet.CoinRecord
+import net.taler.lib.wallet.CoinSourceType.WITHDRAW
+import net.taler.lib.wallet.CoinStatus.DORMANT
+import net.taler.lib.wallet.crypto.Refresh.RefreshPlanchetRecord
+import net.taler.lib.wallet.crypto.Refresh.RefreshSessionRecord
+import net.taler.lib.wallet.exchange.DenominationRecord
+import net.taler.lib.wallet.exchange.DenominationSelectionInfo
+import net.taler.lib.wallet.exchange.DenominationStatus.VerifiedGood
+import net.taler.lib.wallet.exchange.SelectedDenomination
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
diff --git 
a/wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/RsaBlindingTest.kt
 b/wallet/src/androidTest/kotlin/net/taler/lib/wallet/crypto/RsaBlindingTest.kt
similarity index 99%
rename from 
wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/RsaBlindingTest.kt
rename to 
wallet/src/androidTest/kotlin/net/taler/lib/wallet/crypto/RsaBlindingTest.kt
index 0ced114..2ee5f1a 100644
--- 
a/wallet/src/androidTest/kotlin/net/taler/wallet/kotlin/crypto/RsaBlindingTest.kt
+++ 
b/wallet/src/androidTest/kotlin/net/taler/lib/wallet/crypto/RsaBlindingTest.kt
@@ -14,9 +14,9 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
-import net.taler.wallet.kotlin.Base32Crockford
+import net.taler.lib.wallet.Base32Crockford
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
diff --git a/common/src/jvmMain/kotlin/net/taler/common/Time.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/Amount.kt
similarity index 67%
rename from common/src/jvmMain/kotlin/net/taler/common/Time.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/Amount.kt
index 6cd9040..7273dba 100644
--- a/common/src/jvmMain/kotlin/net/taler/common/Time.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/Amount.kt
@@ -14,8 +14,13 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.common
+package net.taler.lib.wallet
 
-actual fun nowMillis(): Long {
-    return System.currentTimeMillis()
+import net.taler.lib.common.Amount
+import net.taler.lib.wallet.crypto.CryptoImpl.Companion.toByteArray
+
+fun Amount.toByteArray() = ByteArray(8 + 4 + 12).apply {
+    value.toByteArray().copyInto(this, 0, 0, 8)
+    fraction.toByteArray().copyInto(this, 8, 0, 4)
+    currency.encodeToByteArray().copyInto(this, 12)
 }
diff --git 
a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Base32Crockford.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/Base32Crockford.kt
similarity index 99%
rename from 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Base32Crockford.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/Base32Crockford.kt
index 9043731..2517e85 100644
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Base32Crockford.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/Base32Crockford.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.lib.wallet
 
 
 class EncodingException : Exception("Invalid encoding")
diff --git a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Db.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/Db.kt
similarity index 95%
rename from wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Db.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/Db.kt
index 3a5ecd6..df809c7 100644
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Db.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/Db.kt
@@ -14,12 +14,12 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.lib.wallet
 
 import kotlinx.coroutines.sync.Mutex
 import kotlinx.coroutines.sync.withLock
-import net.taler.wallet.kotlin.exchange.DenominationRecord
-import net.taler.wallet.kotlin.exchange.ExchangeRecord
+import net.taler.lib.wallet.exchange.DenominationRecord
+import net.taler.lib.wallet.exchange.ExchangeRecord
 
 internal interface Db {
     suspend fun put(exchange: ExchangeRecord)
diff --git a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/PaytoUri.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/PaytoUri.kt
similarity index 98%
rename from wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/PaytoUri.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/PaytoUri.kt
index f6b11d2..2ae9813 100644
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/PaytoUri.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/PaytoUri.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.lib.wallet
 
 data class PaytoUri(
     val targetType: String,
diff --git a/common/src/jsMain/kotlin/net/taler/common/Time.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/Time.kt
similarity index 72%
rename from common/src/jsMain/kotlin/net/taler/common/Time.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/Time.kt
index b114022..e67474b 100644
--- a/common/src/jsMain/kotlin/net/taler/common/Time.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/Time.kt
@@ -14,10 +14,11 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.common
+package net.taler.lib.wallet
 
-import kotlin.js.Date
+import net.taler.lib.common.Timestamp
+import net.taler.lib.wallet.crypto.CryptoImpl.Companion.toByteArray
 
-actual fun nowMillis(): Long {
-    return Date().getMilliseconds().toLong()
+fun Timestamp.roundedToByteArray(): ByteArray = ByteArray(8).apply {
+    (truncateSeconds().ms * 1000L).toByteArray().copyInto(this)
 }
diff --git a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Types.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/Types.kt
similarity index 97%
rename from wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Types.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/Types.kt
index 04b17e7..b068bda 100644
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Types.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/Types.kt
@@ -14,8 +14,9 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.lib.wallet
 
+import net.taler.lib.common.Amount
 
 class CoinRecord(
     /**
diff --git a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Utils.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/Utils.kt
similarity index 97%
rename from wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Utils.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/Utils.kt
index 2549195..498b8a8 100644
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Utils.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/Utils.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.lib.wallet
 
 import io.ktor.client.HttpClient
 import io.ktor.client.features.json.JsonFeature
diff --git a/common/src/nativeMain/kotlin/net/taler/common/Time.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/Version.kt
similarity index 76%
rename from common/src/nativeMain/kotlin/net/taler/common/Time.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/Version.kt
index 8a4091a..ba9be3c 100644
--- a/common/src/nativeMain/kotlin/net/taler/common/Time.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/Version.kt
@@ -14,10 +14,13 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.common
+package net.taler.lib.wallet
 
-import kotlin.system.getTimeMillis
+import net.taler.lib.common.Version
 
-actual fun nowMillis(): Long {
-    return getTimeMillis()
-}
+class SupportedVersions(
+    val walletVersion: Version,
+    val exchangeVersion: Version,
+    val bankVersion: Version,
+    val merchantVersion: Version
+)
diff --git a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/WalletApi.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/WalletApi.kt
similarity index 85%
rename from wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/WalletApi.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/WalletApi.kt
index 11fd181..bfe2825 100644
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/WalletApi.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/WalletApi.kt
@@ -14,18 +14,21 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.lib.wallet
 
 import io.ktor.client.HttpClient
-import net.taler.wallet.kotlin.crypto.Crypto
-import net.taler.wallet.kotlin.crypto.CryptoFactory
-import net.taler.wallet.kotlin.crypto.Signature
-import net.taler.wallet.kotlin.exchange.Exchange
-import net.taler.wallet.kotlin.exchange.ExchangeListItem
-import net.taler.wallet.kotlin.exchange.GetExchangeTosResult
-import net.taler.wallet.kotlin.operations.Withdraw
-import net.taler.wallet.kotlin.operations.WithdrawalDetails
-import net.taler.wallet.kotlin.operations.WithdrawalDetailsForUri
+import net.taler.lib.common.Amount
+import net.taler.lib.common.Timestamp
+import net.taler.lib.common.Version
+import net.taler.lib.wallet.crypto.Crypto
+import net.taler.lib.wallet.crypto.CryptoFactory
+import net.taler.lib.wallet.crypto.Signature
+import net.taler.lib.wallet.exchange.Exchange
+import net.taler.lib.wallet.exchange.ExchangeListItem
+import net.taler.lib.wallet.exchange.GetExchangeTosResult
+import net.taler.lib.wallet.operations.Withdraw
+import net.taler.lib.wallet.operations.WithdrawalDetails
+import net.taler.lib.wallet.operations.WithdrawalDetailsForUri
 
 public class WalletApi {
 
diff --git 
a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Crypto.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Crypto.kt
similarity index 98%
rename from 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Crypto.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Crypto.kt
index 226aa64..cbb486a 100644
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Crypto.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Crypto.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
 internal interface Crypto {
     fun sha256(input: ByteArray): ByteArray
diff --git 
a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoImpl.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/CryptoImpl.kt
similarity index 94%
rename from 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoImpl.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/CryptoImpl.kt
index 0780e45..6b7cb8e 100644
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoImpl.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/CryptoImpl.kt
@@ -14,9 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
-
-import net.taler.wallet.kotlin.crypto.CryptoImpl.Companion.toByteArray
+package net.taler.lib.wallet.crypto
 
 abstract class CryptoImpl : Crypto {
 
diff --git 
a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Deposit.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Deposit.kt
similarity index 92%
rename from 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Deposit.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Deposit.kt
index 3156d3f..66255d8 100644
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Deposit.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Deposit.kt
@@ -14,12 +14,14 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
-import net.taler.wallet.kotlin.Amount
-import net.taler.wallet.kotlin.Base32Crockford
-import net.taler.wallet.kotlin.Timestamp
-import net.taler.wallet.kotlin.crypto.Signature.Companion.WALLET_COIN_DEPOSIT
+import net.taler.lib.common.Amount
+import net.taler.lib.common.Timestamp
+import net.taler.lib.wallet.Base32Crockford
+import net.taler.lib.wallet.crypto.Signature.Companion.WALLET_COIN_DEPOSIT
+import net.taler.lib.wallet.roundedToByteArray
+import net.taler.lib.wallet.toByteArray
 
 /**
  * Deposit operations are requested by a merchant during a transaction.
diff --git a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Kdf.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Kdf.kt
similarity index 98%
rename from wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Kdf.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Kdf.kt
index 44f55cc..2d714f8 100644
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Kdf.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Kdf.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
 import kotlin.experimental.xor
 import kotlin.math.ceil
diff --git 
a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Planchet.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Planchet.kt
similarity index 95%
rename from 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Planchet.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Planchet.kt
index b29007e..22aa786 100644
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Planchet.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Planchet.kt
@@ -14,10 +14,11 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
-import net.taler.wallet.kotlin.Amount
-import net.taler.wallet.kotlin.Base32Crockford
+import net.taler.lib.common.Amount
+import net.taler.lib.wallet.Base32Crockford
+import net.taler.lib.wallet.toByteArray
 
 internal class Planchet(private val crypto: Crypto) {
 
diff --git 
a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Recoup.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Recoup.kt
similarity index 90%
rename from 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Recoup.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Recoup.kt
index 0f2b6df..c7678e4 100644
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Recoup.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Recoup.kt
@@ -14,12 +14,12 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
-import net.taler.wallet.kotlin.Base32Crockford
-import net.taler.wallet.kotlin.CoinRecord
-import net.taler.wallet.kotlin.CoinSourceType.REFRESH
-import net.taler.wallet.kotlin.crypto.Signature.Companion.WALLET_COIN_RECOUP
+import net.taler.lib.wallet.Base32Crockford
+import net.taler.lib.wallet.CoinRecord
+import net.taler.lib.wallet.CoinSourceType.REFRESH
+import net.taler.lib.wallet.crypto.Signature.Companion.WALLET_COIN_RECOUP
 
 internal class Recoup(private val crypto: Crypto) {
 
diff --git 
a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Refresh.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Refresh.kt
similarity index 94%
rename from 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Refresh.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Refresh.kt
index cd24b07..90478ef 100644
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Refresh.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Refresh.kt
@@ -14,17 +14,18 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
-
-import net.taler.wallet.kotlin.Amount
-import net.taler.wallet.kotlin.Base32Crockford
-import net.taler.wallet.kotlin.CoinRecord
-import net.taler.wallet.kotlin.Timestamp
-import net.taler.wallet.kotlin.crypto.Signature.Companion.WALLET_COIN_LINK
-import net.taler.wallet.kotlin.crypto.Signature.Companion.WALLET_COIN_MELT
-import net.taler.wallet.kotlin.crypto.Signature.PurposeBuilder
-import net.taler.wallet.kotlin.exchange.DenominationSelectionInfo
-import net.taler.wallet.kotlin.exchange.SelectedDenomination
+package net.taler.lib.wallet.crypto
+
+import net.taler.lib.common.Amount
+import net.taler.lib.wallet.Base32Crockford
+import net.taler.lib.wallet.CoinRecord
+import net.taler.lib.common.Timestamp
+import net.taler.lib.wallet.crypto.Signature.Companion.WALLET_COIN_LINK
+import net.taler.lib.wallet.crypto.Signature.Companion.WALLET_COIN_MELT
+import net.taler.lib.wallet.crypto.Signature.PurposeBuilder
+import net.taler.lib.wallet.exchange.DenominationSelectionInfo
+import net.taler.lib.wallet.exchange.SelectedDenomination
+import net.taler.lib.wallet.toByteArray
 
 internal class Refresh(private val crypto: Crypto) {
 
diff --git 
a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Signature.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Signature.kt
similarity index 94%
rename from 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Signature.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Signature.kt
index 9b06756..006c004 100644
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/crypto/Signature.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/crypto/Signature.kt
@@ -14,12 +14,14 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
-import net.taler.wallet.kotlin.Base32Crockford
-import net.taler.wallet.kotlin.crypto.CryptoImpl.Companion.toByteArray
-import net.taler.wallet.kotlin.exchange.DenominationRecord
-import net.taler.wallet.kotlin.exchange.WireFee
+import net.taler.lib.wallet.Base32Crockford
+import net.taler.lib.wallet.crypto.CryptoImpl.Companion.toByteArray
+import net.taler.lib.wallet.exchange.DenominationRecord
+import net.taler.lib.wallet.exchange.WireFee
+import net.taler.lib.wallet.roundedToByteArray
+import net.taler.lib.wallet.toByteArray
 
 internal class Signature(private val crypto: Crypto) {
 
diff --git 
a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Auditor.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/exchange/Auditor.kt
similarity index 97%
rename from 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Auditor.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/exchange/Auditor.kt
index 4df0bdf..248da8d 100644
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Auditor.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/exchange/Auditor.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.exchange
+package net.taler.lib.wallet.exchange
 
 import kotlinx.serialization.Serializable
 
diff --git 
a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Denomination.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/exchange/Denomination.kt
similarity index 94%
rename from 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Denomination.kt
rename to 
wallet/src/commonMain/kotlin/net/taler/lib/wallet/exchange/Denomination.kt
index 88a81fd..fca9e3f 100644
--- 
a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Denomination.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/exchange/Denomination.kt
@@ -14,15 +14,15 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.exchange
+package net.taler.lib.wallet.exchange
 
 import kotlinx.serialization.Serializable
-import net.taler.wallet.kotlin.Amount
-import net.taler.wallet.kotlin.Base32Crockford
-import net.taler.wallet.kotlin.Duration
-import net.taler.wallet.kotlin.Timestamp
-import net.taler.wallet.kotlin.exchange.DenominationStatus.Unverified
-import net.taler.wallet.kotlin.exchange.DenominationStatus.VerifiedGood
+import net.taler.lib.common.Amount
+import net.taler.lib.common.Duration
+import net.taler.lib.common.Timestamp
+import net.taler.lib.wallet.Base32Crockford
+import net.taler.lib.wallet.exchange.DenominationStatus.Unverified
+import net.taler.lib.wallet.exchange.DenominationStatus.VerifiedGood
 
 /**
  * Denomination as found in the /keys response from the exchange.
diff --git 
a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Exchange.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/exchange/Exchange.kt
similarity index 89%
rename from 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Exchange.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/exchange/Exchange.kt
index 7a6ac7f..4d89cd6 100644
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Exchange.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/exchange/Exchange.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.exchange
+package net.taler.lib.wallet.exchange
 
 import io.ktor.client.HttpClient
 import io.ktor.client.request.accept
@@ -24,23 +24,23 @@ import io.ktor.client.statement.readText
 import io.ktor.http.ContentType
 import io.ktor.http.HttpHeaders
 import io.ktor.http.HttpStatusCode
-import net.taler.wallet.kotlin.Amount
-import net.taler.wallet.kotlin.Base32Crockford
-import net.taler.wallet.kotlin.Db
-import net.taler.wallet.kotlin.DbFactory
-import net.taler.wallet.kotlin.Timestamp
-import net.taler.wallet.kotlin.compareVersions
-import net.taler.wallet.kotlin.crypto.Crypto
-import net.taler.wallet.kotlin.crypto.CryptoFactory
-import net.taler.wallet.kotlin.crypto.Signature
-import net.taler.wallet.kotlin.exchange.DenominationStatus.Unverified
-import net.taler.wallet.kotlin.exchange.ExchangeUpdateReason.Initial
-import net.taler.wallet.kotlin.exchange.ExchangeUpdateStatus.FetchKeys
-import net.taler.wallet.kotlin.exchange.ExchangeUpdateStatus.FetchTerms
-import net.taler.wallet.kotlin.exchange.ExchangeUpdateStatus.FetchWire
-import net.taler.wallet.kotlin.exchange.ExchangeUpdateStatus.FinalizeUpdate
-import net.taler.wallet.kotlin.exchange.ExchangeUpdateStatus.Finished
-import net.taler.wallet.kotlin.getDefaultHttpClient
+import net.taler.lib.common.Amount
+import net.taler.lib.common.Timestamp
+import net.taler.lib.common.Version
+import net.taler.lib.wallet.Base32Crockford
+import net.taler.lib.wallet.Db
+import net.taler.lib.wallet.DbFactory
+import net.taler.lib.wallet.crypto.Crypto
+import net.taler.lib.wallet.crypto.CryptoFactory
+import net.taler.lib.wallet.crypto.Signature
+import net.taler.lib.wallet.exchange.DenominationStatus.Unverified
+import net.taler.lib.wallet.exchange.ExchangeUpdateReason.Initial
+import net.taler.lib.wallet.exchange.ExchangeUpdateStatus.FetchKeys
+import net.taler.lib.wallet.exchange.ExchangeUpdateStatus.FetchTerms
+import net.taler.lib.wallet.exchange.ExchangeUpdateStatus.FetchWire
+import net.taler.lib.wallet.exchange.ExchangeUpdateStatus.FinalizeUpdate
+import net.taler.lib.wallet.exchange.ExchangeUpdateStatus.Finished
+import net.taler.lib.wallet.getDefaultHttpClient
 
 internal class Exchange(
     private val crypto: Crypto = CryptoFactory.getCrypto(),
@@ -53,8 +53,8 @@ internal class Exchange(
 ) {
 
     companion object {
-        private const val PROTOCOL_VERSION = "8:0:0"
-        fun getVersionMatch(version: String) = 
compareVersions(PROTOCOL_VERSION, version)
+        private val PROTOCOL_VERSION = Version(8, 0, 0)
+        fun getVersionMatch(version: String) = 
PROTOCOL_VERSION.compare(Version.parse(version))
         fun normalizeUrl(exchangeBaseUrl: String): String {
             var url = exchangeBaseUrl
             if (!url.startsWith("http")) url = "http://$url";
diff --git 
a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/ExchangeRecord.kt
 b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/exchange/ExchangeRecord.kt
similarity index 97%
rename from 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/ExchangeRecord.kt
rename to 
wallet/src/commonMain/kotlin/net/taler/lib/wallet/exchange/ExchangeRecord.kt
index 9bfd649..bb8bbd1 100644
--- 
a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/ExchangeRecord.kt
+++ 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/exchange/ExchangeRecord.kt
@@ -14,9 +14,9 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.exchange
+package net.taler.lib.wallet.exchange
 
-import net.taler.wallet.kotlin.Timestamp
+import net.taler.lib.common.Timestamp
 
 /**
  * Exchange record as stored in the wallet's database.
diff --git 
a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Keys.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/exchange/Keys.kt
similarity index 96%
rename from 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Keys.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/exchange/Keys.kt
index 54806f9..12b29db 100644
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Keys.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/exchange/Keys.kt
@@ -14,12 +14,12 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.exchange
+package net.taler.lib.wallet.exchange
 
 import io.ktor.client.HttpClient
 import io.ktor.client.request.get
 import kotlinx.serialization.Serializable
-import net.taler.wallet.kotlin.Timestamp
+import net.taler.lib.common.Timestamp
 
 /**
  * Structure that the exchange gives us in /keys.
diff --git 
a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Wire.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/exchange/Wire.kt
similarity index 94%
rename from 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Wire.kt
rename to wallet/src/commonMain/kotlin/net/taler/lib/wallet/exchange/Wire.kt
index c8fae88..0dca4dd 100644
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/exchange/Wire.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/exchange/Wire.kt
@@ -14,14 +14,14 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.exchange
+package net.taler.lib.wallet.exchange
 
 import io.ktor.client.HttpClient
 import io.ktor.client.request.get
 import kotlinx.serialization.SerialName
 import kotlinx.serialization.Serializable
-import net.taler.wallet.kotlin.Amount
-import net.taler.wallet.kotlin.Timestamp
+import net.taler.lib.common.Amount
+import net.taler.lib.common.Timestamp
 
 @Serializable
 internal data class Wire(
diff --git 
a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/operations/Withdraw.kt 
b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/operations/Withdraw.kt
similarity index 90%
rename from 
wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/operations/Withdraw.kt
rename to 
wallet/src/commonMain/kotlin/net/taler/lib/wallet/operations/Withdraw.kt
index e51e9ec..69c68d1 100644
--- 
a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/operations/Withdraw.kt
+++ b/wallet/src/commonMain/kotlin/net/taler/lib/wallet/operations/Withdraw.kt
@@ -14,32 +14,33 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.operations
+package net.taler.lib.wallet.operations
 
 import io.ktor.client.HttpClient
 import io.ktor.client.request.get
 import kotlinx.serialization.SerialName
 import kotlinx.serialization.Serializable
-import net.taler.wallet.kotlin.Amount
-import net.taler.wallet.kotlin.Db
-import net.taler.wallet.kotlin.DbFactory
-import net.taler.wallet.kotlin.TalerUri.parseWithdrawUri
-import net.taler.wallet.kotlin.Timestamp
-import net.taler.wallet.kotlin.VersionMatchResult
-import net.taler.wallet.kotlin.crypto.Crypto
-import net.taler.wallet.kotlin.crypto.CryptoFactory
-import net.taler.wallet.kotlin.crypto.Signature
-import net.taler.wallet.kotlin.exchange.DenominationRecord
-import net.taler.wallet.kotlin.exchange.DenominationSelectionInfo
-import net.taler.wallet.kotlin.exchange.DenominationStatus.Unverified
-import net.taler.wallet.kotlin.exchange.DenominationStatus.VerifiedBad
-import net.taler.wallet.kotlin.exchange.DenominationStatus.VerifiedGood
-import net.taler.wallet.kotlin.exchange.Exchange
-import net.taler.wallet.kotlin.exchange.ExchangeListItem
-import net.taler.wallet.kotlin.exchange.ExchangeRecord
-import net.taler.wallet.kotlin.exchange.ExchangeWireInfo
-import net.taler.wallet.kotlin.exchange.SelectedDenomination
-import net.taler.wallet.kotlin.getDefaultHttpClient
+import net.taler.lib.common.Amount
+import net.taler.lib.common.TalerUri.parseWithdrawUri
+import net.taler.lib.common.Timestamp
+import net.taler.lib.common.Version
+import net.taler.lib.common.Version.VersionMatchResult
+import net.taler.lib.wallet.Db
+import net.taler.lib.wallet.DbFactory
+import net.taler.lib.wallet.crypto.Crypto
+import net.taler.lib.wallet.crypto.CryptoFactory
+import net.taler.lib.wallet.crypto.Signature
+import net.taler.lib.wallet.exchange.DenominationRecord
+import net.taler.lib.wallet.exchange.DenominationSelectionInfo
+import net.taler.lib.wallet.exchange.DenominationStatus.Unverified
+import net.taler.lib.wallet.exchange.DenominationStatus.VerifiedBad
+import net.taler.lib.wallet.exchange.DenominationStatus.VerifiedGood
+import net.taler.lib.wallet.exchange.Exchange
+import net.taler.lib.wallet.exchange.ExchangeListItem
+import net.taler.lib.wallet.exchange.ExchangeRecord
+import net.taler.lib.wallet.exchange.ExchangeWireInfo
+import net.taler.lib.wallet.exchange.SelectedDenomination
+import net.taler.lib.wallet.getDefaultHttpClient
 
 internal class Withdraw(
     private val httpClient: HttpClient = getDefaultHttpClient(),
diff --git a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Amount.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Amount.kt
deleted file mode 100644
index 2d39bb3..0000000
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Amount.kt
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * This file is part of GNU Taler
- * (C) 2020 Taler Systems S.A.
- *
- * GNU Taler is free software; you can redistribute it and/or modify it under 
the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3, or (at your option) any later version.
- *
- * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR
- * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
- */
-
-package net.taler.wallet.kotlin
-
-import kotlinx.serialization.Decoder
-import kotlinx.serialization.Encoder
-import kotlinx.serialization.KSerializer
-import kotlinx.serialization.Serializable
-import kotlinx.serialization.Serializer
-import net.taler.wallet.kotlin.crypto.CryptoImpl.Companion.toByteArray
-import kotlin.math.floor
-import kotlin.math.pow
-import kotlin.math.roundToInt
-
-class AmountParserException(msg: String? = null, cause: Throwable? = null) : 
Exception(msg, cause)
-class AmountOverflowException(msg: String? = null, cause: Throwable? = null) : 
Exception(msg, cause)
-
-@Serializable
-data class Amount(
-    /**
-     * name of the currency using either a three-character ISO 4217 currency 
code,
-     * or a regional currency identifier starting with a "*" followed by at 
most 10 characters.
-     * ISO 4217 exponents in the name are not supported,
-     * although the "fraction" is corresponds to an ISO 4217 exponent of 6.
-     */
-    val currency: String,
-
-    /**
-     * The integer part may be at most 2^52.
-     * Note that "1" here would correspond to 1 EUR or 1 USD, depending on 
currency, not 1 cent.
-     */
-    val value: Long,
-
-    /**
-     * Unsigned 32 bit fractional value to be added to value representing
-     * an additional currency fraction, in units of one hundred millionth 
(1e-8)
-     * of the base currency value.  For example, a fraction
-     * of 50_000_000 would correspond to 50 cents.
-     */
-    val fraction: Int
-) : Comparable<Amount> {
-
-    @Serializer(forClass = Amount::class)
-    companion object : KSerializer<Amount> {
-
-        private const val FRACTIONAL_BASE: Int = 100000000 // 1e8
-
-        @Suppress("unused")
-        private val REGEX = 
Regex("""^[-_*A-Za-z0-9]{1,12}:([0-9]+)\.?([0-9]+)?$""")
-        private val REGEX_CURRENCY = Regex("""^[-_*A-Za-z0-9]{1,12}$""")
-        internal val MAX_VALUE = 2.0.pow(52).toLong()
-        private const val MAX_FRACTION_LENGTH = 8
-        internal const val MAX_FRACTION = 99_999_999
-
-        fun zero(currency: String): Amount {
-            return Amount(checkCurrency(currency), 0, 0)
-        }
-
-        fun fromJSONString(str: String): Amount {
-            val split = str.split(":")
-            if (split.size != 2) throw AmountParserException("Invalid Amount 
Format")
-            return fromString(split[0], split[1])
-        }
-
-        fun fromString(currency: String, str: String): Amount {
-            // value
-            val valueSplit = str.split(".")
-            val value = checkValue(valueSplit[0].toLongOrNull())
-            // fraction
-            val fraction: Int = if (valueSplit.size > 1) {
-                val fractionStr = valueSplit[1]
-                if (fractionStr.length > MAX_FRACTION_LENGTH)
-                    throw AmountParserException("Fraction $fractionStr too 
long")
-                val fraction = "0.$fractionStr".toDoubleOrNull()
-                    ?.times(FRACTIONAL_BASE)
-                    ?.roundToInt()
-                checkFraction(fraction)
-            } else 0
-            return Amount(checkCurrency(currency), value, fraction)
-        }
-
-        fun min(currency: String): Amount = Amount(currency, 0, 1)
-        fun max(currency: String): Amount = Amount(currency, MAX_VALUE, 
MAX_FRACTION)
-
-//        fun fromJsonObject(json: JSONObject): Amount {
-//            val currency = checkCurrency(json.optString("currency"))
-//            val value = checkValue(json.optString("value").toLongOrNull())
-//            val fraction = 
checkFraction(json.optString("fraction").toIntOrNull())
-//            return Amount(currency, value, fraction)
-//        }
-
-        private fun checkCurrency(currency: String): String {
-            if (!REGEX_CURRENCY.matches(currency))
-                throw AmountParserException("Invalid currency: $currency")
-            return currency
-        }
-
-        private fun checkValue(value: Long?): Long {
-            if (value == null || value > MAX_VALUE)
-                throw AmountParserException("Value $value greater than 
$MAX_VALUE")
-            return value
-        }
-
-        private fun checkFraction(fraction: Int?): Int {
-            if (fraction == null || fraction > MAX_FRACTION)
-                throw AmountParserException("Fraction $fraction greater than 
$MAX_FRACTION")
-            return fraction
-        }
-
-        override fun serialize(encoder: Encoder, value: Amount) {
-            encoder.encodeString(value.toJSONString())
-        }
-
-        override fun deserialize(decoder: Decoder): Amount {
-            return fromJSONString(decoder.decodeString())
-        }
-    }
-
-    val amountStr: String
-        get() = if (fraction == 0) "$value" else {
-            var f = fraction
-            var fractionStr = ""
-            while (f > 0) {
-                fractionStr += f / (FRACTIONAL_BASE / 10)
-                f = (f * 10) % FRACTIONAL_BASE
-            }
-            "$value.$fractionStr"
-        }
-
-    operator fun plus(other: Amount): Amount {
-        check(currency == other.currency) { "Can only subtract from same 
currency" }
-        val resultValue = value + other.value + floor((fraction + 
other.fraction).toDouble() / FRACTIONAL_BASE).toLong()
-        if (resultValue > MAX_VALUE)
-            throw AmountOverflowException()
-        val resultFraction = (fraction + other.fraction) % FRACTIONAL_BASE
-        return Amount(currency, resultValue, resultFraction)
-    }
-
-    operator fun times(factor: Int): Amount {
-        // TODO consider replacing with a faster implementation
-        if (factor == 0) return zero(currency)
-        var result = this
-        for (i in 1 until factor) result += this
-        return result
-    }
-
-    operator fun minus(other: Amount): Amount {
-        check(currency == other.currency) { "Can only subtract from same 
currency" }
-        var resultValue = value
-        var resultFraction = fraction
-        if (resultFraction < other.fraction) {
-            if (resultValue < 1L)
-                throw AmountOverflowException()
-            resultValue--
-            resultFraction += FRACTIONAL_BASE
-        }
-        check(resultFraction >= other.fraction)
-        resultFraction -= other.fraction
-        if (resultValue < other.value)
-            throw AmountOverflowException()
-        resultValue -= other.value
-        return Amount(currency, resultValue, resultFraction)
-    }
-
-    fun isZero(): Boolean {
-        return value == 0L && fraction == 0
-    }
-
-    fun toJSONString(): String {
-        return "$currency:$amountStr"
-    }
-
-    fun toByteArray() = ByteArray(8 + 4 + 12).apply {
-        value.toByteArray().copyInto(this, 0, 0, 8)
-        fraction.toByteArray().copyInto(this, 8, 0, 4)
-        currency.encodeToByteArray().copyInto(this, 12)
-    }
-
-    override fun toString(): String {
-        return "$amountStr $currency"
-    }
-
-    override fun compareTo(other: Amount): Int {
-        check(currency == other.currency) { "Can only compare amounts with the 
same currency" }
-        when {
-            value == other.value -> {
-                if (fraction < other.fraction) return -1
-                if (fraction > other.fraction) return 1
-                return 0
-            }
-            value < other.value -> return -1
-            else -> return 1
-        }
-    }
-
-}
diff --git a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/TalerUri.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/TalerUri.kt
deleted file mode 100644
index c489d71..0000000
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/TalerUri.kt
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * This file is part of GNU Taler
- * (C) 2020 Taler Systems S.A.
- *
- * GNU Taler is free software; you can redistribute it and/or modify it under 
the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3, or (at your option) any later version.
- *
- * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR
- * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
- */
-
-package net.taler.wallet.kotlin
-
-internal object TalerUri {
-
-    private const val SCHEME = "taler://"
-    private const val SCHEME_INSECURE = "taler+http://";
-    private const val AUTHORITY_PAY = "pay"
-    private const val AUTHORITY_WITHDRAW = "withdraw"
-    private const val AUTHORITY_REFUND = "refund"
-    private const val AUTHORITY_TIP = "tip"
-
-    data class WithdrawUriResult(
-        val bankIntegrationApiBaseUrl: String,
-        val withdrawalOperationId: String
-    )
-
-    /**
-     * Parses a withdraw URI and returns a bank status URL or null if the URI 
was invalid.
-     */
-    fun parseWithdrawUri(uri: String): WithdrawUriResult? {
-        val (resultScheme, prefix) = when {
-            uri.startsWith(SCHEME, ignoreCase = true) -> {
-                Pair("https://";, "${SCHEME}${AUTHORITY_WITHDRAW}/")
-            }
-            uri.startsWith(SCHEME_INSECURE, ignoreCase = true) -> {
-                Pair("http://";, "${SCHEME_INSECURE}${AUTHORITY_WITHDRAW}/")
-            }
-            else -> return null
-        }
-        if (!uri.startsWith(prefix)) return null
-        val parts = uri.let {
-            (if (it.endsWith("/")) it.dropLast(1) else 
it).substring(prefix.length).split('/')
-        }
-        if (parts.size < 2) return null
-        val host = parts[0].toLowerCase()
-        val pathSegments = parts.slice(1 until parts.size - 
1).joinToString("/")
-        val withdrawId = parts.last()
-        if (withdrawId.isBlank()) return null
-        val url = "${resultScheme}${host}/${pathSegments}"
-
-        return WithdrawUriResult(url, withdrawId)
-    }
-
-}
diff --git a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Time.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Time.kt
deleted file mode 100644
index 4143389..0000000
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Time.kt
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * This file is part of GNU Taler
- * (C) 2020 Taler Systems S.A.
- *
- * GNU Taler is free software; you can redistribute it and/or modify it under 
the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3, or (at your option) any later version.
- *
- * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR
- * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
- */
-
-package net.taler.wallet.kotlin
-
-import com.soywiz.klock.DateTime
-import kotlinx.serialization.SerialName
-import kotlinx.serialization.Serializable
-import net.taler.wallet.kotlin.Duration.Companion.FOREVER
-import net.taler.wallet.kotlin.crypto.CryptoImpl.Companion.toByteArray
-import kotlin.math.max
-
-@Serializable
-data class Timestamp(
-    @SerialName("t_ms")
-    val ms: Long
-) : Comparable<Timestamp> {
-
-    companion object {
-        const val NEVER: Long = -1  // TODO or UINT64_MAX?
-        fun now(): Timestamp = Timestamp(DateTime.now().unixMillisLong)
-    }
-
-    /**
-     * Returns a copy of this [Timestamp] rounded to seconds.
-     */
-    fun truncateSeconds(): Timestamp {
-        if (ms == NEVER) return Timestamp(ms)
-        return Timestamp((ms / 1000L) * 1000L)
-    }
-
-    fun roundedToByteArray(): ByteArray = ByteArray(8).apply {
-        (truncateSeconds().ms * 1000L).toByteArray().copyInto(this)
-    }
-
-    operator fun minus(other: Timestamp): Duration = when {
-        ms == NEVER -> Duration(FOREVER)
-        other.ms == NEVER -> throw Error("Invalid argument for timestamp 
comparision")
-        ms < other.ms -> Duration(0)
-        else -> Duration(ms - other.ms)
-    }
-
-    operator fun minus(other: Duration): Timestamp = when {
-        ms == NEVER -> this
-        other.ms == FOREVER -> Timestamp(0)
-        else -> Timestamp(max(0, ms - other.ms))
-    }
-
-    override fun compareTo(other: Timestamp): Int {
-        return if (ms == NEVER) {
-            if (other.ms == NEVER) 0
-            else 1
-        } else {
-            if (other.ms == NEVER) -1
-            else ms.compareTo(other.ms)
-        }
-    }
-
-}
-
-@Serializable
-data class Duration(
-    /**
-     * Duration in milliseconds.
-     */
-    @SerialName("d_ms")
-    val ms: Long
-) {
-    companion object {
-        const val FOREVER: Long = -1  // TODO or UINT64_MAX?
-    }
-}
diff --git a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Version.kt 
b/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Version.kt
deleted file mode 100644
index 45e7840..0000000
--- a/wallet/src/commonMain/kotlin/net/taler/wallet/kotlin/Version.kt
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * This file is part of GNU Taler
- * (C) 2020 Taler Systems S.A.
- *
- * GNU Taler is free software; you can redistribute it and/or modify it under 
the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3, or (at your option) any later version.
- *
- * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR
- * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
- */
-
-package net.taler.wallet.kotlin
-
-import kotlin.math.sign
-
-/**
- * Semantic versioning, but libtool-style.
- * See 
https://www.gnu.org/software/libtool/manual/html_node/Libtool-versioning.html
- */
-
-/**
- * Result of comparing two libtool versions.
- */
-data class VersionMatchResult(
-    /**
-     * Is the first version compatible with the second?
-     */
-    val compatible: Boolean,
-    /**
-     * Is the first version older (-1), newer (+1) or identical (0)?
-     */
-    val currentCmp: Int
-)
-
-data class Version(
-    val current: Int,
-    val revision: Int,
-    val age: Int
-)
-
-/**
- * Compare two libtool-style version strings.
- */
-fun compareVersions(me: String,other: String): VersionMatchResult? {
-    val meVer = parseVersion (me)
-    val otherVer = parseVersion (other)
-    if (meVer == null || otherVer == null) return null
-
-    val compatible = meVer.current - meVer.age <= otherVer.current &&
-            meVer.current >= otherVer.current - otherVer.age
-
-    val currentCmp = sign((meVer.current - 
otherVer.current).toDouble()).toInt()
-
-    return VersionMatchResult(compatible, currentCmp)
-}
-
-fun parseVersion(v: String): Version? {
-    val elements = v.split(":")
-    if (elements.size != 3) return null
-    val (currentStr, revisionStr, ageStr) = elements
-    val current = currentStr.toIntOrNull()
-    val revision = revisionStr.toIntOrNull()
-    val age = ageStr.toIntOrNull()
-    if (current == null || revision == null || age == null) return null
-    return Version(current, revision, age)
-}
-
-class SupportedVersions(
-    val walletVersion: Version,
-    val exchangeVersion: Version,
-    val bankVersion: Version,
-    val merchantVersion: Version
-)
diff --git a/wallet/src/commonTest/kotlin/net/taler/lib/wallet/AmountTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/AmountTest.kt
new file mode 100644
index 0000000..ccee992
--- /dev/null
+++ b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/AmountTest.kt
@@ -0,0 +1,64 @@
+/*
+ * This file is part of GNU Taler
+ * (C) 2020 Taler Systems S.A.
+ *
+ * GNU Taler is free software; you can redistribute it and/or modify it under 
the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 3, or (at your option) any later version.
+ *
+ * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR
+ * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+package net.taler.lib.wallet
+
+import net.taler.lib.common.Amount
+import kotlin.test.Test
+import kotlin.test.assertEquals
+
+class AmountTest {
+
+    @Test
+    fun testToByteArray() {
+        val vectors = listOf(
+            Pair("ceicWVf9GhJ:3902026702525079.40496378", 
"006XSQV3G899E0K9XKX66SB9CDBNCSHS8XM4M00"),
+            Pair("asYDLuK2A:3800267550024600.02072907", 
"006R0MNXBVHSG00ZM55P2WTS8H67AJSJ8400000"),
+            Pair("pV1m:1347558259914570.09786232", 
"002CK66VCNVMM04NADW70NHHDM0000000000000"),
+            Pair("geO82l:553744321840253.41004983", 
"000ZF855K627T0KHNYVPESAF70S6R0000000000"),
+            Pair("B9bWK7WPEO:3663912678613976.12122563", 
"006G8KS5P9HXG05RZ71M4EB2AX5KENTG8N7G000"),
+            Pair("X:1537372109907438.77850768", 
"002QCETPFYJYW153X285G000000000000000000"),
+            Pair("5:4271492725553118.39728399", 
"007JSSK6J4VXW0JY6M7KA000000000000000000"),
+            Pair("OSdV:801656289790342.08256189", 
"001DJ6H6CA4RC03XZAYMYMV4AR0000000000000"),
+            Pair("Y6:2908617536334646.94126271", 
"0055AQTB19NKC1CW82ZNJDG0000000000000000"),
+            Pair("kSHoOZj:2610656582865206.00292046", 
"004MCR6T828KC004EK76PMT8DX7NMTG00000000"),
+            Pair("GkhLXrlGES:4246330707533398.83874252", 
"007HC0Z9DFF5C17ZT764ETV89HC74V278N9G000"),
+            Pair("CNS09:738124490298524.71259462", 
"0019YMG01DA9R11ZAN346KJK60WG00000000000"),
+            Pair("sw0b1tKXZym:2132978464977419.28199478", 
"003S7VNZPZS0P0DE98V76XSGC8RQ8JTRB9WPT00"),
+            Pair("fC:1275322307696988.17178522", 
"0028FSGX3ZCNR0863YD6CGR0000000000000000"),
+            Pair("cRai6j:166032749022734.69444771", 
"0009E0C30V70W113MJHP6MK1D4V6M0000000000"),
+            Pair("KOADwTb3:3932974019564218.48282023", 
"006ZJ16ZB39BM0Q0Q6KMPKT18HVN8RHK0000000"),
+            Pair("9Fi9wcLgDe:1268366772151214.97268853", 
"002834N6WRHTW1EC6HTKJHK975VP6K378HJG000"),
+            Pair("SDN:3370670470236379.88943272", 
"005ZK6V0124DP1AD5AM56H2E000000000000000"),
+            Pair("zGCP5V:4010014441349620.76121145", 
"0073Y5HYA8GZ8149GGWQMHT3A0TNC0000000000"),
+            Pair("VsW1JjBLn:2037070181191907.99717275", 
"003KSD2WH18E61FHJ2DNCWTQ6556MGJCDR00000"),
+            Pair("A:1806895799429502.00887758", 
"0036PQ5P8NMQW00DHF742000000000000000000"),
+            Pair("njA8:4015261148004966.43708687", 
"00747PYPD116C0MTY47PWTJ1700000000000000"),
+            Pair("Bwq:3562876074139250.28829179", 
"006AGTNTRWF740DQWQXM4XVH000000000000000"),
+            Pair("8e75v8:3716241006992995.95213823", 
"006K7SP93WF661DCV3ZKGS9Q6NV3G0000000000"),
+            Pair("XrnbQTTn:3887603772953949.94721267", 
"006WZGA9X8ANT1D5AKSNGWKEC98N8N3E0000000"),
+            Pair("MIN:0.00000001", "0000000000000000000MTJAE000000000000000"),
+            Pair("MAX:4503599627370496.99999999", 
"00800000000001FNW3ZMTGAR000000000000000")
+        )
+        for (v in vectors) {
+            val amount = Amount.fromJSONString(v.first)
+            val encodedBytes =
+                Base32Crockford.encode(amount.toByteArray())
+            assertEquals(v.second, encodedBytes)
+        }
+    }
+
+}
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/Base32CrockfordTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/Base32CrockfordTest.kt
similarity index 99%
rename from 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/Base32CrockfordTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/lib/wallet/Base32CrockfordTest.kt
index 565a395..0f16971 100644
--- 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/Base32CrockfordTest.kt
+++ b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/Base32CrockfordTest.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.lib.wallet
 
 import kotlin.test.Ignore
 import kotlin.test.Test
diff --git a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/DbTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/DbTest.kt
similarity index 85%
rename from wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/DbTest.kt
rename to wallet/src/commonTest/kotlin/net/taler/lib/wallet/DbTest.kt
index ab4770d..cdd0484 100644
--- a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/DbTest.kt
+++ b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/DbTest.kt
@@ -14,15 +14,16 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.lib.wallet
 
-import net.taler.wallet.kotlin.exchange.Denominations.denomination10
-import net.taler.wallet.kotlin.exchange.Denominations.denomination5
-import net.taler.wallet.kotlin.exchange.DenominationStatus.Unverified
-import net.taler.wallet.kotlin.exchange.DenominationStatus.VerifiedGood
-import net.taler.wallet.kotlin.exchange.ExchangeRecord
-import net.taler.wallet.kotlin.exchange.ExchangeUpdateReason.Initial
-import net.taler.wallet.kotlin.exchange.ExchangeUpdateStatus.FetchKeys
+import net.taler.lib.common.Timestamp
+import net.taler.lib.wallet.exchange.DenominationStatus.Unverified
+import net.taler.lib.wallet.exchange.DenominationStatus.VerifiedGood
+import net.taler.lib.wallet.exchange.Denominations.denomination10
+import net.taler.lib.wallet.exchange.Denominations.denomination5
+import net.taler.lib.wallet.exchange.ExchangeRecord
+import net.taler.lib.wallet.exchange.ExchangeUpdateReason.Initial
+import net.taler.lib.wallet.exchange.ExchangeUpdateStatus.FetchKeys
 import kotlin.test.Test
 import kotlin.test.assertEquals
 
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/PaytoUriTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/PaytoUriTest.kt
similarity index 98%
rename from wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/PaytoUriTest.kt
rename to wallet/src/commonTest/kotlin/net/taler/lib/wallet/PaytoUriTest.kt
index 4f080e3..cf3780a 100644
--- a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/PaytoUriTest.kt
+++ b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/PaytoUriTest.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.lib.wallet
 
 import kotlin.test.Test
 import kotlin.test.assertEquals
diff --git a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/TestUtils.kt
similarity index 98%
rename from wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt
rename to wallet/src/commonTest/kotlin/net/taler/lib/wallet/TestUtils.kt
index 0ece68e..14c3076 100644
--- a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt
+++ b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/TestUtils.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.lib.wallet
 
 import io.ktor.client.HttpClient
 import io.ktor.client.engine.mock.MockEngine
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/TimestampTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/TimestampTest.kt
similarity index 97%
rename from 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/TimestampTest.kt
rename to wallet/src/commonTest/kotlin/net/taler/lib/wallet/TimestampTest.kt
index 1a12549..b0f3b32 100644
--- a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/TimestampTest.kt
+++ b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/TimestampTest.kt
@@ -14,8 +14,9 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.lib.wallet
 
+import net.taler.lib.common.Timestamp
 import kotlin.random.Random
 import kotlin.test.Test
 import kotlin.test.assertEquals
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/WalletApiTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/WalletApiTest.kt
similarity index 98%
rename from 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/WalletApiTest.kt
rename to wallet/src/commonTest/kotlin/net/taler/lib/wallet/WalletApiTest.kt
index 7971be5..511eb79 100644
--- a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/WalletApiTest.kt
+++ b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/WalletApiTest.kt
@@ -14,8 +14,9 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.lib.wallet
 
+import net.taler.lib.common.Amount
 import kotlin.test.Ignore
 import kotlin.test.Test
 import kotlin.test.assertEquals
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/DepositTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/DepositTest.kt
similarity index 96%
rename from 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/DepositTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/DepositTest.kt
index 399b754..e3017a3 100644
--- a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/DepositTest.kt
+++ b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/DepositTest.kt
@@ -14,12 +14,12 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
-import net.taler.wallet.kotlin.Amount
-import net.taler.wallet.kotlin.Timestamp
-import net.taler.wallet.kotlin.crypto.Deposit.CoinDepositPermission
-import net.taler.wallet.kotlin.crypto.Deposit.DepositInfo
+import net.taler.lib.common.Amount
+import net.taler.lib.common.Timestamp
+import net.taler.lib.wallet.crypto.Deposit.CoinDepositPermission
+import net.taler.lib.wallet.crypto.Deposit.DepositInfo
 import kotlin.test.Test
 import kotlin.test.assertEquals
 
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/EllipticCurveTest.kt
 b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/EllipticCurveTest.kt
similarity index 98%
rename from 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/EllipticCurveTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/EllipticCurveTest.kt
index 4e83b47..10fbcc1 100644
--- 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/EllipticCurveTest.kt
+++ 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/EllipticCurveTest.kt
@@ -14,9 +14,9 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
-import net.taler.wallet.kotlin.Base32Crockford
+import net.taler.lib.wallet.Base32Crockford
 import kotlin.random.Random
 import kotlin.test.Test
 import kotlin.test.assertEquals
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/KdfTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/KdfTest.kt
similarity index 98%
rename from 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/KdfTest.kt
rename to wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/KdfTest.kt
index 974f9aa..291930d 100644
--- a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/KdfTest.kt
+++ b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/KdfTest.kt
@@ -14,11 +14,11 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
-import net.taler.wallet.kotlin.Base32Crockford
-import net.taler.wallet.kotlin.crypto.Kdf.HMAC_SHA256_BLOCK_SIZE
-import net.taler.wallet.kotlin.crypto.Kdf.HMAC_SHA512_BLOCK_SIZE
+import net.taler.lib.wallet.Base32Crockford
+import net.taler.lib.wallet.crypto.Kdf.HMAC_SHA256_BLOCK_SIZE
+import net.taler.lib.wallet.crypto.Kdf.HMAC_SHA512_BLOCK_SIZE
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertTrue
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/RecoupTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/RecoupTest.kt
similarity index 94%
rename from 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/RecoupTest.kt
rename to wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/RecoupTest.kt
index ea74e3c..035b7d7 100644
--- a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/RecoupTest.kt
+++ b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/RecoupTest.kt
@@ -14,14 +14,14 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
-import net.taler.wallet.kotlin.Amount
-import net.taler.wallet.kotlin.CoinRecord
-import net.taler.wallet.kotlin.CoinSourceType.REFRESH
-import net.taler.wallet.kotlin.CoinSourceType.WITHDRAW
-import net.taler.wallet.kotlin.CoinStatus.FRESH
-import net.taler.wallet.kotlin.crypto.Recoup.Request
+import net.taler.lib.common.Amount
+import net.taler.lib.wallet.CoinRecord
+import net.taler.lib.wallet.CoinSourceType.REFRESH
+import net.taler.lib.wallet.CoinSourceType.WITHDRAW
+import net.taler.lib.wallet.CoinStatus.FRESH
+import net.taler.lib.wallet.crypto.Recoup.Request
 import kotlin.test.Test
 import kotlin.test.assertEquals
 
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/RefreshPlanchetTest.kt
 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/RefreshPlanchetTest.kt
similarity index 98%
rename from 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/RefreshPlanchetTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/RefreshPlanchetTest.kt
index 51eb5c6..a56d191 100644
--- 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/RefreshPlanchetTest.kt
+++ 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/RefreshPlanchetTest.kt
@@ -14,9 +14,9 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
-import net.taler.wallet.kotlin.Base32Crockford
+import net.taler.lib.wallet.Base32Crockford
 import kotlin.test.Test
 import kotlin.test.assertEquals
 
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/Sha256Test.kt 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/Sha256Test.kt
similarity index 96%
rename from 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/Sha256Test.kt
rename to wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/Sha256Test.kt
index 3209e05..a71734a 100644
--- a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/Sha256Test.kt
+++ b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/Sha256Test.kt
@@ -14,9 +14,8 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
-import net.taler.wallet.kotlin.Base32Crockford
 import kotlin.test.Test
 import kotlin.test.assertEquals
 
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/Sha512Test.kt 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/Sha512Test.kt
similarity index 97%
rename from 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/Sha512Test.kt
rename to wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/Sha512Test.kt
index 24be282..59fd730 100644
--- a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/Sha512Test.kt
+++ b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/Sha512Test.kt
@@ -14,9 +14,9 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
-import net.taler.wallet.kotlin.Base32Crockford
+import net.taler.lib.wallet.Base32Crockford
 import kotlin.random.Random
 import kotlin.test.Test
 import kotlin.test.assertEquals
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/SignatureTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/SignatureTest.kt
similarity index 98%
rename from 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/SignatureTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/SignatureTest.kt
index 1306c14..b3228b9 100644
--- 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/crypto/SignatureTest.kt
+++ b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/crypto/SignatureTest.kt
@@ -14,16 +14,16 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
-import net.taler.wallet.kotlin.Amount
-import net.taler.wallet.kotlin.Base32Crockford
-import net.taler.wallet.kotlin.Timestamp
-import net.taler.wallet.kotlin.crypto.Signature.PurposeBuilder
-import net.taler.wallet.kotlin.exchange.DenominationRecord
-import net.taler.wallet.kotlin.exchange.DenominationStatus.Unverified
-import net.taler.wallet.kotlin.exchange.DenominationStatus.VerifiedBad
-import net.taler.wallet.kotlin.exchange.WireFee
+import net.taler.lib.common.Amount
+import net.taler.lib.common.Timestamp
+import net.taler.lib.wallet.Base32Crockford
+import net.taler.lib.wallet.crypto.Signature.PurposeBuilder
+import net.taler.lib.wallet.exchange.DenominationRecord
+import net.taler.lib.wallet.exchange.DenominationStatus.Unverified
+import net.taler.lib.wallet.exchange.DenominationStatus.VerifiedBad
+import net.taler.lib.wallet.exchange.WireFee
 import kotlin.random.Random
 import kotlin.test.Test
 import kotlin.test.assertEquals
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/DenominationTest.kt
 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/exchange/DenominationTest.kt
similarity index 85%
rename from 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/DenominationTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/lib/wallet/exchange/DenominationTest.kt
index f48c97d..c52638b 100644
--- 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/DenominationTest.kt
+++ 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/exchange/DenominationTest.kt
@@ -14,17 +14,17 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.exchange
+package net.taler.lib.wallet.exchange
 
-import net.taler.wallet.kotlin.Amount
-import net.taler.wallet.kotlin.Timestamp
-import net.taler.wallet.kotlin.Timestamp.Companion.NEVER
-import net.taler.wallet.kotlin.exchange.DenominationStatus.VerifiedBad
-import net.taler.wallet.kotlin.exchange.DenominationStatus.VerifiedGood
-import net.taler.wallet.kotlin.exchange.Denominations.denomination1
-import net.taler.wallet.kotlin.exchange.Denominations.denomination10
-import net.taler.wallet.kotlin.exchange.Denominations.denomination2
-import net.taler.wallet.kotlin.exchange.Denominations.denomination5
+import net.taler.lib.common.Amount
+import net.taler.lib.common.Timestamp
+import net.taler.lib.common.Timestamp.Companion.NEVER
+import net.taler.lib.wallet.exchange.DenominationStatus.VerifiedBad
+import net.taler.lib.wallet.exchange.DenominationStatus.VerifiedGood
+import net.taler.lib.wallet.exchange.Denominations.denomination1
+import net.taler.lib.wallet.exchange.Denominations.denomination10
+import net.taler.lib.wallet.exchange.Denominations.denomination2
+import net.taler.lib.wallet.exchange.Denominations.denomination5
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertFalse
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/Denominations.kt
 b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/exchange/Denominations.kt
similarity index 97%
rename from 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/Denominations.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/lib/wallet/exchange/Denominations.kt
index 8cfd7fe..10a2772 100644
--- 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/Denominations.kt
+++ 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/exchange/Denominations.kt
@@ -14,12 +14,12 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.exchange
+package net.taler.lib.wallet.exchange
 
-import net.taler.wallet.kotlin.Amount
-import net.taler.wallet.kotlin.Timestamp
-import net.taler.wallet.kotlin.exchange.DenominationStatus.Unverified
-import net.taler.wallet.kotlin.exchange.DenominationStatus.VerifiedGood
+import net.taler.lib.common.Amount
+import net.taler.lib.common.Timestamp
+import net.taler.lib.wallet.exchange.DenominationStatus.Unverified
+import net.taler.lib.wallet.exchange.DenominationStatus.VerifiedGood
 
 object Denominations {
 
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/KeysTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/exchange/KeysTest.kt
similarity index 98%
rename from 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/KeysTest.kt
rename to wallet/src/commonTest/kotlin/net/taler/lib/wallet/exchange/KeysTest.kt
index a6b0c98..a40c7cd 100644
--- a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/KeysTest.kt
+++ b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/exchange/KeysTest.kt
@@ -14,13 +14,13 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.exchange
+package net.taler.lib.wallet.exchange
 
-import net.taler.wallet.kotlin.Amount
-import net.taler.wallet.kotlin.Timestamp
-import net.taler.wallet.kotlin.getMockHttpClient
-import net.taler.wallet.kotlin.giveJsonResponse
-import net.taler.wallet.kotlin.runCoroutine
+import net.taler.lib.common.Amount
+import net.taler.lib.common.Timestamp
+import net.taler.lib.wallet.getMockHttpClient
+import net.taler.lib.wallet.giveJsonResponse
+import net.taler.lib.wallet.runCoroutine
 import kotlin.test.Test
 import kotlin.test.assertEquals
 
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/UpdateTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/exchange/UpdateTest.kt
similarity index 92%
rename from 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/UpdateTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/lib/wallet/exchange/UpdateTest.kt
index 271dc09..15e6d80 100644
--- 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/UpdateTest.kt
+++ b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/exchange/UpdateTest.kt
@@ -14,9 +14,9 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.exchange
+package net.taler.lib.wallet.exchange
 
-import net.taler.wallet.kotlin.runCoroutine
+import net.taler.lib.wallet.runCoroutine
 import kotlin.test.Ignore
 import kotlin.test.Test
 import kotlin.test.assertTrue
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/WireTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/exchange/WireTest.kt
similarity index 96%
rename from 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/WireTest.kt
rename to wallet/src/commonTest/kotlin/net/taler/lib/wallet/exchange/WireTest.kt
index d09b44b..16671a9 100644
--- a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/exchange/WireTest.kt
+++ b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/exchange/WireTest.kt
@@ -14,13 +14,13 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.exchange
+package net.taler.lib.wallet.exchange
 
-import net.taler.wallet.kotlin.Amount
-import net.taler.wallet.kotlin.Timestamp
-import net.taler.wallet.kotlin.getMockHttpClient
-import net.taler.wallet.kotlin.giveJsonResponse
-import net.taler.wallet.kotlin.runCoroutine
+import net.taler.lib.common.Amount
+import net.taler.lib.common.Timestamp
+import net.taler.lib.wallet.getMockHttpClient
+import net.taler.lib.wallet.giveJsonResponse
+import net.taler.lib.wallet.runCoroutine
 import kotlin.test.Test
 import kotlin.test.assertEquals
 
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/operations/WithdrawTest.kt
 b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/operations/WithdrawTest.kt
similarity index 85%
rename from 
wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/operations/WithdrawTest.kt
rename to 
wallet/src/commonTest/kotlin/net/taler/lib/wallet/operations/WithdrawTest.kt
index 541f24f..634a9dd 100644
--- 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/operations/WithdrawTest.kt
+++ 
b/wallet/src/commonTest/kotlin/net/taler/lib/wallet/operations/WithdrawTest.kt
@@ -14,23 +14,23 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.operations
+package net.taler.lib.wallet.operations
 
-import net.taler.wallet.kotlin.Amount
-import net.taler.wallet.kotlin.exchange.DenominationSelectionInfo
-import net.taler.wallet.kotlin.exchange.Denominations.denomination0d01
-import net.taler.wallet.kotlin.exchange.Denominations.denomination0d1
-import net.taler.wallet.kotlin.exchange.Denominations.denomination1
-import net.taler.wallet.kotlin.exchange.Denominations.denomination10
-import net.taler.wallet.kotlin.exchange.Denominations.denomination2
-import net.taler.wallet.kotlin.exchange.Denominations.denomination4
-import net.taler.wallet.kotlin.exchange.Denominations.denomination5
-import net.taler.wallet.kotlin.exchange.Denominations.denomination8
-import net.taler.wallet.kotlin.exchange.SelectedDenomination
-import net.taler.wallet.kotlin.getMockHttpClient
-import net.taler.wallet.kotlin.giveJsonResponse
-import net.taler.wallet.kotlin.operations.Withdraw.BankDetails
-import net.taler.wallet.kotlin.runCoroutine
+import net.taler.lib.common.Amount
+import net.taler.lib.wallet.exchange.DenominationSelectionInfo
+import net.taler.lib.wallet.exchange.Denominations.denomination0d01
+import net.taler.lib.wallet.exchange.Denominations.denomination0d1
+import net.taler.lib.wallet.exchange.Denominations.denomination1
+import net.taler.lib.wallet.exchange.Denominations.denomination10
+import net.taler.lib.wallet.exchange.Denominations.denomination2
+import net.taler.lib.wallet.exchange.Denominations.denomination4
+import net.taler.lib.wallet.exchange.Denominations.denomination5
+import net.taler.lib.wallet.exchange.Denominations.denomination8
+import net.taler.lib.wallet.exchange.SelectedDenomination
+import net.taler.lib.wallet.getMockHttpClient
+import net.taler.lib.wallet.giveJsonResponse
+import net.taler.lib.wallet.operations.Withdraw.BankDetails
+import net.taler.lib.wallet.runCoroutine
 import kotlin.test.Ignore
 import kotlin.test.Test
 import kotlin.test.assertEquals
diff --git a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/AmountTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/AmountTest.kt
deleted file mode 100644
index 08ee618..0000000
--- a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/AmountTest.kt
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * This file is part of GNU Taler
- * (C) 2020 Taler Systems S.A.
- *
- * GNU Taler is free software; you can redistribute it and/or modify it under 
the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3, or (at your option) any later version.
- *
- * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR
- * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
- */
-
-package net.taler.wallet.kotlin
-
-import kotlin.random.Random
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertFalse
-import kotlin.test.assertTrue
-import kotlin.test.fail
-
-class AmountTest {
-
-    companion object {
-        private val charPool: List<Char> = ('a'..'z') + ('A'..'Z') + ('0'..'9')
-        fun getRandomString(minLength: Int = 1, maxLength: Int = 
Random.nextInt(0, 1337)) = (minLength..maxLength)
-            .map { Random.nextInt(0, charPool.size) }
-            .map(charPool::get)
-            .joinToString("")
-
-        fun getRandomAmount() = getRandomAmount(getRandomString(1, 
Random.nextInt(1, 12)))
-
-        fun getRandomAmount(currency: String): Amount {
-            val value = Random.nextLong(0, Amount.MAX_VALUE)
-            val fraction = Random.nextInt(0, Amount.MAX_FRACTION)
-            return Amount(currency, value, fraction)
-        }
-    }
-
-    @Test
-    fun testFromJSONString() {
-        var str = "TESTKUDOS:23.42"
-        var amount = Amount.fromJSONString(str)
-        assertEquals(str, amount.toJSONString())
-        assertEquals("TESTKUDOS", amount.currency)
-        assertEquals(23, amount.value)
-        assertEquals((0.42 * 1e8).toInt(), amount.fraction)
-        assertEquals("23.42 TESTKUDOS", amount.toString())
-
-        str = "EUR:500000000.00000001"
-        amount = Amount.fromJSONString(str)
-        assertEquals(str, amount.toJSONString())
-        assertEquals("EUR", amount.currency)
-        assertEquals(500000000, amount.value)
-        assertEquals(1, amount.fraction)
-        assertEquals("500000000.00000001 EUR", amount.toString())
-
-        str = "EUR:1500000000.00000003"
-        amount = Amount.fromJSONString(str)
-        assertEquals(str, amount.toJSONString())
-        assertEquals("EUR", amount.currency)
-        assertEquals(1500000000, amount.value)
-        assertEquals(3, amount.fraction)
-        assertEquals("1500000000.00000003 EUR", amount.toString())
-    }
-
-    @Test
-    fun testFromJSONStringAcceptsMaxValuesRejectsAbove() {
-        val maxValue = 4503599627370496
-        val str = "TESTKUDOS123:$maxValue.99999999"
-        val amount = Amount.fromJSONString(str)
-        assertEquals(str, amount.toJSONString())
-        assertEquals("TESTKUDOS123", amount.currency)
-        assertEquals(maxValue, amount.value)
-        assertEquals("$maxValue.99999999 TESTKUDOS123", amount.toString())
-
-        // longer currency not accepted
-        assertThrows<AmountParserException>("longer currency was accepted") {
-            Amount.fromJSONString("TESTKUDOS1234:$maxValue.99999999")
-        }
-
-        // max value + 1 not accepted
-        assertThrows<AmountParserException>("max value + 1 was accepted") {
-            Amount.fromJSONString("TESTKUDOS123:${maxValue + 1}.99999999")
-        }
-
-        // max fraction + 1 not accepted
-        assertThrows<AmountParserException>("max fraction + 1 was accepted") {
-            Amount.fromJSONString("TESTKUDOS123:$maxValue.999999990")
-        }
-    }
-
-    @Test
-    fun testFromJSONStringRejections() {
-        assertThrows<AmountParserException> {
-            Amount.fromJSONString("TESTKUDOS:0,5")
-        }
-        assertThrows<AmountParserException> {
-            Amount.fromJSONString("+TESTKUDOS:0.5")
-        }
-        assertThrows<AmountParserException> {
-            Amount.fromJSONString("0.5")
-        }
-        assertThrows<AmountParserException> {
-            Amount.fromJSONString(":0.5")
-        }
-        assertThrows<AmountParserException> {
-            Amount.fromJSONString("EUR::0.5")
-        }
-        assertThrows<AmountParserException> {
-            Amount.fromJSONString("EUR:.5")
-        }
-    }
-
-    @Test
-    fun testAddition() {
-        assertEquals(
-            Amount.fromJSONString("EUR:2"),
-            Amount.fromJSONString("EUR:1") + Amount.fromJSONString("EUR:1")
-        )
-        assertEquals(
-            Amount.fromJSONString("EUR:3"),
-            Amount.fromJSONString("EUR:1.5") + Amount.fromJSONString("EUR:1.5")
-        )
-        assertEquals(
-            Amount.fromJSONString("EUR:500000000.00000002"),
-            Amount.fromJSONString("EUR:500000000.00000001") + 
Amount.fromJSONString("EUR:0.00000001")
-        )
-        assertThrows<AmountOverflowException>("addition didn't overflow") {
-            Amount.fromJSONString("EUR:4503599627370496.99999999") + 
Amount.fromJSONString("EUR:0.00000001")
-        }
-        assertThrows<AmountOverflowException>("addition didn't overflow") {
-            Amount.fromJSONString("EUR:4000000000000000") + 
Amount.fromJSONString("EUR:4000000000000000")
-        }
-    }
-
-    @Test
-    fun testTimes() {
-        assertEquals(
-            Amount.fromJSONString("EUR:2"),
-            Amount.fromJSONString("EUR:2") * 1
-        )
-        assertEquals(
-            Amount.fromJSONString("EUR:2"),
-            Amount.fromJSONString("EUR:1") * 2
-        )
-        assertEquals(
-            Amount.fromJSONString("EUR:4.5"),
-            Amount.fromJSONString("EUR:1.5") * 3
-        )
-        assertEquals(Amount.fromJSONString("EUR:0"), 
Amount.fromJSONString("EUR:1.11") * 0)
-        assertEquals(Amount.fromJSONString("EUR:1.11"), 
Amount.fromJSONString("EUR:1.11") * 1)
-        assertEquals(Amount.fromJSONString("EUR:2.22"), 
Amount.fromJSONString("EUR:1.11") * 2)
-        assertEquals(Amount.fromJSONString("EUR:3.33"), 
Amount.fromJSONString("EUR:1.11") * 3)
-        assertEquals(Amount.fromJSONString("EUR:4.44"), 
Amount.fromJSONString("EUR:1.11") * 4)
-        assertEquals(Amount.fromJSONString("EUR:5.55"), 
Amount.fromJSONString("EUR:1.11") * 5)
-        assertEquals(
-            Amount.fromJSONString("EUR:1500000000.00000003"),
-            Amount.fromJSONString("EUR:500000000.00000001") * 3
-        )
-        assertThrows<AmountOverflowException>("times didn't overflow") {
-            Amount.fromJSONString("EUR:4000000000000000") * 2
-        }
-    }
-
-    @Test
-    fun testSubtraction() {
-        assertEquals(
-            Amount.fromJSONString("EUR:0"),
-            Amount.fromJSONString("EUR:1") - Amount.fromJSONString("EUR:1")
-        )
-        assertEquals(
-            Amount.fromJSONString("EUR:1.5"),
-            Amount.fromJSONString("EUR:3") - Amount.fromJSONString("EUR:1.5")
-        )
-        assertEquals(
-            Amount.fromJSONString("EUR:500000000.00000001"),
-            Amount.fromJSONString("EUR:500000000.00000002") - 
Amount.fromJSONString("EUR:0.00000001")
-        )
-        assertThrows<AmountOverflowException>("subtraction didn't underflow") {
-            Amount.fromJSONString("EUR:23.42") - 
Amount.fromJSONString("EUR:42.23")
-        }
-        assertThrows<AmountOverflowException>("subtraction didn't underflow") {
-            Amount.fromJSONString("EUR:0.5") - 
Amount.fromJSONString("EUR:0.50000001")
-        }
-    }
-
-    @Test
-    fun testIsZero() {
-        assertTrue(Amount.zero("EUR").isZero())
-        assertTrue(Amount.fromJSONString("EUR:0").isZero())
-        assertTrue(Amount.fromJSONString("EUR:0.0").isZero())
-        assertTrue(Amount.fromJSONString("EUR:0.00000").isZero())
-        assertTrue((Amount.fromJSONString("EUR:1.001") - 
Amount.fromJSONString("EUR:1.001")).isZero())
-
-        assertFalse(Amount.fromJSONString("EUR:0.00000001").isZero())
-        assertFalse(Amount.fromJSONString("EUR:1.0").isZero())
-        assertFalse(Amount.fromJSONString("EUR:0001.0").isZero())
-    }
-
-    @Test
-    fun testComparision() {
-        assertTrue(Amount.fromJSONString("EUR:0") <= 
Amount.fromJSONString("EUR:0"))
-        assertTrue(Amount.fromJSONString("EUR:0") <= 
Amount.fromJSONString("EUR:0.00000001"))
-        assertTrue(Amount.fromJSONString("EUR:0") < 
Amount.fromJSONString("EUR:0.00000001"))
-        assertTrue(Amount.fromJSONString("EUR:0") < 
Amount.fromJSONString("EUR:1"))
-        assertEquals(Amount.fromJSONString("EUR:0"), 
Amount.fromJSONString("EUR:0"))
-        assertEquals(Amount.fromJSONString("EUR:42"), 
Amount.fromJSONString("EUR:42"))
-        assertEquals(Amount.fromJSONString("EUR:42.00000001"), 
Amount.fromJSONString("EUR:42.00000001"))
-        assertTrue(Amount.fromJSONString("EUR:42.00000001") >= 
Amount.fromJSONString("EUR:42.00000001"))
-        assertTrue(Amount.fromJSONString("EUR:42.00000002") >= 
Amount.fromJSONString("EUR:42.00000001"))
-        assertTrue(Amount.fromJSONString("EUR:42.00000002") > 
Amount.fromJSONString("EUR:42.00000001"))
-        assertTrue(Amount.fromJSONString("EUR:0.00000002") > 
Amount.fromJSONString("EUR:0.00000001"))
-        assertTrue(Amount.fromJSONString("EUR:0.00000001") > 
Amount.fromJSONString("EUR:0"))
-        assertTrue(Amount.fromJSONString("EUR:2") > 
Amount.fromJSONString("EUR:1"))
-
-        assertThrows<IllegalStateException>("could compare amounts with 
different currencies") {
-            Amount.fromJSONString("EUR:0.5") < 
Amount.fromJSONString("USD:0.50000001")
-        }
-    }
-
-    @Test
-    fun testToByteArray() {
-        val vectors = listOf(
-            Pair("ceicWVf9GhJ:3902026702525079.40496378", 
"006XSQV3G899E0K9XKX66SB9CDBNCSHS8XM4M00"),
-            Pair("asYDLuK2A:3800267550024600.02072907", 
"006R0MNXBVHSG00ZM55P2WTS8H67AJSJ8400000"),
-            Pair("pV1m:1347558259914570.09786232", 
"002CK66VCNVMM04NADW70NHHDM0000000000000"),
-            Pair("geO82l:553744321840253.41004983", 
"000ZF855K627T0KHNYVPESAF70S6R0000000000"),
-            Pair("B9bWK7WPEO:3663912678613976.12122563", 
"006G8KS5P9HXG05RZ71M4EB2AX5KENTG8N7G000"),
-            Pair("X:1537372109907438.77850768", 
"002QCETPFYJYW153X285G000000000000000000"),
-            Pair("5:4271492725553118.39728399", 
"007JSSK6J4VXW0JY6M7KA000000000000000000"),
-            Pair("OSdV:801656289790342.08256189", 
"001DJ6H6CA4RC03XZAYMYMV4AR0000000000000"),
-            Pair("Y6:2908617536334646.94126271", 
"0055AQTB19NKC1CW82ZNJDG0000000000000000"),
-            Pair("kSHoOZj:2610656582865206.00292046", 
"004MCR6T828KC004EK76PMT8DX7NMTG00000000"),
-            Pair("GkhLXrlGES:4246330707533398.83874252", 
"007HC0Z9DFF5C17ZT764ETV89HC74V278N9G000"),
-            Pair("CNS09:738124490298524.71259462", 
"0019YMG01DA9R11ZAN346KJK60WG00000000000"),
-            Pair("sw0b1tKXZym:2132978464977419.28199478", 
"003S7VNZPZS0P0DE98V76XSGC8RQ8JTRB9WPT00"),
-            Pair("fC:1275322307696988.17178522", 
"0028FSGX3ZCNR0863YD6CGR0000000000000000"),
-            Pair("cRai6j:166032749022734.69444771", 
"0009E0C30V70W113MJHP6MK1D4V6M0000000000"),
-            Pair("KOADwTb3:3932974019564218.48282023", 
"006ZJ16ZB39BM0Q0Q6KMPKT18HVN8RHK0000000"),
-            Pair("9Fi9wcLgDe:1268366772151214.97268853", 
"002834N6WRHTW1EC6HTKJHK975VP6K378HJG000"),
-            Pair("SDN:3370670470236379.88943272", 
"005ZK6V0124DP1AD5AM56H2E000000000000000"),
-            Pair("zGCP5V:4010014441349620.76121145", 
"0073Y5HYA8GZ8149GGWQMHT3A0TNC0000000000"),
-            Pair("VsW1JjBLn:2037070181191907.99717275", 
"003KSD2WH18E61FHJ2DNCWTQ6556MGJCDR00000"),
-            Pair("A:1806895799429502.00887758", 
"0036PQ5P8NMQW00DHF742000000000000000000"),
-            Pair("njA8:4015261148004966.43708687", 
"00747PYPD116C0MTY47PWTJ1700000000000000"),
-            Pair("Bwq:3562876074139250.28829179", 
"006AGTNTRWF740DQWQXM4XVH000000000000000"),
-            Pair("8e75v8:3716241006992995.95213823", 
"006K7SP93WF661DCV3ZKGS9Q6NV3G0000000000"),
-            Pair("XrnbQTTn:3887603772953949.94721267", 
"006WZGA9X8ANT1D5AKSNGWKEC98N8N3E0000000"),
-            Pair("MIN:0.00000001", "0000000000000000000MTJAE000000000000000"),
-            Pair("MAX:4503599627370496.99999999", 
"00800000000001FNW3ZMTGAR000000000000000")
-        )
-        for (v in vectors) {
-            val amount = Amount.fromJSONString(v.first)
-            val encodedBytes = Base32Crockford.encode(amount.toByteArray())
-            assertEquals(v.second, encodedBytes)
-        }
-    }
-
-    private inline fun <reified T : Throwable> assertThrows(
-        msg: String? = null,
-        function: () -> Any
-    ) {
-        try {
-            function.invoke()
-            fail(msg)
-        } catch (e: Exception) {
-            assertTrue(e is T)
-        }
-    }
-
-}
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/TalerUriTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/TalerUriTest.kt
deleted file mode 100644
index cfcc8bd..0000000
--- a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/TalerUriTest.kt
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * This file is part of GNU Taler
- * (C) 2020 Taler Systems S.A.
- *
- * GNU Taler is free software; you can redistribute it and/or modify it under 
the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3, or (at your option) any later version.
- *
- * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR
- * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
- */
-
-package net.taler.wallet.kotlin
-
-import net.taler.wallet.kotlin.TalerUri.WithdrawUriResult
-import net.taler.wallet.kotlin.TalerUri.parseWithdrawUri
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNull
-
-class TalerUriTest {
-
-    @Test
-    fun testParseWithdrawUri() {
-        // correct parsing
-        var uri = "taler://withdraw/bank.example.com/12345"
-        var expected = WithdrawUriResult("https://bank.example.com/";, "12345")
-        assertEquals(expected, parseWithdrawUri(uri))
-
-        // correct parsing with insecure http
-        uri = "taler+http://withdraw/bank.example.org/foo";
-        expected = WithdrawUriResult("http://bank.example.org/";, "foo")
-        assertEquals(expected, parseWithdrawUri(uri))
-
-        // correct parsing with long path
-        uri = "taler://withdraw/bank.example.com/foo/bar/23/42/1337/1234567890"
-        expected = 
WithdrawUriResult("https://bank.example.com/foo/bar/23/42/1337";, "1234567890")
-        assertEquals(expected, parseWithdrawUri(uri))
-
-        // rejects incorrect scheme
-        uri = "talerx://withdraw/bank.example.com/12345"
-        assertNull(parseWithdrawUri(uri))
-
-        // rejects incorrect authority
-        uri = "taler://withdrawx/bank.example.com/12345"
-        assertNull(parseWithdrawUri(uri))
-
-        // rejects incorrect authority with insecure http
-        uri = "taler+http://withdrawx/bank.example.com/12345";
-        assertNull(parseWithdrawUri(uri))
-
-        // rejects empty withdrawalId
-        uri = "taler://withdraw/bank.example.com//"
-        assertNull(parseWithdrawUri(uri))
-
-        // rejects empty path and withdrawalId
-        uri = "taler://withdraw/bank.example.com////"
-        assertNull(parseWithdrawUri(uri))
-    }
-
-}
diff --git 
a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/VersionTest.kt 
b/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/VersionTest.kt
deleted file mode 100644
index d445ebc..0000000
--- a/wallet/src/commonTest/kotlin/net/taler/wallet/kotlin/VersionTest.kt
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * This file is part of GNU Taler
- * (C) 2020 Taler Systems S.A.
- *
- * GNU Taler is free software; you can redistribute it and/or modify it under 
the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 3, or (at your option) any later version.
- *
- * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
FOR
- * A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
- */
-
-package net.taler.wallet.kotlin
-
-import kotlin.test.Test
-import kotlin.test.assertEquals
-import kotlin.test.assertNull
-
-class VersionTest {
-
-    @Test
-    fun testComparision() {
-        assertNull(compareVersions("0:0:0", ""))
-        assertNull(compareVersions("", "0:0:0"))
-        assertNull(compareVersions("foo", "0:0:0"))
-        assertNull(compareVersions("0:0:0", "foo"))
-        assertEquals(
-            VersionMatchResult(true, 0),
-            compareVersions("0:0:0", "0:0:0")
-        )
-        assertEquals(
-            VersionMatchResult(true, -1),
-            compareVersions("0:0:0", "1:0:1")
-        )
-        assertEquals(
-            VersionMatchResult(true, -1),
-            compareVersions("0:0:0", "1:5:1")
-        )
-        assertEquals(
-            VersionMatchResult(false, -1),
-            compareVersions("0:0:0", "1:5:0")
-        )
-        assertEquals(
-            VersionMatchResult(false, 1),
-            compareVersions("1:0:0", "0:5:0")
-        )
-        assertEquals(
-            VersionMatchResult(true, 0),
-            compareVersions("1:0:1", "1:5:1")
-        )
-    }
-
-}
diff --git a/wallet/src/nativeMain/kotlin/net/taler/wallet/kotlin/Db.kt 
b/wallet/src/jsMain/kotlin/net/taler/lib/wallet/Db.kt
similarity index 96%
rename from wallet/src/nativeMain/kotlin/net/taler/wallet/kotlin/Db.kt
rename to wallet/src/jsMain/kotlin/net/taler/lib/wallet/Db.kt
index 45cbfc3..39394b8 100644
--- a/wallet/src/nativeMain/kotlin/net/taler/wallet/kotlin/Db.kt
+++ b/wallet/src/jsMain/kotlin/net/taler/lib/wallet/Db.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.lib.wallet
 
 internal actual class DbFactory {
     actual fun openDb(): Db {
diff --git 
a/wallet/src/jsMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt 
b/wallet/src/jsMain/kotlin/net/taler/lib/wallet/crypto/CryptoFactory.kt
similarity index 99%
rename from 
wallet/src/jsMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
rename to wallet/src/jsMain/kotlin/net/taler/lib/wallet/crypto/CryptoFactory.kt
index e428f6a..e5f9531 100644
--- a/wallet/src/jsMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
+++ b/wallet/src/jsMain/kotlin/net/taler/lib/wallet/crypto/CryptoFactory.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
 import org.khronos.webgl.Uint8Array
 import org.khronos.webgl.get
diff --git a/wallet/src/jsTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt 
b/wallet/src/jsTest/kotlin/net/taler/lib/wallet/TestUtils.kt
similarity index 96%
rename from wallet/src/jsTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt
rename to wallet/src/jsTest/kotlin/net/taler/lib/wallet/TestUtils.kt
index 49466e0..16da3f7 100644
--- a/wallet/src/jsTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt
+++ b/wallet/src/jsTest/kotlin/net/taler/lib/wallet/TestUtils.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.lib.wallet
 
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.GlobalScope
diff --git a/wallet/src/jsMain/kotlin/net/taler/wallet/kotlin/Db.kt 
b/wallet/src/nativeMain/kotlin/net/taler/lib/wallet/Db.kt
similarity index 96%
rename from wallet/src/jsMain/kotlin/net/taler/wallet/kotlin/Db.kt
rename to wallet/src/nativeMain/kotlin/net/taler/lib/wallet/Db.kt
index 45cbfc3..39394b8 100644
--- a/wallet/src/jsMain/kotlin/net/taler/wallet/kotlin/Db.kt
+++ b/wallet/src/nativeMain/kotlin/net/taler/lib/wallet/Db.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.lib.wallet
 
 internal actual class DbFactory {
     actual fun openDb(): Db {
diff --git 
a/wallet/src/nativeMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt 
b/wallet/src/nativeMain/kotlin/net/taler/lib/wallet/crypto/CryptoFactory.kt
similarity index 99%
rename from 
wallet/src/nativeMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
rename to 
wallet/src/nativeMain/kotlin/net/taler/lib/wallet/crypto/CryptoFactory.kt
index 7860607..61646a0 100644
--- 
a/wallet/src/nativeMain/kotlin/net/taler/wallet/kotlin/crypto/CryptoFactory.kt
+++ b/wallet/src/nativeMain/kotlin/net/taler/lib/wallet/crypto/CryptoFactory.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin.crypto
+package net.taler.lib.wallet.crypto
 
 import kotlinx.cinterop.CValuesRef
 import kotlinx.cinterop.UByteVar
diff --git a/wallet/src/nativeTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt 
b/wallet/src/nativeTest/kotlin/net/taler/lib/wallet/TestUtils.kt
similarity index 96%
rename from wallet/src/nativeTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt
rename to wallet/src/nativeTest/kotlin/net/taler/lib/wallet/TestUtils.kt
index c44a846..c38916c 100644
--- a/wallet/src/nativeTest/kotlin/net/taler/wallet/kotlin/TestUtils.kt
+++ b/wallet/src/nativeTest/kotlin/net/taler/lib/wallet/TestUtils.kt
@@ -14,7 +14,7 @@
  * GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
  */
 
-package net.taler.wallet.kotlin
+package net.taler.lib.wallet
 
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.runBlocking

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]