return klass.getTypeClass().field(member.name.s, Type.instance(member.type.s));
                 case CONSTANT_METHODREF:
                 case CONSTANT_INTERFACEMETHODREF:
-                    Type.Class.Method m = klass.getTypeClass().method(member.name.s + member.type.s);
+                    Type.Class.Method m = klass.getTypeClass().method(member.name.s,member.type.s);
                     return tag == CONSTANT_INTERFACEMETHODREF ? (Object) new InterfaceMethodKey(m) : (Object) m;
                 default:
                     throw new Error("should never happen");
 
         m.super();
         this.flags = flags;
         if ((flags & ~VALID_METHOD_FLAGS) != 0) throw new ClassFile.ClassReadExn("invalid flags");
-        this.method = m;
+        this.method = c.method(name,typeDescriptor);
         this.attrs = new ClassFile.AttrGen(in,cp);
         
         if ((flags & (NATIVE|ABSTRACT))==0)  {
 
 
         public Field  field(String name, Type type) { return new Field(name, type); }
         public Method method(String name, Type returnType, Type[] argTypes) { return new Method(name, returnType, argTypes); }
-        public Method method(String signature) {
+        public Method method(String name, String typeDescriptor) {
             // FEATURE: This parser is ugly but it works (and shouldn't be a problem) might want to clean it up though
-            String s = signature;
-            String name = s.startsWith("(") ? "" : s.substring(0, s.indexOf('('));
-            s = s.substring(s.indexOf('('));
+            String s = typeDescriptor;
+            if(!s.startsWith("(")) throw new IllegalArgumentException("invalid method type descriptor");
             int p = s.indexOf(')');
             if(p == -1) throw new IllegalArgumentException("invalid method type descriptor");
             String argsDesc = s.substring(1,p);