diff --git a/src/mol-state/transformer.ts b/src/mol-state/transformer.ts
index a4a824c56f41dec056b0f107942115254525874e..9f94340d18785227fefab4cdfbd9c1000f8792bb 100644
--- a/src/mol-state/transformer.ts
+++ b/src/mol-state/transformer.ts
@@ -18,6 +18,7 @@ export interface Transformer<A extends StateObject = StateObject, B extends Stat
 export namespace Transformer {
     export type Id = string & { '@type': 'transformer-id' }
     export type Params<T extends Transformer<any, any, any>> = T extends Transformer<any, any, infer P> ? P : unknown;
+    export type To<T extends Transformer<any, any, any>> = T extends Transformer<any, infer B, any> ? B : unknown;
     export type ControlsFor<Props> = { [P in keyof Props]?: any }
 
     export interface Definition<A extends StateObject = StateObject, B extends StateObject = StateObject, P = unknown> {
diff --git a/src/mol-state/tree/builder.ts b/src/mol-state/tree/builder.ts
index 4d1a70dc3c7e345335a7cec307426862ce7e1c42..4ed5632bc555c864c0ca194622bd85e4de4f6228 100644
--- a/src/mol-state/tree/builder.ts
+++ b/src/mol-state/tree/builder.ts
@@ -8,6 +8,7 @@ import { ImmutableTree } from '../util/immutable-tree';
 import { TransformTree } from './tree';
 import { StateObject } from '../object';
 import { Transform } from './transform';
+import { Transformer } from '../transformer';
 
 export interface StateTreeBuilder {
     getTree(): TransformTree
@@ -24,6 +25,7 @@ export namespace StateTreeBuilder {
 
     export class Root implements StateTreeBuilder {
         private state: State;
+        //to<A extends StateObject>(ref: Transform.Ref) { return new To<A>(this.state, ref); }
         to<A extends StateObject>(ref: Transform.Ref) { return new To<A>(this.state, ref); }
         toRoot<A extends StateObject>() { return new To<A>(this.state, this.state.tree.rootRef as any); }
         getTree(): TransformTree { return this.state.tree.asImmutable(); }
@@ -31,7 +33,8 @@ export namespace StateTreeBuilder {
     }
 
     export class To<A extends StateObject> implements StateTreeBuilder {
-        apply<B extends StateObject>(t: Transform<A, B, any>): To<B> {
+        apply<T extends Transformer<A, any, any>>(tr: T, params?: Transformer.Params<T>, props?: Partial<Transform.Props>): To<Transformer.To<T>> {
+            const t = tr.apply(params, props);
             this.state.tree.add(this.ref, t);
             return new To(this.state, t.ref);
         }
diff --git a/src/perf-tests/state.ts b/src/perf-tests/state.ts
index 72225c541f519c41e0a5c01fe2774752449bb41a..af121c96d5a6e48b508872bf141e8e7495be1188 100644
--- a/src/perf-tests/state.ts
+++ b/src/perf-tests/state.ts
@@ -82,8 +82,8 @@ export async function testState() {
     const tree = state.definition.tree;
     const builder = StateTreeBuilder.create(tree)
     builder.toRoot<Root>()
-        .apply(CreateSquare.apply({ a: 10 }, { ref: 'square' }))
-        .apply(CaclArea.apply());
+        .apply(CreateSquare, { a: 10 }, { ref: 'square' })
+        .apply(CaclArea);
     const tree1 = builder.getTree();
 
     printTTree(tree1);