diff --git a/lib/decl/systemjs/systemjs.d.ts b/lib/decl/systemjs/systemjs.d.ts
index 1d826aebb..4d84b399c 100644
--- a/lib/decl/systemjs/systemjs.d.ts
+++ b/lib/decl/systemjs/systemjs.d.ts
@@ -9,7 +9,7 @@ interface System {
   config: any;
   newModule(obj: Object): any;
   normalizeSync(name: string): string;
-  set(moduleName: string, module: any)
+  set(moduleName: string, module: any): void;
 }
 
 
diff --git a/lib/emscripten/emsc.d.ts b/lib/emscripten/emsc.d.ts
index c313f240d..19a6990e5 100644
--- a/lib/emscripten/emsc.d.ts
+++ b/lib/emscripten/emsc.d.ts
@@ -33,7 +33,7 @@ export interface EmscFunGen {
 export declare namespace Module {
   var cwrap: EmscFunGen;
 
-  function _free(ptr: number);
+  function _free(ptr: number): void;
 
   function _malloc(n: number): number;
 
@@ -41,9 +41,10 @@ export declare namespace Module {
 
   function getValue(ptr: number, type: string, noSafe?: boolean): number;
 
-  function setValue(ptr: number, value: number, type: string, noSafe?: boolean);
+  function setValue(ptr: number, value: number, type: string,
+                    noSafe?: boolean): void;
 
   function writeStringToMemory(s: string,
                                buffer: number,
-                               dontAddNull?: boolean);
+                               dontAddNull?: boolean): void;
 }
\ No newline at end of file
diff --git a/lib/i18n.ts b/lib/i18n.ts
index bba3e14c6..ce13a3292 100644
--- a/lib/i18n.ts
+++ b/lib/i18n.ts
@@ -24,14 +24,14 @@ document.addEventListener(
 
 declare var i18n: any;
 
-const JedModule = window["Jed"];
-var jed;
+const JedModule: any = (window as any)["Jed"];
+var jed: any;
 
 
 class PluralNumber {
   n: number;
 
-  constructor(n) {
+  constructor(n: number) {
     this.n = n;
   }
 
@@ -62,7 +62,7 @@ function init () {
 
 
 /** Convert template strings to a msgid */
-function toI18nString(strings) {
+function toI18nString(strings: string[]) {
   let str = "";
   for (let i = 0; i < strings.length; i++) {
     str += strings[i];
@@ -75,7 +75,7 @@ function toI18nString(strings) {
 
 
 /** Use the first number in values to determine plural form */
-function getPluralValue (values) {
+function getPluralValue (values: any) {
   let n = null;
   for (let i = 0; i < values.length; i++) {
     if ("number" === typeof values[i] || values[i] instanceof PluralNumber) {
@@ -88,11 +88,11 @@ function getPluralValue (values) {
 }
 
 
-var i18n = <any>function i18n(strings, ...values) {
+var i18n = <any>function i18n(strings: string[], ...values: any[]) {
   init();
   if ("object" !== typeof jed) {
     // Fallback implementation in case i18n lib is not there
-    return String.raw(strings, ...values);
+    return String.raw(strings as any, ...values);
   }
 
   let str = toI18nString (strings);
@@ -109,11 +109,11 @@ i18n.strings = {};
  * Interpolate i18nized values with arbitrary objects.
  * @return Array of strings/objects.
  */
-i18n.parts = function(strings, ...values) {
+i18n.parts = function(strings: string[], ...values: any[]) {
   init();
   if ("object" !== typeof jed) {
     // Fallback implementation in case i18n lib is not there
-    let parts = [];
+    let parts: string[] = [];
 
     for (let i = 0; i < strings.length; i++) {
       parts.push(strings[i]);
@@ -127,7 +127,7 @@ i18n.parts = function(strings, ...values) {
   let str = toI18nString (strings);
   let n = getPluralValue (values);
   let tr = jed.ngettext(str, str, n).split(/%(\d+)\$s/);
-  let parts = [];
+  let parts: string[] = [];
   for (let i = 0; i < tr.length; i++) {
     if (0 == i % 2) {
       parts.push(tr[i]);
@@ -144,7 +144,7 @@ i18n.parts = function(strings, ...values) {
  * Pluralize based on first numeric parameter in the template.
  * @todo The plural argument is used for extraction by pogen.js
  */
-i18n.pluralize = function (singular, plural) {
+i18n.pluralize = function (singular: any, plural: any) {
   return singular;
 };
 
@@ -154,4 +154,4 @@ i18n.pluralize = function (singular, plural) {
  */
 i18n.number = function (n : number) {
   return new PluralNumber (n);
-}
+};
diff --git a/lib/wallet/checkable.ts b/lib/wallet/checkable.ts
index a35634e81..9fd816578 100644
--- a/lib/wallet/checkable.ts
+++ b/lib/wallet/checkable.ts
@@ -25,18 +25,39 @@
  */
 
 export namespace Checkable {
-  export function SchemaError(message) {
+
+  type Path = (number|string)[];
+
+  interface SchemaErrorConstructor {
+    new (err: string): SchemaError;
+  }
+
+  interface SchemaError {
+    name: string;
+    message: string;
+  }
+
+  interface Prop {
+    propertyKey: any;
+    checker: any;
+    type: any;
+    elementChecker?: any;
+    elementProp?: any;
+  }
+
+  export let SchemaError = (function SchemaError(message: string) {
     this.name = 'SchemaError';
     this.message = message;
     this.stack = (<any>new Error()).stack;
-  }
+  }) as any as SchemaErrorConstructor;
+
 
   SchemaError.prototype = new Error;
 
   let chkSym = Symbol("checkable");
 
 
-  function checkNumber(target, prop, path): any {
+  function checkNumber(target: any, prop: Prop, path: Path): any {
     if ((typeof target) !== "number") {
       throw new SchemaError(`expected number for ${path}`);
     }
@@ -44,7 +65,7 @@ export namespace Checkable {
   }
 
 
-  function checkString(target, prop, path): any {
+  function checkString(target: any, prop: Prop, path: Path): any {
     if (typeof target !== "string") {
       throw new SchemaError(`expected string for ${path}, got ${typeof target} instead`);
     }
@@ -52,7 +73,7 @@ export namespace Checkable {
   }
 
 
-  function checkAnyObject(target, prop, path): any {
+  function checkAnyObject(target: any, prop: Prop, path: Path): any {
     if (typeof target !== "object") {
       throw new SchemaError(`expected (any) object for ${path}, got ${typeof target} instead`);
     }
@@ -60,12 +81,12 @@ export namespace Checkable {
   }
 
 
-  function checkAny(target, prop, path): any {
+  function checkAny(target: any, prop: Prop, path: Path): any {
     return target;
   }
 
 
-  function checkList(target, prop, path): any {
+  function checkList(target: any, prop: Prop, path: Path): any {
     if (!Array.isArray(target)) {
       throw new SchemaError(`array expected for ${path}, got ${typeof target} instead`);
     }
@@ -77,7 +98,7 @@ export namespace Checkable {
   }
 
 
-  function checkOptional(target, prop, path): any {
+  function checkOptional(target: any, prop: Prop, path: Path): any {
     console.assert(prop.propertyKey);
     prop.elementChecker(target,
                         prop.elementProp,
@@ -86,7 +107,7 @@ export namespace Checkable {
   }
 
 
-  function checkValue(target, prop, path): any {
+  function checkValue(target: any, prop: Prop, path: Path): any {
     let type = prop.type;
     if (!type) {
       throw Error(`assertion failed (prop is ${JSON.stringify(prop)})`);
@@ -123,8 +144,8 @@ export namespace Checkable {
   }
 
 
-  export function Class(target) {
-    target.checked = (v) => {
+  export function Class(target: any) {
+    target.checked = (v: any) => {
       return checkValue(v, {
         propertyKey: "(root)",
         type: target,
@@ -135,7 +156,7 @@ export namespace Checkable {
   }
 
 
-  export function Value(type) {
+  export function Value(type: any) {
     if (!type) {
       throw Error("Type does not exist yet (wrong order of definitions?)");
     }
@@ -152,7 +173,7 @@ export namespace Checkable {
   }
 
 
-  export function List(type) {
+  export function List(type: any) {
     let stub = {};
     type(stub, "(list-element)");
     let elementProp = mkChk(stub).props[0];
@@ -174,7 +195,7 @@ export namespace Checkable {
   }
 
 
-  export function Optional(type) {
+  export function Optional(type: any) {
     let stub = {};
     type(stub, "(optional-element)");
     let elementProp = mkChk(stub).props[0];
@@ -230,7 +251,7 @@ export namespace Checkable {
   }
 
 
-  function mkChk(target) {
+  function mkChk(target: any) {
     let chk = target[chkSym];
     if (!chk) {
       chk = {props: []};
diff --git a/lib/wallet/cryptoApi.ts b/lib/wallet/cryptoApi.ts
index a0113b2ea..2a2a7d319 100644
--- a/lib/wallet/cryptoApi.ts
+++ b/lib/wallet/cryptoApi.ts
@@ -27,9 +27,10 @@ import {Denomination} from "./types";
 import {Offer} from "./wallet";
 import {CoinWithDenom} from "./wallet";
 import {PayCoinInfo} from "./types";
+type RegistryEntry = {resolve: any; reject: any};
 export class CryptoApi {
   private nextRpcId: number = 1;
-  private rpcRegistry = {};
+  private rpcRegistry: {[n: number]: RegistryEntry} = {};
   private cryptoWorker: Worker;
 
 
@@ -52,14 +53,14 @@ export class CryptoApi {
   }
 
 
-  private registerRpcId(resolve, reject): number {
+  private registerRpcId(resolve: any, reject: any): number {
     let id = this.nextRpcId++;
     this.rpcRegistry[id] = {resolve, reject};
     return id;
   }
 
 
-  private doRpc<T>(methodName: string, ...args): Promise<T> {
+  private doRpc<T>(methodName: string, ...args: any[]): Promise<T> {
     return new Promise<T>((resolve, reject) => {
       let msg = {
         operation: methodName,
diff --git a/lib/wallet/cryptoLib.ts b/lib/wallet/cryptoLib.ts
index 1acbdaa16..1ca7b856f 100644
--- a/lib/wallet/cryptoLib.ts
+++ b/lib/wallet/cryptoLib.ts
@@ -28,6 +28,7 @@ import {Offer} from "./wallet";
 import {CoinWithDenom} from "./wallet";
 import {CoinPaySig} from "./types";
 import {Denomination} from "./types";
+import {Amount} from "./emscriptif";
 
 
 export function main(worker: Worker) {
@@ -43,7 +44,7 @@ export function main(worker: Worker) {
     if (typeof msg.data.operation != "string") {
       console.error("RPC operation must be string");
     }
-    let f = RpcFunctions[msg.data.operation];
+    let f = (RpcFunctions as any)[msg.data.operation];
     if (!f) {
       console.error(`unknown operation: '${msg.data.operation}'`);
       return;
@@ -156,7 +157,7 @@ namespace RpcFunctions {
   }
 
 
-  export function rsaUnblind(sig, bk, pk): string {
+  export function rsaUnblind(sig: string, bk: string, pk: string): string {
     let denomSig = native.rsaUnblind(native.RsaSignature.fromCrock(sig),
                                      native.RsaBlindingKeySecret.fromCrock(bk),
                                      native.RsaPublicKey.fromCrock(pk));
@@ -170,11 +171,11 @@ namespace RpcFunctions {
    */
   export function signDeposit(offer: Offer,
                               cds: CoinWithDenom[]): PayCoinInfo {
-    let ret = [];
+    let ret: PayCoinInfo = [];
     let amountSpent = native.Amount.getZero(cds[0].coin.currentAmount.currency);
     let amountRemaining = new native.Amount(offer.contract.amount);
     for (let cd of cds) {
-      let coinSpend;
+      let coinSpend: Amount;
 
       if (amountRemaining.value == 0 && amountRemaining.fraction == 0) {
         break;
diff --git a/lib/wallet/db.ts b/lib/wallet/db.ts
index 6cd25ee27..7fe635b9e 100644
--- a/lib/wallet/db.ts
+++ b/lib/wallet/db.ts
@@ -15,6 +15,7 @@
  */
 
 "use strict";
+import Dictionary = _.Dictionary;
 
 /**
  * Declarations and helpers for
@@ -83,27 +84,27 @@ export function openTalerDb(): Promise<IDBDatabase> {
 }
 
 
-export function exportDb(db): Promise<any> {
+export function exportDb(db: IDBDatabase): Promise<any> {
   let dump = {
     name: db.name,
     version: db.version,
-    stores: {}
+    stores: {} as Dictionary<any>,
   };
 
   return new Promise((resolve, reject) => {
 
     let tx = db.transaction(db.objectStoreNames);
-    tx.addEventListener("complete", (e) => {
+    tx.addEventListener("complete", () => {
       resolve(dump);
     });
     for (let i = 0; i < db.objectStoreNames.length; i++) {
       let name = db.objectStoreNames[i];
-      let storeDump = {};
+      let storeDump = {} as Dictionary<any>;
       dump.stores[name] = storeDump;
       let store = tx.objectStore(name)
                     .openCursor()
-                    .addEventListener("success", (e) => {
-                      let cursor = e.target.result;
+                    .addEventListener("success", (e: Event) => {
+                      let cursor = (e.target as any).result;
                       if (cursor) {
                         storeDump[cursor.key] = cursor.value;
                         cursor.continue();
diff --git a/lib/wallet/emscriptif.ts b/lib/wallet/emscriptif.ts
index 8540d15d0..a12128666 100644
--- a/lib/wallet/emscriptif.ts
+++ b/lib/wallet/emscriptif.ts
@@ -36,11 +36,11 @@ const GNUNET_SYSERR = -1;
 
 let Module = EmscWrapper.Module;
 
-let getEmsc: EmscWrapper.EmscFunGen = (...args) => Module.cwrap.apply(null,
+let getEmsc: EmscWrapper.EmscFunGen = (...args: any[]) => Module.cwrap.apply(null,
                                                                       args);
 
 var emsc = {
-  free: (ptr) => Module._free(ptr),
+  free: (ptr: number) => Module._free(ptr),
   get_value: getEmsc('TALER_WR_get_value',
                      'number',
                      ['number']),
@@ -164,13 +164,12 @@ enum RandomQuality {
 
 
 abstract class ArenaObject {
-  private _nativePtr: number;
+  private _nativePtr: number | undefined = undefined;
   arena: Arena;
 
   abstract destroy(): void;
 
   constructor(arena?: Arena) {
-    this.nativePtr = null;
     if (!arena) {
       if (arenaStack.length == 0) {
         throw Error("No arena available")
@@ -192,9 +191,9 @@ abstract class ArenaObject {
   }
 
   free() {
-    if (this.nativePtr !== undefined) {
+    if (this.nativePtr) {
       emsc.free(this.nativePtr);
-      this.nativePtr = undefined;
+      this._nativePtr = undefined;
     }
   }
 
@@ -212,21 +211,22 @@ abstract class ArenaObject {
     this._nativePtr = n;
   }
 
-  set nativePtr(v) {
+  set nativePtr(v: number) {
     this.setNative(v);
   }
 
   get nativePtr() {
     return this.getNative();
   }
-
 }
 
+
 interface Arena {
   put(obj: ArenaObject): void;
   destroy(): void;
 }
 
+
 class DefaultArena implements Arena {
   heap: Array<ArenaObject>;
 
@@ -234,7 +234,7 @@ class DefaultArena implements Arena {
     this.heap = [];
   }
 
-  put(obj) {
+  put(obj: ArenaObject) {
     this.heap.push(obj);
   }
 
@@ -269,7 +269,7 @@ class SyncArena extends DefaultArena {
     super();
   }
 
-  pub(obj) {
+  pub(obj: ArenaObject) {
     super.put(obj);
     if (!this.isScheduled) {
       this.schedule();
@@ -308,14 +308,12 @@ export class Amount extends ArenaObject {
   }
 
   destroy() {
-    if (this.nativePtr != 0) {
-      emsc.free(this.nativePtr);
-    }
+    super.free();
   }
 
 
   static getZero(currency: string, a?: Arena): Amount {
-    let am = new Amount(null, a);
+    let am = new Amount(undefined, a);
     let r = emsc.amount_get_zero(currency, am.getNative());
     if (r != GNUNET_OK) {
       throw Error("invalid currency");
@@ -442,7 +440,7 @@ abstract class PackedArenaObject extends ArenaObject {
   }
 
   alloc() {
-    if (this.nativePtr === null) {
+    if (!this.nativePtr) {
       this.nativePtr = emscAlloc.malloc(this.size());
     }
   }
@@ -466,7 +464,7 @@ abstract class PackedArenaObject extends ArenaObject {
       b = (b + 256) % 256;
       bytes.push("0".concat(b.toString(16)).slice(-2));
     }
-    let lines = [];
+    let lines: string[] = [];
     for (let i = 0; i < bytes.length; i += 8) {
       lines.push(bytes.slice(i, i + 8).join(","));
     }
@@ -482,7 +480,7 @@ export class AmountNbo extends PackedArenaObject {
 
   toJson(): any {
     let a = new DefaultArena();
-    let am = new Amount(null, a);
+    let am = new Amount(undefined, a);
     am.fromNbo(this);
     let json = am.toJson();
     a.destroy();
@@ -508,7 +506,7 @@ export class EddsaPrivateKey extends PackedArenaObject {
     return obj;
   }
 
-  static fromCrock: (string) => EddsaPrivateKey;
+  static fromCrock: (s: string) => EddsaPrivateKey;
 }
 mixinStatic(EddsaPrivateKey, fromCrock);
 
@@ -521,7 +519,7 @@ function fromCrock(s: string) {
 }
 
 
-function mixin(obj, method, name?: string) {
+function mixin(obj: any, method: any, name?: string) {
   if (!name) {
     name = method.name;
   }
@@ -532,7 +530,7 @@ function mixin(obj, method, name?: string) {
 }
 
 
-function mixinStatic(obj, method, name?: string) {
+function mixinStatic(obj: any, method: any, name?: string) {
   if (!name) {
     name = method.name;
   }
@@ -595,7 +593,7 @@ export class RsaBlindingKeySecret extends PackedArenaObject {
     return o;
   }
 
-  static fromCrock: (string) => RsaBlindingKeySecret;
+  static fromCrock: (s: string) => RsaBlindingKeySecret;
 }
 mixinStatic(RsaBlindingKeySecret, fromCrock);
 
@@ -622,9 +620,9 @@ export class ByteArray extends PackedArenaObject {
     return this.allocatedSize;
   }
 
-  constructor(desiredSize: number, init: number, a?: Arena) {
+  constructor(desiredSize: number, init?: number, a?: Arena) {
     super(a);
-    if (init === undefined || init === null) {
+    if (init === undefined) {
       this.nativePtr = emscAlloc.malloc(desiredSize);
     } else {
       this.nativePtr = init;
@@ -642,7 +640,7 @@ export class ByteArray extends PackedArenaObject {
     let hstr = emscAlloc.malloc(s.length + 1);
     Module.writeStringToMemory(s, hstr);
     let decodedLen = Math.floor((s.length * 5) / 8);
-    let ba = new ByteArray(decodedLen, null, a);
+    let ba = new ByteArray(decodedLen, undefined, a);
     let res = emsc.string_to_data(hstr, s.length, ba.nativePtr, decodedLen);
     emsc.free(hstr);
     if (res != GNUNET_OK) {
@@ -899,11 +897,11 @@ interface Encodeable {
   encode(arena?: Arena): ByteArray;
 }
 
-function makeEncode(encodeFn) {
+function makeEncode(encodeFn: any) {
   function encode(arena?: Arena) {
     let ptr = emscAlloc.malloc(PTR_SIZE);
     let len = encodeFn(this.getNative(), ptr);
-    let res = new ByteArray(len, null, arena);
+    let res = new ByteArray(len, undefined, arena);
     res.setNative(Module.getValue(ptr, '*'));
     emsc.free(ptr);
     return res;
diff --git a/lib/wallet/helpers.ts b/lib/wallet/helpers.ts
index fd1650758..5d231fe64 100644
--- a/lib/wallet/helpers.ts
+++ b/lib/wallet/helpers.ts
@@ -24,7 +24,7 @@
 
 import {AmountJson} from "./types";
 
-export function substituteFulfillmentUrl(url: string, vars) {
+export function substituteFulfillmentUrl(url: string, vars: any) {
   url = url.replace("${H_contract}", vars.H_contract);
   url = url.replace("${$}", "$");
   return url;
@@ -42,7 +42,7 @@ export function amountToPretty(amount: AmountJson): string {
  *
  * See http://api.taler.net/wallet.html#general
  */
-export function canonicalizeBaseUrl(url) {
+export function canonicalizeBaseUrl(url: string) {
   let x = new URI(url);
   if (!x.protocol()) {
     x.protocol("https");
@@ -54,10 +54,10 @@ export function canonicalizeBaseUrl(url) {
 }
 
 
-export function parsePrettyAmount(pretty: string): AmountJson {
+export function parsePrettyAmount(pretty: string): AmountJson|undefined {
   const res = /([0-9]+)(.[0-9]+)?\s*(\w+)/.exec(pretty);
   if (!res) {
-    return null;
+    return undefined;
   }
   return {
     value: parseInt(res[1], 10),
diff --git a/lib/wallet/http.ts b/lib/wallet/http.ts
index 60f388e4b..8f82ceaff 100644
--- a/lib/wallet/http.ts
+++ b/lib/wallet/http.ts
@@ -66,19 +66,19 @@ export class BrowserHttpLib {
   }
 
 
-  postJson(url: string|uri.URI, body) {
+  postJson(url: string|uri.URI, body: any) {
     return this.req("post", url, {req: JSON.stringify(body)});
   }
 
 
-  postForm(url: string|uri.URI, form) {
+  postForm(url: string|uri.URI, form: any) {
     return this.req("post", url, {req: form});
   }
 }
 
 
 export class RequestException {
-  constructor(detail) {
+  constructor(detail: any) {
 
   }
 }
diff --git a/lib/wallet/types.ts b/lib/wallet/types.ts
index 2434dca32..e8b7a1e39 100644
--- a/lib/wallet/types.ts
+++ b/lib/wallet/types.ts
@@ -392,5 +392,5 @@ export interface CheckRepurchaseResult {
 
 
 export interface Notifier {
-  notify();
+  notify(): void;
 }
diff --git a/pages/confirm-contract.tsx b/pages/confirm-contract.tsx
index fadbc3233..e88336a2d 100644
--- a/pages/confirm-contract.tsx
+++ b/pages/confirm-contract.tsx
@@ -26,11 +26,11 @@
 import MithrilComponent = _mithril.MithrilComponent;
 import {substituteFulfillmentUrl} from "../lib/wallet/helpers";
 import m from "mithril";
-import {Contract} from "../lib/wallet/types";
+import {Contract, AmountJson} from "../lib/wallet/types";
 "use strict";
 
 
-function prettyAmount(amount) {
+function prettyAmount(amount: AmountJson) {
   let v = amount.value + amount.fraction / 1e6;
   return `${v.toFixed(2)} ${amount.currency}`;
 }
@@ -40,7 +40,7 @@ const Details = {
   controller() {
     return {collapsed: m.prop(true)};
   },
-  view(ctrl, contract: Contract) {
+  view(ctrl: any, contract: Contract) {
     if (ctrl.collapsed()) {
       return m("div", [
         m("button.linky", {
@@ -71,11 +71,11 @@ export function main() {
   let offer = JSON.parse(query.offer);
   console.dir(offer);
   let contract = offer.contract;
-  let error = null;
+  let error: string|null = null;
   let payDisabled = true;
 
   var Contract = {
-    view(ctrl) {
+    view(ctrl: any) {
       return [
         m("p",
           i18n.parts`${m("strong", contract.merchant.name)}
diff --git a/pages/confirm-create-reserve.tsx b/pages/confirm-create-reserve.tsx
index dafd3ef33..b965f35c9 100644
--- a/pages/confirm-create-reserve.tsx
+++ b/pages/confirm-create-reserve.tsx
@@ -41,10 +41,10 @@ import {getReserveCreationInfo} from "../lib/wallet/wxApi";
  */
 class DelayTimer {
   ms: number;
-  f;
-  timerId: number = null;
+  f: () => void;
+  timerId: number|undefined = undefined;
 
-  constructor(ms: number, f) {
+  constructor(ms: number, f: () => void) {
     this.f = f;
     this.ms = ms;
   }
@@ -58,7 +58,7 @@ class DelayTimer {
   }
 
   stop() {
-    if (this.timerId !== null) {
+    if (this.timerId != undefined) {
       window.clearTimeout(this.timerId);
     }
   }
@@ -67,11 +67,10 @@ class DelayTimer {
 
 class Controller {
   url = m.prop<string>();
-  statusString = null;
+  statusString: string | null = null;
   isValidExchange = false;
-  reserveCreationInfo: ReserveCreationInfo = null;
+  reserveCreationInfo?: ReserveCreationInfo;
   private timer: DelayTimer;
-  private request: XMLHttpRequest;
   amount: AmountJson;
   callbackUrl: string;
   wtTypes: string[];
@@ -97,7 +96,7 @@ class Controller {
   private update() {
     this.timer.stop();
     const doUpdate = () => {
-      this.reserveCreationInfo = null;
+      this.reserveCreationInfo = undefined;
       if (!this.url()) {
         this.statusString = i18n`Error: URL is empty`;
         m.redraw(true);
@@ -126,7 +125,7 @@ class Controller {
         .catch((e) => {
           console.log("get exchange info rejected");
           if (e.hasOwnProperty("httpStatus")) {
-            this.statusString = `Error: request failed with status ${this.request.status}`;
+            this.statusString = `Error: request failed with status ${e.httpStatus}`;
           } else if (e.hasOwnProperty("errorResponse")) {
             let resp = e.errorResponse;
             this.statusString = `Error: ${resp.error} (${resp.hint})`;
@@ -143,11 +142,7 @@ class Controller {
   reset() {
     this.isValidExchange = false;
     this.statusString = null;
-    this.reserveCreationInfo = null;
-    if (this.request) {
-      this.request.abort();
-      this.request = null;
-    }
+    this.reserveCreationInfo = undefined;
   }
 
   confirmReserve(rci: ReserveCreationInfo,
@@ -155,7 +150,7 @@ class Controller {
                  amount: AmountJson,
                  callback_url: string) {
     const d = {exchange, amount};
-    const cb = (rawResp) => {
+    const cb = (rawResp: any) => {
       if (!rawResp) {
         throw Error("empty response");
       }
@@ -195,8 +190,8 @@ class Controller {
 }
 
 function view(ctrl: Controller): any {
-  let controls = [];
-  let mx = (x, ...args) => controls.push(m(x, ...args));
+  let controls: any[] = [];
+  let mx = (x: any, ...args: any[]) => controls.push(m(x, ...args));
 
   mx("p",
      i18n.parts`You are about to withdraw ${m("strong", amountToPretty(
@@ -210,8 +205,8 @@ function view(ctrl: Controller): any {
 }
 
 function viewSimple(ctrl: Controller) {
-  let controls = [];
-  let mx = (x, ...args) => controls.push(m(x, ...args));
+  let controls: any[] = [];
+  let mx = (x: any, ...args: any[]) => controls.push(m(x, ...args));
 
   if (ctrl.statusString) {
     mx("p", "Error: ", ctrl.statusString);
@@ -221,9 +216,9 @@ function viewSimple(ctrl: Controller) {
       }
     }, "advanced options");
   }
-  else if (ctrl.reserveCreationInfo) {
+  else if (ctrl.reserveCreationInfo != undefined) {
     mx("button.accept", {
-         onclick: () => ctrl.confirmReserve(ctrl.reserveCreationInfo,
+         onclick: () => ctrl.confirmReserve(ctrl.reserveCreationInfo!,
                                             ctrl.url(),
                                             ctrl.amount,
                                             ctrl.callbackUrl),
@@ -249,11 +244,11 @@ function viewSimple(ctrl: Controller) {
 
 
 function viewComplex(ctrl: Controller) {
-  let controls = [];
-  let mx = (x, ...args) => controls.push(m(x, ...args));
+  let controls: any[] = [];
+  let mx = (x: any, ...args: any[]) => controls.push(m(x, ...args));
 
   mx("button.accept", {
-       onclick: () => ctrl.confirmReserve(ctrl.reserveCreationInfo,
+       onclick: () => ctrl.confirmReserve(ctrl.reserveCreationInfo!,
                                           ctrl.url(),
                                           ctrl.amount,
                                           ctrl.callbackUrl),
@@ -314,8 +309,8 @@ function viewComplex(ctrl: Controller) {
 function renderReserveCreationDetails(rci: ReserveCreationInfo) {
   let denoms = rci.selectedDenoms;
 
-  let countByPub = {};
-  let uniq = [];
+  let countByPub: {[s: string]: number} = {};
+  let uniq: Denomination[] = [];
 
   denoms.forEach((x: Denomination) => {
     let c = countByPub[x.denom_pub] || 0;
@@ -358,7 +353,7 @@ function renderReserveCreationDetails(rci: ReserveCreationInfo) {
 function getSuggestedExchange(currency: string): Promise<string> {
   // TODO: make this request go to the wallet backend
   // Right now, this is a stub.
-  const defaultExchange = {
+  const defaultExchange: {[s: string]: string} = {
     "KUDOS": "https://exchange.demo.taler.net",
     "PUDOS": "https://exchange.test.taler.net",
   };
diff --git a/pages/show-db.ts b/pages/show-db.ts
index 9a7b315cf..0a3a5bd46 100644
--- a/pages/show-db.ts
+++ b/pages/show-db.ts
@@ -21,30 +21,33 @@
  * @author Florian Dold
  */
 
-function replacer(match, pIndent, pKey, pVal, pEnd) {
+function replacer(match: string, pIndent: string, pKey: string, pVal: string,
+                  pEnd: string) {
   var key = '<span class=json-key>';
   var val = '<span class=json-value>';
   var str = '<span class=json-string>';
   var r = pIndent || '';
-  if (pKey)
-     r = r + key + pKey.replace(/[": ]/g, '') + '</span>: ';
-  if (pVal)
-     r = r + (pVal[0] == '"' ? str : val) + pVal + '</span>';
+  if (pKey) {
+    r = r + key + pKey.replace(/[": ]/g, '') + '</span>: ';
+  }
+  if (pVal) {
+    r = r + (pVal[0] == '"' ? str : val) + pVal + '</span>';
+  }
   return r + (pEnd || '');
 }
 
 
-function prettyPrint(obj) {
+function prettyPrint(obj: any) {
   var jsonLine = /^( *)("[\w]+": )?("[^"]*"|[\w.+-]*)?([,[{])?$/mg;
-  return JSON.stringify(obj, null, 3)
-     .replace(/&/g, '&amp;').replace(/\\"/g, '&quot;')
-     .replace(/</g, '&lt;').replace(/>/g, '&gt;')
-     .replace(jsonLine, replacer);
+  return JSON.stringify(obj, null as any, 3)
+             .replace(/&/g, '&amp;').replace(/\\"/g, '&quot;')
+             .replace(/</g, '&lt;').replace(/>/g, '&gt;')
+             .replace(jsonLine, replacer);
 }
 
 
-document.addEventListener("DOMContentLoaded", (e) => {
-  chrome.runtime.sendMessage({type:'dump-db'}, (resp) => {
+document.addEventListener("DOMContentLoaded", () => {
+  chrome.runtime.sendMessage({type: 'dump-db'}, (resp) => {
     document.getElementById('dump').innerHTML = prettyPrint(resp);
   });
 });
diff --git a/popup/popup.tsx b/popup/popup.tsx
index a818e9228..8a604b457 100644
--- a/popup/popup.tsx
+++ b/popup/popup.tsx
@@ -29,12 +29,15 @@
 "use strict";
 
 import {substituteFulfillmentUrl} from "../lib/wallet/helpers";
+import BrowserClickedEvent = chrome.browserAction.BrowserClickedEvent;
+import {Wallet} from "../lib/wallet/wallet";
+import {AmountJson} from "../lib/wallet/types";
 
 declare var m: any;
 declare var i18n: any;
 
 
-function onUpdateNotification(f) {
+function onUpdateNotification(f: () => void) {
   let port = chrome.runtime.connect({name: "notifications"});
   port.onMessage.addListener((msg, port) => {
     f();
@@ -56,7 +59,7 @@ export function main() {
 console.log("this is popup");
 
 
-function makeTab(target, name) {
+function makeTab(target: string, name: string) {
   let cssClass = "";
   if (target == m.route()) {
     cssClass = "active";
@@ -79,8 +82,8 @@ namespace WalletNavBar {
 }
 
 
-function openInExtension(element, isInitialized) {
-  element.addEventListener("click", (e) => {
+function openInExtension(element: HTMLAnchorElement, isInitialized: boolean) {
+  element.addEventListener("click", (e: Event) => {
     chrome.tabs.create({
                          "url": element.href
                        });
@@ -94,7 +97,7 @@ namespace WalletBalance {
   }
 
   class Controller {
-    myWallet;
+    myWallet: any;
     gotError = false;
 
     constructor() {
@@ -128,7 +131,7 @@ namespace WalletBalance {
     if (!wallet) {
       throw Error("Could not retrieve wallet");
     }
-    let listing = _.map(wallet, x => m("p", formatAmount(x)));
+    let listing = _.map(wallet, (x: any) => m("p", formatAmount(x)));
     if (listing.length > 0) {
       return listing;
     }
@@ -141,13 +144,13 @@ namespace WalletBalance {
 }
 
 
-function formatTimestamp(t) {
+function formatTimestamp(t: number) {
   let x = new Date(t);
   return x.toLocaleString();
 }
 
 
-function formatAmount(amount) {
+function formatAmount(amount: AmountJson) {
   let v = amount.value + amount.fraction / 1e6;
   return `${v.toFixed(2)} ${amount.currency}`;
 }
@@ -158,7 +161,7 @@ function abbrevKey(s: string) {
 }
 
 
-function retryPayment(url, contractHash) {
+function retryPayment(url: string, contractHash: string) {
   return function() {
     chrome.tabs.create({
                          "url": substituteFulfillmentUrl(url,
@@ -168,7 +171,7 @@ function retryPayment(url, contractHash) {
 }
 
 
-function formatHistoryItem(historyItem) {
+function formatHistoryItem(historyItem: any) {
   const d = historyItem.detail;
   const t = historyItem.timestamp;
   console.log("hist item", historyItem);
@@ -210,7 +213,7 @@ namespace WalletHistory {
   }
 
   class Controller {
-    myHistory;
+    myHistory: any;
     gotError = false;
 
     constructor() {
@@ -287,7 +290,7 @@ var WalletDebug = {
 };
 
 
-function openExtensionPage(page) {
+function openExtensionPage(page: string) {
   return function() {
     chrome.tabs.create({
                          "url": chrome.extension.getURL(page)
@@ -296,7 +299,7 @@ function openExtensionPage(page) {
 }
 
 
-function openTab(page) {
+function openTab(page: string) {
   return function() {
     chrome.tabs.create({
                          "url": page
diff --git a/test/tests/taler.ts b/test/tests/taler.ts
index 941e8284d..0ffb37329 100644
--- a/test/tests/taler.ts
+++ b/test/tests/taler.ts
@@ -1,9 +1,9 @@
 import * as Emsc from '../../lib/wallet/emscriptif';
 
 
-declare var HttpMockLib;
+declare var HttpMockLib: any;
 
-export function declareTests(assert, context, it) {
+export function declareTests(assert: any, context: any, it: any) {
 
   it("calls native emscripten code", function() {
     let x = new Emsc.Amount({value: 42, fraction: 42, currency: "EUR"});