diff --git a/apitools/org.eclipse.pde.api.tools.generator/META-INF/MANIFEST.MF b/apitools/org.eclipse.pde.api.tools.generator/META-INF/MANIFEST.MF
index b80bc9e..22e912a 100644
--- a/apitools/org.eclipse.pde.api.tools.generator/META-INF/MANIFEST.MF
+++ b/apitools/org.eclipse.pde.api.tools.generator/META-INF/MANIFEST.MF
@@ -5,7 +5,7 @@
 Bundle-Version: 1.0.200.qualifier
 Bundle-Vendor: %providerName
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Require-Bundle: org.objectweb.asm;bundle-version="3.3.1",
+Require-Bundle: org.objectweb.asm;bundle-version="[5.0.0,6.0.0)",
  org.eclipse.pde.api.tools;bundle-version="1.0.600",
  org.eclipse.jdt.core;bundle-version="3.8.1",
  org.eclipse.core.runtime;bundle-version="3.8.0"
diff --git a/apitools/org.eclipse.pde.api.tools.generator/src/org/eclipse/pde/api/tools/generator/EEGenerator.java b/apitools/org.eclipse.pde.api.tools.generator/src/org/eclipse/pde/api/tools/generator/EEGenerator.java
index 66a56a5..fa32d11 100644
--- a/apitools/org.eclipse.pde.api.tools.generator/src/org/eclipse/pde/api/tools/generator/EEGenerator.java
+++ b/apitools/org.eclipse.pde.api.tools.generator/src/org/eclipse/pde/api/tools/generator/EEGenerator.java
@@ -62,11 +62,10 @@
 import org.eclipse.pde.api.tools.internal.provisional.ProfileModifiers;
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.Attribute;
-import org.objectweb.asm.ClassAdapter;
 import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.ClassWriter;
 import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.MethodAdapter;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
 import org.w3c.dom.DOMException;
@@ -1157,7 +1156,7 @@
 	/**
 	 * Class adapter
 	 */
-	static class StubClassAdapter extends ClassAdapter {
+	static class StubClassAdapter extends ClassVisitor {
 		static final int IGNORE_CLASS_FILE = 0x100;
 
 		int flags;
@@ -1170,7 +1169,7 @@
 		 * @param stubtype
 		 */
 		public StubClassAdapter(Type stubtype) {
-			super(new ClassWriter(0));
+			super(Opcodes.ASM5, new ClassWriter(0));
 			this.type = stubtype;
 		}
 
@@ -1261,7 +1260,7 @@
 				return null;
 			}
 			final StubMethod method = this.stub.addMethod(methodName, desc);
-			return new MethodAdapter(super.visitMethod(access, methodName, desc, signature, exceptions)) {
+			return new MethodVisitor(Opcodes.ASM5, super.visitMethod(access, methodName, desc, signature, exceptions)) {
 				@Override
 				public AnnotationVisitor visitAnnotation(String sig, boolean visible) {
 					if (visible && "Ljava/lang/invoke/MethodHandle$PolymorphicSignature;".equals(sig)) { //$NON-NLS-1$
diff --git a/apitools/org.eclipse.pde.api.tools.tests/META-INF/MANIFEST.MF b/apitools/org.eclipse.pde.api.tools.tests/META-INF/MANIFEST.MF
index 6fc8aa5..5f6f25d 100644
--- a/apitools/org.eclipse.pde.api.tools.tests/META-INF/MANIFEST.MF
+++ b/apitools/org.eclipse.pde.api.tools.tests/META-INF/MANIFEST.MF
@@ -22,7 +22,7 @@
  org.eclipse.jdt.core.tests.builder;bundle-version="[3.8.0,4.0.0)",
  org.eclipse.jdt.core.tests.compiler;bundle-version="[3.8.0,4.0.0)",
  org.eclipse.ant.core,
- org.objectweb.asm;bundle-version="[3.2.0,4.0.0)",
+ org.objectweb.asm;bundle-version="[5.0.0,6.0.0)",
  org.eclipse.jface;bundle-version="3.8.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Export-Package: org.eclipse.pde.api.tools.anttasks.tests,
diff --git a/apitools/org.eclipse.pde.api.tools/META-INF/MANIFEST.MF b/apitools/org.eclipse.pde.api.tools/META-INF/MANIFEST.MF
index c19b26f..e7d7779 100644
--- a/apitools/org.eclipse.pde.api.tools/META-INF/MANIFEST.MF
+++ b/apitools/org.eclipse.pde.api.tools/META-INF/MANIFEST.MF
@@ -14,7 +14,7 @@
  org.eclipse.text;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.core.filebuffers;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.ant.core;bundle-version="[3.1.300,4.0.0)",
- org.objectweb.asm;bundle-version="[3.2.0,4.0.0)",
+ org.objectweb.asm;bundle-version="[5.0.0,6.0.0)",
  org.eclipse.team.core;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.core.filesystem;bundle-version="[1.2.0,2.0.0)",
  org.eclipse.equinox.frameworkadmin;bundle-version="[2.0.0,3.0.0)",
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/BaseApiAnalyzer.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/BaseApiAnalyzer.java
index a706e0c..358df80 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/BaseApiAnalyzer.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/BaseApiAnalyzer.java
@@ -304,13 +304,19 @@
 	 * current version of ASM. Checks the JDT core settings for class file +
 	 * compiler options<br>
 	 * <br>
-	 * Currently the unsupported bytecodes are Java 8 and greater
+	 * For Luna there are no unsupported bytecodes, for Kepler, Java 8 is
+	 * unsupported
 	 * 
 	 * @return true if the backing project is configured to create bytecodes
 	 *         that are not supported
 	 */
 	private boolean unsupportedByteCodes() {
-		return fJavaProject != null && JavaCore.VERSION_1_8.equals(fJavaProject.getOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, true)) && JavaCore.VERSION_1_8.equals(fJavaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true));
+		return false;
+		// fJavaProject != null &&
+		// JavaCore.VERSION_1_8.equals(fJavaProject.getOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM,
+		// true)) &&
+		// JavaCore.VERSION_1_8.equals(fJavaProject.getOption(JavaCore.COMPILER_COMPLIANCE,
+		// true));
 	}
 
 	/**
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ReferenceExtractor.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ReferenceExtractor.java
index 619d454..225758c 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ReferenceExtractor.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ReferenceExtractor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2013 IBM Corporation and others.
+ * Copyright (c) 2007, 2014 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -36,11 +36,10 @@
 import org.eclipse.pde.api.tools.internal.util.Util;
 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.Attribute;
-import org.objectweb.asm.ClassAdapter;
 import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.FieldVisitor;
 import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodAdapter;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.Type;
@@ -53,7 +52,7 @@
  * 
  * @since 1.0.0
  */
-public class ReferenceExtractor extends ClassAdapter {
+public class ReferenceExtractor extends ClassVisitor {
 
 	/**
 	 * A visitor for visiting java 5+ signatures
@@ -66,7 +65,7 @@
 	 * visitArrayType | (visitClassType visitTypeArgument* (visitInnerClassType
 	 * visitTypeArgument* )* visitEnd</tt> ) )
 	 */
-	class ClassFileSignatureVisitor implements SignatureVisitor {
+	class ClassFileSignatureVisitor extends SignatureVisitor {
 
 		protected int kind = -1;
 		protected int originalkind = -1;
@@ -77,6 +76,7 @@
 		protected List<Reference> references;
 
 		public ClassFileSignatureVisitor() {
+			super(Opcodes.ASM5);
 			this.references = new ArrayList<Reference>();
 		}
 
@@ -288,7 +288,7 @@
 	 * visit<i>X</i>Insn | visitLabel | visitTryCatchBlock | visitLocalVariable
 	 * | visitLineNumber)* visitMaxs ] visitEnd
 	 */
-	class ClassFileMethodVisitor extends MethodAdapter {
+	class ClassFileMethodVisitor extends MethodVisitor {
 		int argumentcount = 0;
 		LinePositionTracker linePositionTracker;
 		/**
@@ -309,7 +309,7 @@
 		 * @param mv
 		 */
 		public ClassFileMethodVisitor(MethodVisitor mv, String name, int argumentcount) {
-			super(mv);
+			super(Opcodes.ASM5, mv);
 			this.argumentcount = argumentcount;
 			this.linePositionTracker = new LinePositionTracker();
 			this.lastLineNumber = -1;
@@ -704,7 +704,11 @@
 	 * 
 	 * @since 1.0.600
 	 */
-	class ClassFileFieldVisitor implements FieldVisitor {
+	class ClassFileFieldVisitor extends FieldVisitor {
+
+		ClassFileFieldVisitor() {
+			super(Opcodes.ASM5);
+		}
 
 		/*
 		 * (non-Javadoc)
@@ -1078,7 +1082,7 @@
 	 *            {@link ReferenceModifiers}
 	 */
 	public ReferenceExtractor(IApiType type, Set<Reference> collector, int referenceKinds) {
-		super(new ClassNode());
+		super(Opcodes.ASM5, new ClassNode());
 		fType = type;
 		this.collector = collector;
 		fReferenceKinds = referenceKinds;
@@ -1095,7 +1099,7 @@
 	 * @param tracker
 	 */
 	protected ReferenceExtractor(IApiType type, Set<Reference> collector, int referenceKinds, FieldTracker tracker) {
-		super(new ClassNode());
+		super(Opcodes.ASM5, new ClassNode());
 		fType = type;
 		this.collector = collector;
 		fReferenceKinds = referenceKinds;
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/comparator/SignatureDecoder.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/comparator/SignatureDecoder.java
index 8b5f353..d33c6d7 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/comparator/SignatureDecoder.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/comparator/SignatureDecoder.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2013 IBM Corporation and others.
+ * Copyright (c) 2007, 2014 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -10,12 +10,13 @@
  *******************************************************************************/
 package org.eclipse.pde.api.tools.internal.comparator;
 
+import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.signature.SignatureVisitor;
 
 /**
  * This class is used to decode a generic signature for class or method
  */
-final class SignatureDecoder implements SignatureVisitor {
+final class SignatureDecoder extends SignatureVisitor {
 	static final int CLASS_BOUND = 1;
 	static final int DEFAULT = 0;
 	static final int INTERFACE_BOUND = 2;
@@ -28,6 +29,7 @@
 	SignatureDescriptor signatureDescriptor;
 
 	public SignatureDecoder(SignatureDescriptor signatureDescriptor) {
+		super(Opcodes.ASM5);
 		this.signatureDescriptor = signatureDescriptor;
 	}
 
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/TypeStructureBuilder.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/TypeStructureBuilder.java
index 41ba0de..42a019d 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/TypeStructureBuilder.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/TypeStructureBuilder.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2013 IBM Corporation and others.
+ * Copyright (c) 2007, 2014 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -14,8 +14,6 @@
 import java.io.ByteArrayInputStream;
 import java.io.DataInputStream;
 import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -30,21 +28,18 @@
 import org.eclipse.pde.api.tools.internal.provisional.model.IApiType;
 import org.eclipse.pde.api.tools.internal.provisional.model.IApiTypeRoot;
 import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.ClassAdapter;
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.FieldVisitor;
 import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodAdapter;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.util.TraceAnnotationVisitor;
 
 /**
  * Class adapter used to create an API type structure
  */
-public class TypeStructureBuilder extends ClassAdapter {
+public class TypeStructureBuilder extends ClassVisitor {
 	ApiType fType;
 	IApiComponent fComponent;
 	IApiTypeRoot fFile;
@@ -59,14 +54,15 @@
 	 *            unknown
 	 */
 	TypeStructureBuilder(ClassVisitor cv, IApiComponent component, IApiTypeRoot file) {
-		super(cv);
+		super(Opcodes.ASM5, cv);
 		fComponent = component;
 		fFile = file;
 	}
 
-	/**
-	 * @see org.objectweb.asm.ClassAdapter#visit(int, int, java.lang.String,
-	 *      java.lang.String, java.lang.String, java.lang.String[])
+	/*
+	 * (non-Javadoc)
+	 * @see org.objectweb.asm.ClassVisitor#visit(int, int, java.lang.String,
+	 * java.lang.String, java.lang.String, java.lang.String[])
 	 */
 	@Override
 	public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
@@ -100,9 +96,10 @@
 		super.visit(version, laccess, name, signature, superName, interfaces);
 	}
 
-	/**
-	 * @see org.objectweb.asm.ClassAdapter#visitInnerClass(java.lang.String,
-	 *      java.lang.String, java.lang.String, int)
+	/*
+	 * (non-Javadoc)
+	 * @see org.objectweb.asm.ClassVisitor#visitInnerClass(java.lang.String,
+	 * java.lang.String, java.lang.String, int)
 	 */
 	@Override
 	public void visitInnerClass(String name, String outerName, String innerName, int access) {
@@ -135,7 +132,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * @see org.objectweb.asm.ClassAdapter#visitOuterClass(java.lang.String,
+	 * @see org.objectweb.asm.ClassVisitor#visitOuterClass(java.lang.String,
 	 * java.lang.String, java.lang.String)
 	 */
 	@Override
@@ -145,7 +142,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * @see org.objectweb.asm.ClassAdapter#visitField(int, java.lang.String,
+	 * @see org.objectweb.asm.ClassVisitor#visitField(int, java.lang.String,
 	 * java.lang.String, java.lang.String, java.lang.Object)
 	 */
 	@Override
@@ -161,7 +158,7 @@
 
 	/*
 	 * (non-Javadoc)
-	 * @see org.objectweb.asm.ClassAdapter#visitMethod(int, java.lang.String,
+	 * @see org.objectweb.asm.ClassVisitor#visitMethod(int, java.lang.String,
 	 * java.lang.String, java.lang.String, java.lang.String[])
 	 */
 	@Override
@@ -179,7 +176,7 @@
 			}
 		}
 		final ApiMethod method = fType.addMethod(name, desc, signature, laccess, names);
-		return new MethodAdapter(super.visitMethod(laccess, name, desc, signature, exceptions)) {
+		return new MethodVisitor(Opcodes.ASM5, super.visitMethod(laccess, name, desc, signature, exceptions)) {
 			@Override
 			public AnnotationVisitor visitAnnotation(String sig, boolean visible) {
 				if (visible && "Ljava/lang/invoke/MethodHandle$PolymorphicSignature;".equals(sig)) { //$NON-NLS-1$
@@ -190,23 +187,88 @@
 
 			@Override
 			public AnnotationVisitor visitAnnotationDefault() {
-				return new TraceAnnotationVisitor() {
-					@Override
-					public void visitEnd() {
-						super.visitEnd();
-						StringWriter stringWriter = new StringWriter();
-						PrintWriter writer = new PrintWriter(stringWriter);
-						print(writer);
-						writer.flush();
-						writer.close();
-						String def = String.valueOf(stringWriter.getBuffer());
-						method.setDefaultValue(def);
-					}
-				};
+				return new AnnotationDefaultVisitor(method);
 			}
 		};
 	}
 
+	private static IApiType logAndReturn(IApiTypeRoot file, Exception e) {
+		if (ApiPlugin.DEBUG_BUILDER) {
+			IStatus status = new Status(IStatus.ERROR, ApiPlugin.PLUGIN_ID, NLS.bind(Messages.TypeStructureBuilder_badClassFileEncountered, file.getTypeName()), e);
+			ApiPlugin.log(status);
+		}
+		return null;
+	}
+
+	/**
+	 * Visit the default value for an annotation
+	 */
+	static class AnnotationDefaultVisitor extends AnnotationVisitor {
+		ApiMethod method;
+		Object value;
+		StringBuffer buff = new StringBuffer();
+		boolean trace = false;
+		int traceCount = 0;
+
+		public AnnotationDefaultVisitor(ApiMethod method) {
+			super(Opcodes.ASM5);
+			this.method = method;
+		}
+
+		@Override
+		public void visit(String name, Object value) {
+			if (trace) {
+				appendValue(value);
+				traceCount++;
+				return;
+			}
+			this.value = value;
+		}
+
+		@Override
+		public AnnotationVisitor visitAnnotation(String name, String desc) {
+			trace = true;
+			return this;
+		}
+
+		@Override
+		public void visitEnum(String name, String desc, String value) {
+			if (trace) {
+				appendValue(value);
+				traceCount++;
+				return;
+			}
+			this.value = value;
+		}
+
+		@Override
+		public AnnotationVisitor visitArray(String name) {
+			trace = true;
+			return this;
+		}
+
+		@Override
+		public void visitEnd() {
+			if (trace) {
+				this.value = buff.toString();
+				traceCount--;
+				trace = traceCount != 0;
+			} else {
+				method.setDefaultValue(this.value == null ? null : this.value.toString());
+			}
+		}
+
+		void appendValue(Object val) {
+			if (val != null) {
+				if (buff.length() < 1) {
+					buff.append(val.toString());
+				} else {
+					buff.append(',').append(val.toString());
+				}
+			}
+		}
+	}
+
 	/**
 	 * Builds a type structure with the given .class file bytes in the specified
 	 * API component.
@@ -222,11 +284,11 @@
 			ClassReader classReader = new ClassReader(bytes);
 			classReader.accept(visitor, ClassReader.SKIP_CODE | ClassReader.SKIP_FRAMES);
 		} catch (ArrayIndexOutOfBoundsException e) {
-			if (ApiPlugin.DEBUG_BUILDER) {
-				IStatus status = new Status(IStatus.ERROR, ApiPlugin.PLUGIN_ID, NLS.bind(Messages.TypeStructureBuilder_badClassFileEncountered, file.getTypeName()), e);
-				ApiPlugin.log(status);
-			}
+			logAndReturn(file, e);
 			return null;
+		} catch (IllegalArgumentException iae) {
+			// thrown from ASM 5.0 for bad bytecodes
+			return logAndReturn(file, iae);
 		}
 		return visitor.fType;
 	}
@@ -260,14 +322,14 @@
 		}
 	}
 
-	static class EnclosingMethodSetter extends ClassAdapter {
+	static class EnclosingMethodSetter extends ClassVisitor {
 		String name;
 		String signature;
 		boolean found = false;
 		String typeName;
 
 		public EnclosingMethodSetter(ClassVisitor cv, String typeName) {
-			super(cv);
+			super(Opcodes.ASM5, cv);
 			this.typeName = typeName.replace('.', '/');
 		}
 
@@ -296,11 +358,11 @@
 		}
 	}
 
-	static class TypeNameFinder extends MethodAdapter {
+	static class TypeNameFinder extends MethodVisitor {
 		protected EnclosingMethodSetter setter;
 
 		public TypeNameFinder(MethodVisitor mv, EnclosingMethodSetter enclosingMethodSetter) {
-			super(mv);
+			super(Opcodes.ASM5, mv);
 			this.setter = enclosingMethodSetter;
 		}
 
