diff --git a/src/calls-main-window.c b/src/calls-main-window.c
index c6ea8f2..ee1de9a 100644
--- a/src/calls-main-window.c
+++ b/src/calls-main-window.c
@@ -26,6 +26,7 @@
 #include "calls-origin.h"
 #include "calls-call-holder.h"
 #include "calls-call-selector-item.h"
+#include "calls-new-call-box.h"
 #include "util.h"
 
 #include <glib/gi18n.h>
@@ -51,11 +52,6 @@ struct _CallsMainWindow
   GtkStack *call_stack;
   GtkScrolledWindow *call_scroll;
   GtkFlowBox *call_selector;
-  GtkBox *dial_box;
-  GtkBox *dial_controls;
-  GtkComboBox *origin;
-  GtkSearchEntry *search;
-  HdyDialer *dial_pad;
 
   GtkListStore *origin_store;
 };
@@ -105,6 +101,18 @@ info_response_cb (GtkInfoBar      *infobar,
 }
 
 
+static void
+new_call_submitted_cb (CallsMainWindow *self,
+                       CallsOrigin     *origin,
+                       const gchar     *number,
+                       CallsNewCallBox *new_call_box)
+{
+  g_return_if_fail (CALLS_IS_MAIN_WINDOW (self));
+
+  calls_origin_dial (origin, number);
+}
+
+
 static GtkWidget *
 call_holders_create_widget_cb (CallsCallHolder *holder,
                                CallsMainWindow *self)
@@ -112,55 +120,6 @@ call_holders_create_widget_cb (CallsCallHolder *holder,
   return GTK_WIDGET (calls_call_holder_get_selector_item (holder));
 }
 
-static void
-search_append_symbol (CallsMainWindow *self, gchar symbol)
-{
-  GtkEntryBuffer *buf = gtk_entry_get_buffer (GTK_ENTRY (self->search));
-  guint len = gtk_entry_buffer_get_length (buf);
-
-  gtk_entry_buffer_insert_text (buf, len, &symbol, 1);
-}
-
-static void
-dial_pad_symbol_clicked_cb (CallsMainWindow *self, gchar symbol, HdyDialer *dialer)
-{
-  search_append_symbol (self, symbol);
-}
-
-
-static void
-dial_pad_deleted_cb (CallsMainWindow *self, HdyDialer *dialer)
-{
-  GtkEntryBuffer *buf = gtk_entry_get_buffer (GTK_ENTRY (self->search));
-  guint len = gtk_entry_buffer_get_length (buf);
-
-  gtk_entry_buffer_delete_text (buf, len - 1, 1);
-}
-
-
-static void
-dial_pad_submitted_cb (CallsMainWindow *self, const gchar *unused, HdyDialer *dialer)
-{
-  GtkTreeIter iter;
-  gboolean ok;
-  CallsOrigin *origin;
-  const gchar *number;
-
-  g_return_if_fail (CALLS_IS_MAIN_WINDOW (self));
-
-  ok = gtk_combo_box_get_active_iter (self->origin, &iter);
-  g_return_if_fail (ok);
-
-  gtk_tree_model_get (GTK_TREE_MODEL (self->origin_store), &iter,
-                      ORIGIN_STORE_COLUMN_ORIGIN, &origin,
-                      -1);
-  g_return_if_fail (CALLS_IS_ORIGIN (origin));
-
-  number = gtk_entry_get_text (GTK_ENTRY (self->search));
-
-  calls_origin_dial (origin, number);
-}
-
 
 typedef gboolean (*FindCallHolderFunc) (CallsCallHolder *holder,
                                         gpointer user_data);
@@ -399,28 +358,14 @@ add_origin_calls (CallsMainWindow *self, CallsOrigin *origin)
 static void
 add_origin (CallsMainWindow *self, CallsOrigin *origin)
 {
-  const gint n_origins = gtk_tree_model_iter_n_children
-    (GTK_TREE_MODEL (self->origin_store), NULL);
   GtkTreeIter iter;
 
-  if (n_origins == 1)
-    {
-      /* We have more than one origin now so show the origin combo box */
-      gtk_widget_show (GTK_WIDGET (self->origin));
-    }
-
   gtk_list_store_append (self->origin_store, &iter);
   gtk_list_store_set (self->origin_store, &iter,
                       ORIGIN_STORE_COLUMN_NAME, calls_origin_get_name(origin),
                       ORIGIN_STORE_COLUMN_ORIGIN, G_OBJECT (origin),
                       -1);
 
-  if (gtk_combo_box_get_active (self->origin) == -1)
-    {
-      /* We always want an item active */
-      gtk_combo_box_set_active (self->origin, 0);
-    }
-
 
   g_signal_connect_swapped (origin, "message",
                             G_CALLBACK (show_message), self);
@@ -459,17 +404,6 @@ dump_list_store (GtkListStore *store)
 }
 
 
-static void
-update_origin (CallsMainWindow *self)
-{
-  if (gtk_tree_model_iter_n_children
-      (GTK_TREE_MODEL (self->origin_store), NULL) < 2)
-    {
-      /* User has only one choice so hide the origin combo box */
-      gtk_widget_hide (GTK_WIDGET (self->origin));
-    }
-}
-
 static void
 remove_origin (CallsMainWindow *self, CallsOrigin *origin)
 {
@@ -481,8 +415,6 @@ remove_origin (CallsMainWindow *self, CallsOrigin *origin)
   g_return_if_fail (ok);
 
   gtk_list_store_remove (self->origin_store, &iter);
-
-  update_origin (self);
 }
 
 
@@ -496,8 +428,6 @@ remove_origins (CallsMainWindow *self)
     {
       gtk_list_store_remove (self->origin_store, &iter);
     }
-
-  update_origin (self);
 }
 
 
@@ -644,16 +574,9 @@ calls_main_window_class_init (CallsMainWindowClass *klass)
   gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, call_stack);
   gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, call_scroll);
   gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, call_selector);
-  gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, dial_box);
-  gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, dial_controls);
-  gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, origin);
-  gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, search);
-  gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, dial_pad);
   gtk_widget_class_bind_template_child (widget_class, CallsMainWindow, origin_store);
   gtk_widget_class_bind_template_callback (widget_class, info_response_cb);
   gtk_widget_class_bind_template_callback (widget_class, call_selector_child_activated_cb);
   gtk_widget_class_bind_template_callback (widget_class, back_clicked_cb);
-  gtk_widget_class_bind_template_callback (widget_class, dial_pad_submitted_cb);
-  gtk_widget_class_bind_template_callback (widget_class, dial_pad_deleted_cb);
-  gtk_widget_class_bind_template_callback (widget_class, dial_pad_symbol_clicked_cb);
+  gtk_widget_class_bind_template_callback (widget_class, new_call_submitted_cb);
 }
diff --git a/src/main.c b/src/main.c
index f593b1d..aa17454 100644
--- a/src/main.c
+++ b/src/main.c
@@ -31,6 +31,7 @@
 #include "calls-history-box.h"
 #include "calls-main-window.h"
 #include "calls-mm-provider.h"
+#include "calls-new-call-box.h"
 
 static void
 show_window (GtkApplication *app)
@@ -42,6 +43,7 @@ show_window (GtkApplication *app)
 
   CALLS_TYPE_ENCRYPTION_INDICATOR;
   CALLS_TYPE_HISTORY_BOX;
+  CALLS_TYPE_NEW_CALL_BOX;
   HDY_TYPE_DIALER;
 
   connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
diff --git a/src/ui/main-window.ui b/src/ui/main-window.ui
index 6ce3df7..0192384 100644
--- a/src/ui/main-window.ui
+++ b/src/ui/main-window.ui
@@ -162,75 +162,15 @@
               </packing>
             </child>
             <child>
-              <object class="GtkBox" id="dial_box">
+              <object class="CallsNewCallBox" id="new_call_box">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="orientation">vertical</property>
-                <child>
-                  <object class="GtkBox" id="dial_controls">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="orientation">vertical</property>
-                    <child>
-                      <object class="GtkComboBox" id="origin">
-                        <property name="can_focus">False</property>
-                        <property name="no_show_all">True</property>
-                        <property name="model">origin_store</property>
-                        <property name="id_column">0</property>
-                        <child>
-                          <object class="GtkCellRendererText"/>
-                          <attributes>
-                            <attribute name="text">0</attribute>
-                          </attributes>
-                        </child>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">True</property>
-                        <property name="position">0</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkSearchEntry" id="search">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="primary_icon_name">edit-find-symbolic</property>
-                        <property name="primary_icon_activatable">False</property>
-                        <property name="primary_icon_sensitive">False</property>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">True</property>
-                        <property name="position">1</property>
-                      </packing>
-                    </child>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="HdyDialer" id="dial_pad">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <signal name="deleted" handler="dial_pad_deleted_cb" swapped="yes"/>
-                    <signal name="submitted" handler="dial_pad_submitted_cb" swapped="yes"/>
-                    <signal name="symbol-clicked" handler="dial_pad_symbol_clicked_cb" swapped="yes"/>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">2</property>
-                  </packing>
-                </child>
+                <property name="origin_store">origin_store</property>
+                <signal name="submitted" handler="new_call_submitted_cb" swapped="yes"/>
               </object>
               <packing>
-                <property name="name">dial-pad</property>
-                <property name="title" translatable="yes">Dial pad</property>
-                <property name="position">1</property>
+                <property name="name">new-call</property>
+                <property name="title" translatable="yes">New call</property>
               </packing>
             </child>
             <child>
@@ -241,7 +181,7 @@
               <packing>
                 <property name="name">history</property>
                 <property name="title" translatable="yes">History</property>
-                <property name="position">2</property>
+                <property name="position">3</property>
               </packing>
             </child>
           </object>
@@ -257,4 +197,4 @@
       <placeholder/>
     </child>
   </template>
-</interface>
+</interface>
\ No newline at end of file