diff --git a/src/dapi/format/ResponseApply.js b/src/dapi/format/ResponseApply.js
new file mode 100644
index 0000000..75693f3
--- /dev/null
+++ b/src/dapi/format/ResponseApply.js
@@ -0,0 +1,77 @@
+/**
+ * Applies arbitrary function to response data
+ *
+ * Copyright (C) 2017 R-T Specialty, LLC.
+ *
+ * This file is part of the Liza Data Collection Framework
+ *
+ * Liza is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+var Trait = require( 'easejs' ).Trait,
+ DataApi = require( '../DataApi' );
+
+
+module.exports = Trait( 'ResponseApply' )
+ .implement( DataApi )
+ .extend(
+{
+ /**
+ * Function to apply to data
+ *
+ * @type {function(*)}
+ */
+ 'private _dataf': () => {},
+
+
+ /**
+ * Initialize with function to apply to return data
+ *
+ * @param {function(*)} req_callback return data function
+ */
+ __mixin( dataf )
+ {
+ if ( typeof dataf !== 'function' )
+ {
+ throw TypeError( 'expected function for #request callback' );
+ }
+
+ this._dataf = dataf;
+ },
+
+
+ /**
+ * Apply function to response
+ *
+ * The function provided during mixin will be applied to the response
+ * data to produce a new response.
+ *
+ * It is not recommended to use this trait for complex transformations;
+ * a new trait should be created instead.
+ *
+ * @param {string} data binary data to transmit
+ * @param {function(?Error,*)} callback continuation upon reply
+ *
+ * @return {DataApi} self
+ */
+ 'virtual abstract override public request'( data, callback )
+ {
+ this.__super( data, ( e, retdata ) =>
+ {
+ callback( e, this._dataf( retdata ) );
+ } );
+
+ return this;
+ },
+} );
diff --git a/test/dapi/format/ResponseApplyTest.js b/test/dapi/format/ResponseApplyTest.js
new file mode 100644
index 0000000..ffeed2d
--- /dev/null
+++ b/test/dapi/format/ResponseApplyTest.js
@@ -0,0 +1,65 @@
+/**
+ * Tests ResponseApply
+ *
+ * Copyright (C) 2017 R-T Specialty, LLC.
+ *
+ * This file is part of the Liza Data Collection Framework
+ *
+ * liza is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+'use strict';
+
+const { expect } = require( 'chai' );
+const { Class } = require( 'easejs' );
+const DummyDataApi = require( '../DummyDataApi' );
+
+const {
+ DataApi,
+ format: {
+ ResponseApply: Sut
+ },
+} = require( '../../../' ).dapi;
+
+
+describe( 'ResponseApply', () =>
+{
+ it( 'applies function to response', done =>
+ {
+ const expected = {};
+ const given = { given: 'data' };
+
+ const f = src =>
+ {
+ expect( src ).to.equal( given );
+ return expected;
+ };
+
+ DummyDataApi.use( Sut( f ) )( ( _, c ) => c( null, given ) )
+ .request( given, ( e, data ) =>
+ {
+ expect( data ).to.equal( expected );
+ done();
+ } );
+ } );
+
+
+ it( 'returns self', () =>
+ {
+ const sut = DummyDataApi.use( Sut( _ => {} ) )( _ => {} );
+
+ expect( sut.request( {}, () => {} ) )
+ .to.equal( sut );
+ } );
+} );