diff --git a/src/components/views/elements/ManageIntegsButton.js b/src/components/views/elements/ManageIntegsButton.js
new file mode 100644
index 0000000000..8d4c9d8b85
--- /dev/null
+++ b/src/components/views/elements/ManageIntegsButton.js
@@ -0,0 +1,127 @@
+/*
+Copyright 2017 Vector Creations Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import React from 'react';
+import PropTypes from 'prop-types';
+import sdk from '../../../index';
+import SdkConfig from '../../../SdkConfig';
+import ScalarAuthClient from '../../../ScalarAuthClient';
+import ScalarMessaging from '../../../ScalarMessaging';
+import Modal from "../../../Modal";
+import { _t } from '../../../languageHandler';
+import AccessibleButton from './AccessibleButton';
+import TintableSvg from './TintableSvg';
+
+export default class ManageIntegsButton extends React.Component {
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ scalar_error: null,
+ showIntegrationsError: false,
+ };
+
+ this.onManageIntegrations = this.onManageIntegrations.bind(this);
+ this.onShowIntegrationsError = this.onShowIntegrationsError.bind(this);
+ }
+
+ componentWillMount() {
+ ScalarMessaging.startListening();
+ this.scalarClient = null;
+
+ if (SdkConfig.get().integrations_ui_url && SdkConfig.get().integrations_rest_url) {
+ this.scalarClient = new ScalarAuthClient();
+ this.scalarClient.connect().done(() => {
+ this.forceUpdate();
+ }, (err) => {
+ this.setState({ scalar_error: err});
+ });
+ }
+ }
+
+ componentWillUnmount() {
+ ScalarMessaging.stopListening();
+ }
+
+ onManageIntegrations(ev) {
+ ev.preventDefault();
+ const IntegrationsManager = sdk.getComponent("views.settings.IntegrationsManager");
+ Modal.createDialog(IntegrationsManager, {
+ src: (this.scalarClient !== null && this.scalarClient.hasCredentials()) ?
+ this.scalarClient.getScalarInterfaceUrlForRoom(this.props.room.roomId) :
+ null,
+ onFinished: ()=>{
+ if (this.props.onCancelClick) {
+ this.props.onCancelClick(ev);
+ }
+ },
+ }, "mx_IntegrationsManager");
+ }
+
+ onShowIntegrationsError(ev) {
+ ev.preventDefault();
+ this.setState({
+ showIntegrationsError: !this.state.showIntegrationsError,
+ });
+ }
+
+ render() {
+ let integrationsButton;
+ let integrationsError;
+ if (this.scalarClient !== null) {
+ if (this.state.showIntegrationsError && this.state.scalar_error) {
+ console.error(this.state.scalar_error);
+ integrationsError = (
+
+ { _t('Could not connect to the integration server') }
+
+ );
+ }
+
+ if (this.scalarClient.hasCredentials()) {
+ integrationsButton = (
+