diff --git a/android-lib/build.gradle b/android-lib/build.gradle
index 92a3adc..d76b3dc 100644
--- a/android-lib/build.gradle
+++ b/android-lib/build.gradle
@@ -8,7 +8,7 @@
         classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
         classpath 'com.android.tools.build:gradle:1.2.3'
         classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.0'
-        classpath 'io.v:gradle-plugin:1.4'
+        classpath 'io.v:gradle-plugin:1.6'
     }
 }
 
@@ -59,8 +59,11 @@
     }
 }
 
+def jiriRoot = VanadiumEnvironment.getVanadiumEnvironment().jiriRoot.getAbsolutePath()
+
 vdl {
     inputPaths += 'src/main/java'
+    vdlToolPath = 'vdl'
 }
 
 public static isDarwin() {
@@ -85,7 +88,6 @@
 
 class VanadiumEnvironment {
     File jiriRoot;
-    File jiriBin;
 
     public static getVanadiumEnvironment() {
         VanadiumEnvironment result = new VanadiumEnvironment()
@@ -97,13 +99,6 @@
         }
 
         result.jiriRoot = new File(System.getenv()['JIRI_ROOT'])
-        result.jiriBin = new File(result.jiriRoot, ['.jiri_root', 'scripts', 'jiri'].join(File.separator))
-        if (!result.jiriBin.exists() || !result.jiriBin.isFile() || !result.jiriBin.canExecute()) {
-            throw new InvalidUserDataException(
-                    result.jiriBin.toString() + " does not exist or is not an executable file. "
-                    + "Please follow the Vanadium installation instructions at "
-                    + "https://vanadium.github.io/installation/")
-        }
         return result
     }
 }
@@ -124,10 +119,9 @@
 // Returns a task that will build the Vanadium native library for the given architecture.
 def buildVanadiumLib(VanadiumSupportedArchitecture arch) {
     def jiriRoot = VanadiumEnvironment.getVanadiumEnvironment().jiriRoot.getAbsolutePath()
-    def jiriBin = VanadiumEnvironment.getVanadiumEnvironment().jiriBin.getAbsolutePath()
 
     def check = task("checkVanadiumAndroidEnvironment-${arch.goArch}", type: Exec) {
-        commandLine jiriBin, 'profile', 'list',
+        commandLine 'jiri', 'profile', 'list',
                 '--info', 'Target.InstallationDir', "--target=${arch.goArch}-android", 'v23:android'
         standardOutput = new ByteArrayOutputStream()
         doLast {
@@ -150,7 +144,7 @@
         // safe here.)
         environment "GOOS", "android"
         environment "GOARCH", "${arch.goArch}"
-        commandLine jiriBin, 'go', "--target=${arch.goArch}-android", 'install',
+        commandLine 'jiri', 'go', "--target=${arch.goArch}-android", 'install',
                 '-buildmode=c-shared', '-v', '-tags', 'android',
           '-installsuffix=shared', 'v.io/x/jni/main'
     }
diff --git a/gradle-plugin/build.gradle b/gradle-plugin/build.gradle
index 4f1cbe9..8bea40a 100644
--- a/gradle-plugin/build.gradle
+++ b/gradle-plugin/build.gradle
@@ -1,6 +1,6 @@
 // You should change this after releasing a new version of the gradle plugin. See the
 // list of published versions at https://repo1.maven.org/maven2/io/v/gradle-plugin.
-def releaseVersion = '1.5'
+def releaseVersion = '1.7'
 
 buildscript {
     repositories {
diff --git a/gradle-plugin/src/main/groovy/io/v/vdl/vdl.groovy b/gradle-plugin/src/main/groovy/io/v/vdl/vdl.groovy
index c90bf1e..aba3c56 100644
--- a/gradle-plugin/src/main/groovy/io/v/vdl/vdl.groovy
+++ b/gradle-plugin/src/main/groovy/io/v/vdl/vdl.groovy
@@ -42,10 +42,10 @@
 
                 generateTask.environment(VDLROOT: getVdlRootPath(project))
                 generateTask.environment(VDLPATH: vdlPaths.join(":"))
-		String vdlToolPath = 'build/vdltool/vdl-' + getOsName()
-		if (project.vdl.vdlToolPath != "") {
-			vdlToolPath = project.vdl.vdlToolPath
-		}
+                String vdlToolPath = 'build/vdltool/vdl-' + getOsName()
+                if (project.vdl.vdlToolPath != "") {
+                    vdlToolPath = project.vdl.vdlToolPath
+                }
                 List<String> commandLine = [vdlToolPath,
                                             'generate',
                                             '--lang=java',
diff --git a/lib/build.gradle b/lib/build.gradle
index f79bd35..00250ea 100644
--- a/lib/build.gradle
+++ b/lib/build.gradle
@@ -7,7 +7,7 @@
     }
     dependencies {
         classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
-        classpath 'io.v:gradle-plugin:1.4'
+        classpath 'io.v:gradle-plugin:1.6'
     }
 }
 
@@ -78,13 +78,11 @@
 }
 
 def jiriRoot = VanadiumEnvironment.getVanadiumEnvironment().jiriRoot.getAbsolutePath()
-def jiriBin = VanadiumEnvironment.getVanadiumEnvironment().jiriBin.getAbsolutePath()
 
 sourceSets.main.java.srcDirs += 'generated-src/vdl'
 
 class VanadiumEnvironment {
     File jiriRoot;
-    File jiriBin;
 
     public static getVanadiumEnvironment() {
         VanadiumEnvironment result = new VanadiumEnvironment()
@@ -96,13 +94,6 @@
         }
 
         result.jiriRoot = new File(System.getenv()['JIRI_ROOT'])
-        result.jiriBin = new File(result.jiriRoot, ['.jiri_root', 'scripts', 'jiri'].join(File.separator))
-        if (!result.jiriBin.exists() || !result.jiriBin.isFile() || !result.jiriBin.canExecute()) {
-            throw new InvalidUserDataException(
-                    result.jiriBin.toString() + " does not exist or is not an executable file. "
-                    + "Please follow the Vanadium installation instructions at "
-                    + "https://vanadium.github.io/installation/")
-        }
         return result
     }
 }
@@ -134,7 +125,7 @@
 
     // NOTE(spetrovic): we add the '-installsuffix=shared' flag because the build doesn't work
     // without it on linux/arm.  (There is some conflict with "regular", i.e., non-shared builds).
-    commandLine jiriBin, 'go', '--profiles=v23:java', 'install', '-buildmode=c-shared', '-v',
+    commandLine 'jiri', 'go', '--profiles=v23:java', 'install', '-buildmode=c-shared', '-v',
                 '-tags', 'java', '-installsuffix=shared', 'v.io/x/jni/main'
 }
 
@@ -333,7 +324,7 @@
     inputPaths += [jiriRoot, 'release', 'go', 'src'].join(File.separator)
     vdlRootPath = [jiriRoot, 'release', 'go', 'src', 'v.io', 'v23', 'vdlroot'].join(File.separator)
     generateVdlRoot = true
-    vdlToolPath = [jiriRoot, 'release', 'go', 'bin', 'vdl'].join(File.separator)
+    vdlToolPath = 'vdl'
 }
 
 bintray {
diff --git a/lib/src/main/java/io/v/v23/vdl/Kind.java b/lib/src/main/java/io/v/v23/vdl/Kind.java
index 66130f9..5d69118 100644
--- a/lib/src/main/java/io/v/v23/vdl/Kind.java
+++ b/lib/src/main/java/io/v/v23/vdl/Kind.java
@@ -19,8 +19,6 @@
     INT64,
     FLOAT32,
     FLOAT64,
-    COMPLEX64,
-    COMPLEX128,
     STRING,
     ENUM,
     TYPEOBJECT,
diff --git a/lib/src/main/java/io/v/v23/vdl/Types.java b/lib/src/main/java/io/v/v23/vdl/Types.java
index 10d6c1d..6215464 100644
--- a/lib/src/main/java/io/v/v23/vdl/Types.java
+++ b/lib/src/main/java/io/v/v23/vdl/Types.java
@@ -101,16 +101,6 @@
     public static final VdlType FLOAT64 = createPrimitiveType(Kind.FLOAT64);
 
     /**
-     * The {@code VdlType} object representing the VDL type complex64, it is unnamed.
-     */
-    public static final VdlType COMPLEX64 = createPrimitiveType(Kind.COMPLEX64);
-
-    /**
-     * The {@code VdlType} object representing the VDL type complex128, it is unnamed.
-     */
-    public static final VdlType COMPLEX128 = createPrimitiveType(Kind.COMPLEX128);
-
-    /**
      * The {@code VdlType} object representing the VDL type string, it is unnamed.
      */
     public static final VdlType STRING = createPrimitiveType(Kind.STRING);
@@ -138,8 +128,6 @@
         typeCache.put(VdlInt64.class, INT64);
         typeCache.put(VdlFloat32.class, FLOAT32);
         typeCache.put(VdlFloat64.class, FLOAT64);
-        typeCache.put(VdlComplex64.class, COMPLEX64);
-        typeCache.put(VdlComplex128.class, COMPLEX128);
         typeCache.put(VdlString.class, STRING);
         typeCache.put(VdlTypeObject.class, TYPEOBJECT);
 
@@ -214,10 +202,6 @@
                 return FLOAT32;
             case FLOAT64:
                 return FLOAT64;
-            case COMPLEX64:
-                return COMPLEX64;
-            case COMPLEX128:
-                return COMPLEX128;
             case STRING:
                 return STRING;
             case TYPEOBJECT:
@@ -384,10 +368,6 @@
                 return Boolean.class;
             case BYTE:
                 return Byte.class;
-            case COMPLEX128:
-                return VdlComplex128.class;
-            case COMPLEX64:
-                return VdlComplex64.class;
             case FLOAT32:
                 return Float.class;
             case FLOAT64:
diff --git a/lib/src/main/java/io/v/v23/vdl/VdlComplex128.java b/lib/src/main/java/io/v/v23/vdl/VdlComplex128.java
deleted file mode 100644
index 0140d06..0000000
--- a/lib/src/main/java/io/v/v23/vdl/VdlComplex128.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io.v.v23.vdl;
-
-/**
- * VdlComplex128 is a representation of a VDL complex128.
- */
-public class VdlComplex128 extends VdlValue {
-    private static final long serialVersionUID = 1L;
-
-    private final double real;
-    private final double imag;
-
-    public VdlComplex128(VdlType type, double real, double imag) {
-        super(type);
-        assertKind(Kind.COMPLEX128);
-        this.real = real;
-        this.imag = imag;
-    }
-
-    public VdlComplex128(double real, double imag) {
-        this(Types.COMPLEX128, real, imag);
-    }
-
-    public VdlComplex128(double real) {
-        this(real, 0);
-    }
-
-    public VdlComplex128() {
-        this(0, 0);
-    }
-
-    public double getReal() {
-        return real;
-    }
-
-    public double getImag() {
-        return imag;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) return true;
-        if (!(obj instanceof VdlComplex128)) return false;
-        VdlComplex128 other = (VdlComplex128) obj;
-        return real == other.real && imag == other.imag;
-    }
-
-    @Override
-    public int hashCode() {
-        return Double.valueOf(real).hashCode() ^ Double.valueOf(imag).hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return "{real=" + Double.toString(real) + ", imag=" + Double.toString(imag) + "}";
-    }
-}
diff --git a/lib/src/main/java/io/v/v23/vdl/VdlComplex64.java b/lib/src/main/java/io/v/v23/vdl/VdlComplex64.java
deleted file mode 100644
index 1766ab4..0000000
--- a/lib/src/main/java/io/v/v23/vdl/VdlComplex64.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package io.v.v23.vdl;
-
-/**
- * VdlComplex64 is a representation of a VDL complex64.
- */
-public class VdlComplex64 extends VdlValue {
-    private static final long serialVersionUID = 1L;
-
-    private final float real;
-    private final float imag;
-
-    public VdlComplex64(VdlType type, float real, float imag) {
-        super(type);
-        assertKind(Kind.COMPLEX64);
-        this.real = real;
-        this.imag = imag;
-    }
-
-    public VdlComplex64(float real, float imag) {
-        this(Types.COMPLEX64, real, imag);
-    }
-
-    public VdlComplex64(float real) {
-        this(real, 0);
-    }
-
-    public VdlComplex64() {
-        this(0, 0);
-    }
-
-    public float getReal() {
-        return real;
-    }
-
-    public float getImag() {
-        return imag;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) return true;
-        if (!(obj instanceof VdlComplex64)) return false;
-        VdlComplex64 other = (VdlComplex64) obj;
-        return real == other.real && imag == other.imag;
-    }
-
-    @Override
-    public int hashCode() {
-        return Float.valueOf(real).hashCode() ^ Float.valueOf(imag).hashCode();
-    }
-
-    @Override
-    public String toString() {
-        return "{real=" + Float.toString(real) + ", imag=" + Float.toString(imag) + "}";
-    }
-}
diff --git a/lib/src/main/java/io/v/v23/vdl/VdlValue.java b/lib/src/main/java/io/v/v23/vdl/VdlValue.java
index b123df0..de6a453 100644
--- a/lib/src/main/java/io/v/v23/vdl/VdlValue.java
+++ b/lib/src/main/java/io/v/v23/vdl/VdlValue.java
@@ -111,10 +111,6 @@
                 return new VdlBool();
             case BYTE:
                 return new VdlByte();
-            case COMPLEX128:
-                return new VdlComplex128(0);
-            case COMPLEX64:
-                return new VdlComplex64(0);
             case ENUM:
                 return new VdlEnum(type, type.getLabels().get(0));
             case FLOAT32:
diff --git a/lib/src/main/java/io/v/v23/vom/BinaryDecoder.java b/lib/src/main/java/io/v/v23/vom/BinaryDecoder.java
index b4c011d..e9323a0 100644
--- a/lib/src/main/java/io/v/v23/vom/BinaryDecoder.java
+++ b/lib/src/main/java/io/v/v23/vom/BinaryDecoder.java
@@ -217,9 +217,6 @@
                 return readVdlBool(target);
             case BYTE:
                 return readVdlByte(target);
-            case COMPLEX64:
-            case COMPLEX128:
-                return readVdlComplex(target);
             case ENUM:
                 return readVdlEnum(actualType, target);
             case FLOAT32:
@@ -375,11 +372,6 @@
         return ConvertUtil.convertFromByte(b, target);
     }
 
-    private Object readVdlComplex(ConversionTarget target) throws IOException, ConversionException {
-        return ConvertUtil.convertFromComplex(BinaryUtil.decodeDouble(in),
-                BinaryUtil.decodeDouble(in), target);
-    }
-
     private Object readVdlEnum(VdlType actualType, ConversionTarget target) throws IOException,
             ConversionException {
         int enumIndex = (int) BinaryUtil.decodeUint(in);
diff --git a/lib/src/main/java/io/v/v23/vom/BinaryEncoder.java b/lib/src/main/java/io/v/v23/vom/BinaryEncoder.java
index 4296d00..3182060 100644
--- a/lib/src/main/java/io/v/v23/vom/BinaryEncoder.java
+++ b/lib/src/main/java/io/v/v23/vom/BinaryEncoder.java
@@ -11,8 +11,6 @@
 import io.v.v23.vdl.VdlArray;
 import io.v.v23.vdl.VdlBool;
 import io.v.v23.vdl.VdlByte;
-import io.v.v23.vdl.VdlComplex128;
-import io.v.v23.vdl.VdlComplex64;
 import io.v.v23.vdl.VdlEnum;
 import io.v.v23.vdl.VdlField;
 import io.v.v23.vdl.VdlFloat32;
@@ -192,8 +190,6 @@
             case INT64:
             case FLOAT32:
             case FLOAT64:
-            case COMPLEX64:
-            case COMPLEX128:
             case STRING:
                 return new WireType.NamedT(new WireNamed(
                         type.getName(), getTypeInternal(Types.primitiveTypeFromKind(type.getKind()), pending)));
@@ -286,9 +282,6 @@
                 }
             case BOOL:
                 return writeVdlBool(out, value);
-            case COMPLEX64:
-            case COMPLEX128:
-                return writeVdlComplex(out, value);
             case ENUM:
                 return writeVdlEnum(out, value);
             case FLOAT32:
@@ -464,24 +457,6 @@
     }
 
     /**
-     * Writes a VDL complex to output stream and returns true iff the value is non-zero.
-     */
-    private boolean writeVdlComplex(EncodingStream out, Object value) throws IOException {
-        if (value instanceof VdlComplex64) {
-            boolean isNonZero = BinaryUtil.encodeDouble(out, ((VdlComplex64) value).getReal());
-            isNonZero |= BinaryUtil.encodeDouble(out, ((VdlComplex64) value).getImag());
-            return isNonZero;
-        } else if (value instanceof VdlComplex128) {
-            boolean isNonZero = BinaryUtil.encodeDouble(out, ((VdlComplex128) value).getReal());
-            isNonZero |= BinaryUtil.encodeDouble(out, ((VdlComplex128) value).getImag());
-            return isNonZero;
-        } else {
-            throw new IOException("Unsupported VDL complex value (type " + value.getClass()
-                    + ", value " + value + ")");
-        }
-    }
-
-    /**
      * Writes a VDL enum to output stream and returns true iff the value is non-zero.
      */
     private boolean writeVdlEnum(EncodingStream out, Object value) throws IOException {
diff --git a/lib/src/main/java/io/v/v23/vom/BinaryUtil.java b/lib/src/main/java/io/v/v23/vom/BinaryUtil.java
index cb8fa43..7fcfdd4 100644
--- a/lib/src/main/java/io/v/v23/vom/BinaryUtil.java
+++ b/lib/src/main/java/io/v/v23/vom/BinaryUtil.java
@@ -158,8 +158,6 @@
         switch (type.getKind()) {
             case ANY:
             case ARRAY:
-            case COMPLEX64:
-            case COMPLEX128:
             case LIST:
             case MAP:
             case OPTIONAL:
diff --git a/lib/src/main/java/io/v/v23/vom/BootstrapType.java b/lib/src/main/java/io/v/v23/vom/BootstrapType.java
index 9c81e97..c044561 100644
--- a/lib/src/main/java/io/v/v23/vom/BootstrapType.java
+++ b/lib/src/main/java/io/v/v23/vom/BootstrapType.java
@@ -34,8 +34,6 @@
                 .put(Types.INT64, Constants.WIRE_ID_INT_64)
                 .put(Types.FLOAT32, Constants.WIRE_ID_FLOAT_32)
                 .put(Types.FLOAT64, Constants.WIRE_ID_FLOAT_64)
-                .put(Types.COMPLEX64, Constants.WIRE_ID_COMPLEX_64)
-                .put(Types.COMPLEX128, Constants.WIRE_ID_COMPLEX_128)
                 .put(Types.TYPEOBJECT, Constants.WIRE_ID_TYPE_OBJECT)
                 .put(Types.ANY, Constants.WIRE_ID_ANY)
 
diff --git a/lib/src/main/java/io/v/v23/vom/ConversionTarget.java b/lib/src/main/java/io/v/v23/vom/ConversionTarget.java
index 8c552cf..a8602ad 100644
--- a/lib/src/main/java/io/v/v23/vom/ConversionTarget.java
+++ b/lib/src/main/java/io/v/v23/vom/ConversionTarget.java
@@ -11,8 +11,6 @@
 import io.v.v23.vdl.VdlArray;
 import io.v.v23.vdl.VdlBool;
 import io.v.v23.vdl.VdlByte;
-import io.v.v23.vdl.VdlComplex128;
-import io.v.v23.vdl.VdlComplex64;
 import io.v.v23.vdl.VdlEnum;
 import io.v.v23.vdl.VdlFloat32;
 import io.v.v23.vdl.VdlFloat64;
@@ -50,8 +48,6 @@
             case ARRAY: return new TypeToken<VdlArray<VdlValue>>(){}.getType();
             case BOOL: return VdlBool.class;
             case BYTE: return VdlByte.class;
-            case COMPLEX128: return VdlComplex128.class;
-            case COMPLEX64: return VdlComplex64.class;
             case ENUM: return VdlEnum.class;
             case FLOAT32: return VdlFloat32.class;
             case FLOAT64: return VdlFloat64.class;
diff --git a/lib/src/main/java/io/v/v23/vom/ConvertUtil.java b/lib/src/main/java/io/v/v23/vom/ConvertUtil.java
index 166d35c..7d58008 100644
--- a/lib/src/main/java/io/v/v23/vom/ConvertUtil.java
+++ b/lib/src/main/java/io/v/v23/vom/ConvertUtil.java
@@ -101,7 +101,7 @@
     }
 
     /**
-     * Converts uint values to uint, int, float or complex values only.
+     * Converts uint values to uint, int or float values only.
      * This is used to check O(n) conversion rules instead of O(n^2) for n numeric types.
      */
     private static Object convertUint(long value, ConversionTarget target)
@@ -133,7 +133,7 @@
     }
 
     /**
-     * Converts int values to int, float or complex values only.
+     * Converts int values to int or float values only.
      * This is used to check O(n) conversion rules instead of O(n^2) for n numeric types.
      */
     private static Object convertInt(long value, ConversionTarget target)
@@ -157,7 +157,6 @@
             case INT64:
                 return ReflectUtil.createPrimitive(target, value, Long.TYPE);
             case FLOAT32:
-            case COMPLEX64:
                 if (ConvertUtil.canConvertIntToFloat(value, 32)) {
                     return convertDouble(value, target);
                 }
@@ -171,7 +170,7 @@
     }
 
     /**
-     * Converts float values to float or complex values only.
+     * Converts float values to float values only.
      * This is used to check O(n) conversion rules instead of O(n^2) for n numeric types.
      */
     private static Object convertDouble(double value, ConversionTarget target)
@@ -181,36 +180,26 @@
                 return ReflectUtil.createPrimitive(target, (float) value, Float.TYPE);
             case FLOAT64:
                 return ReflectUtil.createPrimitive(target, value, Double.TYPE);
-            default:
-                return convertComplex(value, 0, target);
         }
+        throw new ConversionException("Can't convert " + value + " to " + target.getTargetType());
     }
 
     /**
-     * Converts complex values to complex values only.
-     * This is used to check O(n) conversion rules instead of O(n^2) for n numeric types.
-     */
-    private static Object convertComplex(double real, double imag, ConversionTarget target)
-            throws ConversionException {
-        return ReflectUtil.createComplex(target, real, imag);
-    }
-
-    /**
-     * Converts from uint to number, one of uint, int, float or complex.
+     * Converts from uint to number, one of uint, int or float.
      */
     static Object convertFromUint(long value, ConversionTarget target) throws ConversionException {
         return convertUint(value, target);
     }
 
     /**
-     * Converts from byte to number, one of uint, int, float or complex.
+     * Converts from byte to number, one of uint, int or float.
      */
     static Object convertFromByte(byte value, ConversionTarget target) throws ConversionException {
         return convertUint(value & 0xffL, target);
     }
 
     /**
-     * Converts from int to number, one of uint, int, float or complex.
+     * Converts from int to number, one of uint, int or float.
      */
     static Object convertFromInt(long value, ConversionTarget target) throws ConversionException {
         if (canConvertIntToUint(value, 64)) {
@@ -221,7 +210,7 @@
     }
 
     /**
-     * Converts from float to number, one of uint, int, float or complex.
+     * Converts from float to number, one of uint, int or float.
      */
     static Object convertFromDouble(double value, ConversionTarget target)
             throws ConversionException {
@@ -233,8 +222,6 @@
                 break;
             case FLOAT32:
             case FLOAT64:
-            case COMPLEX128:
-            case COMPLEX64:
                 break;
             default:
                 if (canConvertFloatToInt(value, 64)) {
@@ -245,18 +232,6 @@
     }
 
     /**
-     * Converts from complex to number, one of uint, int, float or complex.
-     */
-    static Object convertFromComplex(double real, double imag, ConversionTarget target)
-            throws ConversionException {
-        if (imag == 0) {
-            return convertFromDouble(real, target);
-        } else {
-            return convertComplex(real, imag, target);
-        }
-    }
-
-    /**
      * Converts from []byte to []number, [N]number, string or enum.
      */
     static Object convertFromBytes(byte[] bytes, ConversionTarget target)
diff --git a/lib/src/main/java/io/v/v23/vom/ReflectUtil.java b/lib/src/main/java/io/v/v23/vom/ReflectUtil.java
index fcbd55d..92771d8 100644
--- a/lib/src/main/java/io/v/v23/vom/ReflectUtil.java
+++ b/lib/src/main/java/io/v/v23/vom/ReflectUtil.java
@@ -5,8 +5,6 @@
 package io.v.v23.vom;
 
 import io.v.v23.vdl.VdlArray;
-import io.v.v23.vdl.VdlComplex128;
-import io.v.v23.vdl.VdlComplex64;
 import io.v.v23.vdl.VdlEnum;
 import io.v.v23.vdl.VdlList;
 import io.v.v23.vdl.VdlMap;
@@ -57,32 +55,6 @@
     }
 
     /**
-     * Creates an instance of VDL complex. The target class should be inherited from
-     * {@code VdlValue}.
-     */
-    static VdlValue createComplex(ConversionTarget target, double real, double imag)
-            throws ConversionException {
-        Class<?> targetClass = target.getTargetClass();
-        try {
-            if (targetClass == VdlComplex64.class) {
-                return new VdlComplex64(target.getVdlType(), (float) real, (float) imag);
-            } else if (targetClass == VdlComplex128.class) {
-                return new VdlComplex128(target.getVdlType(), real, imag);
-            } else if (VdlComplex64.class.isAssignableFrom(targetClass)) {
-                return (VdlValue) targetClass.getConstructor(Float.TYPE, Float.TYPE)
-                        .newInstance((float) real, (float) imag);
-            } else if (VdlComplex128.class.isAssignableFrom(targetClass)) {
-                return (VdlValue) targetClass.getConstructor(Double.TYPE, Double.TYPE)
-                        .newInstance(real, imag);
-            }
-        } catch (Exception e) {
-            throw new ConversionException(
-                    new VdlComplex128(real, imag), targetClass, e);
-        }
-        throw new ConversionException(new VdlComplex128(real, imag), targetClass);
-    }
-
-    /**
      * Creates an instance of VDL enum. The target class should be inherited from {@code VdlEnum}.
      */
     static VdlEnum createEnum(ConversionTarget target, String label) throws ConversionException {
diff --git a/lib/src/main/java/io/v/v23/vom/TypeCompatibility.java b/lib/src/main/java/io/v/v23/vom/TypeCompatibility.java
index 96de1e6..4257deb 100644
--- a/lib/src/main/java/io/v/v23/vom/TypeCompatibility.java
+++ b/lib/src/main/java/io/v/v23/vom/TypeCompatibility.java
@@ -139,8 +139,6 @@
     private static boolean isNumber(VdlType type) {
         switch (type.getKind()) {
             case BYTE:
-            case COMPLEX128:
-            case COMPLEX64:
             case FLOAT32:
             case FLOAT64:
             case INT16:
diff --git a/lib/src/test/java/io/v/v23/vdl/TypeTest.java b/lib/src/test/java/io/v/v23/vdl/TypeTest.java
index efe0169..02161b5 100644
--- a/lib/src/test/java/io/v/v23/vdl/TypeTest.java
+++ b/lib/src/test/java/io/v/v23/vdl/TypeTest.java
@@ -66,14 +66,6 @@
     private static final class MyString extends VdlString {
         private static final long serialVersionUID = 1L;
     }
-    @GeneratedFromVdl(name = "MyComplex64")
-    private static final class MyComplex64 extends VdlComplex64 {
-        private static final long serialVersionUID = 1L;
-    }
-    @GeneratedFromVdl(name = "MyComplex128")
-    private static final class MyComplex128 extends VdlComplex128 {
-        private static final long serialVersionUID = 1L;
-    }
 
     @SuppressWarnings("unused")
     @GeneratedFromVdl(name = "MyUnion")
@@ -178,8 +170,6 @@
         VdlType myFloat32 = Types.named("MyFloat32", Types.FLOAT32);
         VdlType myFloat64 = Types.named("MyFloat64", Types.FLOAT64);
         VdlType myString = Types.named("MyString", Types.STRING);
-        VdlType myComplex64 = Types.named("MyComplex64", Types.COMPLEX64);
-        VdlType myComplex128 = Types.named("MyComplex128", Types.COMPLEX128);
 
         VdlType myUnion = Types.named("MyUnion", Types.unionOf(new VdlField("A", myInt16),
                 new VdlField("B", Types.INT32), new VdlField("C", Types.INT64)));
@@ -210,8 +200,6 @@
                 .put(myFloat32, MyFloat32.class)
                 .put(myFloat64, MyFloat64.class)
                 .put(myString, MyString.class)
-                .put(myComplex64, MyComplex64.class)
-                .put(myComplex128, MyComplex128.class)
                 .put(myUnion, MyUnion.class)
                 .put(myEnum, MyEnum.class)
                 .put(myArray12, MyArray12.class)
diff --git a/lib/src/test/java/io/v/v23/vom/BinaryEncoderTest.java b/lib/src/test/java/io/v/v23/vom/BinaryEncoderTest.java
index 002b3ef..9abb3a4 100644
--- a/lib/src/test/java/io/v/v23/vom/BinaryEncoderTest.java
+++ b/lib/src/test/java/io/v/v23/vom/BinaryEncoderTest.java
@@ -13,8 +13,6 @@
 import io.v.v23.vdl.Types;
 import io.v.v23.vdl.VdlAny;
 import io.v.v23.vdl.VdlArray;
-import io.v.v23.vdl.VdlComplex128;
-import io.v.v23.vdl.VdlComplex64;
 import io.v.v23.vdl.VdlEnum;
 import io.v.v23.vdl.VdlField;
 import io.v.v23.vdl.VdlOptional;
@@ -37,8 +35,6 @@
                     new VdlArray<Integer>(Types.arrayOf(4, Types.INT32), new Integer[]{0, 0, 0, 0}))
             .put(Types.BOOL, false)
             .put(Types.BYTE, (byte) 0)
-            .put(Types.COMPLEX128, new VdlComplex128(0, 0))
-            .put(Types.COMPLEX64, new VdlComplex64(0, 0))
             .put(Types.enumOf("A", "B", "C"), new VdlEnum(Types.enumOf("A", "B", "C"), "A"))
             .put(Types.FLOAT32, 0f)
             .put(Types.FLOAT64, 0.)
diff --git a/lib/src/test/java/io/v/v23/vom/ConvertUtilTest.java b/lib/src/test/java/io/v/v23/vom/ConvertUtilTest.java
index 253fed8..15b07a5 100644
--- a/lib/src/test/java/io/v/v23/vom/ConvertUtilTest.java
+++ b/lib/src/test/java/io/v/v23/vom/ConvertUtilTest.java
@@ -10,8 +10,6 @@
 
 import io.v.v23.vdl.Types;
 import io.v.v23.vdl.VdlByte;
-import io.v.v23.vdl.VdlComplex128;
-import io.v.v23.vdl.VdlComplex64;
 import io.v.v23.vdl.VdlFloat32;
 import io.v.v23.vdl.VdlFloat64;
 import io.v.v23.vdl.VdlInt16;
@@ -24,8 +22,6 @@
 import io.v.v23.vdl.VdlUint64;
 import io.v.v23.vom.testdata.types.NArray2Uint64;
 import io.v.v23.vom.testdata.types.NByte;
-import io.v.v23.vom.testdata.types.NComplex128;
-import io.v.v23.vom.testdata.types.NComplex64;
 import io.v.v23.vom.testdata.types.NEnum;
 import io.v.v23.vom.testdata.types.NFloat32;
 import io.v.v23.vom.testdata.types.NFloat64;
@@ -77,85 +73,74 @@
         {Long.TYPE, Long.class, VdlInt64.class, NInt64.class},
         {Float.TYPE, Float.class, VdlFloat32.class, NFloat32.class},
         {Double.TYPE, Double.class, VdlFloat64.class, NFloat64.class},
-        {NComplex64.class, VdlComplex64.class},
-        {NComplex128.class, VdlComplex128.class}
     };
 
     private static final NumericConversionTestCase[] numericTests = {
+        // TODO(bprosnitz) This test is really cryptic - it should probably use a list or set of types instead.
         // bytes
-        new NumericConversionTestCase((byte) 0,                                 "11111111111"),
-        new NumericConversionTestCase((byte) 0xf,                               "11111111111"),
-        new NumericConversionTestCase((byte) 0xff,                              "11111111111"),
+        new NumericConversionTestCase((byte) 0,                                 "111111111"),
+        new NumericConversionTestCase((byte) 0xf,                               "111111111"),
+        new NumericConversionTestCase((byte) 0xff,                              "111111111"),
         // uints
-        new NumericConversionTestCase(new VdlUint64(0L),                        "11111111111"),
-        new NumericConversionTestCase(new VdlUint64(0xfL),                      "11111111111"),
-        new NumericConversionTestCase(new VdlUint64(0xffL),                     "11111111111"),
-        new NumericConversionTestCase(new VdlUint64(0xfffL),                    "01111111111"),
-        new NumericConversionTestCase(new VdlUint64(0x7ffL),                    "01111111111"),
-        new NumericConversionTestCase(new VdlUint64(0xffffL),                   "01110111111"),
-        new NumericConversionTestCase(new VdlUint64(0xffffffL),                 "00110111111"),
-        new NumericConversionTestCase(new VdlUint64(0x1000000L),                "00110111111"),
-        new NumericConversionTestCase(new VdlUint64(0x1000001L),                "00110110101"),
-        new NumericConversionTestCase(new VdlUint64(0x7fffffffL),               "00110110101"),
-        new NumericConversionTestCase(new VdlUint64(0xffffffffL),               "00110010101"),
-        new NumericConversionTestCase(new VdlUint64(0xffffffffffffL),           "00010010101"),
-        new NumericConversionTestCase(new VdlUint64(0x20000000000000L),         "00010010101"),
-        new NumericConversionTestCase(new VdlUint64(0x20000000000001L),         "00010010000"),
-        new NumericConversionTestCase(new VdlUint64(0x7fffffffffffffffL),       "00010010000"),
-        new NumericConversionTestCase(new VdlUint64(0xffffffffffffffffL),       "00010000000"),
+        new NumericConversionTestCase(new VdlUint64(0L),                        "111111111"),
+        new NumericConversionTestCase(new VdlUint64(0xfL),                      "111111111"),
+        new NumericConversionTestCase(new VdlUint64(0xffL),                     "111111111"),
+        new NumericConversionTestCase(new VdlUint64(0xfffL),                    "011111111"),
+        new NumericConversionTestCase(new VdlUint64(0x7ffL),                    "011111111"),
+        new NumericConversionTestCase(new VdlUint64(0xffffL),                   "011101111"),
+        new NumericConversionTestCase(new VdlUint64(0xffffffL),                 "001101111"),
+        new NumericConversionTestCase(new VdlUint64(0x1000000L),                "001101111"),
+        new NumericConversionTestCase(new VdlUint64(0x1000001L),                "001101101"),
+        new NumericConversionTestCase(new VdlUint64(0x7fffffffL),               "001101101"),
+        new NumericConversionTestCase(new VdlUint64(0xffffffffL),               "001100101"),
+        new NumericConversionTestCase(new VdlUint64(0xffffffffffffL),           "000100101"),
+        new NumericConversionTestCase(new VdlUint64(0x20000000000000L),         "000100101"),
+        new NumericConversionTestCase(new VdlUint64(0x20000000000001L),         "000100100"),
+        new NumericConversionTestCase(new VdlUint64(0x7fffffffffffffffL),       "000100100"),
+        new NumericConversionTestCase(new VdlUint64(0xffffffffffffffffL),       "000100000"),
         // positive ints
-        new NumericConversionTestCase(0L,                                       "11111111111"),
-        new NumericConversionTestCase(0xfL,                                     "11111111111"),
-        new NumericConversionTestCase(0xffL,                                    "11111111111"),
-        new NumericConversionTestCase(0xfffL,                                   "01111111111"),
-        new NumericConversionTestCase(0x7ffL,                                   "01111111111"),
-        new NumericConversionTestCase(0xffffL,                                  "01110111111"),
-        new NumericConversionTestCase(0xffffffL,                                "00110111111"),
-        new NumericConversionTestCase(0x1000000L,                               "00110111111"),
-        new NumericConversionTestCase(0x1000001L,                               "00110110101"),
-        new NumericConversionTestCase(0x7fffffffL,                              "00110110101"),
-        new NumericConversionTestCase(0xffffffffL,                              "00110010101"),
-        new NumericConversionTestCase(0xffffffffffffL,                          "00010010101"),
-        new NumericConversionTestCase(0x20000000000000L,                        "00010010101"),
-        new NumericConversionTestCase(0x7fffffffffffffffL,                      "00010010000"),
+        new NumericConversionTestCase(0L,                                       "111111111"),
+        new NumericConversionTestCase(0xfL,                                     "111111111"),
+        new NumericConversionTestCase(0xffL,                                    "111111111"),
+        new NumericConversionTestCase(0xfffL,                                   "011111111"),
+        new NumericConversionTestCase(0x7ffL,                                   "011111111"),
+        new NumericConversionTestCase(0xffffL,                                  "011101111"),
+        new NumericConversionTestCase(0xffffffL,                                "001101111"),
+        new NumericConversionTestCase(0x1000000L,                               "001101111"),
+        new NumericConversionTestCase(0x1000001L,                               "001101101"),
+        new NumericConversionTestCase(0x7fffffffL,                              "001101101"),
+        new NumericConversionTestCase(0xffffffffL,                              "001100101"),
+        new NumericConversionTestCase(0xffffffffffffL,                          "000100101"),
+        new NumericConversionTestCase(0x20000000000000L,                        "000100101"),
+        new NumericConversionTestCase(0x7fffffffffffffffL,                      "000100100"),
         // negative ints
-        new NumericConversionTestCase(-1L,                                      "00001111111"),
-        new NumericConversionTestCase(-0x10L,                                   "00001111111"),
-        new NumericConversionTestCase(-0x80L,                                   "00001111111"),
-        new NumericConversionTestCase(-0x800L,                                  "00001111111"),
-        new NumericConversionTestCase(-0x8000L,                                 "00001111111"),
-        new NumericConversionTestCase(-0x800000L,                               "00000111111"),
-        new NumericConversionTestCase(-0x80000000L,                             "00000110101"),
-        new NumericConversionTestCase(-0x800000000000L,                         "00000010101"),
-        new NumericConversionTestCase(-0x20000000000000L,                       "00000010101"),
-        new NumericConversionTestCase(-0x8000000000000000L,                     "00000010000"),
+        new NumericConversionTestCase(-1L,                                      "000011111"),
+        new NumericConversionTestCase(-0x10L,                                   "000011111"),
+        new NumericConversionTestCase(-0x80L,                                   "000011111"),
+        new NumericConversionTestCase(-0x800L,                                  "000011111"),
+        new NumericConversionTestCase(-0x8000L,                                 "000011111"),
+        new NumericConversionTestCase(-0x800000L,                               "000001111"),
+        new NumericConversionTestCase(-0x80000000L,                             "000001101"),
+        new NumericConversionTestCase(-0x800000000000L,                         "000000101"),
+        new NumericConversionTestCase(-0x20000000000000L,                       "000000101"),
+        new NumericConversionTestCase(-0x8000000000000000L,                     "000000100"),
         // positive floats
-        new NumericConversionTestCase(1e0f,                                     "11111111111"),
-        new NumericConversionTestCase(1e2f,                                     "11111111111"),
-        new NumericConversionTestCase(1e4f,                                     "01111111111"),
-        new NumericConversionTestCase(1e8f,                                     "00110111111"),
-        new NumericConversionTestCase(1e16f,                                    "00010011111"),
-        new NumericConversionTestCase(1e19f,                                    "00010001111"),
-        new NumericConversionTestCase(1e20f,                                    "00000001111"),
-        new NumericConversionTestCase(1.1e0f,                                   "00000001111"),
+        new NumericConversionTestCase(1e0f,                                     "111111111"),
+        new NumericConversionTestCase(1e2f,                                     "111111111"),
+        new NumericConversionTestCase(1e4f,                                     "011111111"),
+        new NumericConversionTestCase(1e8f,                                     "001101111"),
+        new NumericConversionTestCase(1e16f,                                    "000100111"),
+        new NumericConversionTestCase(1e19f,                                    "000100011"),
+        new NumericConversionTestCase(1e20f,                                    "000000011"),
+        new NumericConversionTestCase(1.1e0f,                                   "000000011"),
         // negative doubles
-        new NumericConversionTestCase(-1e0f,                                    "00001111111"),
-        new NumericConversionTestCase(-1e2f,                                    "00001111111"),
-        new NumericConversionTestCase(-1e4f,                                    "00001111111"),
-        new NumericConversionTestCase(-1e8f,                                    "00000111111"),
-        new NumericConversionTestCase(-1e16f,                                   "00000011111"),
-        new NumericConversionTestCase(-1e20f,                                   "00000001111"),
-        new NumericConversionTestCase(-1.1e0f,                                  "00000001111"),
-        // complex values
-        new NumericConversionTestCase(new VdlComplex128(0f),                    "11111111111"),
-        new NumericConversionTestCase(new VdlComplex128(1e8f),                  "00110111111"),
-        new NumericConversionTestCase(new VdlComplex128(1e20f),                 "00000001111"),
-        new NumericConversionTestCase(new VdlComplex128(1.1e0f),                "00000001111"),
-        new NumericConversionTestCase(new VdlComplex128(-1f),                   "00001111111"),
-        new NumericConversionTestCase(new VdlComplex128(-1e8f),                 "00000111111"),
-        new NumericConversionTestCase(new VdlComplex128(-1e20f),                "00000001111"),
-        new NumericConversionTestCase(new VdlComplex128(-1.1e0f),               "00000001111"),
-        new NumericConversionTestCase(new VdlComplex128(0f, 1f),                "00000000011"),
+        new NumericConversionTestCase(-1e0f,                                    "000011111"),
+        new NumericConversionTestCase(-1e2f,                                    "000011111"),
+        new NumericConversionTestCase(-1e4f,                                    "000011111"),
+        new NumericConversionTestCase(-1e8f,                                    "000001111"),
+        new NumericConversionTestCase(-1e16f,                                   "000000111"),
+        new NumericConversionTestCase(-1e20f,                                   "000000011"),
+        new NumericConversionTestCase(-1.1e0f,                                  "000000011"),
     };
 
     private static final Type[][] bytesTypes = {
@@ -192,10 +177,6 @@
                 return ConvertUtil.convertFromInt((Long) value, target);
             } else if (value instanceof Float) {
                 return ConvertUtil.convertFromDouble((Float) value, target);
-            } else if (value instanceof VdlComplex128) {
-                double real = ((VdlComplex128) value).getReal();
-                double imag = ((VdlComplex128) value).getImag();
-                return ConvertUtil.convertFromComplex(real, imag, target);
             } else {
                 throw new IllegalArgumentException("Unexpected value " + value);
             }
@@ -226,14 +207,6 @@
         return BigDecimal.valueOf(value).multiply(BigDecimal.valueOf(2).pow(power));
     }
 
-    private BigDecimal normalizeComplex(VdlComplex128 value) {
-        BigDecimal result = normalizeDouble(value.getReal());
-        if (value.getImag() !=0 ) {
-            result = result.add(normalizeDouble(value.getImag()).multiply(BigDecimal.TEN.pow(100)));
-        }
-        return result;
-    }
-
     private BigDecimal normalize(Object value) {
         if (value instanceof Byte) {
             return normalizeUint(((Byte) value) & 0xffL);
@@ -262,14 +235,9 @@
         } else if (value instanceof Double) {
             return normalizeDouble((Double) value);
         } else if (value instanceof VdlFloat32) {
-            return normalizeComplex(new VdlComplex128(((VdlFloat32) value).getValue()));
+            return normalizeDouble(((VdlFloat32)value).getValue());
         } else if (value instanceof VdlFloat64) {
-            return normalizeComplex(new VdlComplex128(((VdlFloat64) value).getValue()));
-        } else if (value instanceof VdlComplex64) {
-            return normalizeComplex(new VdlComplex128(((VdlComplex64) value).getReal(),
-                    ((VdlComplex64) value).getImag()));
-        } else if (value instanceof VdlComplex128) {
-            return normalizeComplex((VdlComplex128) value);
+            return normalizeDouble(((VdlFloat64)value).getValue());
         } else {
             throw new IllegalArgumentException("Unexpected value " + value);
         }
